Partially fixed the mess in status.c.
git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@12433 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
parent
9c07918456
commit
e2960e9af8
@ -8219,7 +8219,7 @@ void clif_parse_GlobalMessage(int fd, struct map_session_data* sd)
|
|||||||
if( skillnotok(MO_EXPLOSIONSPIRITS,sd) )
|
if( skillnotok(MO_EXPLOSIONSPIRITS,sd) )
|
||||||
break; //Do not override the noskill mapflag. [Skotlex]
|
break; //Do not override the noskill mapflag. [Skotlex]
|
||||||
clif_skill_nodamage(&sd->bl,&sd->bl,MO_EXPLOSIONSPIRITS,-1,
|
clif_skill_nodamage(&sd->bl,&sd->bl,MO_EXPLOSIONSPIRITS,-1,
|
||||||
sc_start(&sd->bl,SkillStatusChangeTable(MO_EXPLOSIONSPIRITS),100,
|
sc_start(&sd->bl,status_skill2sc(MO_EXPLOSIONSPIRITS),100,
|
||||||
17,skill_get_time(MO_EXPLOSIONSPIRITS,1))); //Lv17-> +50 critical (noted by Poki) [Skotlex]
|
17,skill_get_time(MO_EXPLOSIONSPIRITS,1))); //Lv17-> +50 critical (noted by Poki) [Skotlex]
|
||||||
sd->state.snovice_call_flag = 0;
|
sd->state.snovice_call_flag = 0;
|
||||||
break;
|
break;
|
||||||
@ -10776,7 +10776,7 @@ void clif_parse_NoviceExplosionSpirits(int fd, struct map_session_data *sd)
|
|||||||
}
|
}
|
||||||
if((sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE && sd->status.base_exp > 0 && nextbaseexp > 0 && (int)((double)1000*sd->status.base_exp/nextbaseexp)%100==0){
|
if((sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE && sd->status.base_exp > 0 && nextbaseexp > 0 && (int)((double)1000*sd->status.base_exp/nextbaseexp)%100==0){
|
||||||
clif_skill_nodamage(&sd->bl,&sd->bl,MO_EXPLOSIONSPIRITS,5,
|
clif_skill_nodamage(&sd->bl,&sd->bl,MO_EXPLOSIONSPIRITS,5,
|
||||||
sc_start(&sd->bl,SkillStatusChangeTable(MO_EXPLOSIONSPIRITS),100,
|
sc_start(&sd->bl,status_skill2sc(MO_EXPLOSIONSPIRITS),100,
|
||||||
5,skill_get_time(MO_EXPLOSIONSPIRITS,5)));
|
5,skill_get_time(MO_EXPLOSIONSPIRITS,5)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
24
src/map/pc.c
24
src/map/pc.c
@ -307,7 +307,7 @@ int pc_setrestartvalue(struct map_session_data *sd,int type)
|
|||||||
if(sd->state.snovice_dead_flag == 1) { // [Celest]
|
if(sd->state.snovice_dead_flag == 1) { // [Celest]
|
||||||
status_heal(&sd->bl, status->max_hp, status->max_sp, 1);
|
status_heal(&sd->bl, status->max_hp, status->max_sp, 1);
|
||||||
sd->state.snovice_dead_flag = 2;
|
sd->state.snovice_dead_flag = 2;
|
||||||
sc_start(&sd->bl,SkillStatusChangeTable(MO_STEELBODY),100,1,skill_get_time(MO_STEELBODY,1));
|
sc_start(&sd->bl,status_skill2sc(MO_STEELBODY),100,1,skill_get_time(MO_STEELBODY,1));
|
||||||
} else
|
} else
|
||||||
status_heal(&sd->bl, b_status->hp, b_status->sp>status->sp?b_status->sp-status->sp:0, 1);
|
status_heal(&sd->bl, b_status->hp, b_status->sp>status->sp?b_status->sp-status->sp:0, 1);
|
||||||
} else { //Just for saving on the char-server (with values as if respawned)
|
} else { //Just for saving on the char-server (with values as if respawned)
|
||||||
@ -3781,7 +3781,7 @@ int pc_checkallowskill(struct map_session_data *sd)
|
|||||||
for (i = 0; i < ARRAYLENGTH(scw_list); i++)
|
for (i = 0; i < ARRAYLENGTH(scw_list); i++)
|
||||||
{ // Skills requiring specific weapon types
|
{ // Skills requiring specific weapon types
|
||||||
if(sd->sc.data[scw_list[i]] &&
|
if(sd->sc.data[scw_list[i]] &&
|
||||||
!pc_check_weapontype(sd,skill_get_weapontype(StatusSkillChangeTable[scw_list[i]])))
|
!pc_check_weapontype(sd,skill_get_weapontype(status_sc2skill(scw_list[i]))))
|
||||||
status_change_end(&sd->bl,scw_list[i],-1);
|
status_change_end(&sd->bl,scw_list[i],-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4231,18 +4231,18 @@ int pc_checkbaselevelup(struct map_session_data *sd)
|
|||||||
|
|
||||||
if((sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE)
|
if((sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE)
|
||||||
{
|
{
|
||||||
sc_start(&sd->bl,SkillStatusChangeTable(PR_KYRIE),100,1,skill_get_time(PR_KYRIE,1));
|
sc_start(&sd->bl,status_skill2sc(PR_KYRIE),100,1,skill_get_time(PR_KYRIE,1));
|
||||||
sc_start(&sd->bl,SkillStatusChangeTable(PR_IMPOSITIO),100,1,skill_get_time(PR_IMPOSITIO,1));
|
sc_start(&sd->bl,status_skill2sc(PR_IMPOSITIO),100,1,skill_get_time(PR_IMPOSITIO,1));
|
||||||
sc_start(&sd->bl,SkillStatusChangeTable(PR_MAGNIFICAT),100,1,skill_get_time(PR_MAGNIFICAT,1));
|
sc_start(&sd->bl,status_skill2sc(PR_MAGNIFICAT),100,1,skill_get_time(PR_MAGNIFICAT,1));
|
||||||
sc_start(&sd->bl,SkillStatusChangeTable(PR_GLORIA),100,1,skill_get_time(PR_GLORIA,1));
|
sc_start(&sd->bl,status_skill2sc(PR_GLORIA),100,1,skill_get_time(PR_GLORIA,1));
|
||||||
sc_start(&sd->bl,SkillStatusChangeTable(PR_SUFFRAGIUM),100,1,skill_get_time(PR_SUFFRAGIUM,1));
|
sc_start(&sd->bl,status_skill2sc(PR_SUFFRAGIUM),100,1,skill_get_time(PR_SUFFRAGIUM,1));
|
||||||
if (sd->state.snovice_dead_flag == 2)
|
if (sd->state.snovice_dead_flag == 2)
|
||||||
sd->state.snovice_dead_flag = 0; //Reenable steelbody resurrection on dead.
|
sd->state.snovice_dead_flag = 0; //Reenable steelbody resurrection on dead.
|
||||||
} else
|
} else
|
||||||
if((sd->class_&MAPID_UPPERMASK) == MAPID_TAEKWON || (sd->class_&MAPID_UPPERMASK) == MAPID_STAR_GLADIATOR)
|
if((sd->class_&MAPID_UPPERMASK) == MAPID_TAEKWON || (sd->class_&MAPID_UPPERMASK) == MAPID_STAR_GLADIATOR)
|
||||||
{
|
{
|
||||||
sc_start(&sd->bl,SkillStatusChangeTable(AL_INCAGI),100,10,600000);
|
sc_start(&sd->bl,status_skill2sc(AL_INCAGI),100,10,600000);
|
||||||
sc_start(&sd->bl,SkillStatusChangeTable(AL_BLESSING),100,10,600000);
|
sc_start(&sd->bl,status_skill2sc(AL_BLESSING),100,10,600000);
|
||||||
}
|
}
|
||||||
clif_misceffect(&sd->bl,0);
|
clif_misceffect(&sd->bl,0);
|
||||||
npc_script_event(sd, NPCE_BASELVUP); //LORDALFA - LVLUPEVENT
|
npc_script_event(sd, NPCE_BASELVUP); //LORDALFA - LVLUPEVENT
|
||||||
@ -5263,7 +5263,7 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
|
|||||||
clif_resurrection(&sd->bl, 1);
|
clif_resurrection(&sd->bl, 1);
|
||||||
if(battle_config.pc_invincible_time)
|
if(battle_config.pc_invincible_time)
|
||||||
pc_setinvincibletimer(sd, battle_config.pc_invincible_time);
|
pc_setinvincibletimer(sd, battle_config.pc_invincible_time);
|
||||||
sc_start(&sd->bl,SkillStatusChangeTable(PR_KYRIE),100,10,skill_get_time2(SL_KAIZEL,j));
|
sc_start(&sd->bl,status_skill2sc(PR_KYRIE),100,10,skill_get_time2(SL_KAIZEL,j));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (sd->state.snovice_dead_flag == 1)
|
if (sd->state.snovice_dead_flag == 1)
|
||||||
@ -5276,7 +5276,7 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
|
|||||||
sd->state.snovice_dead_flag = 2;
|
sd->state.snovice_dead_flag = 2;
|
||||||
if(battle_config.pc_invincible_time)
|
if(battle_config.pc_invincible_time)
|
||||||
pc_setinvincibletimer(sd, battle_config.pc_invincible_time);
|
pc_setinvincibletimer(sd, battle_config.pc_invincible_time);
|
||||||
sc_start(&sd->bl,SkillStatusChangeTable(MO_STEELBODY),100,1,skill_get_time(MO_STEELBODY,1));
|
sc_start(&sd->bl,status_skill2sc(MO_STEELBODY),100,1,skill_get_time(MO_STEELBODY,1));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5627,7 +5627,7 @@ int pc_jobchange(struct map_session_data *sd,int job, int upper)
|
|||||||
int id;
|
int id;
|
||||||
for(i = 0; i < MAX_SKILL_TREE && (id = skill_tree[class_][i].id) > 0; i++) {
|
for(i = 0; i < MAX_SKILL_TREE && (id = skill_tree[class_][i].id) > 0; i++) {
|
||||||
//Remove status specific to your current tree skills.
|
//Remove status specific to your current tree skills.
|
||||||
id = SkillStatusChangeTable(id);
|
id = status_skill2sc(id);
|
||||||
if (id > SC_COMMON_MAX && sd->sc.data[id])
|
if (id > SC_COMMON_MAX && sd->sc.data[id])
|
||||||
status_change_end(&sd->bl, id, -1);
|
status_change_end(&sd->bl, id, -1);
|
||||||
}
|
}
|
||||||
|
@ -8110,9 +8110,9 @@ BUILDIN_FUNC(sc_start)
|
|||||||
else
|
else
|
||||||
bl = map_id2bl(st->rid);
|
bl = map_id2bl(st->rid);
|
||||||
|
|
||||||
if( tick == 0 && val1 > 0 && type >= 0 && type < SC_MAX && StatusSkillChangeTable[type] != 0 )
|
if( tick == 0 && val1 > 0 && type >= 0 && type < SC_MAX && status_sc2skill(type) != 0 )
|
||||||
{// When there isn't a duration specified, try to get it from the skill_db
|
{// When there isn't a duration specified, try to get it from the skill_db
|
||||||
tick = skill_get_time(StatusSkillChangeTable[type], val1);
|
tick = skill_get_time(status_sc2skill(type), val1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if( potion_flag == 1 && potion_target )
|
if( potion_flag == 1 && potion_target )
|
||||||
@ -8148,9 +8148,9 @@ BUILDIN_FUNC(sc_start2)
|
|||||||
else
|
else
|
||||||
bl = map_id2bl(st->rid);
|
bl = map_id2bl(st->rid);
|
||||||
|
|
||||||
if( tick == 0 && val1 > 0 && type >= 0 && type < SC_MAX && StatusSkillChangeTable[type] != 0 )
|
if( tick == 0 && val1 > 0 && type >= 0 && type < SC_MAX && status_sc2skill(type) != 0 )
|
||||||
{// When there isn't a duration specified, try to get it from the skill_db
|
{// When there isn't a duration specified, try to get it from the skill_db
|
||||||
tick = skill_get_time(StatusSkillChangeTable[type], val1);
|
tick = skill_get_time(status_sc2skill(type), val1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if( potion_flag == 1 && potion_target )
|
if( potion_flag == 1 && potion_target )
|
||||||
@ -8190,9 +8190,9 @@ BUILDIN_FUNC(sc_start4)
|
|||||||
else
|
else
|
||||||
bl = map_id2bl(st->rid);
|
bl = map_id2bl(st->rid);
|
||||||
|
|
||||||
if( tick == 0 && val1 > 0 && type >= 0 && type < SC_MAX && StatusSkillChangeTable[type] != 0 )
|
if( tick == 0 && val1 > 0 && type >= 0 && type < SC_MAX && status_sc2skill(type) != 0 )
|
||||||
{// When there isn't a duration specified, try to get it from the skill_db
|
{// When there isn't a duration specified, try to get it from the skill_db
|
||||||
tick = skill_get_time(StatusSkillChangeTable[type], val1);
|
tick = skill_get_time(status_sc2skill(type), val1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if( potion_flag == 1 && potion_target )
|
if( potion_flag == 1 && potion_target )
|
||||||
|
@ -61,7 +61,7 @@ int icewall_unit_pos;
|
|||||||
|
|
||||||
/// Maps skill ids to skill db offsets.
|
/// Maps skill ids to skill db offsets.
|
||||||
/// Returns the skill's array index, or 0 (Unknown Skill).
|
/// Returns the skill's array index, or 0 (Unknown Skill).
|
||||||
static int skill_get_index( int id )
|
int skill_get_index( int id )
|
||||||
{
|
{
|
||||||
// avoid ranges reserved for mapping guild/homun skills
|
// avoid ranges reserved for mapping guild/homun skills
|
||||||
if( id >= GD_SKILLRANGEMIN && id <= GD_SKILLRANGEMAX )
|
if( id >= GD_SKILLRANGEMIN && id <= GD_SKILLRANGEMAX )
|
||||||
@ -639,7 +639,7 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case NPC_PETRIFYATTACK:
|
case NPC_PETRIFYATTACK:
|
||||||
sc_start4(bl,SkillStatusChangeTable(skillid),50+10*skilllv,
|
sc_start4(bl,status_skill2sc(skillid),50+10*skilllv,
|
||||||
skilllv,0,0,skill_get_time(skillid,skilllv),
|
skilllv,0,0,skill_get_time(skillid,skilllv),
|
||||||
skill_get_time2(skillid,skilllv));
|
skill_get_time2(skillid,skilllv));
|
||||||
break;
|
break;
|
||||||
@ -649,11 +649,11 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
|
|||||||
case NPC_POISON:
|
case NPC_POISON:
|
||||||
case NPC_SILENCEATTACK:
|
case NPC_SILENCEATTACK:
|
||||||
case NPC_STUNATTACK:
|
case NPC_STUNATTACK:
|
||||||
sc_start(bl,SkillStatusChangeTable(skillid),50+10*skilllv,skilllv,skill_get_time2(skillid,skilllv));
|
sc_start(bl,status_skill2sc(skillid),50+10*skilllv,skilllv,skill_get_time2(skillid,skilllv));
|
||||||
break;
|
break;
|
||||||
case NPC_ACIDBREATH:
|
case NPC_ACIDBREATH:
|
||||||
case NPC_ICEBREATH:
|
case NPC_ICEBREATH:
|
||||||
sc_start(bl,SkillStatusChangeTable(skillid),70,skilllv,skill_get_time2(skillid,skilllv));
|
sc_start(bl,status_skill2sc(skillid),70,skilllv,skill_get_time2(skillid,skilllv));
|
||||||
break;
|
break;
|
||||||
case NPC_BLEEDING:
|
case NPC_BLEEDING:
|
||||||
sc_start(bl,SC_BLEEDING,(20*skilllv),skilllv,skill_get_time2(skillid,skilllv));
|
sc_start(bl,SC_BLEEDING,(20*skilllv),skilllv,skill_get_time2(skillid,skilllv));
|
||||||
@ -705,7 +705,7 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case LK_JOINTBEAT:
|
case LK_JOINTBEAT:
|
||||||
skill = SkillStatusChangeTable(skillid);
|
skill = status_skill2sc(skillid);
|
||||||
if (tsc->jb_flag) {
|
if (tsc->jb_flag) {
|
||||||
sc_start2(bl,skill,(5*skilllv+5),skilllv,tsc->jb_flag&BREAK_FLAGS,skill_get_time2(skillid,skilllv));
|
sc_start2(bl,skill,(5*skilllv+5),skilllv,tsc->jb_flag&BREAK_FLAGS,skill_get_time2(skillid,skilllv));
|
||||||
tsc->jb_flag = 0;
|
tsc->jb_flag = 0;
|
||||||
@ -822,7 +822,7 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
|
|||||||
continue; //Range Failed.
|
continue; //Range Failed.
|
||||||
}
|
}
|
||||||
type = sd->addeff[i].id;
|
type = sd->addeff[i].id;
|
||||||
skill = skill_get_time2(StatusSkillChangeTable[type],7);
|
skill = skill_get_time2(status_sc2skill(type),7);
|
||||||
|
|
||||||
if (sd->addeff[i].flag&ATF_TARGET)
|
if (sd->addeff[i].flag&ATF_TARGET)
|
||||||
status_change_start(bl,type,rate,7,0,0,0,skill,0);
|
status_change_start(bl,type,rate,7,0,0,0,skill,0);
|
||||||
@ -967,7 +967,7 @@ int skill_counter_additional_effect (struct block_list* src, struct block_list *
|
|||||||
kaahi_heal_timer, bl->id, SC_KAAHI); //Activate heal.
|
kaahi_heal_timer, bl->id, SC_KAAHI); //Activate heal.
|
||||||
break;
|
break;
|
||||||
case MO_EXTREMITYFIST:
|
case MO_EXTREMITYFIST:
|
||||||
sc_start(src,SkillStatusChangeTable(skillid),100,skilllv,skill_get_time2(skillid,skilllv));
|
sc_start(src,status_skill2sc(skillid),100,skilllv,skill_get_time2(skillid,skilllv));
|
||||||
break;
|
break;
|
||||||
case GS_FULLBUSTER:
|
case GS_FULLBUSTER:
|
||||||
sc_start(src,SC_BLIND,2*skilllv,skilllv,skill_get_time2(skillid,skilllv));
|
sc_start(src,SC_BLIND,2*skilllv,skilllv,skill_get_time2(skillid,skilllv));
|
||||||
@ -1013,7 +1013,7 @@ int skill_counter_additional_effect (struct block_list* src, struct block_list *
|
|||||||
continue; //Range Failed.
|
continue; //Range Failed.
|
||||||
}
|
}
|
||||||
type = dstsd->addeff2[i].id;
|
type = dstsd->addeff2[i].id;
|
||||||
time = skill_get_time2(StatusSkillChangeTable[type],7);
|
time = skill_get_time2(status_sc2skill(type),7);
|
||||||
|
|
||||||
if (dstsd->addeff2[i].flag&ATF_TARGET)
|
if (dstsd->addeff2[i].flag&ATF_TARGET)
|
||||||
status_change_start(src,type,rate,7,0,0,0,time,0);
|
status_change_start(src,type,rate,7,0,0,0,time,0);
|
||||||
@ -1147,7 +1147,7 @@ int skill_break_equip (struct block_list *bl, unsigned short where, int rate, in
|
|||||||
else if (rand()%10000 >= rate)
|
else if (rand()%10000 >= rate)
|
||||||
where&=~where_list[i];
|
where&=~where_list[i];
|
||||||
else if (!sd) //Cause Strip effect.
|
else if (!sd) //Cause Strip effect.
|
||||||
sc_start(bl,scatk[i],100,0,skill_get_time(StatusSkillChangeTable[scatk[i]],1));
|
sc_start(bl,scatk[i],100,0,skill_get_time(status_sc2skill(scatk[i]),1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!where) //Nothing to break.
|
if (!where) //Nothing to break.
|
||||||
@ -2630,7 +2630,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
|
|||||||
|
|
||||||
case NPC_MAGICALATTACK:
|
case NPC_MAGICALATTACK:
|
||||||
skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
|
skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
|
||||||
sc_start(src,SkillStatusChangeTable(skillid),100,skilllv,skill_get_time(skillid,skilllv));
|
sc_start(src,status_skill2sc(skillid),100,skilllv,skill_get_time(skillid,skilllv));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HVAN_CAPRICE: //[blackhole89]
|
case HVAN_CAPRICE: //[blackhole89]
|
||||||
@ -2866,7 +2866,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
|
|||||||
return skill_castend_pos2(src,bl->x,bl->y,skillid,skilllv,tick,0);
|
return skill_castend_pos2(src,bl->x,bl->y,skillid,skilllv,tick,0);
|
||||||
}
|
}
|
||||||
|
|
||||||
type = SkillStatusChangeTable(skillid);
|
type = status_skill2sc(skillid);
|
||||||
tsc = status_get_sc(bl);
|
tsc = status_get_sc(bl);
|
||||||
tsce = (tsc && type != -1)?tsc->data[type]:NULL;
|
tsce = (tsc && type != -1)?tsc->data[type]:NULL;
|
||||||
|
|
||||||
@ -4887,6 +4887,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
|
|||||||
case SL_STAR:
|
case SL_STAR:
|
||||||
case SL_SUPERNOVICE:
|
case SL_SUPERNOVICE:
|
||||||
case SL_WIZARD:
|
case SL_WIZARD:
|
||||||
|
//NOTE: here, 'type' has the value of the associated MAPID, not of the SC_SPIRIT constant.
|
||||||
if (sd && !(dstsd && (dstsd->class_&MAPID_UPPERMASK) == type)) {
|
if (sd && !(dstsd && (dstsd->class_&MAPID_UPPERMASK) == type)) {
|
||||||
clif_skill_fail(sd,skillid,0,0);
|
clif_skill_fail(sd,skillid,0,0);
|
||||||
break;
|
break;
|
||||||
@ -5540,7 +5541,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, int skillid, int sk
|
|||||||
sd = BL_CAST(BL_PC, src);
|
sd = BL_CAST(BL_PC, src);
|
||||||
|
|
||||||
sc = status_get_sc(src);
|
sc = status_get_sc(src);
|
||||||
type = SkillStatusChangeTable(skillid);
|
type = status_skill2sc(skillid);
|
||||||
sce = (sc && type != -1)?sc->data[type]:NULL;
|
sce = (sc && type != -1)?sc->data[type]:NULL;
|
||||||
|
|
||||||
switch (skillid) { //Skill effect.
|
switch (skillid) { //Skill effect.
|
||||||
@ -6509,7 +6510,7 @@ static int skill_unit_onplace (struct skill_unit *src, struct block_list *bl, un
|
|||||||
if (sc && sc->option&OPTION_HIDE && sg->skill_id != WZ_HEAVENDRIVE)
|
if (sc && sc->option&OPTION_HIDE && sg->skill_id != WZ_HEAVENDRIVE)
|
||||||
return 0; //Hidden characters are immune to AoE skills except Heaven's Drive. [Skotlex]
|
return 0; //Hidden characters are immune to AoE skills except Heaven's Drive. [Skotlex]
|
||||||
|
|
||||||
type = SkillStatusChangeTable(sg->skill_id);
|
type = status_skill2sc(sg->skill_id);
|
||||||
sce = (sc && type != -1)?sc->data[type]:NULL;
|
sce = (sc && type != -1)?sc->data[type]:NULL;
|
||||||
skillid = sg->skill_id; //In case the group is deleted, we need to return the correct skill id, still.
|
skillid = sg->skill_id; //In case the group is deleted, we need to return the correct skill id, still.
|
||||||
switch (sg->unit_id) {
|
switch (sg->unit_id) {
|
||||||
@ -6673,7 +6674,7 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
|
|||||||
sc = NULL;
|
sc = NULL;
|
||||||
sstatus = NULL;
|
sstatus = NULL;
|
||||||
}
|
}
|
||||||
type = SkillStatusChangeTable(sg->skill_id);
|
type = status_skill2sc(sg->skill_id);
|
||||||
skillid = sg->skill_id;
|
skillid = sg->skill_id;
|
||||||
|
|
||||||
if (sg->interval == -1) {
|
if (sg->interval == -1) {
|
||||||
@ -7068,7 +7069,7 @@ int skill_unit_onout (struct skill_unit *src, struct block_list *bl, unsigned in
|
|||||||
nullpo_retr(0, bl);
|
nullpo_retr(0, bl);
|
||||||
nullpo_retr(0, sg=src->group);
|
nullpo_retr(0, sg=src->group);
|
||||||
sc = status_get_sc(bl);
|
sc = status_get_sc(bl);
|
||||||
type = SkillStatusChangeTable(sg->skill_id);
|
type = status_skill2sc(sg->skill_id);
|
||||||
sce = (sc && type != -1)?sc->data[type]:NULL;
|
sce = (sc && type != -1)?sc->data[type]:NULL;
|
||||||
|
|
||||||
if (bl->prev==NULL || !src->alive || //Need to delete the trap if the source died.
|
if (bl->prev==NULL || !src->alive || //Need to delete the trap if the source died.
|
||||||
@ -7115,7 +7116,7 @@ static int skill_unit_onleft (int skill_id, struct block_list *bl, unsigned int
|
|||||||
if (sc && !sc->count)
|
if (sc && !sc->count)
|
||||||
sc = NULL;
|
sc = NULL;
|
||||||
|
|
||||||
type = SkillStatusChangeTable(skill_id);
|
type = status_skill2sc(skill_id);
|
||||||
sce = (sc && type != -1)?sc->data[type]:NULL;
|
sce = (sc && type != -1)?sc->data[type]:NULL;
|
||||||
|
|
||||||
switch (skill_id)
|
switch (skill_id)
|
||||||
@ -7617,7 +7618,7 @@ int skill_check_condition(struct map_session_data* sd, short skill, short lv, in
|
|||||||
case CR_SHRINK:
|
case CR_SHRINK:
|
||||||
case TK_RUN:
|
case TK_RUN:
|
||||||
case GS_GATLINGFEVER:
|
case GS_GATLINGFEVER:
|
||||||
if(sc && sc->data[SkillStatusChangeTable(skill)])
|
if(sc && sc->data[status_skill2sc(skill)])
|
||||||
return 1; //Allow turning off.
|
return 1; //Allow turning off.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -7706,7 +7707,7 @@ int skill_check_condition(struct map_session_data* sd, short skill, short lv, in
|
|||||||
case TK_READYDOWN:
|
case TK_READYDOWN:
|
||||||
case TK_READYSTORM:
|
case TK_READYSTORM:
|
||||||
case TK_READYTURN:
|
case TK_READYTURN:
|
||||||
if(sc && sc->data[SkillStatusChangeTable(skill)])
|
if(sc && sc->data[status_skill2sc(skill)])
|
||||||
return 1; //Enable disabling them regardless of who you are.
|
return 1; //Enable disabling them regardless of who you are.
|
||||||
case TK_JUMPKICK:
|
case TK_JUMPKICK:
|
||||||
if ((sd->class_&MAPID_UPPERMASK) == MAPID_SOUL_LINKER) {
|
if ((sd->class_&MAPID_UPPERMASK) == MAPID_SOUL_LINKER) {
|
||||||
|
@ -209,6 +209,7 @@ enum { CAST_GROUND, CAST_DAMAGE, CAST_NODAMAGE };
|
|||||||
int skill_get_casttype(int id); //[Skotlex]
|
int skill_get_casttype(int id); //[Skotlex]
|
||||||
// スキルデ?タベ?スへのアクセサ
|
// スキルデ?タベ?スへのアクセサ
|
||||||
//
|
//
|
||||||
|
int skill_get_index( int id );
|
||||||
int skill_get_type( int id );
|
int skill_get_type( int id );
|
||||||
int skill_get_hit( int id );
|
int skill_get_hit( int id );
|
||||||
int skill_get_inf( int id );
|
int skill_get_inf( int id );
|
||||||
|
185
src/map/status.c
185
src/map/status.c
@ -21,6 +21,7 @@
|
|||||||
#include "itemdb.h"
|
#include "itemdb.h"
|
||||||
#include "battle.h"
|
#include "battle.h"
|
||||||
#include "chrif.h"
|
#include "chrif.h"
|
||||||
|
#include "skill.h"
|
||||||
#include "status.h"
|
#include "status.h"
|
||||||
#include "script.h"
|
#include "script.h"
|
||||||
#include "unit.h"
|
#include "unit.h"
|
||||||
@ -34,21 +35,12 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
//For specifying where in the SkillStatusChangeTableArray the "out of bounds" skills get stored. [Skotlex]
|
|
||||||
#define SC_HM_BASE 800
|
|
||||||
#define SC_GD_BASE 900
|
|
||||||
|
|
||||||
//Regen related flags.
|
//Regen related flags.
|
||||||
#define RGN_HP 0x01
|
#define RGN_HP 0x01
|
||||||
#define RGN_SP 0x02
|
#define RGN_SP 0x02
|
||||||
#define RGN_SHP 0x04
|
#define RGN_SHP 0x04
|
||||||
#define RGN_SSP 0x08
|
#define RGN_SSP 0x08
|
||||||
|
|
||||||
int SkillStatusChangeTableArray[MAX_SKILL]; //Stores the status that should be associated to this skill.
|
|
||||||
int StatusIconChangeTable[SC_MAX]; //Stores the icon that should be associated to this status change.
|
|
||||||
int StatusSkillChangeTable[SC_MAX]; //Stores the skill that should be considered associated to this status change.
|
|
||||||
unsigned long StatusChangeFlagTable[SC_MAX]; //Stores the flag specifying what this SC changes.
|
|
||||||
|
|
||||||
static int max_weight_base[CLASS_COUNT];
|
static int max_weight_base[CLASS_COUNT];
|
||||||
static int hp_coefficient[CLASS_COUNT];
|
static int hp_coefficient[CLASS_COUNT];
|
||||||
static int hp_coefficient2[CLASS_COUNT];
|
static int hp_coefficient2[CLASS_COUNT];
|
||||||
@ -60,91 +52,88 @@ int percentrefinery[5][MAX_REFINE+1]; //
|
|||||||
static int atkmods[3][MAX_WEAPON_TYPE]; // •<>ŠíATKƒTƒCƒY<C692>C<EFBFBD>³(size_fix.txt)
|
static int atkmods[3][MAX_WEAPON_TYPE]; // •<>ŠíATKƒTƒCƒY<C692>C<EFBFBD>³(size_fix.txt)
|
||||||
static char job_bonus[CLASS_COUNT][MAX_LEVEL];
|
static char job_bonus[CLASS_COUNT][MAX_LEVEL];
|
||||||
|
|
||||||
|
static struct eri *sc_data_ers; //For sc_data entries
|
||||||
static struct status_data dummy_status;
|
static struct status_data dummy_status;
|
||||||
|
|
||||||
int current_equip_item_index; //Contains inventory index of an equipped item. To pass it into the EQUP_SCRIPT [Lupus]
|
int current_equip_item_index; //Contains inventory index of an equipped item. To pass it into the EQUP_SCRIPT [Lupus]
|
||||||
int current_equip_card_id; //To prevent card-stacking (from jA) [Skotlex]
|
int current_equip_card_id; //To prevent card-stacking (from jA) [Skotlex]
|
||||||
//we need it for new cards 15 Feb 2005, to check if the combo cards are insrerted into the CURRENT weapon only
|
//we need it for new cards 15 Feb 2005, to check if the combo cards are insrerted into the CURRENT weapon only
|
||||||
//to avoid cards exploits
|
//to avoid cards exploits
|
||||||
|
|
||||||
static struct eri *sc_data_ers; //For sc_data entries
|
static int SkillStatusChangeTable[MAX_SKILL]; // skill -> status
|
||||||
|
static int StatusIconChangeTable[SC_MAX]; // status -> icon
|
||||||
|
unsigned long StatusChangeFlagTable[SC_MAX]; // status -> flags
|
||||||
|
static int StatusSkillChangeTable[SC_MAX]; // status -> skill
|
||||||
|
|
||||||
static void add_sc(int skill, int sc)
|
int status_skill2sc(int skill)
|
||||||
{
|
{
|
||||||
int sk = skill;
|
int sk = skill_get_index(skill);
|
||||||
if (sk >= GD_SKILLBASE) sk = skill - GD_SKILLBASE + SC_GD_BASE;
|
if( sk == 0 ) {
|
||||||
else
|
ShowError("status_skill2sc: Unsupported skill id %d\n", skill);
|
||||||
if (sk >= HM_SKILLBASE) sk = skill - HM_SKILLBASE + SC_HM_BASE;
|
return -1;
|
||||||
if (sk < 0 || sk >= MAX_SKILL) {
|
|
||||||
ShowError("add_sc: Unsupported skill id %d\n", skill);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
if (SkillStatusChangeTableArray[sk]==-1) // skill -> sk [Lance]
|
return SkillStatusChangeTable[sk];
|
||||||
SkillStatusChangeTableArray[sk] = sc;
|
|
||||||
if (StatusSkillChangeTable[sc]==0)
|
|
||||||
StatusSkillChangeTable[sc] = skill;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int status_sc2skill(int sc)
|
||||||
|
{
|
||||||
|
if( sc < 0 || sc >= SC_MAX ) {
|
||||||
|
ShowError("status_skill2sc: Unsupported status change id %d\n", sc);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return StatusSkillChangeTable[sc];
|
||||||
|
}
|
||||||
|
|
||||||
|
#define add_sc(skill,sc) set_sc(skill,sc,SI_BLANK,SCB_NONE)
|
||||||
|
|
||||||
static void set_sc(int skill, int sc, int icon, unsigned int flag)
|
static void set_sc(int skill, int sc, int icon, unsigned int flag)
|
||||||
{
|
{
|
||||||
|
int sk = skill_get_index(skill);
|
||||||
|
if( sk == 0 ) {
|
||||||
|
ShowError("set_sc: Unsupported skill id %d\n", skill);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if( sc < 0 || sc >= SC_MAX ) {
|
||||||
|
ShowError("set_sc: Unsupported status change id %d\n", sc);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( StatusSkillChangeTable[sc] == 0 )
|
||||||
|
StatusSkillChangeTable[sc] = skill;
|
||||||
if( StatusIconChangeTable[sc] == SI_BLANK )
|
if( StatusIconChangeTable[sc] == SI_BLANK )
|
||||||
StatusIconChangeTable[sc] = icon;
|
StatusIconChangeTable[sc] = icon;
|
||||||
StatusChangeFlagTable[sc] |= flag;
|
StatusChangeFlagTable[sc] |= flag;
|
||||||
add_sc(skill, sc);
|
|
||||||
|
if( SkillStatusChangeTable[sk] == -1 )
|
||||||
|
SkillStatusChangeTable[sk] = sc;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Initializes the StatusIconChangeTable variable. May seem somewhat slower than directly defining the array,
|
|
||||||
//but it is much less prone to errors. [Skotlex]
|
|
||||||
void initChangeTables(void)
|
void initChangeTables(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < SC_MAX; i++)
|
for (i = 0; i < SC_MAX; i++)
|
||||||
StatusIconChangeTable[i] = SI_BLANK;
|
StatusIconChangeTable[i] = SI_BLANK;
|
||||||
for (i = 0; i < MAX_SKILL; i++)
|
for (i = 0; i < MAX_SKILL; i++)
|
||||||
SkillStatusChangeTableArray[i] = -1;
|
SkillStatusChangeTable[i] = -1;
|
||||||
|
|
||||||
memset(StatusSkillChangeTable, 0, sizeof(StatusSkillChangeTable));
|
memset(StatusSkillChangeTable, 0, sizeof(StatusSkillChangeTable));
|
||||||
memset(StatusChangeFlagTable, 0, sizeof(StatusChangeFlagTable));
|
memset(StatusChangeFlagTable, 0, sizeof(StatusChangeFlagTable));
|
||||||
|
|
||||||
//First we define the skill for common ailments. These are used in
|
//First we define the skill for common ailments. These are used in skill_additional_effect through sc cards. [Skotlex]
|
||||||
//skill_additional_effect through sc cards. [Skotlex]
|
set_sc( MG_STONECURSE , SC_STONE , SI_BLANK , SCB_DEF_ELE|SCB_DEF|SCB_MDEF );
|
||||||
StatusSkillChangeTable[SC_STONE] = MG_STONECURSE;
|
set_sc( MG_FROSTDIVER , SC_FREEZE , SI_BLANK , SCB_DEF_ELE|SCB_DEF|SCB_MDEF );
|
||||||
StatusSkillChangeTable[SC_FREEZE] = MG_FROSTDIVER;
|
set_sc( NPC_STUNATTACK , SC_STUN , SI_BLANK , SCB_NONE );
|
||||||
StatusSkillChangeTable[SC_STUN] = NPC_STUNATTACK;
|
set_sc( NPC_SLEEPATTACK , SC_SLEEP , SI_BLANK , SCB_NONE );
|
||||||
StatusSkillChangeTable[SC_SLEEP] = NPC_SLEEPATTACK;
|
set_sc( NPC_POISON , SC_POISON , SI_BLANK , SCB_DEF2|SCB_REGEN );
|
||||||
StatusSkillChangeTable[SC_POISON] = NPC_POISON;
|
set_sc( NPC_CURSEATTACK , SC_CURSE , SI_BLANK , SCB_LUK|SCB_BATK|SCB_WATK|SCB_SPEED );
|
||||||
StatusSkillChangeTable[SC_CURSE] = NPC_CURSEATTACK;
|
set_sc( NPC_SILENCEATTACK , SC_SILENCE , SI_BLANK , SCB_NONE );
|
||||||
StatusSkillChangeTable[SC_SILENCE] = NPC_SILENCEATTACK;
|
set_sc( DC_WINKCHARM , SC_CONFUSION , SI_BLANK , SCB_NONE );
|
||||||
StatusSkillChangeTable[SC_CONFUSION] = DC_WINKCHARM;
|
set_sc( NPC_BLINDATTACK , SC_BLIND , SI_BLANK , SCB_HIT|SCB_FLEE );
|
||||||
StatusSkillChangeTable[SC_BLIND] = NPC_BLINDATTACK;
|
set_sc( LK_HEADCRUSH , SC_BLEEDING , SI_BLEEDING , SCB_REGEN );
|
||||||
StatusSkillChangeTable[SC_BLEEDING] = LK_HEADCRUSH;
|
set_sc( NPC_POISON , SC_DPOISON , SI_BLANK , SCB_DEF2|SCB_REGEN );
|
||||||
StatusSkillChangeTable[SC_DPOISON] = NPC_POISON;
|
|
||||||
|
|
||||||
//These are the status-change flags for the common ailments.
|
|
||||||
StatusChangeFlagTable[SC_STONE] = SCB_DEF_ELE|SCB_DEF|SCB_MDEF;
|
|
||||||
StatusChangeFlagTable[SC_FREEZE] = SCB_DEF_ELE|SCB_DEF|SCB_MDEF;
|
|
||||||
// StatusChangeFlagTable[SC_STUN] = SCB_NONE;
|
|
||||||
// StatusChangeFlagTable[SC_SLEEP] = SCB_NONE;
|
|
||||||
StatusChangeFlagTable[SC_POISON] = SCB_DEF2|SCB_REGEN;
|
|
||||||
StatusChangeFlagTable[SC_CURSE] = SCB_LUK|SCB_BATK|SCB_WATK|SCB_SPEED;
|
|
||||||
// StatusChangeFlagTable[SC_SILENCE] = SCB_NONE;
|
|
||||||
// StatusChangeFlagTable[SC_CONFUSION] = SCB_NONE;
|
|
||||||
StatusChangeFlagTable[SC_BLIND] = SCB_HIT|SCB_FLEE;
|
|
||||||
StatusChangeFlagTable[SC_BLEEDING] = SCB_REGEN;
|
|
||||||
StatusChangeFlagTable[SC_DPOISON] = SCB_DEF2|SCB_REGEN;
|
|
||||||
|
|
||||||
//The icons for the common ailments
|
|
||||||
// StatusIconChangeTable[SC_STONE] = SI_BLANK;
|
|
||||||
// StatusIconChangeTable[SC_FREEZE] = SI_BLANK;
|
|
||||||
// StatusIconChangeTable[SC_STUN] = SI_BLANK;
|
|
||||||
// StatusIconChangeTable[SC_SLEEP] = SI_BLANK;
|
|
||||||
// StatusIconChangeTable[SC_POISON] = SI_BLANK;
|
|
||||||
// StatusIconChangeTable[SC_CURSE] = SI_BLANK;
|
|
||||||
// StatusIconChangeTable[SC_SILENCE] = SI_BLANK;
|
|
||||||
// StatusIconChangeTable[SC_CONFUSION] = SI_BLANK;
|
|
||||||
// StatusIconChangeTable[SC_BLIND] = SI_BLANK;
|
|
||||||
StatusIconChangeTable[SC_BLEEDING] = SI_BLEEDING;
|
|
||||||
// StatusIconChangeTable[SC_DPOISON] = SI_BLANK;
|
|
||||||
|
|
||||||
|
|
||||||
|
//The main status definitions
|
||||||
add_sc( SM_BASH , SC_STUN );
|
add_sc( SM_BASH , SC_STUN );
|
||||||
set_sc( SM_PROVOKE , SC_PROVOKE , SI_PROVOKE , SCB_DEF|SCB_DEF2|SCB_BATK|SCB_WATK );
|
set_sc( SM_PROVOKE , SC_PROVOKE , SI_PROVOKE , SCB_DEF|SCB_DEF2|SCB_BATK|SCB_WATK );
|
||||||
add_sc( SM_MAGNUM , SC_WATK_ELEMENT );
|
add_sc( SM_MAGNUM , SC_WATK_ELEMENT );
|
||||||
@ -409,8 +398,8 @@ void initChangeTables(void)
|
|||||||
set_sc( HLIF_AVOID , SC_AVOID , SI_BLANK , SCB_SPEED );
|
set_sc( HLIF_AVOID , SC_AVOID , SI_BLANK , SCB_SPEED );
|
||||||
set_sc( HLIF_CHANGE , SC_CHANGE , SI_BLANK , SCB_VIT|SCB_INT );
|
set_sc( HLIF_CHANGE , SC_CHANGE , SI_BLANK , SCB_VIT|SCB_INT );
|
||||||
set_sc( HFLI_FLEET , SC_FLEET , SI_BLANK , SCB_ASPD|SCB_BATK|SCB_WATK );
|
set_sc( HFLI_FLEET , SC_FLEET , SI_BLANK , SCB_ASPD|SCB_BATK|SCB_WATK );
|
||||||
set_sc(HFLI_SPEED, SC_SPEED, SI_BLANK, SCB_FLEE); //[orn]
|
set_sc( HFLI_SPEED , SC_SPEED , SI_BLANK , SCB_FLEE );
|
||||||
set_sc(HAMI_DEFENCE, SC_DEFENCE, SI_BLANK, SCB_DEF); //[orn]
|
set_sc( HAMI_DEFENCE , SC_DEFENCE , SI_BLANK , SCB_DEF );
|
||||||
set_sc( HAMI_BLOODLUST , SC_BLOODLUST , SI_BLANK , SCB_BATK|SCB_WATK );
|
set_sc( HAMI_BLOODLUST , SC_BLOODLUST , SI_BLANK , SCB_BATK|SCB_WATK );
|
||||||
|
|
||||||
set_sc( GD_LEADERSHIP , SC_GUILDAURA , SI_BLANK , SCB_STR|SCB_AGI|SCB_VIT|SCB_DEX );
|
set_sc( GD_LEADERSHIP , SC_GUILDAURA , SI_BLANK , SCB_STR|SCB_AGI|SCB_VIT|SCB_DEX );
|
||||||
@ -418,21 +407,21 @@ void initChangeTables(void)
|
|||||||
set_sc( GD_REGENERATION , SC_REGENERATION , SI_BLANK , SCB_REGEN );
|
set_sc( GD_REGENERATION , SC_REGENERATION , SI_BLANK , SCB_REGEN );
|
||||||
|
|
||||||
// Storing the target job rather than simply SC_SPIRIT simplifies code later on.
|
// Storing the target job rather than simply SC_SPIRIT simplifies code later on.
|
||||||
SkillStatusChangeTableArray[SL_ALCHEMIST] = MAPID_ALCHEMIST,
|
SkillStatusChangeTable[SL_ALCHEMIST] = MAPID_ALCHEMIST,
|
||||||
SkillStatusChangeTableArray[SL_MONK] = MAPID_MONK,
|
SkillStatusChangeTable[SL_MONK] = MAPID_MONK,
|
||||||
SkillStatusChangeTableArray[SL_STAR] = MAPID_STAR_GLADIATOR,
|
SkillStatusChangeTable[SL_STAR] = MAPID_STAR_GLADIATOR,
|
||||||
SkillStatusChangeTableArray[SL_SAGE] = MAPID_SAGE,
|
SkillStatusChangeTable[SL_SAGE] = MAPID_SAGE,
|
||||||
SkillStatusChangeTableArray[SL_CRUSADER] = MAPID_CRUSADER,
|
SkillStatusChangeTable[SL_CRUSADER] = MAPID_CRUSADER,
|
||||||
SkillStatusChangeTableArray[SL_SUPERNOVICE] = MAPID_SUPER_NOVICE,
|
SkillStatusChangeTable[SL_SUPERNOVICE] = MAPID_SUPER_NOVICE,
|
||||||
SkillStatusChangeTableArray[SL_KNIGHT] = MAPID_KNIGHT,
|
SkillStatusChangeTable[SL_KNIGHT] = MAPID_KNIGHT,
|
||||||
SkillStatusChangeTableArray[SL_WIZARD] = MAPID_WIZARD,
|
SkillStatusChangeTable[SL_WIZARD] = MAPID_WIZARD,
|
||||||
SkillStatusChangeTableArray[SL_PRIEST] = MAPID_PRIEST,
|
SkillStatusChangeTable[SL_PRIEST] = MAPID_PRIEST,
|
||||||
SkillStatusChangeTableArray[SL_BARDDANCER] = MAPID_BARDDANCER,
|
SkillStatusChangeTable[SL_BARDDANCER] = MAPID_BARDDANCER,
|
||||||
SkillStatusChangeTableArray[SL_ROGUE] = MAPID_ROGUE,
|
SkillStatusChangeTable[SL_ROGUE] = MAPID_ROGUE,
|
||||||
SkillStatusChangeTableArray[SL_ASSASIN] = MAPID_ASSASSIN,
|
SkillStatusChangeTable[SL_ASSASIN] = MAPID_ASSASSIN,
|
||||||
SkillStatusChangeTableArray[SL_BLACKSMITH] = MAPID_BLACKSMITH,
|
SkillStatusChangeTable[SL_BLACKSMITH] = MAPID_BLACKSMITH,
|
||||||
SkillStatusChangeTableArray[SL_HUNTER] = MAPID_HUNTER,
|
SkillStatusChangeTable[SL_HUNTER] = MAPID_HUNTER,
|
||||||
SkillStatusChangeTableArray[SL_SOULLINKER] = MAPID_SOUL_LINKER,
|
SkillStatusChangeTable[SL_SOULLINKER] = MAPID_SOUL_LINKER,
|
||||||
|
|
||||||
//Status that don't have a skill associated.
|
//Status that don't have a skill associated.
|
||||||
StatusIconChangeTable[SC_WEIGHT50] = SI_WEIGHT50;
|
StatusIconChangeTable[SC_WEIGHT50] = SI_WEIGHT50;
|
||||||
@ -446,9 +435,6 @@ void initChangeTables(void)
|
|||||||
StatusIconChangeTable[SC_INCSTR] = SI_INCSTR;
|
StatusIconChangeTable[SC_INCSTR] = SI_INCSTR;
|
||||||
StatusIconChangeTable[SC_MIRACLE] = SI_SPIRIT;
|
StatusIconChangeTable[SC_MIRACLE] = SI_SPIRIT;
|
||||||
StatusIconChangeTable[SC_INTRAVISION] = SI_INTRAVISION;
|
StatusIconChangeTable[SC_INTRAVISION] = SI_INTRAVISION;
|
||||||
//This seems wrong as it sets the same icon to all skills that change your
|
|
||||||
//element, but alas, all of them are mob-target only with the exception of
|
|
||||||
//NPC_CHANGEUNDEAD, so this should be alright. [Skotlex]
|
|
||||||
StatusIconChangeTable[SC_STRFOOD] = SI_FOODSTR;
|
StatusIconChangeTable[SC_STRFOOD] = SI_FOODSTR;
|
||||||
StatusIconChangeTable[SC_AGIFOOD] = SI_FOODAGI;
|
StatusIconChangeTable[SC_AGIFOOD] = SI_FOODAGI;
|
||||||
StatusIconChangeTable[SC_VITFOOD] = SI_FOODVIT;
|
StatusIconChangeTable[SC_VITFOOD] = SI_FOODVIT;
|
||||||
@ -513,19 +499,6 @@ void initChangeTables(void)
|
|||||||
StatusIconChangeTable[SC_HALLUCINATION] = SI_BLANK;
|
StatusIconChangeTable[SC_HALLUCINATION] = SI_BLANK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int SkillStatusChangeTable(int skill)
|
|
||||||
{
|
|
||||||
int sk = skill;
|
|
||||||
if (sk >= GD_SKILLBASE) sk = skill - GD_SKILLBASE + SC_GD_BASE;
|
|
||||||
else
|
|
||||||
if (sk >= HM_SKILLBASE) sk = skill - HM_SKILLBASE + SC_HM_BASE;
|
|
||||||
if (sk < 0 || sk >= MAX_SKILL) {
|
|
||||||
ShowError("add_sc: Unsupported skill id %d\n", skill);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return SkillStatusChangeTableArray[sk];
|
|
||||||
}
|
|
||||||
int StatusIconChangeTable[SC_MAX]; //Stores the icon that should be associated to this status change.
|
|
||||||
static void initDummyData(void)
|
static void initDummyData(void)
|
||||||
{
|
{
|
||||||
memset(&dummy_status, 0, sizeof(dummy_status));
|
memset(&dummy_status, 0, sizeof(dummy_status));
|
||||||
@ -5414,7 +5387,7 @@ int status_change_start(struct block_list* bl,enum sc_type type,int rate,int val
|
|||||||
|
|
||||||
case SC_JOINTBEAT:
|
case SC_JOINTBEAT:
|
||||||
if( val2&BREAK_NECK )
|
if( val2&BREAK_NECK )
|
||||||
sc_start(bl,SC_BLEEDING,100,val1,skill_get_time2(StatusSkillChangeTable[type],val1));
|
sc_start(bl,SC_BLEEDING,100,val1,skill_get_time2(status_sc2skill(type),val1));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SC_BERSERK:
|
case SC_BERSERK:
|
||||||
@ -5422,7 +5395,7 @@ int status_change_start(struct block_list* bl,enum sc_type type,int rate,int val
|
|||||||
sc_start4(bl, SC_ENDURE, 100,10,0,0,2, tick);
|
sc_start4(bl, SC_ENDURE, 100,10,0,0,2, tick);
|
||||||
//HP healing is performing after the calc_status call.
|
//HP healing is performing after the calc_status call.
|
||||||
//Val2 holds HP penalty
|
//Val2 holds HP penalty
|
||||||
if (!val4) val4 = skill_get_time2(StatusSkillChangeTable[type],val1);
|
if (!val4) val4 = skill_get_time2(status_sc2skill(type),val1);
|
||||||
if (!val4) val4 = 10000; //Val4 holds damage interval
|
if (!val4) val4 = 10000; //Val4 holds damage interval
|
||||||
val3 = tick/val4; //val3 holds skill duration
|
val3 = tick/val4; //val3 holds skill duration
|
||||||
tick = val4;
|
tick = val4;
|
||||||
@ -5615,7 +5588,7 @@ int status_change_start(struct block_list* bl,enum sc_type type,int rate,int val
|
|||||||
type2 = types[i];
|
type2 = types[i];
|
||||||
if (src->sc.data[type2])
|
if (src->sc.data[type2])
|
||||||
sc_start(bl,type2,100,src->sc.data[type2]->val1,
|
sc_start(bl,type2,100,src->sc.data[type2]->val1,
|
||||||
skill_get_time(StatusSkillChangeTable[type2],src->sc.data[type2]->val1));
|
skill_get_time(status_sc2skill(type2),src->sc.data[type2]->val1));
|
||||||
i--;
|
i--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -6341,7 +6314,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
|
|||||||
DIFF_TICK(gettick(), sce->val4) <= 1000 &&
|
DIFF_TICK(gettick(), sce->val4) <= 1000 &&
|
||||||
(!sd || (sd->weapontype1 == 0 && sd->weapontype2 == 0))
|
(!sd || (sd->weapontype1 == 0 && sd->weapontype2 == 0))
|
||||||
)
|
)
|
||||||
sc_start(bl,SC_SPURT,100,sce->val1,skill_get_time2(StatusSkillChangeTable[type], sce->val1));
|
sc_start(bl,SC_SPURT,100,sce->val1,skill_get_time2(status_sc2skill(type), sce->val1));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SC_AUTOBERSERK:
|
case SC_AUTOBERSERK:
|
||||||
@ -6454,7 +6427,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
|
|||||||
if (sce->val2 > 0) {
|
if (sce->val2 > 0) {
|
||||||
//Caster has been unlocked... nearby chars need to be unlocked.
|
//Caster has been unlocked... nearby chars need to be unlocked.
|
||||||
int range = 1
|
int range = 1
|
||||||
+skill_get_range2(bl, StatusSkillChangeTable[type], sce->val1)
|
+skill_get_range2(bl, status_sc2skill(type), sce->val1)
|
||||||
+skill_get_range2(bl, TF_BACKSLIDING, 1); //Since most people use this to escape the hold....
|
+skill_get_range2(bl, TF_BACKSLIDING, 1); //Since most people use this to escape the hold....
|
||||||
map_foreachinarea(status_change_timer_sub,
|
map_foreachinarea(status_change_timer_sub,
|
||||||
bl->m, bl->x-range, bl->y-range, bl->x+range,bl->y+range,BL_CHAR,bl,sce,type,gettick());
|
bl->m, bl->x-range, bl->y-range, bl->x+range,bl->y+range,BL_CHAR,bl,sce,type,gettick());
|
||||||
@ -6808,7 +6781,7 @@ int status_change_timer(int tid, unsigned int tick, int id, int data)
|
|||||||
if (!sc->data[SC_INCSTR]) {
|
if (!sc->data[SC_INCSTR]) {
|
||||||
sc_start(bl, SC_INCSTR,100,1<<(sce->val1-1),
|
sc_start(bl, SC_INCSTR,100,1<<(sce->val1-1),
|
||||||
(sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_ROGUE?10:1) //SL bonus -> x10 duration
|
(sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_ROGUE?10:1) //SL bonus -> x10 duration
|
||||||
*skill_get_time2(StatusSkillChangeTable[type],sce->val1));
|
*skill_get_time2(status_sc2skill(type),sce->val1));
|
||||||
}
|
}
|
||||||
sc_timer_next(sce->val2+tick, status_change_timer, bl->id, data);
|
sc_timer_next(sce->val2+tick, status_change_timer, bl->id, data);
|
||||||
return 0;
|
return 0;
|
||||||
@ -7408,7 +7381,7 @@ static int status_natural_heal(DBKey key,void * data,va_list ap)
|
|||||||
val*=2;
|
val*=2;
|
||||||
sd->state.doridori = 0;
|
sd->state.doridori = 0;
|
||||||
if ((rate = pc_checkskill(sd,TK_SPTIME)))
|
if ((rate = pc_checkskill(sd,TK_SPTIME)))
|
||||||
sc_start(bl,SkillStatusChangeTable(TK_SPTIME),
|
sc_start(bl,status_skill2sc(TK_SPTIME),
|
||||||
100,rate,skill_get_time(TK_SPTIME, rate));
|
100,rate,skill_get_time(TK_SPTIME, rate));
|
||||||
if (
|
if (
|
||||||
(sd->class_&MAPID_UPPERMASK) == MAPID_STAR_GLADIATOR &&
|
(sd->class_&MAPID_UPPERMASK) == MAPID_STAR_GLADIATOR &&
|
||||||
|
@ -291,8 +291,6 @@ enum sc_type {
|
|||||||
SC_COMMONSC_RESIST,
|
SC_COMMONSC_RESIST,
|
||||||
SC_MAX, //Automatically updated max, used in for's to check we are within bounds.
|
SC_MAX, //Automatically updated max, used in for's to check we are within bounds.
|
||||||
};
|
};
|
||||||
int SkillStatusChangeTable(int skill);
|
|
||||||
extern int StatusSkillChangeTable[SC_MAX];
|
|
||||||
|
|
||||||
//Numerates the Number for the status changes (client-dependent), imported from jA
|
//Numerates the Number for the status changes (client-dependent), imported from jA
|
||||||
enum si_type {
|
enum si_type {
|
||||||
@ -542,41 +540,44 @@ enum {
|
|||||||
#define MANNER_NOROOM 0x10
|
#define MANNER_NOROOM 0x10
|
||||||
|
|
||||||
//Define flags for the status_calc_bl function. [Skotlex]
|
//Define flags for the status_calc_bl function. [Skotlex]
|
||||||
#define SCB_NONE 0x00000000
|
enum scb_flag
|
||||||
#define SCB_BASE 0x00000001
|
{
|
||||||
#define SCB_MAXHP 0x00000002
|
SCB_NONE = 0x00000000,
|
||||||
#define SCB_MAXSP 0x00000004
|
SCB_BASE = 0x00000001,
|
||||||
#define SCB_STR 0x00000008
|
SCB_MAXHP = 0x00000002,
|
||||||
#define SCB_AGI 0x00000010
|
SCB_MAXSP = 0x00000004,
|
||||||
#define SCB_VIT 0x00000020
|
SCB_STR = 0x00000008,
|
||||||
#define SCB_INT 0x00000040
|
SCB_AGI = 0x00000010,
|
||||||
#define SCB_DEX 0x00000080
|
SCB_VIT = 0x00000020,
|
||||||
#define SCB_LUK 0x00000100
|
SCB_INT = 0x00000040,
|
||||||
#define SCB_BATK 0x00000200
|
SCB_DEX = 0x00000080,
|
||||||
#define SCB_WATK 0x00000400
|
SCB_LUK = 0x00000100,
|
||||||
#define SCB_MATK 0x00000800
|
SCB_BATK = 0x00000200,
|
||||||
#define SCB_HIT 0x00001000
|
SCB_WATK = 0x00000400,
|
||||||
#define SCB_FLEE 0x00002000
|
SCB_MATK = 0x00000800,
|
||||||
#define SCB_DEF 0x00004000
|
SCB_HIT = 0x00001000,
|
||||||
#define SCB_DEF2 0x00008000
|
SCB_FLEE = 0x00002000,
|
||||||
#define SCB_MDEF 0x00010000
|
SCB_DEF = 0x00004000,
|
||||||
#define SCB_MDEF2 0x00020000
|
SCB_DEF2 = 0x00008000,
|
||||||
#define SCB_SPEED 0x00040000
|
SCB_MDEF = 0x00010000,
|
||||||
#define SCB_ASPD 0x00080000
|
SCB_MDEF2 = 0x00020000,
|
||||||
#define SCB_DSPD 0x00100000
|
SCB_SPEED = 0x00040000,
|
||||||
#define SCB_CRI 0x00200000
|
SCB_ASPD = 0x00080000,
|
||||||
#define SCB_FLEE2 0x00400000
|
SCB_DSPD = 0x00100000,
|
||||||
#define SCB_ATK_ELE 0x00800000
|
SCB_CRI = 0x00200000,
|
||||||
#define SCB_DEF_ELE 0x01000000
|
SCB_FLEE2 = 0x00400000,
|
||||||
#define SCB_MODE 0x02000000
|
SCB_ATK_ELE = 0x00800000,
|
||||||
#define SCB_SIZE 0x04000000
|
SCB_DEF_ELE = 0x01000000,
|
||||||
#define SCB_RACE 0x08000000
|
SCB_MODE = 0x02000000,
|
||||||
#define SCB_RANGE 0x10000000
|
SCB_SIZE = 0x04000000,
|
||||||
#define SCB_REGEN 0x20000000
|
SCB_RACE = 0x08000000,
|
||||||
//SCB_DYE means the sc should force cloth-dye change to 0 to avoid client crashes.
|
SCB_RANGE = 0x10000000,
|
||||||
#define SCB_DYE 0x40000000
|
SCB_REGEN = 0x20000000,
|
||||||
#define SCB_PC 0x80000000
|
SCB_DYE = 0x40000000, // force cloth-dye change to 0 to avoid client crashes.
|
||||||
#define SCB_ALL 0x3FFFFFFF
|
SCB_PC = 0x80000000,
|
||||||
|
|
||||||
|
SCB_ALL = 0x3FFFFFFF
|
||||||
|
};
|
||||||
|
|
||||||
//Define to determine who gets HP/SP consumed on doing skills/etc. [Skotlex]
|
//Define to determine who gets HP/SP consumed on doing skills/etc. [Skotlex]
|
||||||
#define BL_CONSUME (BL_PC|BL_HOM)
|
#define BL_CONSUME (BL_PC|BL_HOM)
|
||||||
@ -681,7 +682,9 @@ struct status_change {
|
|||||||
struct status_change_entry *data[SC_MAX];
|
struct status_change_entry *data[SC_MAX];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// for looking up associated data
|
||||||
|
int status_skill2sc(int skill);
|
||||||
|
int status_sc2skill(int sc);
|
||||||
|
|
||||||
int status_damage(struct block_list *src,struct block_list *target,int hp,int sp, int walkdelay, int flag);
|
int status_damage(struct block_list *src,struct block_list *target,int hp,int sp, int walkdelay, int flag);
|
||||||
//Define for standard HP damage attacks.
|
//Define for standard HP damage attacks.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user