|
@@ -1211,15 +1211,7 @@ static int skill_area_temp[8];
|
|
|
/*==========================================
|
|
|
* Add effect to skill when hit succesfully target
|
|
|
*------------------------------------------*/
|
|
|
-int skill_additional_effect(struct block_list* src, struct block_list *bl, uint16 skill_id, uint16 skill_lv, int attack_type, enum damage_lv dmg_lv, t_tick tick)
|
|
|
-{
|
|
|
- map_session_data *sd, *dstsd;
|
|
|
- struct mob_data *md, *dstmd;
|
|
|
- struct status_data *sstatus, *tstatus;
|
|
|
- status_change *sc, *tsc;
|
|
|
- int skill;
|
|
|
- int rate;
|
|
|
-
|
|
|
+int skill_additional_effect( struct block_list* src, struct block_list *bl, uint16 skill_id, uint16 skill_lv, int attack_type, enum damage_lv dmg_lv, t_tick tick ){
|
|
|
nullpo_ret(src);
|
|
|
nullpo_ret(bl);
|
|
|
|
|
@@ -1228,15 +1220,15 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
|
|
if( dmg_lv < ATK_BLOCK ) // Don't apply effect if miss.
|
|
|
return 0;
|
|
|
|
|
|
- sd = BL_CAST(BL_PC, src);
|
|
|
- md = BL_CAST(BL_MOB, src);
|
|
|
- dstsd = BL_CAST(BL_PC, bl);
|
|
|
- dstmd = BL_CAST(BL_MOB, bl);
|
|
|
+ map_session_data* sd = BL_CAST( BL_PC, src );
|
|
|
+ mob_data* md = BL_CAST( BL_MOB, src );
|
|
|
+ map_session_data* dstsd = BL_CAST( BL_PC, bl );
|
|
|
+ mob_data* dstmd = BL_CAST( BL_MOB, bl );
|
|
|
|
|
|
- sc = status_get_sc(src);
|
|
|
- tsc = status_get_sc(bl);
|
|
|
- sstatus = status_get_status_data(src);
|
|
|
- tstatus = status_get_status_data(bl);
|
|
|
+ status_change* sc = status_get_sc( src );
|
|
|
+ status_change* tsc = status_get_sc( bl );
|
|
|
+ status_data* sstatus = status_get_status_data( src );
|
|
|
+ status_data* tstatus = status_get_status_data( bl );
|
|
|
|
|
|
// Taekwon combos activate on traps, so we need to check them even for targets that don't have status
|
|
|
if (sd && skill_id == 0 && !(attack_type&BF_SKILL) && sc) {
|
|
@@ -1257,7 +1249,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
|
|
(2000 - 4 * sstatus->agi - 2 * sstatus->dex)))
|
|
|
; //Stance triggered
|
|
|
else if (sc->getSCE(SC_READYCOUNTER)) { //additional chance from SG_FRIEND [Komurka]
|
|
|
- rate = 20;
|
|
|
+ int rate = 20;
|
|
|
if (sc->getSCE(SC_SKILLRATE_UP) && sc->getSCE(SC_SKILLRATE_UP)->val1 == TK_COUNTER) {
|
|
|
rate += rate*sc->getSCE(SC_SKILLRATE_UP)->val2 / 100;
|
|
|
status_change_end(src, SC_SKILLRATE_UP);
|
|
@@ -1282,7 +1274,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
|
|
) {
|
|
|
// Trigger status effects
|
|
|
for (const auto &it : sd->addeff) {
|
|
|
- rate = it.rate;
|
|
|
+ int rate = it.rate;
|
|
|
if( attack_type&BF_LONG ) // Any ranged physical attack takes status arrows into account (Grimtooth...) [DracoRPG]
|
|
|
rate += it.arrow_rate;
|
|
|
if( !rate )
|
|
@@ -1329,9 +1321,9 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
|
|
continue;
|
|
|
|
|
|
if (it.target&ATF_TARGET)
|
|
|
- status_change_start(src, bl, it.sc, rate, 7, 0, 0, 0, it.duration, SCSTART_NONE, 100);
|
|
|
+ status_change_start(src, bl, it.sc, it.rate, 7, 0, 0, 0, it.duration, SCSTART_NONE, 100);
|
|
|
if (it.target&ATF_SELF)
|
|
|
- status_change_start(src, src, it.sc, rate, 7, 0, 0, 0, it.duration, SCSTART_NONE, 100);
|
|
|
+ status_change_start(src, src, it.sc, it.rate, 7, 0, 0, 0, it.duration, SCSTART_NONE, 100);
|
|
|
}
|
|
|
//"While the damage can be blocked by Pneuma, the chance to break armor remains", irowiki. [Cydh]
|
|
|
if (dmg_lv == ATK_BLOCK && skill_id == AM_ACIDTERROR) {
|
|
@@ -1355,8 +1347,12 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
|
|
if( attack_type&BF_SKILL )
|
|
|
break; // If a normal attack is a skill, it's splash damage. [Inkfish]
|
|
|
if(sd) {
|
|
|
+ int skill;
|
|
|
+
|
|
|
// Automatic trigger of Blitz Beat
|
|
|
if (pc_isfalcon(sd) && sd->status.weapon == W_BOW && (skill = pc_checkskill(sd, HT_BLITZBEAT)) > 0 && rnd() % 1000 <= sstatus->luk * 10 / 3 + 1) {
|
|
|
+ int rate;
|
|
|
+
|
|
|
if ((sd->class_ & MAPID_THIRDMASK) == MAPID_RANGER)
|
|
|
rate = 5;
|
|
|
else
|
|
@@ -1366,7 +1362,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
|
|
}
|
|
|
// Automatic trigger of Warg Strike
|
|
|
if (pc_iswug(sd) && (skill = pc_checkskill(sd, RA_WUGSTRIKE)) > 0) {
|
|
|
- rate = sstatus->luk * 10 / 3 + 1;
|
|
|
+ int rate = sstatus->luk * 10 / 3 + 1;
|
|
|
|
|
|
if (pc_isfalcon(sd))
|
|
|
rate = rate / 3;
|
|
@@ -1376,7 +1372,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
|
|
}
|
|
|
// Automatic trigger of Hawk Rush
|
|
|
if (pc_isfalcon(sd) && sd->status.weapon == W_BOW && (skill = pc_checkskill(sd, WH_HAWKRUSH)) > 0) {
|
|
|
- rate = sstatus->con * 10 / 3 + 1;
|
|
|
+ int rate = sstatus->con * 10 / 3 + 1;
|
|
|
|
|
|
rate += rate * (20 * pc_checkskill(sd, WH_NATUREFRIENDLY)) / 100;
|
|
|
|
|
@@ -1601,16 +1597,23 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
|
|
status_change_start(src, bl, SC_SLEEP, (sstatus->int_ * 2 + rnd_value(100, 300)) * 10, skill_lv, 0, 0, 0, skill_get_time2(skill_id, skill_lv), SCSTART_NONE);
|
|
|
break;
|
|
|
|
|
|
- case DC_UGLYDANCE:
|
|
|
- rate = 5+5*skill_lv;
|
|
|
- if(sd && (skill=pc_checkskill(sd,DC_DANCINGLESSON)))
|
|
|
- rate += 5+skill;
|
|
|
#ifdef RENEWAL
|
|
|
- status_zap(bl, 0, 2 * skill_lv + 10); // !TODO: How does caster's DEX/AGI play a role?
|
|
|
+ case DC_UGLYDANCE:
|
|
|
+ // !TODO: How does caster's DEX/AGI play a role?
|
|
|
+ status_zap( bl, 0, 2 * skill_lv + 10 );
|
|
|
+ break;
|
|
|
#else
|
|
|
- status_zap(bl, 0, rate);
|
|
|
+ case DC_UGLYDANCE: {
|
|
|
+ int rate = 5 + 5 * skill_lv;
|
|
|
+ int skill = pc_checkskill( sd, DC_DANCINGLESSON );
|
|
|
+
|
|
|
+ if( skill > 0 ){
|
|
|
+ rate += 5 + skill;
|
|
|
+ }
|
|
|
+
|
|
|
+ status_zap( bl, 0, rate );
|
|
|
+ } break;
|
|
|
#endif
|
|
|
- break;
|
|
|
case SL_STUN:
|
|
|
if (tstatus->size==SZ_MEDIUM) //Only stuns mid-sized mobs.
|
|
|
sc_start(src,bl,SC_STUN,(30+10*skill_lv),skill_lv,skill_get_time(skill_id,skill_lv));
|
|
@@ -1658,7 +1661,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
|
|
case NPC_MENTALBREAKER:
|
|
|
{ //Based on observations by Tharis, Mental Breaker should do SP damage
|
|
|
//equal to Matk*skLevel.
|
|
|
- rate = sstatus->matk_min;
|
|
|
+ int rate = sstatus->matk_min;
|
|
|
if (rate < sstatus->matk_max)
|
|
|
rate += rnd()%(sstatus->matk_max - sstatus->matk_min);
|
|
|
rate*=skill_lv;
|
|
@@ -1884,8 +1887,8 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
|
|
case GC_WEAPONCRUSH:
|
|
|
skill_castend_nodamage_id(src,bl,skill_id,skill_lv,tick,BCT_ENEMY);
|
|
|
break;
|
|
|
- case LG_PINPOINTATTACK:
|
|
|
- rate = 30 + 5 * ((sd) ? pc_checkskill(sd,LG_PINPOINTATTACK) : skill_lv) + (status_get_agi(src) + status_get_lv(src)) / 10;
|
|
|
+ case LG_PINPOINTATTACK: {
|
|
|
+ int rate = 30 + 5 * ((sd) ? pc_checkskill(sd,LG_PINPOINTATTACK) : skill_lv) + (status_get_agi(src) + status_get_lv(src)) / 10;
|
|
|
switch( skill_lv ) {
|
|
|
case 1:
|
|
|
sc_start2(src,bl,SC_BLEEDING,rate,skill_lv,src->id,skill_get_time(skill_id,skill_lv));
|
|
@@ -1903,7 +1906,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
|
|
skill_break_equip(src, bl, EQP_WEAPON, rate * 100, BCT_ENEMY);
|
|
|
break;
|
|
|
}
|
|
|
- break;
|
|
|
+ } break;
|
|
|
|
|
|
case LG_MOONSLASHER:
|
|
|
sc_start(src,src,SC_OVERBRANDREADY,100,skill_lv,skill_get_time2(skill_id,skill_lv));
|
|
@@ -1942,12 +1945,12 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
|
|
case SO_EARTHGRAVE:
|
|
|
sc_start2(src,bl, SC_BLEEDING, 5 * skill_lv, skill_lv, src->id, skill_get_time2(skill_id, skill_lv)); // Need official rate. [LimitLine]
|
|
|
break;
|
|
|
- case SO_DIAMONDDUST:
|
|
|
- rate = 5 + 5 * skill_lv;
|
|
|
+ case SO_DIAMONDDUST: {
|
|
|
+ int rate = 5 + 5 * skill_lv;
|
|
|
if( sc && sc->getSCE(SC_COOLER_OPTION) )
|
|
|
rate += (sd ? sd->status.job_level / 5 : 0);
|
|
|
sc_start(src,bl, SC_CRYSTALIZE, rate, skill_lv, skill_get_time2(skill_id, skill_lv));
|
|
|
- break;
|
|
|
+ } break;
|
|
|
case SO_VARETYR_SPEAR:
|
|
|
sc_start(src,bl, SC_STUN, 5 * skill_lv, skill_lv, skill_get_time(skill_id, skill_lv));
|
|
|
break;
|
|
@@ -1987,8 +1990,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
|
|
sc_start2(src,bl, SC_BLEEDING, 25, skill_lv, src->id, skill_get_time(skill_id,skill_lv));
|
|
|
break;
|
|
|
case EL_STONE_HAMMER:
|
|
|
- rate = 10 * skill_lv;
|
|
|
- sc_start(src,bl, SC_STUN, rate, skill_lv, skill_get_time(skill_id,skill_lv));
|
|
|
+ sc_start(src, bl, SC_STUN, 10 * skill_lv, skill_lv, skill_get_time(skill_id, skill_lv));
|
|
|
break;
|
|
|
case EL_ROCK_CRUSHER:
|
|
|
sc_start(src,bl, SC_ROCK_CRUSHER,50,skill_lv,skill_get_time(EL_ROCK_CRUSHER,skill_lv));
|
|
@@ -2222,7 +2224,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
|
|
|
|
|
// Coma
|
|
|
if (sd && sd->special_state.bonus_coma && (!md || util::vector_exists(status_get_race2(&md->bl), RC2_GVG) || status_get_class(&md->bl) != CLASS_BATTLEFIELD)) {
|
|
|
- rate = 0;
|
|
|
+ int rate = 0;
|
|
|
//! TODO: Filter the skills that shouldn't inflict coma bonus, to avoid some non-damage skills inflict coma. [Cydh]
|
|
|
if (!skill_id || !skill_get_nk(skill_id, NK_NODAMAGE)) {
|
|
|
rate += sd->indexed_bonus.coma_class[tstatus->class_] + sd->indexed_bonus.coma_class[CLASS_ALL];
|
|
@@ -2241,7 +2243,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
|
|
{ // Breaking Equipment
|
|
|
if( sd && battle_config.equip_self_break_rate )
|
|
|
{ // Self weapon breaking
|
|
|
- rate = battle_config.equip_natural_break_rate;
|
|
|
+ int rate = battle_config.equip_natural_break_rate;
|
|
|
#ifndef RENEWAL
|
|
|
if( sc )
|
|
|
{
|
|
@@ -2257,7 +2259,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
|
|
if( battle_config.equip_skill_break_rate && skill_id != WS_CARTTERMINATION && skill_id != ITM_TOMAHAWK )
|
|
|
{ // Cart Termination/Tomahawk won't trigger breaking data. Why? No idea, go ask Gravity.
|
|
|
// Target weapon breaking
|
|
|
- rate = 0;
|
|
|
+ int rate = 0;
|
|
|
if( sd )
|
|
|
rate += sd->bonus.break_weapon_rate;
|
|
|
if (sc) {
|
|
@@ -2293,6 +2295,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
|
|
|
|
|
if( sd && sd->ed && sc && !status_isdead(bl) && !skill_id ) {
|
|
|
struct unit_data *ud = unit_bl2ud(src);
|
|
|
+ int skill;
|
|
|
|
|
|
if( sc->getSCE(SC_WILD_STORM_OPTION) )
|
|
|
skill = sc->getSCE(SC_WILD_STORM_OPTION)->val2;
|
|
@@ -2309,11 +2312,11 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
|
|
skill_castend_damage_id(src, bl, skill, 5, tick, 0);
|
|
|
|
|
|
if (ud) {
|
|
|
- rate = skill_delayfix(src, skill, skill_lv);
|
|
|
- if (DIFF_TICK(ud->canact_tick, tick + rate) < 0){
|
|
|
- ud->canact_tick = i64max(tick + rate, ud->canact_tick);
|
|
|
+ int delay = skill_delayfix(src, skill, skill_lv);
|
|
|
+ if (DIFF_TICK(ud->canact_tick, tick + delay) < 0){
|
|
|
+ ud->canact_tick = i64max(tick + delay, ud->canact_tick);
|
|
|
if ( battle_config.display_status_timers )
|
|
|
- clif_status_change(src, EFST_POSTDELAY, 1, rate, 0, 0, 0);
|
|
|
+ clif_status_change(src, EFST_POSTDELAY, 1, delay, 0, 0, 0);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -2328,7 +2331,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
|
|
((it.battle_flag)&attack_type)&BF_SKILLMASK))
|
|
|
continue; // one or more trigger conditions were not fulfilled
|
|
|
|
|
|
- skill = it.id;
|
|
|
+ int skill = it.id;
|
|
|
|
|
|
sd->state.autocast = 1;
|
|
|
if ( skill_isNotOk(skill, sd) ) {
|
|
@@ -2342,7 +2345,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
|
|
if (it.flag & AUTOSPELL_FORCE_RANDOM_LEVEL)
|
|
|
autospl_skill_lv = rnd_value( 1, autospl_skill_lv );
|
|
|
|
|
|
- rate = (!sd->state.arrow_atk) ? it.rate : it.rate / 2;
|
|
|
+ int rate = (!sd->state.arrow_atk) ? it.rate : it.rate / 2;
|
|
|
|
|
|
if (rnd()%1000 >= rate)
|
|
|
continue;
|