From 5e8ea9ab73382f56714cdf0bb44d336ba7783d20 Mon Sep 17 00:00:00 2001 From: Atemo Date: Sat, 14 Mar 2026 22:17:22 +0100 Subject: [PATCH 1/2] Corrected POW ratio of skill SHC_SAVAGE_IMPACT (#9923) * Corrected POW ratio of skill SHC_SAVAGE_IMPACT when the character has the status SC_SHADOW_EXCEED --- src/map/skills/thief/savageimpact.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/map/skills/thief/savageimpact.cpp b/src/map/skills/thief/savageimpact.cpp index 8bcaf8e3c59..a7ae9d66e2e 100644 --- a/src/map/skills/thief/savageimpact.cpp +++ b/src/map/skills/thief/savageimpact.cpp @@ -17,19 +17,19 @@ void SkillSavageImpact::calculateSkillRatio(const Damage *wd, const block_list * const status_data* sstatus = status_get_status_data(*src); const status_change *sc = status_get_sc(src); - skillratio += -100 + 105 * skill_lv + 5 * sstatus->pow; + skillratio += -100 + 105 * skill_lv; + skillratio += 5 * sstatus->pow; - if( sc != nullptr && sc->getSCE( SC_SHADOW_EXCEED ) ){ - skillratio += 20 * skill_lv + 3 * sstatus->pow; // !TODO: check POW ratio + if( sc != nullptr && sc->hasSCE( SC_SHADOW_EXCEED ) ){ + skillratio += 20 * skill_lv; + skillratio += 2 * sstatus->pow; } RE_LVL_DMOD(100); } void SkillSavageImpact::splashSearch(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32 flag) const { - status_change *sc = status_get_sc(src); - - if( sc && sc->getSCE( SC_CLOAKINGEXCEED ) ){ + if( status_change *sc = status_get_sc(src); sc != nullptr && sc->hasSCE( SC_CLOAKINGEXCEED ) ){ skill_area_temp[0] = 2; status_change_end( src, SC_CLOAKINGEXCEED ); } @@ -42,6 +42,7 @@ void SkillSavageImpact::splashSearch(block_list* src, block_list* target, uint16 // Move the player 1 cell near the target, between the target and the player if (skill_check_unit_movepos(5, src, target->x + dirx[dir], target->y + diry[dir], 0, 1)) clif_blown(src); + clif_skill_nodamage(src, *target, getSkillId(), skill_lv); SkillImplRecursiveDamageSplash::splashSearch(src, target, skill_lv, tick, flag); From 223b4eede6fa8c4f078ec02d088fc8312d9639be Mon Sep 17 00:00:00 2001 From: Atemo Date: Sat, 14 Mar 2026 23:19:51 +0100 Subject: [PATCH 2/2] Added modifyDamageData impl (#9910) * Added modifyDamageData to modify struct Damage data from skills Co-authored-by: Lemongrass3110 --- src/map/battle.cpp | 324 ++---------------- src/map/map-server.vcxproj | 8 + src/map/map-server.vcxproj.filters | 12 + src/map/skill.cpp | 15 +- src/map/skills/acolyte/kiexplosion.cpp | 5 +- src/map/skills/acolyte/kiexplosion.hpp | 1 + .../skills/acolyte/ragingquadrupleblow.cpp | 9 + .../skills/acolyte/ragingquadrupleblow.hpp | 1 + src/map/skills/acolyte/rideinlightening.cpp | 10 + src/map/skills/acolyte/rideinlightening.hpp | 1 + src/map/skills/acolyte/thirdflamebomb.cpp | 4 + src/map/skills/acolyte/thirdflamebomb.hpp | 1 + src/map/skills/acolyte/throwspiritsphere.cpp | 14 + src/map/skills/acolyte/throwspiritsphere.hpp | 1 + src/map/skills/gunslinger/chainaction.cpp | 12 + src/map/skills/gunslinger/chainaction.hpp | 13 + src/map/skills/gunslinger/grounddrift.cpp | 11 + src/map/skills/gunslinger/grounddrift.hpp | 1 + src/map/skills/gunslinger/magazineforone.cpp | 7 + src/map/skills/gunslinger/magazineforone.hpp | 1 + src/map/skills/gunslinger/quickdrawshot.cpp | 10 + src/map/skills/gunslinger/quickdrawshot.hpp | 1 + .../gunslinger/skill_factory_gunslinger.cpp | 3 +- src/map/skills/gunslinger/spiralshooting.cpp | 7 + src/map/skills/gunslinger/spiralshooting.hpp | 1 + .../skills/gunslinger/thevigilanteatnight.cpp | 7 + .../skills/gunslinger/thevigilanteatnight.hpp | 1 + .../homunculus_blazingandfurious.cpp | 9 + .../homunculus_blazingandfurious.hpp | 1 + .../homunculus/homunculus_sonicclaw.cpp | 9 + .../homunculus/homunculus_sonicclaw.hpp | 1 + src/map/skills/mage/coldbolt.cpp | 13 +- src/map/skills/mage/coldbolt.hpp | 1 + src/map/skills/mage/crimsonarrow.cpp | 8 + src/map/skills/mage/crimsonarrow.hpp | 1 + src/map/skills/mage/crystalimpact.cpp | 7 + src/map/skills/mage/crystalimpact.hpp | 1 + src/map/skills/mage/destructivehurricane.cpp | 7 + src/map/skills/mage/destructivehurricane.hpp | 1 + src/map/skills/mage/firebolt.cpp | 12 + src/map/skills/mage/firebolt.hpp | 1 + src/map/skills/mage/firepillar.cpp | 7 + src/map/skills/mage/firepillar.hpp | 1 + src/map/skills/mage/firewall.cpp | 10 + src/map/skills/mage/firewall.hpp | 1 + src/map/skills/mage/hellinferno.cpp | 7 + src/map/skills/mage/hellinferno.hpp | 1 + src/map/skills/mage/lightningbolt.cpp | 12 + src/map/skills/mage/lightningbolt.hpp | 1 + src/map/skills/mage/psychicwave.cpp | 7 + src/map/skills/mage/psychicwave.hpp | 1 + .../mercenary/mercenary_bowlingbash.cpp | 4 + .../mercenary/mercenary_bowlingbash.hpp | 1 + src/map/skills/mercenary/mercenary_pierce.cpp | 8 + src/map/skills/mercenary/mercenary_pierce.hpp | 1 + src/map/skills/merchant/armcannon.cpp | 7 + src/map/skills/merchant/armcannon.hpp | 1 + src/map/skills/merchant/axestomp.cpp | 7 + src/map/skills/merchant/axestomp.hpp | 1 + src/map/skills/merchant/boostknuckle.cpp | 7 + src/map/skills/merchant/boostknuckle.hpp | 1 + src/map/skills/merchant/cartcannon.cpp | 7 + src/map/skills/merchant/cartcannon.hpp | 1 + src/map/skills/merchant/explosivepowder.cpp | 7 + src/map/skills/merchant/explosivepowder.hpp | 1 + src/map/skills/merchant/mayhemicthorns.cpp | 7 + src/map/skills/merchant/mayhemicthorns.hpp | 1 + src/map/skills/merchant/mightysmash.cpp | 7 + src/map/skills/merchant/mightysmash.hpp | 1 + src/map/skills/merchant/powerswing.cpp | 7 + src/map/skills/merchant/powerswing.hpp | 1 + src/map/skills/merchant/vulcanarm.cpp | 7 + src/map/skills/merchant/vulcanarm.hpp | 1 + src/map/skills/ninja/kocrossslash.cpp | 7 + src/map/skills/ninja/kocrossslash.hpp | 1 + src/map/skills/novice/doublebowlingbash.cpp | 6 + src/map/skills/novice/doublebowlingbash.hpp | 1 + src/map/skills/novice/groundgravitation.cpp | 7 + src/map/skills/novice/groundgravitation.hpp | 1 + src/map/skills/novice/jackfrostnova.cpp | 7 + src/map/skills/novice/jackfrostnova.hpp | 1 + src/map/skills/novice/meteorstormbuster.cpp | 7 + src/map/skills/novice/meteorstormbuster.hpp | 1 + src/map/skills/skill_impl.cpp | 4 + src/map/skills/skill_impl.hpp | 5 + src/map/skills/swordman/banishingpoint.cpp | 4 +- src/map/skills/swordman/bowlingbash.cpp | 15 + src/map/skills/swordman/bowlingbash.hpp | 1 + src/map/skills/swordman/counterattack.cpp | 4 + src/map/skills/swordman/counterattack.hpp | 1 + src/map/skills/swordman/overslash.cpp | 8 + src/map/skills/swordman/overslash.hpp | 1 + src/map/skills/swordman/pierce.cpp | 6 + src/map/skills/swordman/pierce.hpp | 1 + .../swordman/servantweapondemolition.cpp | 7 + .../swordman/servantweapondemolition.hpp | 1 + .../skills/swordman/servantweaponphantom.cpp | 7 + .../skills/swordman/servantweaponphantom.hpp | 1 + src/map/skills/swordman/spearstab.cpp | 4 + src/map/skills/swordman/spearstab.hpp | 1 + src/map/skills/swordman/spiralpierce.cpp | 7 + src/map/skills/swordman/spiralpierce.hpp | 1 + src/map/skills/swordman/windcutter.cpp | 12 + src/map/skills/swordman/windcutter.hpp | 1 + src/map/skills/taekwon/allinthesky.cpp | 9 + src/map/skills/taekwon/allinthesky.hpp | 1 + .../taekwon/talismanoffourbearinggod.cpp | 17 + .../taekwon/talismanoffourbearinggod.hpp | 1 + src/map/skills/taekwon/turnkick.cpp | 4 + src/map/skills/taekwon/turnkick.hpp | 1 + src/map/skills/taekwon/warmthofthemoon.cpp | 7 + src/map/skills/taekwon/warmthofthemoon.hpp | 1 + src/map/skills/taekwon/warmthofthestars.cpp | 7 + src/map/skills/taekwon/warmthofthestars.hpp | 1 + src/map/skills/taekwon/warmthofthesun.cpp | 7 + src/map/skills/taekwon/warmthofthesun.hpp | 1 + src/map/skills/thief/abysssquare.cpp | 5 + src/map/skills/thief/abysssquare.hpp | 1 + src/map/skills/thief/backstab.cpp | 9 + src/map/skills/thief/backstab.hpp | 1 + src/map/skills/thief/chasingbreak.cpp | 7 + src/map/skills/thief/chasingbreak.hpp | 1 + src/map/skills/thief/chasingshot.cpp | 7 + src/map/skills/thief/chasingshot.hpp | 1 + src/map/skills/thief/doubleattack.cpp | 12 + src/map/skills/thief/doubleattack.hpp | 13 + src/map/skills/thief/eternalslash.cpp | 7 + src/map/skills/thief/eternalslash.hpp | 1 + src/map/skills/thief/fatalmenace.cpp | 7 + src/map/skills/thief/fatalmenace.hpp | 1 + src/map/skills/thief/frenzyshot.cpp | 8 + src/map/skills/thief/frenzyshot.hpp | 1 + src/map/skills/thief/hitandsliding.cpp | 7 + src/map/skills/thief/hitandsliding.hpp | 1 + src/map/skills/thief/impactcrater.cpp | 7 + src/map/skills/thief/impactcrater.hpp | 1 + src/map/skills/thief/savageimpact.cpp | 4 + src/map/skills/thief/savageimpact.hpp | 1 + src/map/skills/thief/skill_factory_thief.cpp | 3 +- 139 files changed, 671 insertions(+), 310 deletions(-) create mode 100644 src/map/skills/gunslinger/chainaction.cpp create mode 100644 src/map/skills/gunslinger/chainaction.hpp create mode 100644 src/map/skills/thief/doubleattack.cpp create mode 100644 src/map/skills/thief/doubleattack.hpp diff --git a/src/map/battle.cpp b/src/map/battle.cpp index fb3c0ff9789..1ba277a7bd1 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -4451,52 +4451,6 @@ static void battle_calc_multi_attack(struct Damage* wd, block_list *src,block_li sc_start(src,src,SC_QD_SHOT_READY,100,target->id,skill_get_time(RL_QD_SHOT,1)); } } - - switch (skill_id) { - case RK_WINDCUTTER: - if (sd && sd->weapontype1 == W_2HSWORD) - wd->div_ = 2; - break; - case SC_FATALMENACE: - if (sd && sd->weapontype1 == W_DAGGER) - wd->div_++; - break; - case SR_RIDEINLIGHTNING: - wd->div_ = (sd ? max(1, skill_lv) : 1); - break; - case RL_QD_SHOT: - wd->div_ = 1 + (sd ? sd->status.job_level : 1) / 20; - break; - case KO_JYUMONJIKIRI: - if( tsc && tsc->getSCE(SC_JYUMONJIKIRI) ) - wd->div_ = wd->div_ * -1;// needs more info - break; - case MH_BLAZING_AND_FURIOUS: { - homun_data *hd = BL_CAST(BL_HOM, src); - if (hd) { - wd->div_ = hd->homunculus.spiritball; - hom_delspiritball(hd, MAX_SPIRITBALL, 1); - } - break; - } - case ABC_FRENZY_SHOT: - if( rnd_chance( 5 * skill_lv, 100 ) ){ - wd->div_ = 3; - } - break; - case NW_SPIRAL_SHOOTING: - if (sd && sd->weapontype1 == W_GRENADE) - wd->div_ += 1; - break; - case NW_MAGAZINE_FOR_ONE: - if (sd && sd->weapontype1 == W_GATLING) - wd->div_ += 4; - break; - case NW_THE_VIGILANTE_AT_NIGHT: - if (sd && sd->weapontype1 == W_GATLING) - wd->div_ += 3; - break; - } } /** @@ -4627,13 +4581,6 @@ static int32 battle_calc_attack_skill_ratio(struct Damage* wd, block_list *src,b skill->impl->calculateSkillRatio(wd, src, target, skill_lv, skillratio, 0); } - switch(skill_id) { - case SKE_ALL_IN_THE_SKY: - // TODO: refactor - if (status_get_race(target) == RC_DEMIHUMAN || status_get_race(target) == RC_DEMON) - wd->div_ = 3; - break; - } return skillratio; } @@ -5474,162 +5421,14 @@ static struct Damage initialize_weapon_data(const block_list* src, const block_l wd.blewcount += battle_blewcount_bonus(sd, skill_id); if (skill_id) { + // wd.flag from skills wd.flag |= battle_range_type(src, target, skill_id, skill_lv); - switch(skill_id) - { -#ifdef RENEWAL - case RG_BACKSTAP: - if (sd && sd->status.weapon == W_DAGGER) - wd.div_ = 2; - break; - case MO_CHAINCOMBO: - if (sd && sd->status.weapon == W_KNUCKLE) - wd.div_ = -6; - break; -#endif - case MH_SONIC_CRAW: - if(const homun_data* hd = BL_CAST(BL_HOM,src); hd != nullptr){ - wd.div_ = hd->homunculus.spiritball; - } - break; - case MO_FINGEROFFENSIVE: - if (sd) { - if (battle_config.finger_offensive_type) - wd.div_ = 1; -#ifndef RENEWAL - else if ((sd->spiritball + sd->spiritball_old) < wd.div_) - wd.div_ = sd->spiritball + sd->spiritball_old; -#endif - } - break; - - case KN_PIERCE: - case ML_PIERCE: - wd.div_= (wd.div_>0?tstatus->size+1:-(tstatus->size+1)); - break; - - case TF_DOUBLE: //For NPC used skill. - case GS_CHAINACTION: - wd.type = DMG_MULTI_HIT; - break; - - case GS_GROUNDDRIFT: - wd.amotion = sstatus->amotion; - [[fallthrough]]; - case KN_SPEARSTAB: -#ifndef RENEWAL - case KN_BOWLINGBASH: -#endif - case MS_BOWLINGBASH: - case MO_BALKYOUNG: - case TK_TURNKICK: - wd.blewcount = 0; - break; - case SG_SUN_WARM: - case SG_MOON_WARM: - case SG_STAR_WARM: - // A random 0~3 knockback bonus is added to the base knockback - wd.blewcount += rnd_value(0, 3); - break; -#ifdef RENEWAL - case KN_BOWLINGBASH: - if (sd && sd->status.weapon == W_2HSWORD) { - if (wd.miscflag >= 2 && wd.miscflag <= 3) - wd.div_ = 3; - else if (wd.miscflag >= 4) - wd.div_ = 4; - } - break; -#endif - case KN_AUTOCOUNTER: - wd.flag = (wd.flag&~BF_SKILLMASK)|BF_NORMAL; - break; - case LK_SPIRALPIERCE: - if (!sd) wd.flag = (wd.flag&~(BF_RANGEMASK|BF_WEAPONMASK))|BF_LONG|BF_MISC; - break; - case RK_WINDCUTTER: - if (sd && (sd->status.weapon == W_1HSPEAR || sd->status.weapon == W_2HSPEAR)) - wd.flag |= BF_LONG; - break; - case NC_BOOSTKNUCKLE: - case NC_VULCANARM: - case NC_ARMSCANNON: - if (sc && sc->getSCE(SC_ABR_DUAL_CANNON)) - wd.div_ = 2; - break; - case NC_POWERSWING: - if (sc && sc->getSCE(SC_ABR_BATTLE_WARIOR)) - wd.div_ = -2; - break; - case GN_CARTCANNON: - if (sc && sc->getSCE(SC_BIONIC_WOODENWARRIOR)) - wd.div_ = 2; - break; - case DK_SERVANT_W_PHANTOM: - case DK_SERVANT_W_DEMOL: - if (sd && (sd->servantball + sd->servantball_old) < wd.div_) - wd.div_ = sd->servantball + sd->servantball_old; - break; - case IQ_THIRD_FLAME_BOMB: - wd.div_ = min(wd.div_ + wd.miscflag, 3); // Number of hits doesn't go above 3. - break; - case IG_OVERSLASH: - if( wd.miscflag >= 4 ){ - wd.div_ = 7; - }else if( wd.miscflag >= 2 ){ - wd.div_ = 5; - } - break; - case SHC_ETERNAL_SLASH: - if (sc && sc->getSCE(SC_E_SLASH_COUNT)) - wd.div_ = sc->getSCE(SC_E_SLASH_COUNT)->val1; - break; - case SHC_IMPACT_CRATER: - if (sc && sc->getSCE(SC_ROLLINGCUTTER)) - wd.div_ = sc->getSCE(SC_ROLLINGCUTTER)->val1; - break; - case MT_AXE_STOMP: - if (sd && sd->status.weapon == W_2HAXE) - wd.div_ = 3; - break; - case SHC_SAVAGE_IMPACT: - wd.div_ = wd.div_ + wd.miscflag; - break; - case MT_MIGHTY_SMASH: - if (sc && sc->getSCE(SC_AXE_STOMP)) - wd.div_ = 7; - break; - case BO_EXPLOSIVE_POWDER: - if (sc && sc->getSCE(SC_RESEARCHREPORT)) - wd.div_ = 5; - break; - case BO_MAYHEMIC_THORNS: - if (sc && sc->getSCE(SC_RESEARCHREPORT)) - wd.div_ = 4; - break; - case ABC_CHASING_BREAK: - if (sc != nullptr && sc->hasSCE(SC_CHASING)) - wd.div_ = 7; - break; - case ABC_CHASING_SHOT: - if (sc != nullptr && sc->hasSCE(SC_CHASING)) - wd.div_ = 3; - break; - case ABC_HIT_AND_SLIDING: - if (sd != nullptr && sd->status.weapon == W_BOW) - wd.flag |= BF_LONG; - break; - case HN_DOUBLEBOWLINGBASH: - if (wd.miscflag > 1) - wd.div_ += min(4, wd.miscflag); - break; - } } else { - bool is_long = false; - - if (is_skill_using_arrow(src, skill_id) || (sc && sc->getSCE(SC_SOULATTACK))) - is_long = true; - wd.flag |= is_long ? BF_LONG : BF_SHORT; + // wd.flag from basic attacks + if (is_skill_using_arrow(src, skill_id) || (sc != nullptr && sc->hasSCE(SC_SOULATTACK))) + wd.flag |= BF_LONG; + else + wd.flag |= BF_SHORT; } return wd; @@ -5717,6 +5516,11 @@ static struct Damage battle_calc_weapon_attack(block_list *src, block_list *targ wd = initialize_weapon_data(src, target, skill_id, skill_lv, wflag); + // Update Damage data based on skill + if (std::shared_ptr skill = skill_db.find(skill_id); skill != nullptr && skill->impl != nullptr) { + skill->impl->modifyDamageData(wd, *src, *target, skill_lv); + } + right_element = battle_get_weapon_element(&wd, src, target, skill_id, skill_lv, EQI_HAND_R, false); left_element = battle_get_weapon_element(&wd, src, target, skill_id, skill_lv, EQI_HAND_L, false); @@ -6159,50 +5963,6 @@ struct Damage battle_calc_magic_attack(block_list *src,block_list *target,uint16 //Initialize variables that will be used afterwards s_ele = battle_get_magic_element(src, target, skill_id, skill_lv, mflag); - switch(skill_id) { - case WL_HELLINFERNO: - if (mflag & 2) { // ELE_DARK - ad.div_ = -3; - } - break; - case NPC_PSYCHIC_WAVE: - case SO_PSYCHIC_WAVE: - if (sd && (sd->weapontype1 == W_STAFF || sd->weapontype1 == W_2HSTAFF || sd->weapontype1 == W_BOOK)) - ad.div_ = 2; - break; - case AG_DESTRUCTIVE_HURRICANE: - if (sc && sc->getSCE(SC_CLIMAX) && sc->getSCE(SC_CLIMAX)->val1 == 2) - ad.blewcount = 2; - break; - case AG_CRYSTAL_IMPACT: - if (sc && sc->getSCE(SC_CLIMAX) && sc->getSCE(SC_CLIMAX)->val1 == 2) - ad.div_ = 2; - break; - case ABC_ABYSS_SQUARE: - if (mflag == 2) - ad.div_ = 2; - break; - case AG_CRIMSON_ARROW_ATK: - if( sc != nullptr && sc->getSCE( SC_CLIMAX ) ){ - ad.div_ = 2; - } - break; - case SOA_TALISMAN_OF_FOUR_BEARING_GOD: - if (sc != nullptr){ - if (sc->getSCE(SC_T_FIRST_GOD) != nullptr) - ad.div_ = 2; - else if (sc->getSCE(SC_T_SECOND_GOD) != nullptr) - ad.div_ = 3; - else if (sc->getSCE(SC_T_THIRD_GOD) != nullptr) - ad.div_ = 4; - else if (sc->getSCE(SC_T_FOURTH_GOD) != nullptr) - ad.div_ = 5; - else if (sc->getSCE(SC_T_FIFTH_GOD) != nullptr) - ad.div_ = 7; - } - break; - } - //Set miscellaneous data that needs be filled if(sd) { sd->state.arrow_atk = 0; @@ -6212,20 +5972,14 @@ struct Damage battle_calc_magic_attack(block_list *src,block_list *target,uint16 //Skill Range Criteria ad.flag |= battle_range_type(src, target, skill_id, skill_lv); + // Update Damage data based on skill + if (skill != nullptr && skill->impl != nullptr) { + skill->impl->modifyDamageData(ad, *src, *target, skill_lv); + } + //Infinite defense (plant mode) flag.infdef = is_infinite_defense(target, ad.flag)?1:0; - switch(skill_id) { - case MG_FIREWALL: - if (tstatus->def_ele == ELE_FIRE || battle_check_undead(tstatus->race, tstatus->def_ele)) { - ad.blewcount = 0; //No knockback - // Fire and undead units hit by firewall cannot be stopped for 2 seconds - if (unit_data* ud = unit_bl2ud(target); ud != nullptr) - ud->endure_tick = gettick() + 2000; - } - break; - } - if (!flag.infdef) { //No need to do the math for plants int32 skillratio = 100; //Skill dmg modifiers. if (sd != nullptr) @@ -6341,47 +6095,6 @@ struct Damage battle_calc_magic_attack(block_list *src,block_list *target,uint16 skill->impl->calculateSkillRatio(&ad, src, target, skill_lv, skillratio, mflag); } - switch(skill_id) { - case MG_FIREBOLT: - case MG_COLDBOLT: - case MG_LIGHTNINGBOLT: - if (sc) { - // TODO: Refactor - if (sc->getSCE(SC_SPELLFIST) && mflag & BF_SHORT) { - ad.div_ = 1; // ad mods, to make it work similar to regular hits [Xazax] - ad.flag = BF_WEAPON | BF_SHORT; - ad.type = DMG_NORMAL; - } - } - break; - case WZ_FIREPILLAR: - // TODO: Refactor - if (sd && ad.div_ > 0) - ad.div_ *= -1; //For players, damage is divided by number of hits - break; - case HN_GROUND_GRAVITATION: - if (mflag & SKILL_ALTDMG_FLAG) { - // Initial damage - // TODO: refactor / move elsewhere - ad.div_ = -2; - } - break; - case HN_JACK_FROST_NOVA: - if (mflag & SKILL_ALTDMG_FLAG) { - // Initial damage - // TODO: refactor / move elsewhere - ad.div_ = 1; // 1 hit - } - break; - case HN_METEOR_STORM_BUSTER: - if (mflag & SKILL_ALTDMG_FLAG) { - // Fall damage - // TODO: refactor / move elsewhere - ad.div_ = -3; - } - break; - } - if (sc) {// Insignia's increases the damage of offensive magic by a fixed percentage depending on the element. if ((sc->getSCE(SC_FIRE_INSIGNIA) && sc->getSCE(SC_FIRE_INSIGNIA)->val1 == 3 && s_ele == ELE_FIRE) || (sc->getSCE(SC_WATER_INSIGNIA) && sc->getSCE(SC_WATER_INSIGNIA)->val1 == 3 && s_ele == ELE_WATER) || @@ -6733,6 +6446,11 @@ struct Damage battle_calc_misc_attack(block_list *src,block_list *target,uint16 //Skill Range Criteria md.flag |= battle_range_type(src, target, skill_id, skill_lv); + // Update Damage data based on skill + if (skill != nullptr && skill->impl != nullptr) { + skill->impl->modifyDamageData(md, *src, *target, skill_lv); + } + switch (skill_id) { case TF_THROWSTONE: if (sd) diff --git a/src/map/map-server.vcxproj b/src/map/map-server.vcxproj index d3bc60c84db..21361d2f015 100644 --- a/src/map/map-server.vcxproj +++ b/src/map/map-server.vcxproj @@ -532,6 +532,7 @@ + @@ -1431,6 +1432,7 @@ + @@ -2396,6 +2398,9 @@ true + + true + true @@ -5093,6 +5098,9 @@ true + + true + true diff --git a/src/map/map-server.vcxproj.filters b/src/map/map-server.vcxproj.filters index 51e2cf550d2..db3c14bedef 100644 --- a/src/map/map-server.vcxproj.filters +++ b/src/map/map-server.vcxproj.filters @@ -1251,6 +1251,9 @@ Header Files\Skills\Gunslinger + + Header Files\Skills\Gunslinger + Header Files\Skills\Gunslinger @@ -3948,6 +3951,9 @@ Header Files\Skills\Thief + + Header Files\Skills\Thief + Header Files\Skills\Thief @@ -4979,6 +4985,9 @@ Source Files\Skills\Gunslinger + + Source Files\Skills\Gunslinger + Source Files\Skills\Gunslinger @@ -7676,6 +7685,9 @@ Source Files\Skills\Thief + + Source Files\Skills\Thief + Source Files\Skills\Thief diff --git a/src/map/skill.cpp b/src/map/skill.cpp index ffd62cde09e..e1003e277f2 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -1094,7 +1094,7 @@ bool skill_isNotOk_hom(homun_data *hd, uint16 skill_id, uint16 skill_lv) // Blazing And Furious removes all spirit balls after calculating the amount of hits if (skill_id != MH_BLAZING_AND_FURIOUS) - hom_delspiritball(hd, spiritball, 1); + hom_delspiritball(hd, spiritball, 1); // TODO: no update on the client ? } //Use master's criteria. @@ -2964,6 +2964,19 @@ int64 skill_attack (int32 attack_type, block_list* src, block_list *dsrc, block_ sc_start(src, src, SC_CHARGINGPIERCE_COUNT, 100, 1, skill_get_time2(DK_CHARGINGPIERCE, 1)); } break; + case MG_FIREWALL: + if (tstatus->def_ele == ELE_FIRE || battle_check_undead(tstatus->race, tstatus->def_ele)) { + // Fire and undead units hit by firewall cannot be stopped for 2 seconds + if (unit_data* ud = unit_bl2ud(bl); ud != nullptr) + ud->endure_tick = gettick() + 2000; + } + break; + case MH_BLAZING_AND_FURIOUS: + if (homun_data *hd = BL_CAST(BL_HOM, src); hd != nullptr) { + // TODO: no update on the client ? + hom_delspiritball(hd, MAX_SPIRITBALL, 1); + } + break; } //combo handling diff --git a/src/map/skills/acolyte/kiexplosion.cpp b/src/map/skills/acolyte/kiexplosion.cpp index 9611b364af9..a8b530d5c26 100644 --- a/src/map/skills/acolyte/kiexplosion.cpp +++ b/src/map/skills/acolyte/kiexplosion.cpp @@ -10,6 +10,10 @@ SkillKiExplosion::SkillKiExplosion() : SkillImpl(MO_BALKYOUNG) { } +void SkillKiExplosion::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + dmg.blewcount = 0; +} + void SkillKiExplosion::castendNoDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const { //Passive part of the attack. Splash knock-back+stun. [Skotlex] if (skill_area_temp[1] != target->id) { @@ -41,4 +45,3 @@ void SkillKiExplosion::applyAdditionalEffects(block_list* src, block_list* targe if(attack_type&BF_MISC) //70% base stun chance... sc_start(src,target,SC_STUN,70,skill_lv,skill_get_time2(getSkillId(),skill_lv)); } - diff --git a/src/map/skills/acolyte/kiexplosion.hpp b/src/map/skills/acolyte/kiexplosion.hpp index 6628f36018e..640b1cc29af 100644 --- a/src/map/skills/acolyte/kiexplosion.hpp +++ b/src/map/skills/acolyte/kiexplosion.hpp @@ -9,6 +9,7 @@ class SkillKiExplosion : public SkillImpl { public: SkillKiExplosion(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void castendNoDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const override; void castendDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const override; void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override; diff --git a/src/map/skills/acolyte/ragingquadrupleblow.cpp b/src/map/skills/acolyte/ragingquadrupleblow.cpp index e6ae5cc47ba..0ac6281561d 100644 --- a/src/map/skills/acolyte/ragingquadrupleblow.cpp +++ b/src/map/skills/acolyte/ragingquadrupleblow.cpp @@ -10,6 +10,15 @@ SkillRagingQuadrupleBlow::SkillRagingQuadrupleBlow() : WeaponSkillImpl(MO_CHAINCOMBO) { } +void SkillRagingQuadrupleBlow::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { +#ifdef RENEWAL + const map_session_data* sd = BL_CAST(BL_PC, &src); + + if (sd != nullptr && sd->status.weapon == W_KNUCKLE) + dmg.div_ = -6; +#endif +} + void SkillRagingQuadrupleBlow::castendDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const { WeaponSkillImpl::castendDamageId(src, target, skill_lv, tick, flag); status_change_end(src, SC_BLADESTOP); diff --git a/src/map/skills/acolyte/ragingquadrupleblow.hpp b/src/map/skills/acolyte/ragingquadrupleblow.hpp index a8bacf24f8f..68d76d5e2be 100644 --- a/src/map/skills/acolyte/ragingquadrupleblow.hpp +++ b/src/map/skills/acolyte/ragingquadrupleblow.hpp @@ -9,6 +9,7 @@ class SkillRagingQuadrupleBlow : public WeaponSkillImpl { public: SkillRagingQuadrupleBlow(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void castendDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const override; void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override; }; diff --git a/src/map/skills/acolyte/rideinlightening.cpp b/src/map/skills/acolyte/rideinlightening.cpp index 6e9ab435347..f7b0ad79905 100644 --- a/src/map/skills/acolyte/rideinlightening.cpp +++ b/src/map/skills/acolyte/rideinlightening.cpp @@ -12,6 +12,16 @@ SkillRideInLightening::SkillRideInLightening() : SkillImplRecursiveDamageSplash(SR_RIDEINLIGHTNING) { } +void SkillRideInLightening::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const map_session_data* sd = BL_CAST(BL_PC, &src); + + if (sd != nullptr) { + dmg.div_ = max(1, skill_lv); + }else { + dmg.div_ = 1; + } +} + void SkillRideInLightening::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const { const map_session_data* sd = BL_CAST(BL_PC, src); diff --git a/src/map/skills/acolyte/rideinlightening.hpp b/src/map/skills/acolyte/rideinlightening.hpp index bbee7470eee..4766dd37b48 100644 --- a/src/map/skills/acolyte/rideinlightening.hpp +++ b/src/map/skills/acolyte/rideinlightening.hpp @@ -9,6 +9,7 @@ class SkillRideInLightening : public SkillImplRecursiveDamageSplash { public: SkillRideInLightening(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const override; void castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const override; }; diff --git a/src/map/skills/acolyte/thirdflamebomb.cpp b/src/map/skills/acolyte/thirdflamebomb.cpp index dc920b146b7..8ffcb1ee448 100644 --- a/src/map/skills/acolyte/thirdflamebomb.cpp +++ b/src/map/skills/acolyte/thirdflamebomb.cpp @@ -12,6 +12,10 @@ SkillThirdFlameBomb::SkillThirdFlameBomb() : SkillImplRecursiveDamageSplash(IQ_THIRD_FLAME_BOMB) { } +void SkillThirdFlameBomb::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + dmg.div_ = min(dmg.div_ + dmg.miscflag, 3); // Number of hits doesn't go above 3. +} + void SkillThirdFlameBomb::calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& skillratio, int32 mflag) const { const status_data* sstatus = status_get_status_data(*src); diff --git a/src/map/skills/acolyte/thirdflamebomb.hpp b/src/map/skills/acolyte/thirdflamebomb.hpp index 41f41fbfdec..37a7686fdab 100644 --- a/src/map/skills/acolyte/thirdflamebomb.hpp +++ b/src/map/skills/acolyte/thirdflamebomb.hpp @@ -9,6 +9,7 @@ class SkillThirdFlameBomb : public SkillImplRecursiveDamageSplash { public: SkillThirdFlameBomb(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override; void applyAdditionalEffects(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32 attack_type, enum damage_lv dmg_lv) const override; void splashSearch(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32 flag) const override; diff --git a/src/map/skills/acolyte/throwspiritsphere.cpp b/src/map/skills/acolyte/throwspiritsphere.cpp index d7095ce9285..664a93558bb 100644 --- a/src/map/skills/acolyte/throwspiritsphere.cpp +++ b/src/map/skills/acolyte/throwspiritsphere.cpp @@ -5,12 +5,26 @@ #include +#include "map/battle.hpp" #include "map/pc.hpp" #include "map/status.hpp" SkillThrowSpiritSphere::SkillThrowSpiritSphere() : WeaponSkillImpl(MO_FINGEROFFENSIVE) { } +void SkillThrowSpiritSphere::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const map_session_data* sd = BL_CAST(BL_PC, &src); + + if (sd != nullptr) { + if (battle_config.finger_offensive_type) + dmg.div_ = 1; +#ifndef RENEWAL + else if ((sd->spiritball + sd->spiritball_old) < dmg.div_) + dmg.div_ = sd->spiritball + sd->spiritball_old; +#endif + } +} + void SkillThrowSpiritSphere::castendDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const { map_session_data* sd = BL_CAST(BL_PC, src); diff --git a/src/map/skills/acolyte/throwspiritsphere.hpp b/src/map/skills/acolyte/throwspiritsphere.hpp index e5fa5971702..e12690bc69e 100644 --- a/src/map/skills/acolyte/throwspiritsphere.hpp +++ b/src/map/skills/acolyte/throwspiritsphere.hpp @@ -9,6 +9,7 @@ class SkillThrowSpiritSphere : public WeaponSkillImpl { public: SkillThrowSpiritSphere(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void castendDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const override; void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override; }; diff --git a/src/map/skills/gunslinger/chainaction.cpp b/src/map/skills/gunslinger/chainaction.cpp new file mode 100644 index 00000000000..4d9f3f7275e --- /dev/null +++ b/src/map/skills/gunslinger/chainaction.cpp @@ -0,0 +1,12 @@ +// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#include "chainaction.hpp" + +SkillChainAction::SkillChainAction() : WeaponSkillImpl(GS_CHAINACTION) { +} + +void SkillChainAction::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + // For NPC used skill. + dmg.type = DMG_MULTI_HIT; +} diff --git a/src/map/skills/gunslinger/chainaction.hpp b/src/map/skills/gunslinger/chainaction.hpp new file mode 100644 index 00000000000..8db9d024de2 --- /dev/null +++ b/src/map/skills/gunslinger/chainaction.hpp @@ -0,0 +1,13 @@ +// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#pragma once + +#include "../skill_impl.hpp" + +class SkillChainAction : public WeaponSkillImpl { +public: + SkillChainAction(); + + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; +}; diff --git a/src/map/skills/gunslinger/grounddrift.cpp b/src/map/skills/gunslinger/grounddrift.cpp index f15659f2ece..fd3ff95289c 100644 --- a/src/map/skills/gunslinger/grounddrift.cpp +++ b/src/map/skills/gunslinger/grounddrift.cpp @@ -3,9 +3,20 @@ #include "grounddrift.hpp" +#include + +#include "map/status.hpp" + SkillGroundDrift::SkillGroundDrift() : SkillImpl(GS_GROUNDDRIFT) { } +void SkillGroundDrift::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const status_data* sstatus = status_get_status_data(src); + + dmg.amotion = sstatus->amotion; + dmg.blewcount = 0; +} + void SkillGroundDrift::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &base_skillratio, int32 mflag) const { #ifdef RENEWAL base_skillratio += 100 + 20 * skill_lv; diff --git a/src/map/skills/gunslinger/grounddrift.hpp b/src/map/skills/gunslinger/grounddrift.hpp index 921c25f5557..f012f47ef0c 100644 --- a/src/map/skills/gunslinger/grounddrift.hpp +++ b/src/map/skills/gunslinger/grounddrift.hpp @@ -11,6 +11,7 @@ class SkillGroundDrift : public SkillImpl { public: SkillGroundDrift(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &base_skillratio, int32 mflag) const override; void castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const override; }; diff --git a/src/map/skills/gunslinger/magazineforone.cpp b/src/map/skills/gunslinger/magazineforone.cpp index e84e4f558fb..376b362f673 100644 --- a/src/map/skills/gunslinger/magazineforone.cpp +++ b/src/map/skills/gunslinger/magazineforone.cpp @@ -11,6 +11,13 @@ SkillMagazineForOne::SkillMagazineForOne() : WeaponSkillImpl(NW_MAGAZINE_FOR_ONE) { } +void SkillMagazineForOne::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const map_session_data* sd = BL_CAST(BL_PC, &src); + + if (sd != nullptr && sd->weapontype1 == W_GATLING) + dmg.div_ += 4; +} + void SkillMagazineForOne::castendDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const { status_change* sc = status_get_sc(src); diff --git a/src/map/skills/gunslinger/magazineforone.hpp b/src/map/skills/gunslinger/magazineforone.hpp index c64cc48c2f9..8dae115fc86 100644 --- a/src/map/skills/gunslinger/magazineforone.hpp +++ b/src/map/skills/gunslinger/magazineforone.hpp @@ -9,6 +9,7 @@ class SkillMagazineForOne : public WeaponSkillImpl { public: SkillMagazineForOne(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void castendDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const override; void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override; }; diff --git a/src/map/skills/gunslinger/quickdrawshot.cpp b/src/map/skills/gunslinger/quickdrawshot.cpp index a900ba4a73d..16db1941389 100644 --- a/src/map/skills/gunslinger/quickdrawshot.cpp +++ b/src/map/skills/gunslinger/quickdrawshot.cpp @@ -9,6 +9,16 @@ SkillQuickDrawShot::SkillQuickDrawShot() : SkillImpl(RL_QD_SHOT) { } +void SkillQuickDrawShot::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const map_session_data* sd = BL_CAST(BL_PC, &src); + + dmg.div_ = 1; + + if (sd != nullptr) { + dmg.div_ += sd->status.job_level / 20; + } +} + void SkillQuickDrawShot::castendNoDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const { // Remember main target as it will always be hit by this skill skill_area_temp[1] = target->id; diff --git a/src/map/skills/gunslinger/quickdrawshot.hpp b/src/map/skills/gunslinger/quickdrawshot.hpp index 11c2395a1d1..25458d5471b 100644 --- a/src/map/skills/gunslinger/quickdrawshot.hpp +++ b/src/map/skills/gunslinger/quickdrawshot.hpp @@ -9,6 +9,7 @@ class SkillQuickDrawShot : public SkillImpl { public: SkillQuickDrawShot(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void castendNoDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const override; void castendDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const override; }; diff --git a/src/map/skills/gunslinger/skill_factory_gunslinger.cpp b/src/map/skills/gunslinger/skill_factory_gunslinger.cpp index cdd29c82d34..07c3cf9d4e6 100644 --- a/src/map/skills/gunslinger/skill_factory_gunslinger.cpp +++ b/src/map/skills/gunslinger/skill_factory_gunslinger.cpp @@ -14,6 +14,7 @@ #include "basicgrenade.cpp" #include "bindtrap.cpp" #include "bullseye.cpp" +#include "chainaction.cpp" #include "cracker.cpp" #include "crimsonmarker.cpp" #include "desperado.cpp" @@ -62,7 +63,7 @@ std::unique_ptr SkillFactoryGunslinger::create(const e_skill sk case GS_BULLSEYE: return std::make_unique(); case GS_CHAINACTION: - return std::make_unique(skill_id); + return std::make_unique(); case GS_CRACKER: return std::make_unique(); case GS_DESPERADO: diff --git a/src/map/skills/gunslinger/spiralshooting.cpp b/src/map/skills/gunslinger/spiralshooting.cpp index 6676df2696a..6a53f1f39cf 100644 --- a/src/map/skills/gunslinger/spiralshooting.cpp +++ b/src/map/skills/gunslinger/spiralshooting.cpp @@ -12,6 +12,13 @@ SkillSpiralShooting::SkillSpiralShooting() : SkillImpl(NW_SPIRAL_SHOOTING) { } +void SkillSpiralShooting::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const map_session_data* sd = BL_CAST(BL_PC, &src); + + if (sd != nullptr && sd->weapontype1 == W_GRENADE) + dmg.div_ += 1; +} + void SkillSpiralShooting::castendDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const { map_session_data* sd = BL_CAST(BL_PC, src); status_change* sc = status_get_sc(src); diff --git a/src/map/skills/gunslinger/spiralshooting.hpp b/src/map/skills/gunslinger/spiralshooting.hpp index 4b4477dd6f2..619ecf3127a 100644 --- a/src/map/skills/gunslinger/spiralshooting.hpp +++ b/src/map/skills/gunslinger/spiralshooting.hpp @@ -9,6 +9,7 @@ class SkillSpiralShooting : public SkillImpl { public: SkillSpiralShooting(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void castendDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const override; void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override; }; diff --git a/src/map/skills/gunslinger/thevigilanteatnight.cpp b/src/map/skills/gunslinger/thevigilanteatnight.cpp index a885ac6fb6d..cee3897b5df 100644 --- a/src/map/skills/gunslinger/thevigilanteatnight.cpp +++ b/src/map/skills/gunslinger/thevigilanteatnight.cpp @@ -12,6 +12,13 @@ SkillTheVigilanteAtNight::SkillTheVigilanteAtNight() : SkillImpl(NW_THE_VIGILANTE_AT_NIGHT) { } +void SkillTheVigilanteAtNight::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const map_session_data* sd = BL_CAST(BL_PC, &src); + + if (sd != nullptr && sd->weapontype1 == W_GATLING) + dmg.div_ += 3; +} + void SkillTheVigilanteAtNight::castendNoDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const { map_session_data* sd = BL_CAST(BL_PC, src); status_change* sc = status_get_sc(src); diff --git a/src/map/skills/gunslinger/thevigilanteatnight.hpp b/src/map/skills/gunslinger/thevigilanteatnight.hpp index 86d8fd23574..b35fbbe3fc3 100644 --- a/src/map/skills/gunslinger/thevigilanteatnight.hpp +++ b/src/map/skills/gunslinger/thevigilanteatnight.hpp @@ -9,6 +9,7 @@ class SkillTheVigilanteAtNight : public SkillImpl { public: SkillTheVigilanteAtNight(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void castendNoDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const override; void castendDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const override; void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override; diff --git a/src/map/skills/homunculus/homunculus_blazingandfurious.cpp b/src/map/skills/homunculus/homunculus_blazingandfurious.cpp index 1ec75564aa7..9a6299aad92 100644 --- a/src/map/skills/homunculus/homunculus_blazingandfurious.cpp +++ b/src/map/skills/homunculus/homunculus_blazingandfurious.cpp @@ -5,6 +5,7 @@ #include "map/battle.hpp" #include "map/clif.hpp" +#include "map/homunculus.hpp" #include "map/pc.hpp" #include "map/status.hpp" #include "map/unit.hpp" @@ -12,6 +13,14 @@ SkillBlazingAndFurious::SkillBlazingAndFurious() : SkillImplRecursiveDamageSplash(MH_BLAZING_AND_FURIOUS) { } +void SkillBlazingAndFurious::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const homun_data *hd = BL_CAST(BL_HOM, &src); + + if (hd != nullptr) { + dmg.div_ = hd->homunculus.spiritball; + } +} + void SkillBlazingAndFurious::castendNoDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const { map_session_data* sd = BL_CAST(BL_PC, src); diff --git a/src/map/skills/homunculus/homunculus_blazingandfurious.hpp b/src/map/skills/homunculus/homunculus_blazingandfurious.hpp index 00735653080..976f9ac7ea5 100644 --- a/src/map/skills/homunculus/homunculus_blazingandfurious.hpp +++ b/src/map/skills/homunculus/homunculus_blazingandfurious.hpp @@ -9,6 +9,7 @@ class SkillBlazingAndFurious : public SkillImplRecursiveDamageSplash { public: SkillBlazingAndFurious(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void castendNoDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const; void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override; }; diff --git a/src/map/skills/homunculus/homunculus_sonicclaw.cpp b/src/map/skills/homunculus/homunculus_sonicclaw.cpp index ea26762b34a..f35cdf0b36e 100644 --- a/src/map/skills/homunculus/homunculus_sonicclaw.cpp +++ b/src/map/skills/homunculus/homunculus_sonicclaw.cpp @@ -3,11 +3,20 @@ #include "homunculus_sonicclaw.hpp" +#include "map/homunculus.hpp" #include "map/status.hpp" SkillSonicClaw::SkillSonicClaw() : SkillImpl(MH_SONIC_CRAW) { } +void SkillSonicClaw::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const homun_data *hd = BL_CAST(BL_HOM, &src); + + if (hd != nullptr) { + dmg.div_ = hd->homunculus.spiritball; + } +} + void SkillSonicClaw::castendDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const { skill_attack(skill_get_type(getSkillId()), src, src, target, getSkillId(), skill_lv, tick, flag); } diff --git a/src/map/skills/homunculus/homunculus_sonicclaw.hpp b/src/map/skills/homunculus/homunculus_sonicclaw.hpp index 41f604c6c13..b5b14dcb775 100644 --- a/src/map/skills/homunculus/homunculus_sonicclaw.hpp +++ b/src/map/skills/homunculus/homunculus_sonicclaw.hpp @@ -9,6 +9,7 @@ class SkillSonicClaw : public SkillImpl { public: SkillSonicClaw(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void castendDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const override; void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override; }; diff --git a/src/map/skills/mage/coldbolt.cpp b/src/map/skills/mage/coldbolt.cpp index 73184518e47..1d097d60960 100644 --- a/src/map/skills/mage/coldbolt.cpp +++ b/src/map/skills/mage/coldbolt.cpp @@ -22,7 +22,18 @@ void SkillColdBolt::calculateSkillRatio(const Damage *wd, const block_list *src, } } - void SkillColdBolt::castendDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32 &flag) const { skill_attack(BF_MAGIC, src, src, target, getSkillId(), skill_lv, tick, flag); } + +void SkillColdBolt::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const status_change* sc = status_get_sc(&src); + + if (sc != nullptr) { + if (sc->hasSCE(SC_SPELLFIST) && (dmg.miscflag & BF_SHORT)) { + dmg.div_ = 1; // ad mods, to make it work similar to regular hits [Xazax] + dmg.flag = BF_WEAPON | BF_SHORT; + dmg.type = DMG_NORMAL; + } + } +} diff --git a/src/map/skills/mage/coldbolt.hpp b/src/map/skills/mage/coldbolt.hpp index 10d06769f13..c2194f10b2f 100644 --- a/src/map/skills/mage/coldbolt.hpp +++ b/src/map/skills/mage/coldbolt.hpp @@ -12,4 +12,5 @@ class SkillColdBolt : public SkillImpl { void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &base_skillratio, int32 mflag) const override; void castendDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32 &flag) const override; + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; }; diff --git a/src/map/skills/mage/crimsonarrow.cpp b/src/map/skills/mage/crimsonarrow.cpp index 6c5a94b5137..40659667531 100644 --- a/src/map/skills/mage/crimsonarrow.cpp +++ b/src/map/skills/mage/crimsonarrow.cpp @@ -44,6 +44,14 @@ void SkillCrimsonArrow::castendDamageId(block_list *src, block_list *target, uin SkillCrimsonArrowAttack::SkillCrimsonArrowAttack() : SkillImplRecursiveDamageSplash(AG_CRIMSON_ARROW_ATK) { } +void SkillCrimsonArrowAttack::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const status_change *sc = status_get_sc(&src); + + if (sc != nullptr && sc->hasSCE(SC_CLIMAX)) { + dmg.div_ = 2; + } +} + void SkillCrimsonArrowAttack::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const { const status_data* sstatus = status_get_status_data(*src); diff --git a/src/map/skills/mage/crimsonarrow.hpp b/src/map/skills/mage/crimsonarrow.hpp index 930e29d0064..012902667d8 100644 --- a/src/map/skills/mage/crimsonarrow.hpp +++ b/src/map/skills/mage/crimsonarrow.hpp @@ -20,5 +20,6 @@ class SkillCrimsonArrowAttack : public SkillImplRecursiveDamageSplash { public: SkillCrimsonArrowAttack(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const override; }; diff --git a/src/map/skills/mage/crystalimpact.cpp b/src/map/skills/mage/crystalimpact.cpp index 9745664336b..5225436d08f 100644 --- a/src/map/skills/mage/crystalimpact.cpp +++ b/src/map/skills/mage/crystalimpact.cpp @@ -12,6 +12,13 @@ SkillCrystalImpact::SkillCrystalImpact() : SkillImplRecursiveDamageSplash(AG_CRYSTAL_IMPACT) { } +void SkillCrystalImpact::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const status_change *sc = status_get_sc(&src); + + if (sc != nullptr && sc->hasSCE(SC_CLIMAX) && sc->getSCE(SC_CLIMAX)->val1 == 2) + dmg.div_ = 2; +} + void SkillCrystalImpact::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const { const status_data* sstatus = status_get_status_data(*src); diff --git a/src/map/skills/mage/crystalimpact.hpp b/src/map/skills/mage/crystalimpact.hpp index 19363e880aa..79fb91fe3c3 100644 --- a/src/map/skills/mage/crystalimpact.hpp +++ b/src/map/skills/mage/crystalimpact.hpp @@ -10,6 +10,7 @@ class SkillCrystalImpact : public SkillImplRecursiveDamageSplash { public: SkillCrystalImpact(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void applyAdditionalEffects(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32 attack_type, enum damage_lv dmg_lv) const override; void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const override; void castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const override; diff --git a/src/map/skills/mage/destructivehurricane.cpp b/src/map/skills/mage/destructivehurricane.cpp index 390d57d9ce3..886d0a4cb6b 100644 --- a/src/map/skills/mage/destructivehurricane.cpp +++ b/src/map/skills/mage/destructivehurricane.cpp @@ -12,6 +12,13 @@ SkillDestructiveHurricane::SkillDestructiveHurricane() : SkillImplRecursiveDamageSplash(AG_DESTRUCTIVE_HURRICANE) { } +void SkillDestructiveHurricane::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const status_change *sc = status_get_sc(&src); + + if (sc != nullptr && sc->hasSCE(SC_CLIMAX) && sc->getSCE(SC_CLIMAX)->val1 == 2) + dmg.blewcount = 2; +} + void SkillDestructiveHurricane::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const { const status_data* sstatus = status_get_status_data(*src); diff --git a/src/map/skills/mage/destructivehurricane.hpp b/src/map/skills/mage/destructivehurricane.hpp index 5dc9c3f67fb..9b180db1a81 100644 --- a/src/map/skills/mage/destructivehurricane.hpp +++ b/src/map/skills/mage/destructivehurricane.hpp @@ -10,6 +10,7 @@ class SkillDestructiveHurricane : public SkillImplRecursiveDamageSplash { public: SkillDestructiveHurricane(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void applyAdditionalEffects(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32 attack_type, enum damage_lv dmg_lv) const override; void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const override; void castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const override; diff --git a/src/map/skills/mage/firebolt.cpp b/src/map/skills/mage/firebolt.cpp index f5c4a2c9278..0262caae5e2 100644 --- a/src/map/skills/mage/firebolt.cpp +++ b/src/map/skills/mage/firebolt.cpp @@ -25,3 +25,15 @@ void SkillFireBolt::calculateSkillRatio(const Damage *wd, const block_list *src, void SkillFireBolt::castendDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32 &flag) const { skill_attack(BF_MAGIC, src, src, target, getSkillId(), skill_lv, tick, flag); } + +void SkillFireBolt::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const status_change* sc = status_get_sc(&src); + + if (sc != nullptr) { + if (sc->hasSCE(SC_SPELLFIST) && (dmg.miscflag & BF_SHORT)) { + dmg.div_ = 1; // ad mods, to make it work similar to regular hits [Xazax] + dmg.flag = BF_WEAPON | BF_SHORT; + dmg.type = DMG_NORMAL; + } + } +} diff --git a/src/map/skills/mage/firebolt.hpp b/src/map/skills/mage/firebolt.hpp index 84c803f8b77..8a0926b8c60 100644 --- a/src/map/skills/mage/firebolt.hpp +++ b/src/map/skills/mage/firebolt.hpp @@ -12,4 +12,5 @@ class SkillFireBolt : public SkillImpl { void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &base_skillratio, int32 mflag) const override; void castendDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32 &flag) const override; + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; }; diff --git a/src/map/skills/mage/firepillar.cpp b/src/map/skills/mage/firepillar.cpp index a696edb7077..910bf3977c5 100644 --- a/src/map/skills/mage/firepillar.cpp +++ b/src/map/skills/mage/firepillar.cpp @@ -22,3 +22,10 @@ void SkillFirePillar::calculateSkillRatio(const Damage* wd, const block_list* sr void SkillFirePillar::applyAdditionalEffects(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32 attack_type, enum damage_lv dmg_lv) const { unit_set_walkdelay(target, tick, skill_get_time2(getSkillId(), skill_lv), 1); } + +void SkillFirePillar::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const map_session_data* sd = BL_CAST(BL_PC, &src); + + if (sd != nullptr && dmg.div_ > 0) + dmg.div_ *= -1; // For players, damage is divided by number of hits +} diff --git a/src/map/skills/mage/firepillar.hpp b/src/map/skills/mage/firepillar.hpp index 3f95493bbc0..c9e217c3add 100644 --- a/src/map/skills/mage/firepillar.hpp +++ b/src/map/skills/mage/firepillar.hpp @@ -12,4 +12,5 @@ class SkillFirePillar : public SkillImpl { void castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const override; void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override; void applyAdditionalEffects(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32 attack_type, enum damage_lv dmg_lv) const override; + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; }; diff --git a/src/map/skills/mage/firewall.cpp b/src/map/skills/mage/firewall.cpp index a739e50b3cb..64bd002c01a 100644 --- a/src/map/skills/mage/firewall.cpp +++ b/src/map/skills/mage/firewall.cpp @@ -3,6 +3,8 @@ #include "firewall.hpp" +#include "map/status.hpp" + SkillFireWall::SkillFireWall() : SkillImpl(MG_FIREWALL) { } @@ -16,3 +18,11 @@ void SkillFireWall::castendPos2(block_list* src, int32 x, int32 y, uint16 skill_ void SkillFireWall::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &base_skillratio, int32 mflag) const { base_skillratio -= 50; } + +void SkillFireWall::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const status_data* tstatus = status_get_status_data(target); + + if (tstatus->def_ele == ELE_FIRE || battle_check_undead(tstatus->race, tstatus->def_ele)) { + dmg.blewcount = 0; // No knockback + } +} diff --git a/src/map/skills/mage/firewall.hpp b/src/map/skills/mage/firewall.hpp index 460aae126dd..d2dcf60442c 100644 --- a/src/map/skills/mage/firewall.hpp +++ b/src/map/skills/mage/firewall.hpp @@ -12,4 +12,5 @@ class SkillFireWall : public SkillImpl { void castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const override; void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &base_skillratio, int32 mflag) const override; + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; }; diff --git a/src/map/skills/mage/hellinferno.cpp b/src/map/skills/mage/hellinferno.cpp index 6baf853943d..2b178a84c03 100644 --- a/src/map/skills/mage/hellinferno.cpp +++ b/src/map/skills/mage/hellinferno.cpp @@ -8,9 +8,16 @@ #include "map/clif.hpp" #include "map/status.hpp" +// TODO: refactor to SkillImplRecursiveDamageSplash SkillHellInferno::SkillHellInferno() : SkillImpl(WL_HELLINFERNO) { } +void SkillHellInferno::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + if (dmg.miscflag & 2) { // ELE_DARK + dmg.div_ = -3; + } +} + void SkillHellInferno::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const { skillratio += -100 + 400 * skill_lv; if (mflag & 2) // ELE_DARK diff --git a/src/map/skills/mage/hellinferno.hpp b/src/map/skills/mage/hellinferno.hpp index ab4425c7393..e243bebef40 100644 --- a/src/map/skills/mage/hellinferno.hpp +++ b/src/map/skills/mage/hellinferno.hpp @@ -9,6 +9,7 @@ class SkillHellInferno : public SkillImpl { public: SkillHellInferno(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const override; void castendDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const override; }; diff --git a/src/map/skills/mage/lightningbolt.cpp b/src/map/skills/mage/lightningbolt.cpp index c736855fed4..70bf726be74 100644 --- a/src/map/skills/mage/lightningbolt.cpp +++ b/src/map/skills/mage/lightningbolt.cpp @@ -25,3 +25,15 @@ void SkillLightningBolt::calculateSkillRatio(const Damage *wd, const block_list void SkillLightningBolt::castendDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32 &flag) const { skill_attack(BF_MAGIC, src, src, target, getSkillId(), skill_lv, tick, flag); } + +void SkillLightningBolt::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const status_change* sc = status_get_sc(&src); + + if (sc != nullptr) { + if (sc->hasSCE(SC_SPELLFIST) && (dmg.miscflag & BF_SHORT)) { + dmg.div_ = 1; // ad mods, to make it work similar to regular hits [Xazax] + dmg.flag = BF_WEAPON | BF_SHORT; + dmg.type = DMG_NORMAL; + } + } +} diff --git a/src/map/skills/mage/lightningbolt.hpp b/src/map/skills/mage/lightningbolt.hpp index 2cd207635fe..8e219ace87e 100644 --- a/src/map/skills/mage/lightningbolt.hpp +++ b/src/map/skills/mage/lightningbolt.hpp @@ -12,4 +12,5 @@ class SkillLightningBolt : public SkillImpl { void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &base_skillratio, int32 mflag) const override; void castendDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32 &flag) const override; + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; }; diff --git a/src/map/skills/mage/psychicwave.cpp b/src/map/skills/mage/psychicwave.cpp index 031bf616eea..c5de68c357d 100644 --- a/src/map/skills/mage/psychicwave.cpp +++ b/src/map/skills/mage/psychicwave.cpp @@ -10,6 +10,13 @@ SkillPsychicWave::SkillPsychicWave() : SkillImpl(SO_PSYCHIC_WAVE) { } +void SkillPsychicWave::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const map_session_data* sd = BL_CAST(BL_PC, &src); + + if (sd != nullptr && (sd->weapontype1 == W_STAFF || sd->weapontype1 == W_2HSTAFF || sd->weapontype1 == W_BOOK)) + dmg.div_ = 2; +} + void SkillPsychicWave::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const { const status_data* sstatus = status_get_status_data(*src); const status_change *sc = status_get_sc(src); diff --git a/src/map/skills/mage/psychicwave.hpp b/src/map/skills/mage/psychicwave.hpp index be483c833f9..a93141533e7 100644 --- a/src/map/skills/mage/psychicwave.hpp +++ b/src/map/skills/mage/psychicwave.hpp @@ -9,6 +9,7 @@ class SkillPsychicWave : public SkillImpl { public: SkillPsychicWave(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const override; void castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const override; }; diff --git a/src/map/skills/mercenary/mercenary_bowlingbash.cpp b/src/map/skills/mercenary/mercenary_bowlingbash.cpp index d1d7a8d8fa2..7736d0e9ae1 100644 --- a/src/map/skills/mercenary/mercenary_bowlingbash.cpp +++ b/src/map/skills/mercenary/mercenary_bowlingbash.cpp @@ -12,6 +12,10 @@ SkillMercenaryBowlingBash::SkillMercenaryBowlingBash() : WeaponSkillImpl(MS_BOWLINGBASH) { } +void SkillMercenaryBowlingBash::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + dmg.blewcount = 0; +} + void SkillMercenaryBowlingBash::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &base_skillratio, int32 mflag) const { base_skillratio += 40 * skill_lv; } diff --git a/src/map/skills/mercenary/mercenary_bowlingbash.hpp b/src/map/skills/mercenary/mercenary_bowlingbash.hpp index 8e9d938601f..0460c5f6846 100644 --- a/src/map/skills/mercenary/mercenary_bowlingbash.hpp +++ b/src/map/skills/mercenary/mercenary_bowlingbash.hpp @@ -9,6 +9,7 @@ class SkillMercenaryBowlingBash : public WeaponSkillImpl { public: SkillMercenaryBowlingBash(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &base_skillratio, int32 mflag) const override; void castendDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const override; }; diff --git a/src/map/skills/mercenary/mercenary_pierce.cpp b/src/map/skills/mercenary/mercenary_pierce.cpp index 68f427fc5a9..1c2d56698b7 100644 --- a/src/map/skills/mercenary/mercenary_pierce.cpp +++ b/src/map/skills/mercenary/mercenary_pierce.cpp @@ -3,9 +3,17 @@ #include "mercenary_pierce.hpp" +#include "map/status.hpp" + SkillMercenaryPierce::SkillMercenaryPierce() : WeaponSkillImpl(ML_PIERCE) { } +void SkillMercenaryPierce::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const status_data* tstatus = status_get_status_data(target); + + dmg.div_= (dmg.div_> 0 ? tstatus->size+1 : -(tstatus->size+1)); +} + void SkillMercenaryPierce::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &base_skillratio, int32 mflag) const { base_skillratio += 10 * skill_lv; } diff --git a/src/map/skills/mercenary/mercenary_pierce.hpp b/src/map/skills/mercenary/mercenary_pierce.hpp index c3719abc7ee..32f3795cb70 100644 --- a/src/map/skills/mercenary/mercenary_pierce.hpp +++ b/src/map/skills/mercenary/mercenary_pierce.hpp @@ -9,6 +9,7 @@ class SkillMercenaryPierce : public WeaponSkillImpl { public: SkillMercenaryPierce(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &base_skillratio, int32 mflag) const override; void modifyHitRate(int16& hit_rate, const block_list* src, const block_list* target, uint16 skill_lv) const override; }; diff --git a/src/map/skills/merchant/armcannon.cpp b/src/map/skills/merchant/armcannon.cpp index c21532c89ce..05548819be1 100644 --- a/src/map/skills/merchant/armcannon.cpp +++ b/src/map/skills/merchant/armcannon.cpp @@ -10,6 +10,13 @@ SkillArmCannon::SkillArmCannon() : SkillImplRecursiveDamageSplash(NC_ARMSCANNON) { } +void SkillArmCannon::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const status_change *sc = status_get_sc(&src); + + if (sc != nullptr && sc->hasSCE(SC_ABR_DUAL_CANNON)) + dmg.div_ = 2; +} + void SkillArmCannon::calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& skillratio, int32 mflag) const { skillratio += -100 + 400 + 350 * skill_lv; RE_LVL_DMOD(100); diff --git a/src/map/skills/merchant/armcannon.hpp b/src/map/skills/merchant/armcannon.hpp index b5bb604dbe2..6224d9d7fe7 100644 --- a/src/map/skills/merchant/armcannon.hpp +++ b/src/map/skills/merchant/armcannon.hpp @@ -9,6 +9,7 @@ class SkillArmCannon : public SkillImplRecursiveDamageSplash { public: SkillArmCannon(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override; int32 getSplashTarget(block_list* src) const override; void splashSearch(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32 flag) const override; diff --git a/src/map/skills/merchant/axestomp.cpp b/src/map/skills/merchant/axestomp.cpp index 0d8b1dd5495..675fb91f588 100644 --- a/src/map/skills/merchant/axestomp.cpp +++ b/src/map/skills/merchant/axestomp.cpp @@ -13,6 +13,13 @@ SkillAxeStomp::SkillAxeStomp() : SkillImplRecursiveDamageSplash(MT_AXE_STOMP) { } +void SkillAxeStomp::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const map_session_data* sd = BL_CAST(BL_PC, &src); + + if (sd != nullptr && sd->status.weapon == W_2HAXE) + dmg.div_ = 3; +} + void SkillAxeStomp::castendNoDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const { int32 starget = BL_CHAR|BL_SKILL; diff --git a/src/map/skills/merchant/axestomp.hpp b/src/map/skills/merchant/axestomp.hpp index 09e40cbea13..4683955e9c6 100644 --- a/src/map/skills/merchant/axestomp.hpp +++ b/src/map/skills/merchant/axestomp.hpp @@ -9,6 +9,7 @@ class SkillAxeStomp : public SkillImplRecursiveDamageSplash { public: SkillAxeStomp(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void castendNoDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const override; void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override; }; diff --git a/src/map/skills/merchant/boostknuckle.cpp b/src/map/skills/merchant/boostknuckle.cpp index 0a726e44917..27c600d0522 100644 --- a/src/map/skills/merchant/boostknuckle.cpp +++ b/src/map/skills/merchant/boostknuckle.cpp @@ -10,6 +10,13 @@ SkillBoostKnuckle::SkillBoostKnuckle() : WeaponSkillImpl(NC_BOOSTKNUCKLE) { } +void SkillBoostKnuckle::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const status_change *sc = status_get_sc(&src); + + if (sc != nullptr && sc->hasSCE(SC_ABR_DUAL_CANNON)) + dmg.div_ = 2; +} + void SkillBoostKnuckle::calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& skillratio, int32 mflag) const { const status_data* sstatus = status_get_status_data(*src); diff --git a/src/map/skills/merchant/boostknuckle.hpp b/src/map/skills/merchant/boostknuckle.hpp index 5d4f8d95877..d312610320a 100644 --- a/src/map/skills/merchant/boostknuckle.hpp +++ b/src/map/skills/merchant/boostknuckle.hpp @@ -9,5 +9,6 @@ class SkillBoostKnuckle : public WeaponSkillImpl { public: SkillBoostKnuckle(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override; }; diff --git a/src/map/skills/merchant/cartcannon.cpp b/src/map/skills/merchant/cartcannon.cpp index be87f5cfb68..4ba8f77775c 100644 --- a/src/map/skills/merchant/cartcannon.cpp +++ b/src/map/skills/merchant/cartcannon.cpp @@ -12,6 +12,13 @@ SkillCartCannon::SkillCartCannon() : SkillImplRecursiveDamageSplash(GN_CARTCANNON) { } +void SkillCartCannon::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const status_change *sc = status_get_sc(&src); + + if (sc != nullptr && sc->hasSCE(SC_BIONIC_WOODENWARRIOR)) + dmg.div_ = 2; +} + void SkillCartCannon::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const { const status_data* sstatus = status_get_status_data(*src); const map_session_data* sd = BL_CAST(BL_PC, src); diff --git a/src/map/skills/merchant/cartcannon.hpp b/src/map/skills/merchant/cartcannon.hpp index c4d071cc5e7..cbb4501f012 100644 --- a/src/map/skills/merchant/cartcannon.hpp +++ b/src/map/skills/merchant/cartcannon.hpp @@ -9,6 +9,7 @@ class SkillCartCannon : public SkillImplRecursiveDamageSplash { public: SkillCartCannon(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const override; void modifyHitRate(int16& hit_rate, const block_list* src, const block_list* target, uint16 skill_lv) const override; void splashSearch(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32 flag) const override; diff --git a/src/map/skills/merchant/explosivepowder.cpp b/src/map/skills/merchant/explosivepowder.cpp index aa5f3f835af..c74e669e0a6 100644 --- a/src/map/skills/merchant/explosivepowder.cpp +++ b/src/map/skills/merchant/explosivepowder.cpp @@ -12,6 +12,13 @@ SkillExplosivePowder::SkillExplosivePowder() : SkillImplRecursiveDamageSplash(BO_EXPLOSIVE_POWDER) { } +void SkillExplosivePowder::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const status_change *sc = status_get_sc(&src); + + if (sc != nullptr && sc->hasSCE(SC_RESEARCHREPORT)) + dmg.div_ = 5; +} + void SkillExplosivePowder::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const { const status_data* sstatus = status_get_status_data(*src); const status_change *sc = status_get_sc(src); diff --git a/src/map/skills/merchant/explosivepowder.hpp b/src/map/skills/merchant/explosivepowder.hpp index 6fc5f646bdd..9358c4683c8 100644 --- a/src/map/skills/merchant/explosivepowder.hpp +++ b/src/map/skills/merchant/explosivepowder.hpp @@ -9,6 +9,7 @@ class SkillExplosivePowder : public SkillImplRecursiveDamageSplash { public: SkillExplosivePowder(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const override; void castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const override; }; diff --git a/src/map/skills/merchant/mayhemicthorns.cpp b/src/map/skills/merchant/mayhemicthorns.cpp index a0258795e76..428ac3369b6 100644 --- a/src/map/skills/merchant/mayhemicthorns.cpp +++ b/src/map/skills/merchant/mayhemicthorns.cpp @@ -11,6 +11,13 @@ SkillMayhemicThorns::SkillMayhemicThorns() : SkillImplRecursiveDamageSplash(BO_MAYHEMIC_THORNS) { } +void SkillMayhemicThorns::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const status_change *sc = status_get_sc(&src); + + if (sc != nullptr && sc->hasSCE(SC_RESEARCHREPORT)) + dmg.div_ = 4; +} + void SkillMayhemicThorns::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const { const status_data* sstatus = status_get_status_data(*src); const status_change *sc = status_get_sc(src); diff --git a/src/map/skills/merchant/mayhemicthorns.hpp b/src/map/skills/merchant/mayhemicthorns.hpp index 09d86b2593c..548050212fe 100644 --- a/src/map/skills/merchant/mayhemicthorns.hpp +++ b/src/map/skills/merchant/mayhemicthorns.hpp @@ -9,6 +9,7 @@ class SkillMayhemicThorns : public SkillImplRecursiveDamageSplash { public: SkillMayhemicThorns(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const override; void splashSearch(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32 flag) const override; }; diff --git a/src/map/skills/merchant/mightysmash.cpp b/src/map/skills/merchant/mightysmash.cpp index 48b4f724840..8d40a2b0b60 100644 --- a/src/map/skills/merchant/mightysmash.cpp +++ b/src/map/skills/merchant/mightysmash.cpp @@ -12,6 +12,13 @@ SkillMightySmash::SkillMightySmash() : SkillImplRecursiveDamageSplash(MT_MIGHTY_SMASH) { } +void SkillMightySmash::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const status_change *sc = status_get_sc(&src); + + if (sc != nullptr && sc->hasSCE(SC_AXE_STOMP)) + dmg.div_ = 7; +} + void SkillMightySmash::castendNoDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const { int32 starget = BL_CHAR|BL_SKILL; diff --git a/src/map/skills/merchant/mightysmash.hpp b/src/map/skills/merchant/mightysmash.hpp index 4e1756e263b..165e1b35730 100644 --- a/src/map/skills/merchant/mightysmash.hpp +++ b/src/map/skills/merchant/mightysmash.hpp @@ -9,6 +9,7 @@ class SkillMightySmash : public SkillImplRecursiveDamageSplash { public: SkillMightySmash(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void castendNoDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const override; void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override; }; diff --git a/src/map/skills/merchant/powerswing.cpp b/src/map/skills/merchant/powerswing.cpp index ef8411e592a..3499ab4d4d8 100644 --- a/src/map/skills/merchant/powerswing.cpp +++ b/src/map/skills/merchant/powerswing.cpp @@ -10,6 +10,13 @@ SkillPowerSwing::SkillPowerSwing() : WeaponSkillImpl(NC_POWERSWING) { } +void SkillPowerSwing::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const status_change *sc = status_get_sc(&src); + + if (sc != nullptr && sc->hasSCE(SC_ABR_BATTLE_WARIOR)) + dmg.div_ = -2; +} + void SkillPowerSwing::applyAdditionalEffects(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32 attack_type, enum damage_lv dmg_lv) const { sc_start(src,target, SC_STUN, 10, skill_lv, skill_get_time(getSkillId(), skill_lv)); } diff --git a/src/map/skills/merchant/powerswing.hpp b/src/map/skills/merchant/powerswing.hpp index 4513039384d..13bc9741767 100644 --- a/src/map/skills/merchant/powerswing.hpp +++ b/src/map/skills/merchant/powerswing.hpp @@ -10,5 +10,6 @@ class SkillPowerSwing : public WeaponSkillImpl { SkillPowerSwing(); void applyAdditionalEffects(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32 attack_type, enum damage_lv dmg_lv) const override; + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const override; }; diff --git a/src/map/skills/merchant/vulcanarm.cpp b/src/map/skills/merchant/vulcanarm.cpp index 21457999ec2..9eed31235c2 100644 --- a/src/map/skills/merchant/vulcanarm.cpp +++ b/src/map/skills/merchant/vulcanarm.cpp @@ -10,6 +10,13 @@ SkillVulcanArm::SkillVulcanArm() : SkillImplRecursiveDamageSplash(NC_VULCANARM) { } +void SkillVulcanArm::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const status_change *sc = status_get_sc(&src); + + if (sc != nullptr && sc->hasSCE(SC_ABR_DUAL_CANNON)) + dmg.div_ = 2; +} + void SkillVulcanArm::calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& skillratio, int32 mflag) const { const status_data* sstatus = status_get_status_data(*src); diff --git a/src/map/skills/merchant/vulcanarm.hpp b/src/map/skills/merchant/vulcanarm.hpp index 5adcc9c6601..cfe37462d93 100644 --- a/src/map/skills/merchant/vulcanarm.hpp +++ b/src/map/skills/merchant/vulcanarm.hpp @@ -9,5 +9,6 @@ class SkillVulcanArm : public SkillImplRecursiveDamageSplash { public: SkillVulcanArm(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override; }; diff --git a/src/map/skills/ninja/kocrossslash.cpp b/src/map/skills/ninja/kocrossslash.cpp index 9903f83b9d8..74df444e742 100644 --- a/src/map/skills/ninja/kocrossslash.cpp +++ b/src/map/skills/ninja/kocrossslash.cpp @@ -13,6 +13,13 @@ SkillKoCrossSlash::SkillKoCrossSlash() : WeaponSkillImpl(KO_JYUMONJIKIRI) { } +void SkillKoCrossSlash::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const status_change *tsc = status_get_sc(&target); + + if (tsc != nullptr && tsc->hasSCE(SC_JYUMONJIKIRI)) + dmg.div_ *= -1; // TODO: needs more info +} + void SkillKoCrossSlash::applyAdditionalEffects(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32 attack_type, enum damage_lv dmg_lv) const { sc_start(src,target,SC_JYUMONJIKIRI,100,skill_lv,skill_get_time(getSkillId(),skill_lv)); } diff --git a/src/map/skills/ninja/kocrossslash.hpp b/src/map/skills/ninja/kocrossslash.hpp index 24e3aa872fd..fefe5d45eeb 100644 --- a/src/map/skills/ninja/kocrossslash.hpp +++ b/src/map/skills/ninja/kocrossslash.hpp @@ -9,6 +9,7 @@ class SkillKoCrossSlash : public WeaponSkillImpl { public: SkillKoCrossSlash(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void applyAdditionalEffects(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32 attack_type, enum damage_lv dmg_lv) const override; void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const override; void castendDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const override; diff --git a/src/map/skills/novice/doublebowlingbash.cpp b/src/map/skills/novice/doublebowlingbash.cpp index b72e13c2f54..b1d064e75a6 100644 --- a/src/map/skills/novice/doublebowlingbash.cpp +++ b/src/map/skills/novice/doublebowlingbash.cpp @@ -12,6 +12,12 @@ SkillDoubleBowlingBash::SkillDoubleBowlingBash() : SkillImpl(HN_DOUBLEBOWLINGBASH) { } +void SkillDoubleBowlingBash::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + if (dmg.miscflag > 1) { + dmg.div_ += min(4, dmg.miscflag); + } +} + void SkillDoubleBowlingBash::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const { const status_data* sstatus = status_get_status_data(*src); const map_session_data* sd = BL_CAST( BL_PC, src ); diff --git a/src/map/skills/novice/doublebowlingbash.hpp b/src/map/skills/novice/doublebowlingbash.hpp index cc439969390..1e2f4753a6f 100644 --- a/src/map/skills/novice/doublebowlingbash.hpp +++ b/src/map/skills/novice/doublebowlingbash.hpp @@ -9,6 +9,7 @@ class SkillDoubleBowlingBash : public SkillImpl { public: SkillDoubleBowlingBash(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const override; void castendDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const override; }; diff --git a/src/map/skills/novice/groundgravitation.cpp b/src/map/skills/novice/groundgravitation.cpp index b968d4653f5..98d03161e02 100644 --- a/src/map/skills/novice/groundgravitation.cpp +++ b/src/map/skills/novice/groundgravitation.cpp @@ -68,3 +68,10 @@ void SkillGroundGravitation::castendPos2(block_list* src, int32 x, int32 y, uint skill_addtimerskill(src, tick + (t_tick)i*skill_get_unit_interval(getSkillId()), 0, x, y, getSkillId(), skill_lv, 0, flag); } } + +void SkillGroundGravitation::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + if (dmg.miscflag & SKILL_ALTDMG_FLAG) { + // Initial damage + dmg.div_ = -2; + } +} diff --git a/src/map/skills/novice/groundgravitation.hpp b/src/map/skills/novice/groundgravitation.hpp index 8da2f0835d2..d02aba951c8 100644 --- a/src/map/skills/novice/groundgravitation.hpp +++ b/src/map/skills/novice/groundgravitation.hpp @@ -13,4 +13,5 @@ class SkillGroundGravitation : public SkillImpl { void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const override; void castendDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const override; void castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const override; + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; }; diff --git a/src/map/skills/novice/jackfrostnova.cpp b/src/map/skills/novice/jackfrostnova.cpp index e5f8afda6e9..0406d82df67 100644 --- a/src/map/skills/novice/jackfrostnova.cpp +++ b/src/map/skills/novice/jackfrostnova.cpp @@ -67,3 +67,10 @@ void SkillJackFrostNova::castendPos2(block_list* src, int32 x, int32 y, uint16 s skill_addtimerskill(src, tick + (t_tick)i*skill_get_unit_interval(getSkillId()), 0, x, y, getSkillId(), skill_lv, 0, flag); } } + +void SkillJackFrostNova::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + if (dmg.miscflag & SKILL_ALTDMG_FLAG) { + // Initial damage + dmg.div_ = 1; + } +} diff --git a/src/map/skills/novice/jackfrostnova.hpp b/src/map/skills/novice/jackfrostnova.hpp index 8588a8b900b..9c63c10c308 100644 --- a/src/map/skills/novice/jackfrostnova.hpp +++ b/src/map/skills/novice/jackfrostnova.hpp @@ -13,4 +13,5 @@ class SkillJackFrostNova : public SkillImpl { void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const override; void castendDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const override; void castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const override; + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; }; diff --git a/src/map/skills/novice/meteorstormbuster.cpp b/src/map/skills/novice/meteorstormbuster.cpp index eab75f438d6..8815f755e84 100644 --- a/src/map/skills/novice/meteorstormbuster.cpp +++ b/src/map/skills/novice/meteorstormbuster.cpp @@ -65,3 +65,10 @@ void SkillMeteorStormBuster::castendPos2(block_list* src, int32 x, int32 y, uint skill_addtimerskill(src, tick + (t_tick)i*skill_get_time2(getSkillId(), skill_lv), 0, x, y, getSkillId(), skill_lv, 0, flag); } } + +void SkillMeteorStormBuster::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + if (dmg.miscflag & SKILL_ALTDMG_FLAG) { + // Fall damage + dmg.div_ = -3; + } +} diff --git a/src/map/skills/novice/meteorstormbuster.hpp b/src/map/skills/novice/meteorstormbuster.hpp index d9daa1193a8..2be5cb7088e 100644 --- a/src/map/skills/novice/meteorstormbuster.hpp +++ b/src/map/skills/novice/meteorstormbuster.hpp @@ -13,4 +13,5 @@ class SkillMeteorStormBuster : public SkillImpl { void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const override; void castendDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const override; void castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const override; + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; }; diff --git a/src/map/skills/skill_impl.cpp b/src/map/skills/skill_impl.cpp index ca968651d5e..597786d9d5a 100644 --- a/src/map/skills/skill_impl.cpp +++ b/src/map/skills/skill_impl.cpp @@ -42,6 +42,10 @@ void SkillImpl::applyCounterAdditionalEffects(block_list*, block_list*, uint16, // no-op } +void SkillImpl::modifyDamageData(Damage&, const block_list&, const block_list&, uint16) const { + // no-op +} + StatusSkillImpl::StatusSkillImpl(e_skill skillId, bool end_if_running) : SkillImpl(skillId) { this->end_if_running = end_if_running; }; diff --git a/src/map/skills/skill_impl.hpp b/src/map/skills/skill_impl.hpp index 21c56da943d..321fec436a1 100644 --- a/src/map/skills/skill_impl.hpp +++ b/src/map/skills/skill_impl.hpp @@ -47,6 +47,11 @@ class SkillImpl { */ virtual void applyCounterAdditionalEffects(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& attack_type) const; + /** + * Allows modifying the damage data right after initialization. + */ + virtual void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const; + protected: e_skill skill_id_; }; diff --git a/src/map/skills/swordman/banishingpoint.cpp b/src/map/skills/swordman/banishingpoint.cpp index e1da3e3def7..ca39bc10c29 100644 --- a/src/map/skills/swordman/banishingpoint.cpp +++ b/src/map/skills/swordman/banishingpoint.cpp @@ -28,6 +28,6 @@ void SkillBanishingPoint::calculateSkillRatio(const Damage* wd, const block_list RE_LVL_DMOD(100); } -void SkillBanishingPoint::modifyHitRate(int16& hitrate, const block_list* src, const block_list* target, uint16 skill_lv) const { - hitrate += 5 * skill_lv; +void SkillBanishingPoint::modifyHitRate(int16& hit_rate, const block_list* src, const block_list* target, uint16 skill_lv) const { + hit_rate += 5 * skill_lv; } diff --git a/src/map/skills/swordman/bowlingbash.cpp b/src/map/skills/swordman/bowlingbash.cpp index de92f92503b..cc507dd17c5 100644 --- a/src/map/skills/swordman/bowlingbash.cpp +++ b/src/map/skills/swordman/bowlingbash.cpp @@ -13,6 +13,21 @@ SkillBowlingBash::SkillBowlingBash() : SkillImpl(KN_BOWLINGBASH) { } +void SkillBowlingBash::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { +#ifdef RENEWAL + const map_session_data* sd = BL_CAST(BL_PC, &src); + + if (sd != nullptr && sd->status.weapon == W_2HSWORD) { + if (dmg.miscflag >= 4) + dmg.div_ = 4; + else if (dmg.miscflag >= 2) + dmg.div_ = 3; + } +#else + dmg.blewcount = 0; +#endif +} + void SkillBowlingBash::calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const { base_skillratio += 40 * skill_lv; } diff --git a/src/map/skills/swordman/bowlingbash.hpp b/src/map/skills/swordman/bowlingbash.hpp index ff945010f2a..1a52dd77271 100644 --- a/src/map/skills/swordman/bowlingbash.hpp +++ b/src/map/skills/swordman/bowlingbash.hpp @@ -9,6 +9,7 @@ class SkillBowlingBash : public SkillImpl { public: SkillBowlingBash(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override; void castendDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const override; }; diff --git a/src/map/skills/swordman/counterattack.cpp b/src/map/skills/swordman/counterattack.cpp index 02669572f19..27d566eaed9 100644 --- a/src/map/skills/swordman/counterattack.cpp +++ b/src/map/skills/swordman/counterattack.cpp @@ -8,6 +8,10 @@ SkillCounterAttack::SkillCounterAttack() : SkillImpl(KN_AUTOCOUNTER) { } +void SkillCounterAttack::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + dmg.flag = (dmg.flag&~BF_SKILLMASK)|BF_NORMAL; +} + void SkillCounterAttack::castendNoDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const { sc_start(src, target, skill_get_sc(getSkillId()), 100, skill_lv, skill_get_time(getSkillId(), skill_lv)); skill_addtimerskill(src, tick + 100, target->id, 0, 0, getSkillId(), skill_lv, BF_WEAPON, flag); diff --git a/src/map/skills/swordman/counterattack.hpp b/src/map/skills/swordman/counterattack.hpp index 1fe7f5208e0..01ec9044e59 100644 --- a/src/map/skills/swordman/counterattack.hpp +++ b/src/map/skills/swordman/counterattack.hpp @@ -9,6 +9,7 @@ class SkillCounterAttack : public SkillImpl { public: SkillCounterAttack(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void castendNoDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const override; void modifyHitRate(int16& hit_rate, const block_list* src, const block_list* target, uint16 skill_lv) const override; }; diff --git a/src/map/skills/swordman/overslash.cpp b/src/map/skills/swordman/overslash.cpp index 4f009c2e07a..fbe9d6786aa 100644 --- a/src/map/skills/swordman/overslash.cpp +++ b/src/map/skills/swordman/overslash.cpp @@ -14,6 +14,14 @@ SkillOverSlash::SkillOverSlash() : SkillImplRecursiveDamageSplash(IG_OVERSLASH) { } +void SkillOverSlash::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + if (dmg.miscflag >= 4) { + dmg.div_ = 7; + } else if (dmg.miscflag >= 2) { + dmg.div_ = 5; + } +} + void SkillOverSlash::calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& skillratio, int32 mflag) const { const map_session_data* sd = BL_CAST(BL_PC, src); const status_data* sstatus = status_get_status_data(*src); diff --git a/src/map/skills/swordman/overslash.hpp b/src/map/skills/swordman/overslash.hpp index 2bd3672b254..d9f7eefb6b6 100644 --- a/src/map/skills/swordman/overslash.hpp +++ b/src/map/skills/swordman/overslash.hpp @@ -9,6 +9,7 @@ class SkillOverSlash : public SkillImplRecursiveDamageSplash { public: SkillOverSlash(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override; void splashSearch(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32 flag) const override; }; diff --git a/src/map/skills/swordman/pierce.cpp b/src/map/skills/swordman/pierce.cpp index a7b73d55dd6..40b24f2010d 100644 --- a/src/map/skills/swordman/pierce.cpp +++ b/src/map/skills/swordman/pierce.cpp @@ -8,6 +8,12 @@ SkillPierce::SkillPierce() : WeaponSkillImpl(KN_PIERCE) { } +void SkillPierce::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const status_data* tstatus = status_get_status_data(target); + + dmg.div_= (dmg.div_> 0 ? tstatus->size+1 : -(tstatus->size+1)); +} + void SkillPierce::calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const { const status_change* sc = status_get_sc(src); diff --git a/src/map/skills/swordman/pierce.hpp b/src/map/skills/swordman/pierce.hpp index 6c58d7c9bbd..37bc1ed4a1a 100644 --- a/src/map/skills/swordman/pierce.hpp +++ b/src/map/skills/swordman/pierce.hpp @@ -11,6 +11,7 @@ class SkillPierce : public WeaponSkillImpl { public: SkillPierce(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override; void modifyHitRate(int16& hit_rate, const block_list* src, const block_list* target, uint16 skill_lv) const override; }; diff --git a/src/map/skills/swordman/servantweapondemolition.cpp b/src/map/skills/swordman/servantweapondemolition.cpp index ad133a87fc7..a62517a046d 100644 --- a/src/map/skills/swordman/servantweapondemolition.cpp +++ b/src/map/skills/swordman/servantweapondemolition.cpp @@ -13,6 +13,13 @@ SkillServantWeaponDemolition::SkillServantWeaponDemolition() : SkillImplRecursiveDamageSplash(DK_SERVANT_W_DEMOL) { } +void SkillServantWeaponDemolition::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const map_session_data* sd = BL_CAST(BL_PC, &src); + + if (sd != nullptr && (sd->servantball + sd->servantball_old) < dmg.div_) + dmg.div_ = sd->servantball + sd->servantball_old; +} + void SkillServantWeaponDemolition::castendNoDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const { int32 starget = BL_CHAR|BL_SKILL; diff --git a/src/map/skills/swordman/servantweapondemolition.hpp b/src/map/skills/swordman/servantweapondemolition.hpp index 40ed11ba47c..edd6dfbf62d 100644 --- a/src/map/skills/swordman/servantweapondemolition.hpp +++ b/src/map/skills/swordman/servantweapondemolition.hpp @@ -9,6 +9,7 @@ class SkillServantWeaponDemolition : public SkillImplRecursiveDamageSplash { public: SkillServantWeaponDemolition(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void castendNoDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const override; void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override; int64 splashDamage(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32 flag) const override; diff --git a/src/map/skills/swordman/servantweaponphantom.cpp b/src/map/skills/swordman/servantweaponphantom.cpp index 37795e48fe7..b86902d57e5 100644 --- a/src/map/skills/swordman/servantweaponphantom.cpp +++ b/src/map/skills/swordman/servantweaponphantom.cpp @@ -12,6 +12,13 @@ SkillServantWeaponPhantom::SkillServantWeaponPhantom() : SkillImplRecursiveDamageSplash(DK_SERVANT_W_PHANTOM) { } +void SkillServantWeaponPhantom::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const map_session_data* sd = BL_CAST(BL_PC, &src); + + if (sd != nullptr && (sd->servantball + sd->servantball_old) < dmg.div_) + dmg.div_ = sd->servantball + sd->servantball_old; +} + void SkillServantWeaponPhantom::calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& skillratio, int32 mflag) const { const status_data* sstatus = status_get_status_data(*src); diff --git a/src/map/skills/swordman/servantweaponphantom.hpp b/src/map/skills/swordman/servantweaponphantom.hpp index 9c13af261da..f3fcb1ae492 100644 --- a/src/map/skills/swordman/servantweaponphantom.hpp +++ b/src/map/skills/swordman/servantweaponphantom.hpp @@ -9,6 +9,7 @@ class SkillServantWeaponPhantom : public SkillImplRecursiveDamageSplash { public: SkillServantWeaponPhantom(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override; void applyAdditionalEffects(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32 attack_type, enum damage_lv dmg_lv) const override; void splashSearch(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32 flag) const override; diff --git a/src/map/skills/swordman/spearstab.cpp b/src/map/skills/swordman/spearstab.cpp index 66a5270c36e..0ccdf6e124d 100644 --- a/src/map/skills/swordman/spearstab.cpp +++ b/src/map/skills/swordman/spearstab.cpp @@ -8,6 +8,10 @@ SkillSpearStab::SkillSpearStab() : SkillImpl(KN_SPEARSTAB) { } +void SkillSpearStab::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + dmg.blewcount = 0; +} + void SkillSpearStab::castendDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const { if(flag&1) { if (target->id==skill_area_temp[1]) diff --git a/src/map/skills/swordman/spearstab.hpp b/src/map/skills/swordman/spearstab.hpp index 523146b7b71..62b1e4c60fd 100644 --- a/src/map/skills/swordman/spearstab.hpp +++ b/src/map/skills/swordman/spearstab.hpp @@ -9,6 +9,7 @@ class SkillSpearStab : public SkillImpl { public: SkillSpearStab(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void castendDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const override; void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override; }; diff --git a/src/map/skills/swordman/spiralpierce.cpp b/src/map/skills/swordman/spiralpierce.cpp index bffb62e7065..e441e0ebba3 100644 --- a/src/map/skills/swordman/spiralpierce.cpp +++ b/src/map/skills/swordman/spiralpierce.cpp @@ -12,6 +12,13 @@ SkillSpiralPierce::SkillSpiralPierce() : WeaponSkillImpl(LK_SPIRALPIERCE) { } +void SkillSpiralPierce::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const map_session_data* sd = BL_CAST(BL_PC, &src); + + if (sd == nullptr) + dmg.flag = (dmg.flag&~(BF_RANGEMASK|BF_WEAPONMASK))|BF_LONG|BF_MISC; +} + void SkillSpiralPierce::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const { #ifdef RENEWAL const status_change *sc = status_get_sc(src); diff --git a/src/map/skills/swordman/spiralpierce.hpp b/src/map/skills/swordman/spiralpierce.hpp index 25608132ad4..a1f3773517d 100644 --- a/src/map/skills/swordman/spiralpierce.hpp +++ b/src/map/skills/swordman/spiralpierce.hpp @@ -9,6 +9,7 @@ class SkillSpiralPierce : public WeaponSkillImpl { public: SkillSpiralPierce(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void applyAdditionalEffects(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32 attack_type, enum damage_lv dmg_lv) const override; void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const override; }; diff --git a/src/map/skills/swordman/windcutter.cpp b/src/map/skills/swordman/windcutter.cpp index 60bc9805a7e..aa1484d914a 100644 --- a/src/map/skills/swordman/windcutter.cpp +++ b/src/map/skills/swordman/windcutter.cpp @@ -13,6 +13,18 @@ SkillWindCutter::SkillWindCutter() : SkillImpl(RK_WINDCUTTER) { } +void SkillWindCutter::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const map_session_data* sd = BL_CAST(BL_PC, &src); + + if (sd != nullptr) { + if (sd->status.weapon == W_1HSPEAR || sd->status.weapon == W_2HSPEAR) + dmg.flag |= BF_LONG; + + if (sd->weapontype1 == W_2HSWORD) + dmg.div_ = 2; + } +} + void SkillWindCutter::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const { const map_session_data* sd = BL_CAST(BL_PC, src); diff --git a/src/map/skills/swordman/windcutter.hpp b/src/map/skills/swordman/windcutter.hpp index 0a214b6ca18..8b036b1028d 100644 --- a/src/map/skills/swordman/windcutter.hpp +++ b/src/map/skills/swordman/windcutter.hpp @@ -9,6 +9,7 @@ class SkillWindCutter : public SkillImpl { public: SkillWindCutter(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const override; void castendDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const override; void castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const override; diff --git a/src/map/skills/taekwon/allinthesky.cpp b/src/map/skills/taekwon/allinthesky.cpp index ccdc02288f4..3f3542e016f 100644 --- a/src/map/skills/taekwon/allinthesky.cpp +++ b/src/map/skills/taekwon/allinthesky.cpp @@ -26,3 +26,12 @@ void SkillAllInTheSky::calculateSkillRatio(const Damage* wd, const block_list* s base_skillratio += -100 + 250 + 1200 * skill_lv; base_skillratio += 5 * sstatus->pow; } + +void SkillAllInTheSky::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + switch (status_get_race(&target)) { + case RC_DEMIHUMAN: + case RC_DEMON: + dmg.div_ = 3; + break; + } +} diff --git a/src/map/skills/taekwon/allinthesky.hpp b/src/map/skills/taekwon/allinthesky.hpp index f3a9b17eaee..013e7a01c17 100644 --- a/src/map/skills/taekwon/allinthesky.hpp +++ b/src/map/skills/taekwon/allinthesky.hpp @@ -11,4 +11,5 @@ class SkillAllInTheSky : public SkillImpl { void castendDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const override; void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override; + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; }; diff --git a/src/map/skills/taekwon/talismanoffourbearinggod.cpp b/src/map/skills/taekwon/talismanoffourbearinggod.cpp index 4e36c97803d..152cc170e10 100644 --- a/src/map/skills/taekwon/talismanoffourbearinggod.cpp +++ b/src/map/skills/taekwon/talismanoffourbearinggod.cpp @@ -12,6 +12,23 @@ SkillTalismanOfFourBearingGod::SkillTalismanOfFourBearingGod() : SkillImplRecursiveDamageSplash(SOA_TALISMAN_OF_FOUR_BEARING_GOD) { } +void SkillTalismanOfFourBearingGod::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const status_change *sc = status_get_sc(&src); + + if (sc != nullptr){ + if (sc->hasSCE(SC_T_FIRST_GOD)) + dmg.div_ = 2; + else if (sc->hasSCE(SC_T_SECOND_GOD)) + dmg.div_ = 3; + else if (sc->hasSCE(SC_T_THIRD_GOD)) + dmg.div_ = 4; + else if (sc->hasSCE(SC_T_FOURTH_GOD)) + dmg.div_ = 5; + else if (sc->hasSCE(SC_T_FIFTH_GOD)) + dmg.div_ = 7; + } +} + void SkillTalismanOfFourBearingGod::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const { const status_data* sstatus = status_get_status_data(*src); const map_session_data* sd = BL_CAST( BL_PC, src ); diff --git a/src/map/skills/taekwon/talismanoffourbearinggod.hpp b/src/map/skills/taekwon/talismanoffourbearinggod.hpp index 10785ccacb0..f9f45a0fb89 100644 --- a/src/map/skills/taekwon/talismanoffourbearinggod.hpp +++ b/src/map/skills/taekwon/talismanoffourbearinggod.hpp @@ -9,6 +9,7 @@ class SkillTalismanOfFourBearingGod : public SkillImplRecursiveDamageSplash { public: SkillTalismanOfFourBearingGod(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const override; void splashSearch(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32 flag) const override; }; diff --git a/src/map/skills/taekwon/turnkick.cpp b/src/map/skills/taekwon/turnkick.cpp index ca6313e52aa..8fe7b9af955 100644 --- a/src/map/skills/taekwon/turnkick.cpp +++ b/src/map/skills/taekwon/turnkick.cpp @@ -9,6 +9,10 @@ SkillTurnKick::SkillTurnKick() : SkillImpl(TK_TURNKICK) { } +void SkillTurnKick::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + dmg.blewcount = 0; +} + void SkillTurnKick::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &base_skillratio, int32 mflag) const { base_skillratio += 90 + 30 * skill_lv; } diff --git a/src/map/skills/taekwon/turnkick.hpp b/src/map/skills/taekwon/turnkick.hpp index 8338e89501c..6c1d792db2c 100644 --- a/src/map/skills/taekwon/turnkick.hpp +++ b/src/map/skills/taekwon/turnkick.hpp @@ -11,6 +11,7 @@ class SkillTurnKick : public SkillImpl { public: SkillTurnKick(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &base_skillratio, int32 mflag) const override; void applyAdditionalEffects(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32 attack_type, enum damage_lv dmg_lv) const override; void castendDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32 &flag) const override; diff --git a/src/map/skills/taekwon/warmthofthemoon.cpp b/src/map/skills/taekwon/warmthofthemoon.cpp index 5aea29470bc..97b577a01fb 100644 --- a/src/map/skills/taekwon/warmthofthemoon.cpp +++ b/src/map/skills/taekwon/warmthofthemoon.cpp @@ -3,11 +3,18 @@ #include "warmthofthemoon.hpp" +#include + #include "map/status.hpp" SkillWarmthoftheMoon::SkillWarmthoftheMoon() : SkillImpl(SG_MOON_WARM) { } +void SkillWarmthoftheMoon::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + // A random 0~3 knockback bonus is added to the base knockback + dmg.blewcount += rnd_value(0, 3); +} + void SkillWarmthoftheMoon::castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const { sc_type type = skill_get_sc(getSkillId()); std::shared_ptr sg; diff --git a/src/map/skills/taekwon/warmthofthemoon.hpp b/src/map/skills/taekwon/warmthofthemoon.hpp index b2ae0be4e14..0bbb04d7bde 100644 --- a/src/map/skills/taekwon/warmthofthemoon.hpp +++ b/src/map/skills/taekwon/warmthofthemoon.hpp @@ -9,5 +9,6 @@ class SkillWarmthoftheMoon : public SkillImpl { public: SkillWarmthoftheMoon(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const override; }; diff --git a/src/map/skills/taekwon/warmthofthestars.cpp b/src/map/skills/taekwon/warmthofthestars.cpp index b22306abc6c..580accc89f4 100644 --- a/src/map/skills/taekwon/warmthofthestars.cpp +++ b/src/map/skills/taekwon/warmthofthestars.cpp @@ -3,11 +3,18 @@ #include "warmthofthestars.hpp" +#include + #include "map/status.hpp" SkillWarmthoftheStars::SkillWarmthoftheStars() : SkillImpl(SG_STAR_WARM) { } +void SkillWarmthoftheStars::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + // A random 0~3 knockback bonus is added to the base knockback + dmg.blewcount += rnd_value(0, 3); +} + void SkillWarmthoftheStars::castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const { sc_type type = skill_get_sc(getSkillId()); std::shared_ptr sg; diff --git a/src/map/skills/taekwon/warmthofthestars.hpp b/src/map/skills/taekwon/warmthofthestars.hpp index 1e76fdbfaa2..dc433aae136 100644 --- a/src/map/skills/taekwon/warmthofthestars.hpp +++ b/src/map/skills/taekwon/warmthofthestars.hpp @@ -9,5 +9,6 @@ class SkillWarmthoftheStars : public SkillImpl { public: SkillWarmthoftheStars(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const override; }; diff --git a/src/map/skills/taekwon/warmthofthesun.cpp b/src/map/skills/taekwon/warmthofthesun.cpp index 52398aead2f..19035f090db 100644 --- a/src/map/skills/taekwon/warmthofthesun.cpp +++ b/src/map/skills/taekwon/warmthofthesun.cpp @@ -3,11 +3,18 @@ #include "warmthofthesun.hpp" +#include + #include "map/status.hpp" SkillWarmthoftheSun::SkillWarmthoftheSun() : SkillImpl(SG_SUN_WARM) { } +void SkillWarmthoftheSun::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + // A random 0~3 knockback bonus is added to the base knockback + dmg.blewcount += rnd_value(0, 3); +} + void SkillWarmthoftheSun::castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const { sc_type type = skill_get_sc(getSkillId()); std::shared_ptr sg; diff --git a/src/map/skills/taekwon/warmthofthesun.hpp b/src/map/skills/taekwon/warmthofthesun.hpp index 72d294fe32d..8cc09a31c9c 100644 --- a/src/map/skills/taekwon/warmthofthesun.hpp +++ b/src/map/skills/taekwon/warmthofthesun.hpp @@ -9,5 +9,6 @@ class SkillWarmthoftheSun : public SkillImpl { public: SkillWarmthoftheSun(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const override; }; diff --git a/src/map/skills/thief/abysssquare.cpp b/src/map/skills/thief/abysssquare.cpp index e53d0d4eafe..3d9e4ed9f6e 100644 --- a/src/map/skills/thief/abysssquare.cpp +++ b/src/map/skills/thief/abysssquare.cpp @@ -11,6 +11,11 @@ SkillAbyssSquare::SkillAbyssSquare() : SkillImpl(ABC_ABYSS_SQUARE) { } +void SkillAbyssSquare::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + if (dmg.miscflag == 2) + dmg.div_ = 2; +} + void SkillAbyssSquare::castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const { flag|=1;//Set flag to 1 to prevent deleting ammo (it will be deleted on group-delete). diff --git a/src/map/skills/thief/abysssquare.hpp b/src/map/skills/thief/abysssquare.hpp index 2638bf928b2..c42e5181be4 100644 --- a/src/map/skills/thief/abysssquare.hpp +++ b/src/map/skills/thief/abysssquare.hpp @@ -9,6 +9,7 @@ class SkillAbyssSquare : public SkillImpl { public: SkillAbyssSquare(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const override; void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override; }; diff --git a/src/map/skills/thief/backstab.cpp b/src/map/skills/thief/backstab.cpp index 63972db1068..9d93b8612c3 100644 --- a/src/map/skills/thief/backstab.cpp +++ b/src/map/skills/thief/backstab.cpp @@ -11,6 +11,15 @@ SkillBackStab::SkillBackStab() : SkillImpl(RG_BACKSTAP) { } +void SkillBackStab::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { +#ifdef RENEWAL + const map_session_data* sd = BL_CAST(BL_PC, &src); + + if (sd != nullptr && sd->status.weapon == W_DAGGER) + dmg.div_ = 2; +#endif +} + void SkillBackStab::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &base_skillratio, int32 mflag) const { const map_session_data* sd = BL_CAST( BL_PC, src ); diff --git a/src/map/skills/thief/backstab.hpp b/src/map/skills/thief/backstab.hpp index 58446f5554c..c9fa79648a5 100644 --- a/src/map/skills/thief/backstab.hpp +++ b/src/map/skills/thief/backstab.hpp @@ -9,6 +9,7 @@ class SkillBackStab : public SkillImpl { public: SkillBackStab(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void applyAdditionalEffects(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32 attack_type, enum damage_lv dmg_lv) const override; void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const override; void castendDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const override; diff --git a/src/map/skills/thief/chasingbreak.cpp b/src/map/skills/thief/chasingbreak.cpp index a7a4d400099..2adb45b521c 100644 --- a/src/map/skills/thief/chasingbreak.cpp +++ b/src/map/skills/thief/chasingbreak.cpp @@ -14,6 +14,13 @@ SkillChasingBreak::SkillChasingBreak() : SkillImplRecursiveDamageSplash(ABC_CHASING_BREAK) { } +void SkillChasingBreak::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const status_change *sc = status_get_sc(&src); + + if (sc != nullptr && sc->hasSCE(SC_CHASING)) + dmg.div_ = 7; +} + void SkillChasingBreak::calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& skillratio, int32 mflag) const { const status_change* sc = status_get_sc(src); const status_data* sstatus = status_get_status_data(*src); diff --git a/src/map/skills/thief/chasingbreak.hpp b/src/map/skills/thief/chasingbreak.hpp index 1bb9896b6d7..8ddbb514e23 100644 --- a/src/map/skills/thief/chasingbreak.hpp +++ b/src/map/skills/thief/chasingbreak.hpp @@ -9,6 +9,7 @@ class SkillChasingBreak : public SkillImplRecursiveDamageSplash { public: SkillChasingBreak(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override; void splashSearch(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32 flag) const override; }; diff --git a/src/map/skills/thief/chasingshot.cpp b/src/map/skills/thief/chasingshot.cpp index abaa5d6772f..9fbda902f60 100644 --- a/src/map/skills/thief/chasingshot.cpp +++ b/src/map/skills/thief/chasingshot.cpp @@ -14,6 +14,13 @@ SkillChasingShot::SkillChasingShot() : SkillImplRecursiveDamageSplash(ABC_CHASING_SHOT) { } +void SkillChasingShot::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const status_change *sc = status_get_sc(&src); + + if (sc != nullptr && sc->hasSCE(SC_CHASING)) + dmg.div_ = 3; +} + void SkillChasingShot::calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& skillratio, int32 mflag) const { const status_change* sc = status_get_sc(src); const status_data* sstatus = status_get_status_data(*src); diff --git a/src/map/skills/thief/chasingshot.hpp b/src/map/skills/thief/chasingshot.hpp index 6e6605f8a11..1c72751b0ad 100644 --- a/src/map/skills/thief/chasingshot.hpp +++ b/src/map/skills/thief/chasingshot.hpp @@ -9,6 +9,7 @@ class SkillChasingShot : public SkillImplRecursiveDamageSplash { public: SkillChasingShot(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override; void splashSearch(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32 flag) const override; }; diff --git a/src/map/skills/thief/doubleattack.cpp b/src/map/skills/thief/doubleattack.cpp new file mode 100644 index 00000000000..5e7a310078a --- /dev/null +++ b/src/map/skills/thief/doubleattack.cpp @@ -0,0 +1,12 @@ +// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#include "doubleattack.hpp" + +SkillDoubleAttack::SkillDoubleAttack() : WeaponSkillImpl(TF_DOUBLE) { +} + +void SkillDoubleAttack::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + // For NPC used skill. + dmg.type = DMG_MULTI_HIT; +} diff --git a/src/map/skills/thief/doubleattack.hpp b/src/map/skills/thief/doubleattack.hpp new file mode 100644 index 00000000000..c5c455287a8 --- /dev/null +++ b/src/map/skills/thief/doubleattack.hpp @@ -0,0 +1,13 @@ +// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#pragma once + +#include "../skill_impl.hpp" + +class SkillDoubleAttack : public WeaponSkillImpl { +public: + SkillDoubleAttack(); + + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; +}; diff --git a/src/map/skills/thief/eternalslash.cpp b/src/map/skills/thief/eternalslash.cpp index 2623a8c5e4e..69533cec949 100644 --- a/src/map/skills/thief/eternalslash.cpp +++ b/src/map/skills/thief/eternalslash.cpp @@ -11,6 +11,13 @@ SkillEternalSlash::SkillEternalSlash() : WeaponSkillImpl(SHC_ETERNAL_SLASH) { } +void SkillEternalSlash::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const status_change *sc = status_get_sc(&src); + + if (sc != nullptr && sc->hasSCE(SC_E_SLASH_COUNT)) + dmg.div_ = sc->getSCE(SC_E_SLASH_COUNT)->val1; +} + void SkillEternalSlash::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const { const status_data* sstatus = status_get_status_data(*src); const status_change *sc = status_get_sc(src); diff --git a/src/map/skills/thief/eternalslash.hpp b/src/map/skills/thief/eternalslash.hpp index a68acea40ff..05198aabab7 100644 --- a/src/map/skills/thief/eternalslash.hpp +++ b/src/map/skills/thief/eternalslash.hpp @@ -9,6 +9,7 @@ class SkillEternalSlash : public WeaponSkillImpl { public: SkillEternalSlash(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const override; void castendDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const override; }; diff --git a/src/map/skills/thief/fatalmenace.cpp b/src/map/skills/thief/fatalmenace.cpp index 30deacd72fa..23e1c4b8ef0 100644 --- a/src/map/skills/thief/fatalmenace.cpp +++ b/src/map/skills/thief/fatalmenace.cpp @@ -12,6 +12,13 @@ SkillFatalMenace::SkillFatalMenace() : WeaponSkillImpl(SC_FATALMENACE) { } +void SkillFatalMenace::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const map_session_data* sd = BL_CAST(BL_PC, &src); + + if (sd != nullptr && sd->weapontype1 == W_DAGGER) + dmg.div_++; +} + void SkillFatalMenace::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const { const status_data* sstatus = status_get_status_data(*src); const status_change *sc = status_get_sc(src); diff --git a/src/map/skills/thief/fatalmenace.hpp b/src/map/skills/thief/fatalmenace.hpp index 72266b49406..d5d9d3c93b6 100644 --- a/src/map/skills/thief/fatalmenace.hpp +++ b/src/map/skills/thief/fatalmenace.hpp @@ -9,6 +9,7 @@ class SkillFatalMenace : public WeaponSkillImpl { public: SkillFatalMenace(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const override; void castendDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const override; void modifyHitRate(int16& hit_rate, const block_list* src, const block_list* target, uint16 skill_lv) const override; diff --git a/src/map/skills/thief/frenzyshot.cpp b/src/map/skills/thief/frenzyshot.cpp index 779c5fe1ec9..c30fe05e3bf 100644 --- a/src/map/skills/thief/frenzyshot.cpp +++ b/src/map/skills/thief/frenzyshot.cpp @@ -3,6 +3,8 @@ #include "frenzyshot.hpp" +#include + #include #include "map/clif.hpp" @@ -11,6 +13,12 @@ SkillFrenzyShot::SkillFrenzyShot() : WeaponSkillImpl(ABC_FRENZY_SHOT) { } +void SkillFrenzyShot::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + if (rnd_chance(5 * skill_lv, 100)) { + dmg.div_ = 3; + } +} + void SkillFrenzyShot::castendDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const { clif_skill_nodamage(src, *target, getSkillId(), skill_lv); WeaponSkillImpl::castendDamageId(src, target, skill_lv, tick, flag); diff --git a/src/map/skills/thief/frenzyshot.hpp b/src/map/skills/thief/frenzyshot.hpp index 4042d2189b3..81559003dfe 100644 --- a/src/map/skills/thief/frenzyshot.hpp +++ b/src/map/skills/thief/frenzyshot.hpp @@ -9,6 +9,7 @@ class SkillFrenzyShot : public WeaponSkillImpl { public: SkillFrenzyShot(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void castendDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const override; void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override; }; diff --git a/src/map/skills/thief/hitandsliding.cpp b/src/map/skills/thief/hitandsliding.cpp index 1dbb05962d9..28b467866da 100644 --- a/src/map/skills/thief/hitandsliding.cpp +++ b/src/map/skills/thief/hitandsliding.cpp @@ -15,6 +15,13 @@ SkillHitAndSliding::SkillHitAndSliding() : WeaponSkillImpl(ABC_HIT_AND_SLIDING) { } +void SkillHitAndSliding::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const map_session_data* sd = BL_CAST(BL_PC, &src); + + if (sd != nullptr && sd->status.weapon == W_BOW) + dmg.flag |= BF_LONG; +} + void SkillHitAndSliding::castendDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const { map_session_data* sd = BL_CAST(BL_PC, src); uint8 dir = DIR_NORTHEAST; diff --git a/src/map/skills/thief/hitandsliding.hpp b/src/map/skills/thief/hitandsliding.hpp index fa9784b4343..a47f001eade 100644 --- a/src/map/skills/thief/hitandsliding.hpp +++ b/src/map/skills/thief/hitandsliding.hpp @@ -9,6 +9,7 @@ class SkillHitAndSliding : public WeaponSkillImpl { public: SkillHitAndSliding(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void castendDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const override; void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override; void applyAdditionalEffects(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32 attack_type, enum damage_lv dmg_lv) const override; diff --git a/src/map/skills/thief/impactcrater.cpp b/src/map/skills/thief/impactcrater.cpp index d077fe04acf..514e932e8ac 100644 --- a/src/map/skills/thief/impactcrater.cpp +++ b/src/map/skills/thief/impactcrater.cpp @@ -11,6 +11,13 @@ SkillImpactCrater::SkillImpactCrater() : SkillImplRecursiveDamageSplash(SHC_IMPACT_CRATER) { } +void SkillImpactCrater::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + const status_change *sc = status_get_sc(&src); + + if (sc != nullptr && sc->hasSCE(SC_ROLLINGCUTTER)) + dmg.div_ = sc->getSCE(SC_ROLLINGCUTTER)->val1; +} + void SkillImpactCrater::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const { const status_data* sstatus = status_get_status_data(*src); diff --git a/src/map/skills/thief/impactcrater.hpp b/src/map/skills/thief/impactcrater.hpp index 66e95006790..9cb8b18cf31 100644 --- a/src/map/skills/thief/impactcrater.hpp +++ b/src/map/skills/thief/impactcrater.hpp @@ -9,6 +9,7 @@ class SkillImpactCrater : public SkillImplRecursiveDamageSplash { public: SkillImpactCrater(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const override; void castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const override; }; diff --git a/src/map/skills/thief/savageimpact.cpp b/src/map/skills/thief/savageimpact.cpp index a7ae9d66e2e..d9d213f2a5b 100644 --- a/src/map/skills/thief/savageimpact.cpp +++ b/src/map/skills/thief/savageimpact.cpp @@ -13,6 +13,10 @@ SkillSavageImpact::SkillSavageImpact() : SkillImplRecursiveDamageSplash(SHC_SAVAGE_IMPACT) { } +void SkillSavageImpact::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { + dmg.div_ = dmg.div_ + dmg.miscflag; +} + void SkillSavageImpact::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const { const status_data* sstatus = status_get_status_data(*src); const status_change *sc = status_get_sc(src); diff --git a/src/map/skills/thief/savageimpact.hpp b/src/map/skills/thief/savageimpact.hpp index ced7093c07f..d96d0de883f 100644 --- a/src/map/skills/thief/savageimpact.hpp +++ b/src/map/skills/thief/savageimpact.hpp @@ -9,6 +9,7 @@ class SkillSavageImpact : public SkillImplRecursiveDamageSplash { public: SkillSavageImpact(); + void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const override; void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const override; void splashSearch(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32 flag) const override; }; diff --git a/src/map/skills/thief/skill_factory_thief.cpp b/src/map/skills/thief/skill_factory_thief.cpp index 2c68744f8df..815aed4a0db 100644 --- a/src/map/skills/thief/skill_factory_thief.cpp +++ b/src/map/skills/thief/skill_factory_thief.cpp @@ -41,6 +41,7 @@ #include "divesthelm.cpp" #include "divestshield.cpp" #include "divestweapon.cpp" +#include "doubleattack.cpp" #include "emergencyescape.cpp" #include "enchantdeadlypoison.cpp" #include "enchantpoison.cpp" @@ -290,7 +291,7 @@ std::unique_ptr SkillFactoryThief::create(const e_skill skill_i case TF_DETOXIFY: return std::make_unique(); case TF_DOUBLE: - return std::make_unique(skill_id); + return std::make_unique(); case TF_HIDING: return std::make_unique(); case TF_PICKSTONE: