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;
+};