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:
ultramage 2008-03-25 21:41:31 +00:00
parent 9c07918456
commit e2960e9af8
7 changed files with 427 additions and 449 deletions

View File

@ -8219,7 +8219,7 @@ void clif_parse_GlobalMessage(int fd, struct map_session_data* sd)
if( skillnotok(MO_EXPLOSIONSPIRITS,sd) )
break; //Do not override the noskill mapflag. [Skotlex]
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]
sd->state.snovice_call_flag = 0;
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){
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)));
}
}

View File

@ -307,7 +307,7 @@ int pc_setrestartvalue(struct map_session_data *sd,int type)
if(sd->state.snovice_dead_flag == 1) { // [Celest]
status_heal(&sd->bl, status->max_hp, status->max_sp, 1);
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
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)
@ -3781,7 +3781,7 @@ int pc_checkallowskill(struct map_session_data *sd)
for (i = 0; i < ARRAYLENGTH(scw_list); i++)
{ // Skills requiring specific weapon types
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);
}
@ -4231,18 +4231,18 @@ int pc_checkbaselevelup(struct map_session_data *sd)
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,SkillStatusChangeTable(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,SkillStatusChangeTable(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_KYRIE),100,1,skill_get_time(PR_KYRIE,1));
sc_start(&sd->bl,status_skill2sc(PR_IMPOSITIO),100,1,skill_get_time(PR_IMPOSITIO,1));
sc_start(&sd->bl,status_skill2sc(PR_MAGNIFICAT),100,1,skill_get_time(PR_MAGNIFICAT,1));
sc_start(&sd->bl,status_skill2sc(PR_GLORIA),100,1,skill_get_time(PR_GLORIA,1));
sc_start(&sd->bl,status_skill2sc(PR_SUFFRAGIUM),100,1,skill_get_time(PR_SUFFRAGIUM,1));
if (sd->state.snovice_dead_flag == 2)
sd->state.snovice_dead_flag = 0; //Reenable steelbody resurrection on dead.
} else
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,SkillStatusChangeTable(AL_BLESSING),100,10,600000);
sc_start(&sd->bl,status_skill2sc(AL_INCAGI),100,10,600000);
sc_start(&sd->bl,status_skill2sc(AL_BLESSING),100,10,600000);
}
clif_misceffect(&sd->bl,0);
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);
if(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;
}
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;
if(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;
}
@ -5627,7 +5627,7 @@ int pc_jobchange(struct map_session_data *sd,int job, int upper)
int id;
for(i = 0; i < MAX_SKILL_TREE && (id = skill_tree[class_][i].id) > 0; i++) {
//Remove status specific to your current tree skills.
id = SkillStatusChangeTable(id);
id = status_skill2sc(id);
if (id > SC_COMMON_MAX && sd->sc.data[id])
status_change_end(&sd->bl, id, -1);
}

View File

@ -8110,9 +8110,9 @@ BUILDIN_FUNC(sc_start)
else
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
tick = skill_get_time(StatusSkillChangeTable[type], val1);
tick = skill_get_time(status_sc2skill(type), val1);
}
if( potion_flag == 1 && potion_target )
@ -8148,9 +8148,9 @@ BUILDIN_FUNC(sc_start2)
else
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
tick = skill_get_time(StatusSkillChangeTable[type], val1);
tick = skill_get_time(status_sc2skill(type), val1);
}
if( potion_flag == 1 && potion_target )
@ -8190,9 +8190,9 @@ BUILDIN_FUNC(sc_start4)
else
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
tick = skill_get_time(StatusSkillChangeTable[type], val1);
tick = skill_get_time(status_sc2skill(type), val1);
}
if( potion_flag == 1 && potion_target )

View File

