Implement NPC_ALL_STAT_DOWN (#7637)

This commit is contained in:
eppc0330 2023-03-13 14:25:02 +09:00 committed by GitHub
parent b3881bd1fc
commit bee2c27d78
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 57 additions and 0 deletions

View File

@ -17907,6 +17907,18 @@ Body:
NoReiteration: true
NoOverlap: true
Status: PropertyWalk
- Id: 751
Name: NPC_ALL_STAT_DOWN
Description: Decrease All Stats
MaxLevel: 5
TargetType: Attack
DamageFlags:
NoDamage: true
Flags:
IsNpc: true
Range: 9
Duration1: 10000
Status: ALL_STAT_DOWN
- Id: 752
Name: NPC_GRADUAL_GRAVITY
Description: Increased Gravity

View File

@ -8556,3 +8556,16 @@ Body:
DisplayPc: true
NoDispell: true
NoClearance: true
- Status: ALL_STAT_DOWN
Icon: EFST_ALL_STAT_DOWN
DurationLookup: NPC_ALL_STAT_DOWN
CalcFlags:
Str: true
Agi: true
Vit: true
Int: true
Dex: true
Luk: true
Flags:
NoDispell: true
NoClearance: true

View File

@ -1873,6 +1873,7 @@
export_constant(SC_GOLDENE_TONE);
export_constant(SC_TEMPERING);
export_constant(SC_GRADUAL_GRAVITY);
export_constant(SC_ALL_STAT_DOWN);
#ifdef RENEWAL
export_constant(SC_EXTREMITYFIST2);

View File

@ -7822,6 +7822,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
break;
case NPC_ALL_STAT_DOWN:
status_change_start(src, bl, type, 10000, skill_lv, 0, 0, 0, skill_get_time(skill_id, skill_lv), SCSTART_NOAVOID|SCSTART_NOTICKDEF|SCSTART_NORATEDEF);
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
break;
#ifdef RENEWAL
// EDP also give +25% WATK poison pseudo element to user.
case ASC_EDP:

View File

@ -6412,7 +6412,10 @@ static unsigned short status_calc_str(struct block_list *bl, status_change *sc,
str += sc->getSCE(SC_ALMIGHTY)->val1;
if (sc->getSCE(SC_ULTIMATECOOK))
str += sc->getSCE(SC_ULTIMATECOOK)->val1;
if (sc->getSCE(SC_ALL_STAT_DOWN))
str -= sc->getSCE(SC_ALL_STAT_DOWN)->val2;
//TODO: Stat points should be able to be decreased below 0
return (unsigned short)cap_value(str,0,USHRT_MAX);
}
@ -6496,7 +6499,10 @@ static unsigned short status_calc_agi(struct block_list *bl, status_change *sc,
agi += sc->getSCE(SC_ALMIGHTY)->val1;
if (sc->getSCE(SC_ULTIMATECOOK))
agi += sc->getSCE(SC_ULTIMATECOOK)->val1;
if (sc->getSCE(SC_ALL_STAT_DOWN))
agi -= sc->getSCE(SC_ALL_STAT_DOWN)->val2;
//TODO: Stat points should be able to be decreased below 0
return (unsigned short)cap_value(agi,0,USHRT_MAX);
}
@ -6572,7 +6578,10 @@ static unsigned short status_calc_vit(struct block_list *bl, status_change *sc,
vit += sc->getSCE(SC_ULTIMATECOOK)->val1;
if (sc->getSCE(SC_CUP_OF_BOZA))
vit += 10;
if (sc->getSCE(SC_ALL_STAT_DOWN))
vit -= sc->getSCE(SC_ALL_STAT_DOWN)->val2;
//TODO: Stat points should be able to be decreased below 0
return (unsigned short)cap_value(vit,0,USHRT_MAX);
}
@ -6661,7 +6670,10 @@ static unsigned short status_calc_int(struct block_list *bl, status_change *sc,
int_ += sc->getSCE(SC_ALMIGHTY)->val1;
if (sc->getSCE(SC_ULTIMATECOOK))
int_ += sc->getSCE(SC_ULTIMATECOOK)->val1;
if (sc->getSCE(SC_ALL_STAT_DOWN))
int_ -= sc->getSCE(SC_ALL_STAT_DOWN)->val2;
//TODO: Stat points should be able to be decreased below 0
return (unsigned short)cap_value(int_,0,USHRT_MAX);
}
@ -6747,7 +6759,10 @@ static unsigned short status_calc_dex(struct block_list *bl, status_change *sc,
dex += sc->getSCE(SC_ALMIGHTY)->val1;
if (sc->getSCE(SC_ULTIMATECOOK))
dex += sc->getSCE(SC_ULTIMATECOOK)->val1;
if (sc->getSCE(SC_ALL_STAT_DOWN))
dex -= sc->getSCE(SC_ALL_STAT_DOWN)->val2;
//TODO: Stat points should be able to be decreased below 0
return (unsigned short)cap_value(dex,0,USHRT_MAX);
}
@ -6821,7 +6836,10 @@ static unsigned short status_calc_luk(struct block_list *bl, status_change *sc,
luk += sc->getSCE(SC_ULTIMATECOOK)->val1;
if (sc->getSCE(SC_MYSTICPOWDER))
luk += 10;
if (sc->getSCE(SC_ALL_STAT_DOWN))
luk -= sc->getSCE(SC_ALL_STAT_DOWN)->val2;
//TODO: Stat points should be able to be decreased below 0
return (unsigned short)cap_value(luk,0,USHRT_MAX);
}
@ -10895,6 +10913,12 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
tick_time = status_get_sc_interval(type);
val4 = tick - tick_time; // Remaining time
break;
case SC_ALL_STAT_DOWN:
val2 = 20 * val1;
if( val1 < skill_get_max( NPC_ALL_STAT_DOWN ) ){
val2 -= 10;
}
break;
case SC_BOSSMAPINFO:
if( sd != NULL ) {
struct mob_data *boss_md = map_getmob_boss(bl->m); // Search for Boss on this Map

View File

@ -1264,6 +1264,7 @@ enum sc_type : int16 {
SC_TEMPERING,
SC_GRADUAL_GRAVITY,
SC_ALL_STAT_DOWN,
#ifdef RENEWAL
SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled