From f89f6d6e8ba4ceff5512a2fe5eb3b64f94b18267 Mon Sep 17 00:00:00 2001 From: Atemo Date: Mon, 19 Jan 2026 16:47:10 +0100 Subject: [PATCH] Split up Assassin Cross skills (#9750) --- src/map/battle.cpp | 17 -------- src/map/map-server-generator.vcxproj | 8 ++++ src/map/map-server-generator.vcxproj.filters | 24 ++++++++++ src/map/map-server.vcxproj | 8 ++++ src/map/map-server.vcxproj.filters | 24 ++++++++++ src/map/skill.cpp | 36 --------------- src/map/skills/thief/createdeadlypoison.cpp | 21 +++++++++ src/map/skills/thief/createdeadlypoison.hpp | 13 ++++++ src/map/skills/thief/enchantdeadlypoison.cpp | 22 ++++++++++ src/map/skills/thief/enchantdeadlypoison.hpp | 13 ++++++ src/map/skills/thief/meteorassault.cpp | 46 ++++++++++++++++++++ src/map/skills/thief/meteorassault.hpp | 15 +++++++ src/map/skills/thief/skill_factory_thief.cpp | 12 ++++- src/map/skills/thief/souldestroyer.cpp | 24 ++++++++++ src/map/skills/thief/souldestroyer.hpp | 13 ++++++ 15 files changed, 242 insertions(+), 54 deletions(-) create mode 100644 src/map/skills/thief/createdeadlypoison.cpp create mode 100644 src/map/skills/thief/createdeadlypoison.hpp create mode 100644 src/map/skills/thief/enchantdeadlypoison.cpp create mode 100644 src/map/skills/thief/enchantdeadlypoison.hpp create mode 100644 src/map/skills/thief/meteorassault.cpp create mode 100644 src/map/skills/thief/meteorassault.hpp create mode 100644 src/map/skills/thief/souldestroyer.cpp create mode 100644 src/map/skills/thief/souldestroyer.hpp diff --git a/src/map/battle.cpp b/src/map/battle.cpp index c3697a8139d..34293ec9876 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -4883,14 +4883,6 @@ static int32 battle_calc_attack_skill_ratio(struct Damage* wd, block_list *src,b RE_LVL_DMOD(100); break; #endif - case ASC_METEORASSAULT: -#ifdef RENEWAL - skillratio += 100 + 120 * skill_lv; - RE_LVL_DMOD(100); -#else - skillratio += -60 + 40 * skill_lv; -#endif - break; case SN_SHARPSHOOTING: if (src->type == BL_MOB) { // TODO: Did these formulas change in the renewal balancing? if (wd->miscflag & 2) // Splash damage bonus @@ -4921,15 +4913,6 @@ static int32 battle_calc_attack_skill_ratio(struct Damage* wd, block_list *src,b RE_LVL_DMOD(100); #else skillratio += 100 + 100 * skill_lv; -#endif - break; - case ASC_BREAKER: -#ifdef RENEWAL - skillratio += -100 + 150 * skill_lv + sstatus->str + sstatus->int_; // !TODO: Confirm stat modifier - RE_LVL_DMOD(100); -#else - // Pre-Renewal: skill ratio for weapon part of damage [helvetica] - skillratio += -100 + 100 * skill_lv; #endif break; case PA_SACRIFICE: diff --git a/src/map/map-server-generator.vcxproj b/src/map/map-server-generator.vcxproj index 56c1814769c..0fdf6b09a05 100644 --- a/src/map/map-server-generator.vcxproj +++ b/src/map/map-server-generator.vcxproj @@ -405,16 +405,19 @@ + + + @@ -423,6 +426,7 @@ + @@ -641,16 +645,19 @@ + + + @@ -659,6 +666,7 @@ + diff --git a/src/map/map-server-generator.vcxproj.filters b/src/map/map-server-generator.vcxproj.filters index 2f6aeb1f4d5..efff1f6720b 100644 --- a/src/map/map-server-generator.vcxproj.filters +++ b/src/map/map-server-generator.vcxproj.filters @@ -864,6 +864,9 @@ Header Files\Skills\Thief + + Header Files\Skills\Thief + Header Files\Skills\Thief @@ -879,6 +882,9 @@ Header Files\Skills\Thief + + Header Files\Skills\Thief + Header Files\Skills\Thief @@ -894,6 +900,9 @@ Header Files\Skills\Thief + + Header Files\Skills\Thief + Header Files\Skills\Thief @@ -918,6 +927,9 @@ Header Files\Skills\Thief + + Header Files\Skills\Thief + Header Files\Skills\Thief @@ -1430,6 +1442,9 @@ Source Files\Skills\Thief + + Source Files\Skills\Thief + Source Files\Skills\Thief @@ -1445,6 +1460,9 @@ Source Files\Skills\Thief + + Source Files\Skills\Thief + Source Files\Skills\Thief @@ -1460,6 +1478,9 @@ Source Files\Skills\Thief + + Source Files\Skills\Thief + Source Files\Skills\Thief @@ -1484,6 +1505,9 @@ Source Files\Skills\Thief + + Source Files\Skills\Thief + Source Files\Skills\Thief diff --git a/src/map/map-server.vcxproj b/src/map/map-server.vcxproj index f34fd11172a..39967816ce2 100644 --- a/src/map/map-server.vcxproj +++ b/src/map/map-server.vcxproj @@ -405,16 +405,19 @@ + + + @@ -423,6 +426,7 @@ + @@ -641,16 +645,19 @@ + + + @@ -659,6 +666,7 @@ + diff --git a/src/map/map-server.vcxproj.filters b/src/map/map-server.vcxproj.filters index 2f6aeb1f4d5..efff1f6720b 100644 --- a/src/map/map-server.vcxproj.filters +++ b/src/map/map-server.vcxproj.filters @@ -864,6 +864,9 @@ Header Files\Skills\Thief + + Header Files\Skills\Thief + Header Files\Skills\Thief @@ -879,6 +882,9 @@ Header Files\Skills\Thief + + Header Files\Skills\Thief + Header Files\Skills\Thief @@ -894,6 +900,9 @@ Header Files\Skills\Thief + + Header Files\Skills\Thief + Header Files\Skills\Thief @@ -918,6 +927,9 @@ Header Files\Skills\Thief + + Header Files\Skills\Thief + Header Files\Skills\Thief @@ -1430,6 +1442,9 @@ Source Files\Skills\Thief + + Source Files\Skills\Thief + Source Files\Skills\Thief @@ -1445,6 +1460,9 @@ Source Files\Skills\Thief + + Source Files\Skills\Thief + Source Files\Skills\Thief @@ -1460,6 +1478,9 @@ Source Files\Skills\Thief + + Source Files\Skills\Thief + Source Files\Skills\Thief @@ -1484,6 +1505,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 259d6038213..d77e82b631a 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -1597,20 +1597,6 @@ int32 skill_additional_effect( block_list* src, block_list *bl, uint16 skill_id, sc_start2(src,bl, SC_BLEEDING,50, skill_lv, src->id, skill_get_time2(skill_id,skill_lv)); break; - case ASC_METEORASSAULT: - //Any enemies hit by this skill will receive Stun, Darkness, or external bleeding status ailment with a 5%+5*skill_lv% chance. - switch(rnd()%3) { - case 0: - sc_start(src,bl,SC_BLIND,(5+skill_lv*5),skill_lv,skill_get_time2(skill_id,1)); - break; - case 1: - sc_start(src,bl,SC_STUN,(5+skill_lv*5),skill_lv,skill_get_time2(skill_id,2)); - break; - default: - sc_start2(src,bl,SC_BLEEDING,(5+skill_lv*5),skill_lv,src->id,skill_get_time2(skill_id,3)); - } - break; - case HW_NAPALMVULCAN: case HN_NAPALM_VULCAN_STRIKE: sc_start(src,bl,SC_CURSE,5*skill_lv,skill_lv,skill_get_time2(skill_id,skill_lv)); @@ -5345,7 +5331,6 @@ int32 skill_castend_damage_id (block_list* src, block_list *bl, uint16 skill_id, #endif case HW_NAPALMVULCAN: case NJ_HUUMA: - case ASC_METEORASSAULT: case NPC_PULSESTRIKE: case NPC_PULSESTRIKE2: case NPC_HELLJUDGEMENT: @@ -7862,17 +7847,6 @@ int32 skill_castend_nodamage_id (block_list *src, block_list *bl, uint16 skill_i clif_skill_damage( *src, *bl, tick, status_get_amotion(src), 0, DMGVAL_IGNORE, 1, skill_id, skill_lv, DMG_SINGLE ); break; - // EDP also give +25% WATK poison pseudo element to user. - case ASC_EDP: - clif_skill_nodamage(src,*bl,skill_id,skill_lv, - sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); -#ifdef RENEWAL - sc_start4(src, src, SC_SUB_WEAPONPROPERTY, 100, ELE_POISON, 25, skill_id, 0, skill_get_time(skill_id, skill_lv)); -#else - sc_start4(src, src, SC_WATK_ELEMENT, 100, ELE_POISON, 25, 0, 0, skill_get_time(skill_id, skill_lv)); -#endif - break; - case LG_SHIELDSPELL: if (skill_lv == 1) type = SC_SHIELDSPELL_HP; @@ -8288,7 +8262,6 @@ int32 skill_castend_nodamage_id (block_list *src, block_list *bl, uint16 skill_i break; //List of self skills that give damage around caster - case ASC_METEORASSAULT: case RK_WINDCUTTER: case RK_STORMBLAST: case NC_AXETORNADO: @@ -8864,15 +8837,6 @@ int32 skill_castend_nodamage_id (block_list *src, block_list *bl, uint16 skill_i unit_warp(bl,-1,-1,-1,CLR_TELEPORT); break; - case ASC_CDP: - if(sd) { - if(skill_produce_mix(sd, skill_id, ITEMID_POISON_BOTTLE, 0, 0, 0, 1, -1)) //Produce a Poison Bottle. - clif_skill_nodamage(src,*bl,skill_id,skill_lv); - else - clif_skill_fail( *sd, skill_id, USESKILL_FAIL_STUFF_INSUFFICIENT ); - } - break; - case ST_FULLSTRIP: case GC_WEAPONCRUSH: case SC_STRIPACCESSARY: diff --git a/src/map/skills/thief/createdeadlypoison.cpp b/src/map/skills/thief/createdeadlypoison.cpp new file mode 100644 index 00000000000..21868fce5ab --- /dev/null +++ b/src/map/skills/thief/createdeadlypoison.cpp @@ -0,0 +1,21 @@ +// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#include "createdeadlypoison.hpp" + +#include "map/clif.hpp" +#include "map/pc.hpp" + +SkillCreateDeadlyPoison::SkillCreateDeadlyPoison() : SkillImpl(ASC_CDP) { +} + +void SkillCreateDeadlyPoison::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 ); + + if(sd) { + if(skill_produce_mix(sd, getSkillId(), ITEMID_POISON_BOTTLE, 0, 0, 0, 1, -1)) //Produce a Poison Bottle. + clif_skill_nodamage(src,*target,getSkillId(),skill_lv); + else + clif_skill_fail( *sd, getSkillId(), USESKILL_FAIL_STUFF_INSUFFICIENT ); + } +} diff --git a/src/map/skills/thief/createdeadlypoison.hpp b/src/map/skills/thief/createdeadlypoison.hpp new file mode 100644 index 00000000000..887ea279348 --- /dev/null +++ b/src/map/skills/thief/createdeadlypoison.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 SkillCreateDeadlyPoison : public SkillImpl { +public: + SkillCreateDeadlyPoison(); + + 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/enchantdeadlypoison.cpp b/src/map/skills/thief/enchantdeadlypoison.cpp new file mode 100644 index 00000000000..f5f27d4c17a --- /dev/null +++ b/src/map/skills/thief/enchantdeadlypoison.cpp @@ -0,0 +1,22 @@ +// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#include "enchantdeadlypoison.hpp" + +#include + +#include "map/status.hpp" + +SkillEnchantDeadlyPoison::SkillEnchantDeadlyPoison() : StatusSkillImpl(ASC_EDP) { +} + +void SkillEnchantDeadlyPoison::castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const { + // EDP also give +25% WATK poison pseudo element to user. + StatusSkillImpl::castendNoDamageId(src, target, skill_lv, tick, flag); + +#ifdef RENEWAL + sc_start4(src, src, SC_SUB_WEAPONPROPERTY, 100, ELE_POISON, 25, getSkillId(), 0, skill_get_time(getSkillId(), skill_lv)); +#else + sc_start4(src, src, SC_WATK_ELEMENT, 100, ELE_POISON, 25, 0, 0, skill_get_time(getSkillId(), skill_lv)); +#endif +} diff --git a/src/map/skills/thief/enchantdeadlypoison.hpp b/src/map/skills/thief/enchantdeadlypoison.hpp new file mode 100644 index 00000000000..4777467e261 --- /dev/null +++ b/src/map/skills/thief/enchantdeadlypoison.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 "../status_skill_impl.hpp" + +class SkillEnchantDeadlyPoison : public StatusSkillImpl { +public: + SkillEnchantDeadlyPoison(); + + 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/meteorassault.cpp b/src/map/skills/thief/meteorassault.cpp new file mode 100644 index 00000000000..88aedd1d191 --- /dev/null +++ b/src/map/skills/thief/meteorassault.cpp @@ -0,0 +1,46 @@ +// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#include "meteorassault.hpp" + +#include +#include + +#include "map/clif.hpp" +#include "map/status.hpp" + +SkillMeteorAssault::SkillMeteorAssault() : SkillImplRecursiveDamageSplash(ASC_METEORASSAULT) { +} + +void SkillMeteorAssault::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const { +#ifdef RENEWAL + skillratio += 100 + 120 * skill_lv; + RE_LVL_DMOD(100); +#else + skillratio += -60 + 40 * skill_lv; +#endif +} + +void SkillMeteorAssault::castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const { + // Skill give damage around caster + int32 starget = BL_CHAR|BL_SKILL; + + skill_area_temp[1] = 0; + clif_skill_nodamage(src,*target,getSkillId(),skill_lv); + map_foreachinrange(skill_area_sub, target, skill_get_splash(getSkillId(), skill_lv), starget, + src, getSkillId(), skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id); +} + +void SkillMeteorAssault::applyAdditionalEffects(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32 attack_type, enum damage_lv dmg_lv) const { + //Any enemies hit by this skill will receive Stun, Darkness, or external bleeding status ailment with a 5%+5*skill_lv% chance. + switch(rnd()%3) { + case 0: + sc_start(src,target,SC_BLIND,(5+skill_lv*5),skill_lv,skill_get_time2(getSkillId(),1)); + break; + case 1: + sc_start(src,target,SC_STUN,(5+skill_lv*5),skill_lv,skill_get_time2(getSkillId(),2)); + break; + default: + sc_start2(src,target,SC_BLEEDING,(5+skill_lv*5),skill_lv,src->id,skill_get_time2(getSkillId(),3)); + } +} diff --git a/src/map/skills/thief/meteorassault.hpp b/src/map/skills/thief/meteorassault.hpp new file mode 100644 index 00000000000..de373a892d7 --- /dev/null +++ b/src/map/skills/thief/meteorassault.hpp @@ -0,0 +1,15 @@ +// 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 SkillMeteorAssault : public SkillImplRecursiveDamageSplash { +public: + SkillMeteorAssault(); + + 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/thief/skill_factory_thief.cpp b/src/map/skills/thief/skill_factory_thief.cpp index 7b3e64e7d4a..66bd261f90f 100644 --- a/src/map/skills/thief/skill_factory_thief.cpp +++ b/src/map/skills/thief/skill_factory_thief.cpp @@ -10,16 +10,19 @@ #include "backstab.hpp" #include "cloaking.hpp" #include "closeconfine.hpp" +#include "createdeadlypoison.hpp" #include "detoxify.hpp" #include "divestarmor.hpp" #include "divesthelm.hpp" #include "divestshield.hpp" #include "divestweapon.hpp" +#include "enchantdeadlypoison.hpp" #include "enchantpoison.hpp" #include "envenom.hpp" #include "findstone.hpp" #include "grimtooth.hpp" #include "hiding.hpp" +#include "meteorassault.hpp" #include "mug.hpp" #include "remover.hpp" #include "sandattack.hpp" @@ -27,6 +30,7 @@ #include "sightlessmind.hpp" #include "snatch.hpp" #include "sonicblow.hpp" +#include "souldestroyer.hpp" #include "steal.hpp" #include "stonefling.hpp" #include "throwvenomknife.hpp" @@ -39,6 +43,12 @@ std::unique_ptr SkillFactoryThief::create(const e_skill skill_i return std::make_unique(skill_id); case ABC_CHAIN_REACTION_SHOT_ATK: return std::make_unique(skill_id); + case ASC_CDP: + return std::make_unique(); + case ASC_EDP: + return std::make_unique(); + case ASC_METEORASSAULT: + return std::make_unique(); case AS_CLOAKING: return std::make_unique(); case AS_ENCHANTPOISON: @@ -56,7 +66,7 @@ std::unique_ptr SkillFactoryThief::create(const e_skill skill_i case AS_VENOMKNIFE: return std::make_unique(); case ASC_BREAKER: - return std::make_unique(skill_id); + return std::make_unique(); case GC_VENOMIMPRESS: return std::make_unique(skill_id); case GC_VENOMPRESSURE: diff --git a/src/map/skills/thief/souldestroyer.cpp b/src/map/skills/thief/souldestroyer.cpp new file mode 100644 index 00000000000..d31e20f7d99 --- /dev/null +++ b/src/map/skills/thief/souldestroyer.cpp @@ -0,0 +1,24 @@ +// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#include "souldestroyer.hpp" + +#include +#include + +#include "map/status.hpp" + +SkillSoulDestroyer::SkillSoulDestroyer() : WeaponSkillImpl(ASC_BREAKER) { +} + +void SkillSoulDestroyer::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const { +#ifdef RENEWAL + const status_data* sstatus = status_get_status_data(*src); + + skillratio += -100 + 150 * skill_lv + sstatus->str + sstatus->int_; // !TODO: Confirm stat modifier + RE_LVL_DMOD(100); +#else + // Pre-Renewal: skill ratio for weapon part of damage [helvetica] + skillratio += -100 + 100 * skill_lv; +#endif +} diff --git a/src/map/skills/thief/souldestroyer.hpp b/src/map/skills/thief/souldestroyer.hpp new file mode 100644 index 00000000000..ce2ac7674f7 --- /dev/null +++ b/src/map/skills/thief/souldestroyer.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 "../weapon_skill_impl.hpp" + +class SkillSoulDestroyer : public WeaponSkillImpl { +public: + SkillSoulDestroyer(); + + void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const override; +};