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) )
|
||||
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)));
|
||||
}
|
||||
}
|
||||
|
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]
|
||||
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);
|
||||
}
|
||||
|
@ -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 )
|
||||
|
@ -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) {
|
||||
|
@ -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 );
|
||||
|
185
src/map/status.c
185
src/map/status.c
@ -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 &&
|
||||
|
@ -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.
|
||||
|
Loading…
x
Reference in New Issue
Block a user