@ -61,7 +61,7 @@ int icewall_unit_pos;
/// Maps skill ids to skill db offsets.
/// 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
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;
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),
skill_get_time2(skillid,skilllv));
break;
@ -649,11 +649,11 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
case NPC_POISON:
case NPC_SILENCEATTACK:
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;
case NPC_ACIDBREATH:
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;
case NPC_BLEEDING:
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;
case LK_JOINTBEAT:
skill = SkillStatusChangeTable(skillid);
skill = status_skill2sc(skillid);
if (tsc->jb_flag) {
sc_start2(bl,skill,(5*skilllv+5),skilllv,tsc->jb_flag&BREAK_FLAGS,skill_get_time2(skillid,skilllv));
tsc->jb_flag = 0;
@ -822,7 +822,7 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
continue; //Range Failed.
}
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)
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.
break;
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;
case GS_FULLBUSTER:
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.
}
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)
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)
where&=~where_list[i];
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.
@ -2630,7 +2630,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
case NPC_MAGICALATTACK:
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;
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);
}
type = SkillStatusChangeTable(skillid);
type = status_skill2sc(skillid);
tsc = status_get_sc(bl);
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_SUPERNOVICE:
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)) {
clif_skill_fail(sd,skillid,0,0);
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);
sc = status_get_sc(src);
type = SkillStatusChangeTable(skillid);
type = status_skill2sc(skillid);
sce = (sc && type != -1)?sc->data[type]:NULL;
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)
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;
skillid = sg->skill_id; //In case the group is deleted, we need to return the correct skill id, still.
switch (sg->unit_id) {
@ -6673,7 +6674,7 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
sc = NULL;
sstatus = NULL;
}
type = SkillStatusChangeTable(sg->skill_id);
type = status_skill2sc(sg->skill_id);
skillid = sg->skill_id;
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, sg=src->group);
sc = status_get_sc(bl);
type = SkillStatusChangeTable(sg->skill_id);
type = status_skill2sc(sg->skill_id);
sce = (sc && type != -1)?sc->data[type]:NULL;
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)
sc = NULL;
type = SkillStatusChangeTable(skill_id);
type = status_skill2sc(skill_id);
sce = (sc && type != -1)?sc->data[type]:NULL;
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 TK_RUN:
case GS_GATLINGFEVER:
if(sc && sc->data[SkillStatusChangeTable(skill)])
if(sc && sc->data[status_skill2sc(skill)])
return 1; //Allow turning off.
break;
@ -7706,7 +7707,7 @@ int skill_check_condition(struct map_session_data* sd, short skill, short lv, in
case TK_READYDOWN:
case TK_READYSTORM:
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.
case TK_JUMPKICK:
if ((sd->class_&MAPID_UPPERMASK) == MAPID_SOUL_LINKER) {

View File

@ -209,6 +209,7 @@ enum { CAST_GROUND, CAST_DAMAGE, CAST_NODAMAGE };
int skill_get_casttype(int id); //[Skotlex]
// スキルデ?タベ?スへのアクセサ
//
int skill_get_index( int id );
int skill_get_type( int id );
int skill_get_hit( int id );
int skill_get_inf( int id );

View File

@ -21,6 +21,7 @@
#include "itemdb.h"
#include "battle.h"
#include "chrif.h"
#include "skill.h"
#include "status.h"
#include "script.h"
#include "unit.h"
@ -34,21 +35,12 @@
#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.
#define RGN_HP 0x01
#define RGN_SP 0x02
#define RGN_SHP 0x04
#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 hp_coefficient[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 char job_bonus[CLASS_COUNT][MAX_LEVEL];
static struct eri *sc_data_ers; //For sc_data entries
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_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
//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;
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;
int sk = skill_get_index(skill);
if( sk == 0 ) {
ShowError("status_skill2sc: Unsupported skill id %d\n", skill);
return -1;
}
if (SkillStatusChangeTableArray[sk]==-1) // skill -> sk [Lance]
SkillStatusChangeTableArray[sk] = sc;
if (StatusSkillChangeTable[sc]==0)
StatusSkillChangeTable[sc] = skill;
return SkillStatusChangeTable[sk];
}
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)
{
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 )
StatusIconChangeTable[sc] = icon;
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)
{
int i;
for (i = 0; i < SC_MAX; i++)
StatusIconChangeTable[i] = SI_BLANK;
for (i = 0; i < MAX_SKILL; i++)
SkillStatusChangeTableArray[i] = -1;
SkillStatusChangeTable[i] = -1;
memset(StatusSkillChangeTable, 0, sizeof(StatusSkillChangeTable));
memset(StatusChangeFlagTable, 0, sizeof(StatusChangeFlagTable));
//First we define the skill for common ailments. These are used in
//skill_additional_effect through sc cards. [Skotlex]
StatusSkillChangeTable[SC_STONE] = MG_STONECURSE;
StatusSkillChangeTable[SC_FREEZE] = MG_FROSTDIVER;
StatusSkillChangeTable[SC_STUN] = NPC_STUNATTACK;
StatusSkillChangeTable[SC_SLEEP] = NPC_SLEEPATTACK;
StatusSkillChangeTable[SC_POISON] = NPC_POISON;
StatusSkillChangeTable[SC_CURSE] = NPC_CURSEATTACK;
StatusSkillChangeTable[SC_SILENCE] = NPC_SILENCEATTACK;
StatusSkillChangeTable[SC_CONFUSION] = DC_WINKCHARM;
StatusSkillChangeTable[SC_BLIND] = NPC_BLINDATTACK;
StatusSkillChangeTable[SC_BLEEDING] = LK_HEADCRUSH;
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;
//First we define the skill for common ailments. These are used in skill_additional_effect through sc cards. [Skotlex]
set_sc( MG_STONECURSE , SC_STONE , SI_BLANK , SCB_DEF_ELE|SCB_DEF|SCB_MDEF );
set_sc( MG_FROSTDIVER , SC_FREEZE , SI_BLANK , SCB_DEF_ELE|SCB_DEF|SCB_MDEF );
set_sc( NPC_STUNATTACK , SC_STUN , SI_BLANK , SCB_NONE );
set_sc( NPC_SLEEPATTACK , SC_SLEEP , SI_BLANK , SCB_NONE );
set_sc( NPC_POISON , SC_POISON , SI_BLANK , SCB_DEF2|SCB_REGEN );
set_sc( NPC_CURSEATTACK , SC_CURSE , SI_BLANK , SCB_LUK|SCB_BATK|SCB_WATK|SCB_SPEED );
set_sc( NPC_SILENCEATTACK , SC_SILENCE , SI_BLANK , SCB_NONE );
set_sc( DC_WINKCHARM , SC_CONFUSION , SI_BLANK , SCB_NONE );
set_sc( NPC_BLINDATTACK , SC_BLIND , SI_BLANK , SCB_HIT|SCB_FLEE );
set_sc( LK_HEADCRUSH , SC_BLEEDING , SI_BLEEDING , SCB_REGEN );
set_sc( NPC_POISON , SC_DPOISON , SI_BLANK , SCB_DEF2|SCB_REGEN );
//The main status definitions
add_sc( SM_BASH , SC_STUN );
set_sc( SM_PROVOKE , SC_PROVOKE , SI_PROVOKE , SCB_DEF|SCB_DEF2|SCB_BATK|SCB_WATK );
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_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_SPEED, SC_SPEED, SI_BLANK, SCB_FLEE); //[orn]
set_sc(HAMI_DEFENCE, SC_DEFENCE, SI_BLANK, SCB_DEF); //[orn]
set_sc( HFLI_SPEED , SC_SPEED , SI_BLANK , SCB_FLEE );
set_sc( HAMI_DEFENCE , SC_DEFENCE , SI_BLANK , SCB_DEF );
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 );
@ -418,21 +407,21 @@ void initChangeTables(void)
set_sc( GD_REGENERATION , SC_REGENERATION , SI_BLANK , SCB_REGEN );
// Storing the target job rather than simply SC_SPIRIT simplifies code later on.
SkillStatusChangeTableArray[SL_ALCHEMIST] = MAPID_ALCHEMIST,
SkillStatusChangeTableArray[SL_MONK] = MAPID_MONK,
SkillStatusChangeTableArray[SL_STAR] = MAPID_STAR_GLADIATOR,
SkillStatusChangeTableArray[SL_SAGE] = MAPID_SAGE,
SkillStatusChangeTableArray[SL_CRUSADER] = MAPID_CRUSADER,
SkillStatusChangeTableArray[SL_SUPERNOVICE] = MAPID_SUPER_NOVICE,
SkillStatusChangeTableArray[SL_KNIGHT] = MAPID_KNIGHT,
SkillStatusChangeTableArray[SL_WIZARD] = MAPID_WIZARD,
SkillStatusChangeTableArray[SL_PRIEST] = MAPID_PRIEST,
SkillStatusChangeTableArray[SL_BARDDANCER] = MAPID_BARDDANCER,
SkillStatusChangeTableArray[SL_ROGUE] = MAPID_ROGUE,
SkillStatusChangeTableArray[SL_ASSASIN] = MAPID_ASSASSIN,
SkillStatusChangeTableArray[SL_BLACKSMITH] = MAPID_BLACKSMITH,
SkillStatusChangeTableArray[SL_HUNTER] = MAPID_HUNTER,
SkillStatusChangeTableArray[SL_SOULLINKER] = MAPID_SOUL_LINKER,
SkillStatusChangeTable[SL_ALCHEMIST] = MAPID_ALCHEMIST,
SkillStatusChangeTable[SL_MONK] = MAPID_MONK,
SkillStatusChangeTable[SL_STAR] = MAPID_STAR_GLADIATOR,
SkillStatusChangeTable[SL_SAGE] = MAPID_SAGE,
SkillStatusChangeTable[SL_CRUSADER] = MAPID_CRUSADER,
SkillStatusChangeTable[SL_SUPERNOVICE] = MAPID_SUPER_NOVICE,
SkillStatusChangeTable[SL_KNIGHT] = MAPID_KNIGHT,
SkillStatusChangeTable[SL_WIZARD] = MAPID_WIZARD,
SkillStatusChangeTable[SL_PRIEST] = MAPID_PRIEST,
SkillStatusChangeTable[SL_BARDDANCER] = MAPID_BARDDANCER,
SkillStatusChangeTable[SL_ROGUE] = MAPID_ROGUE,
SkillStatusChangeTable[SL_ASSASIN] = MAPID_ASSASSIN,
SkillStatusChangeTable[SL_BLACKSMITH] = MAPID_BLACKSMITH,
SkillStatusChangeTable[SL_HUNTER] = MAPID_HUNTER,
SkillStatusChangeTable[SL_SOULLINKER] = MAPID_SOUL_LINKER,
//Status that don't have a skill associated.
StatusIconChangeTable[SC_WEIGHT50] = SI_WEIGHT50;
@ -446,9 +435,6 @@ void initChangeTables(void)
StatusIconChangeTable[SC_INCSTR] = SI_INCSTR;
StatusIconChangeTable[SC_MIRACLE] = SI_SPIRIT;
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_AGIFOOD] = SI_FOODAGI;
StatusIconChangeTable[SC_VITFOOD] = SI_FOODVIT;
@ -513,19 +499,6 @@ void initChangeTables(void)
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)
{
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:
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;
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);
//HP healing is performing after the calc_status call.
//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
val3 = tick/val4; //val3 holds skill duration
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];
if (src->sc.data[type2])
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--;
}
}
@ -6341,7 +6314,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
DIFF_TICK(gettick(), sce->val4) <= 1000 &&
(!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;
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) {
//Caster has been unlocked... nearby chars need to be unlocked.
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....
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());
@ -6808,7 +6781,7 @@ int status_change_timer(int tid, unsigned int tick, int id, int data)
if (!sc->data[SC_INCSTR]) {
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
*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);
return 0;
@ -7408,7 +7381,7 @@ static int status_natural_heal(DBKey key,void * data,va_list ap)
val*=2;
sd->state.doridori = 0;
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));
if (
(sd->class_&MAPID_UPPERMASK) == MAPID_STAR_GLADIATOR &&

View File

@ -291,8 +291,6 @@ enum sc_type {
SC_COMMONSC_RESIST,
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
enum si_type {
@ -542,41 +540,44 @@ enum {
#define MANNER_NOROOM 0x10
//Define flags for the status_calc_bl function. [Skotlex]
#define SCB_NONE 0x00000000
#define SCB_BASE 0x00000001
#define SCB_MAXHP 0x00000002
#define SCB_MAXSP 0x00000004
#define SCB_STR 0x00000008
#define SCB_AGI 0x00000010
#define SCB_VIT 0x00000020
#define SCB_INT 0x00000040
#define SCB_DEX 0x00000080
#define SCB_LUK 0x00000100
#define SCB_BATK 0x00000200
#define SCB_WATK 0x00000400
#define SCB_MATK 0x00000800
#define SCB_HIT 0x00001000
#define SCB_FLEE 0x00002000
#define SCB_DEF 0x00004000
#define SCB_DEF2 0x00008000
#define SCB_MDEF 0x00010000
#define SCB_MDEF2 0x00020000
#define SCB_SPEED 0x00040000
#define SCB_ASPD 0x00080000
#define SCB_DSPD 0x00100000
#define SCB_CRI 0x00200000
#define SCB_FLEE2 0x00400000
#define SCB_ATK_ELE 0x00800000
#define SCB_DEF_ELE 0x01000000
#define SCB_MODE 0x02000000
#define SCB_SIZE 0x04000000
#define SCB_RACE 0x08000000
#define SCB_RANGE 0x10000000
#define SCB_REGEN 0x20000000
//SCB_DYE means the sc should force cloth-dye change to 0 to avoid client crashes.
#define SCB_DYE 0x40000000
#define SCB_PC 0x80000000
#define SCB_ALL 0x3FFFFFFF
enum scb_flag
{
SCB_NONE = 0x00000000,
SCB_BASE = 0x00000001,
SCB_MAXHP = 0x00000002,
SCB_MAXSP = 0x00000004,
SCB_STR = 0x00000008,
SCB_AGI = 0x00000010,
SCB_VIT = 0x00000020,
SCB_INT = 0x00000040,
SCB_DEX = 0x00000080,
SCB_LUK = 0x00000100,
SCB_BATK = 0x00000200,
SCB_WATK = 0x00000400,
SCB_MATK = 0x00000800,
SCB_HIT = 0x00001000,
SCB_FLEE = 0x00002000,
SCB_DEF = 0x00004000,
SCB_DEF2 = 0x00008000,
SCB_MDEF = 0x00010000,
SCB_MDEF2 = 0x00020000,
SCB_SPEED = 0x00040000,
SCB_ASPD = 0x00080000,
SCB_DSPD = 0x00100000,
SCB_CRI = 0x00200000,
SCB_FLEE2 = 0x00400000,
SCB_ATK_ELE = 0x00800000,
SCB_DEF_ELE = 0x01000000,
SCB_MODE = 0x02000000,
SCB_SIZE = 0x04000000,
SCB_RACE = 0x08000000,
SCB_RANGE = 0x10000000,
SCB_REGEN = 0x20000000,
SCB_DYE = 0x40000000, // force cloth-dye change to 0 to avoid client crashes.
SCB_PC = 0x80000000,
SCB_ALL = 0x3FFFFFFF
};
//Define to determine who gets HP/SP consumed on doing skills/etc. [Skotlex]
#define BL_CONSUME (BL_PC|BL_HOM)
@ -681,7 +682,9 @@ struct status_change {
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);
//Define for standard HP damage attacks.