diff --git a/src/map/battle.cpp b/src/map/battle.cpp
index 34293ec9876..4e5e2ed2990 100644
--- a/src/map/battle.cpp
+++ b/src/map/battle.cpp
@@ -8266,15 +8266,6 @@ struct Damage battle_calc_magic_attack(block_list *src,block_list *target,uint16
skillratio += 25;
#endif
break;
- case SL_STIN: //Target size must be small (0) for full damage
- skillratio += (tstatus->size != SZ_SMALL ? -99 : 10 * skill_lv);
- break;
- case SL_STUN:
- skillratio += 5 * skill_lv;
- break;
- case SL_SMA: //Base damage is 40% + lv%
- skillratio += -60 + status_get_lv(src);
- break;
case NJ_KOUENKA:
skillratio -= 10;
if(sd && sd->spiritcharm_type == CHARM_TYPE_FIRE && sd->spiritcharm > 0)
diff --git a/src/map/map-server-generator.vcxproj b/src/map/map-server-generator.vcxproj
index 0fdf6b09a05..4ae7d0f04e1 100644
--- a/src/map/map-server-generator.vcxproj
+++ b/src/map/map-server-generator.vcxproj
@@ -393,20 +393,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -428,6 +456,7 @@
+
@@ -633,20 +662,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -668,6 +725,7 @@
+
diff --git a/src/map/map-server-generator.vcxproj.filters b/src/map/map-server-generator.vcxproj.filters
index efff1f6720b..969354b7a90 100644
--- a/src/map/map-server-generator.vcxproj.filters
+++ b/src/map/map-server-generator.vcxproj.filters
@@ -828,12 +828,42 @@
Header Files\Skills\Taekwon
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
Header Files\Skills\Taekwon
Header Files\Skills\Taekwon
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
Header Files\Skills\Taekwon
@@ -846,6 +876,54 @@
Header Files\Skills\Taekwon
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
Header Files\Skills\Taekwon
@@ -864,12 +942,18 @@
Header Files\Skills\Thief
+
+ Header Files\Skills\Thief
+
Header Files\Skills\Thief
Header Files\Skills\Thief
+
+ Header Files\Skills\Thief
+
Header Files\Skills\Thief
@@ -933,6 +1017,9 @@
Header Files\Skills\Thief
+
+ Header Files\Skills\Thief
+
Header Files\Skills\Thief
@@ -1406,12 +1493,42 @@
Source Files\Skills\Taekwon
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
Source Files\Skills\Taekwon
Source Files\Skills\Taekwon
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
Source Files\Skills\Taekwon
@@ -1424,6 +1541,54 @@
Source Files\Skills\Taekwon
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
Source Files\Skills\Taekwon
@@ -1442,12 +1607,18 @@
Source Files\Skills\Thief
+
+ Source Files\Skills\Thief
+
Source Files\Skills\Thief
Source Files\Skills\Thief
+
+ Source Files\Skills\Thief
+
Source Files\Skills\Thief
@@ -1511,6 +1682,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 39967816ce2..ce700fa94ca 100644
--- a/src/map/map-server.vcxproj
+++ b/src/map/map-server.vcxproj
@@ -393,20 +393,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -428,6 +456,7 @@
+
@@ -633,20 +662,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -668,6 +725,7 @@
+
diff --git a/src/map/map-server.vcxproj.filters b/src/map/map-server.vcxproj.filters
index efff1f6720b..969354b7a90 100644
--- a/src/map/map-server.vcxproj.filters
+++ b/src/map/map-server.vcxproj.filters
@@ -828,12 +828,42 @@
Header Files\Skills\Taekwon
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
Header Files\Skills\Taekwon
Header Files\Skills\Taekwon
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
Header Files\Skills\Taekwon
@@ -846,6 +876,54 @@
Header Files\Skills\Taekwon
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
Header Files\Skills\Taekwon
@@ -864,12 +942,18 @@
Header Files\Skills\Thief
+
+ Header Files\Skills\Thief
+
Header Files\Skills\Thief
Header Files\Skills\Thief
+
+ Header Files\Skills\Thief
+
Header Files\Skills\Thief
@@ -933,6 +1017,9 @@
Header Files\Skills\Thief
+
+ Header Files\Skills\Thief
+
Header Files\Skills\Thief
@@ -1406,12 +1493,42 @@
Source Files\Skills\Taekwon
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
Source Files\Skills\Taekwon
Source Files\Skills\Taekwon
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
Source Files\Skills\Taekwon
@@ -1424,6 +1541,54 @@
Source Files\Skills\Taekwon
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
Source Files\Skills\Taekwon
@@ -1442,12 +1607,18 @@
Source Files\Skills\Thief
+
+ Source Files\Skills\Thief
+
Source Files\Skills\Thief
Source Files\Skills\Thief
+
+ Source Files\Skills\Thief
+
Source Files\Skills\Thief
@@ -1511,6 +1682,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 d77e82b631a..fcfd420a55b 100755
--- a/src/map/skill.cpp
+++ b/src/map/skill.cpp
@@ -1500,10 +1500,6 @@ int32 skill_additional_effect( block_list* src, block_list *bl, uint16 skill_id,
status_zap( bl, 0, rate );
} break;
#endif
- case SL_STUN:
- if (tstatus->size==SZ_MEDIUM) //Only stuns mid-sized mobs.
- sc_start(src,bl,SC_STUN,(30+10*skill_lv),skill_lv,skill_get_time(skill_id,skill_lv));
- break;
case NPC_PETRIFYATTACK:
sc_start2(src,bl,SC_STONEWAIT,(20*skill_lv),skill_lv,src->id,skill_get_time2(skill_id,skill_lv),skill_get_time(skill_id, skill_lv));
@@ -1583,10 +1579,6 @@ int32 skill_additional_effect( block_list* src, block_list *bl, uint16 skill_id,
sc_start(src,bl,SC_ANKLE,100,0,skill_get_time2(skill_id,skill_lv));
break;
- case ST_REJECTSWORD:
- sc_start(src,bl,SC_AUTOCOUNTER,(skill_lv*15),skill_lv,skill_get_time(skill_id,skill_lv));
- break;
-
case PF_FOGWALL:
if (src != bl && !tsc->getSCE(SC_DELUGE))
sc_start(src,bl,SC_BLIND,100,skill_lv,skill_get_time2(skill_id,skill_lv));
@@ -6201,11 +6193,6 @@ int32 skill_castend_damage_id (block_list* src, block_list *bl, uint16 skill_id,
skill_attack(BF_MISC, src, src, bl, skill_id, skill_lv, tick, flag);
break;
- case SL_SMA:
- status_change_end(src, SC_SMA);
- [[fallthrough]];
- case SL_STIN:
- case SL_STUN:
case SP_SPA:
if (sd && !battle_config.allow_es_magic_pc && bl->type != BL_MOB) {
status_change_start(src,src,SC_STUN,10000,skill_lv,0,0,0,500,SCSTART_NOTICKDEF|SCSTART_NORATEDEF);
@@ -8571,10 +8558,6 @@ int32 skill_castend_nodamage_id (block_list *src, block_list *bl, uint16 skill_i
clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start2(src, bl, type, 100, skill_lv, pc_checkskill(sd, SP_SOULENERGY), skill_get_time(skill_id, skill_lv)));
break;
- case SL_KAITE:
- case SL_KAAHI:
- case SL_KAIZEL:
- case SL_KAUPE:
case SP_KAUTE:
if (sd) {
if (!dstsd || !(
@@ -8583,25 +8566,21 @@ int32 skill_castend_nodamage_id (block_list *src, block_list *bl, uint16 skill_i
dstsd->status.char_id == sd->status.char_id ||
dstsd->status.char_id == sd->status.partner_id ||
dstsd->status.char_id == sd->status.child ||
- (skill_id == SP_KAUTE && dstsd->sc.getSCE(SC_SOULUNITY))
+ (dstsd->sc.getSCE(SC_SOULUNITY))
)) {
status_change_start(src,src,SC_STUN,10000,skill_lv,0,0,0,500,SCSTART_NORATEDEF);
clif_skill_fail( *sd, skill_id );
break;
}
}
- if (skill_id == SP_KAUTE) {
- if (!status_charge(src, sstatus->max_hp * (10 + 2 * skill_lv) / 100, 0)) {
- if (sd)
- clif_skill_fail( *sd, skill_id, USESKILL_FAIL );
- break;
- }
- clif_skill_nodamage(src, *bl, skill_id, skill_lv);
- status_heal(bl, 0, tstatus->max_sp * (10 + 2 * skill_lv) / 100, 2);
- } else
- clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)));
+ if (!status_charge(src, sstatus->max_hp * (10 + 2 * skill_lv) / 100, 0)) {
+ if (sd)
+ clif_skill_fail( *sd, skill_id, USESKILL_FAIL );
+ break;
+ }
+ clif_skill_nodamage(src, *bl, skill_id, skill_lv);
+ status_heal(bl, 0, tstatus->max_sp * (10 + 2 * skill_lv) / 100, 2);
break;
- case ST_CHASEWALK:
case KO_YAMIKUMO:
if (tsce)
{
@@ -8837,20 +8816,12 @@ int32 skill_castend_nodamage_id (block_list *src, block_list *bl, uint16 skill_i
unit_warp(bl,-1,-1,-1,CLR_TELEPORT);
break;
- case ST_FULLSTRIP:
case GC_WEAPONCRUSH:
case SC_STRIPACCESSARY:
case ABC_STRIP_SHADOW: {
bool i;
- //Special message when trying to use strip on FCP [Jobbie]
- if( sd && skill_id == ST_FULLSTRIP && tsc && tsc->getSCE(SC_CP_WEAPON) && tsc->getSCE(SC_CP_HELM) && tsc->getSCE(SC_CP_ARMOR) && tsc->getSCE(SC_CP_SHIELD))
- {
- clif_gospel_info( *sd, 0x28 );
- break;
- }
-
- if( (i = skill_strip_equip(src, bl, skill_id, skill_lv)) || (skill_id != ST_FULLSTRIP && skill_id != GC_WEAPONCRUSH ) )
+ if( (i = skill_strip_equip(src, bl, skill_id, skill_lv)) || (skill_id != GC_WEAPONCRUSH ) )
clif_skill_nodamage(src,*bl,skill_id,skill_lv,i);
//Nothing stripped.
@@ -9531,39 +9502,6 @@ int32 skill_castend_nodamage_id (block_list *src, block_list *bl, uint16 skill_i
}
break;
- case SL_ALCHEMIST:
- case SL_ASSASIN:
- case SL_BARDDANCER:
- case SL_BLACKSMITH:
- case SL_CRUSADER:
- case SL_HUNTER:
- case SL_KNIGHT:
- case SL_MONK:
- case SL_PRIEST:
- case SL_ROGUE:
- case SL_SAGE:
- case SL_SOULLINKER:
- case SL_STAR:
- case SL_SUPERNOVICE:
- case SL_WIZARD:
- case SL_HIGH:
- if( sc_start2( src, bl, type, 100, skill_lv, skill_id, skill_get_time( skill_id, skill_lv ) ) ){
- clif_skill_nodamage(src, *bl, skill_id, skill_lv);
-
- // 1% chance to erase death count on successful cast
- if( skill_id == SL_SUPERNOVICE && dstsd && dstsd->die_counter && rnd_chance( 1, 100 ) ){
- pc_setparam( dstsd, SP_PCDIECOUNTER, 0 );
- clif_specialeffect( bl, EF_ANGEL2, AREA );
- status_calc_pc( dstsd, SCO_NONE );
- }
-
- sc_start( src, src, SC_SMA, 100, skill_lv, skill_get_time( SL_SMA, skill_lv ) );
- }else{
- if( sd ){
- clif_skill_fail( *sd, skill_id );
- }
- }
- break;
case SP_SOULGOLEM:
case SP_SOULSHADOW:
case SP_SOULFALCON:
@@ -9591,27 +9529,6 @@ int32 skill_castend_nodamage_id (block_list *src, block_list *bl, uint16 skill_i
status_change_end(bl, SC_SOULFAIRY);
break;
- case SL_SWOO:
- if (tsce) {
- if(sd)
- clif_skill_fail( *sd, skill_id );
- status_change_start(src,src,SC_STUN,10000,skill_lv,0,0,0,10000,SCSTART_NORATEDEF);
- status_change_end(bl, SC_SWOO);
- break;
- }
- [[fallthrough]];
- case SL_SKA: // [marquis007]
- case SL_SKE:
- if (sd && !battle_config.allow_es_magic_pc && bl->type != BL_MOB) {
- clif_skill_fail( *sd, skill_id );
- status_change_start(src,src,SC_STUN,10000,skill_lv,0,0,0,500,SCSTART_NOTICKDEF|SCSTART_NORATEDEF);
- break;
- }
- clif_skill_nodamage(src,*bl,skill_id,skill_lv,sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
- if (skill_id == SL_SKE)
- sc_start(src,src,SC_SMA,100,skill_lv,skill_get_time(SL_SMA,skill_lv));
- break;
-
case AG_ENERGY_CONVERSION:
if (status_get_sp(src) == status_get_max_sp(src)) {
if( sd != nullptr ){
diff --git a/src/map/skills/taekwon/eska.cpp b/src/map/skills/taekwon/eska.cpp
new file mode 100644
index 00000000000..6f8dc270c91
--- /dev/null
+++ b/src/map/skills/taekwon/eska.cpp
@@ -0,0 +1,33 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "eska.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillEska::SkillEska() : StatusSkillImpl(SL_SKA) {
+}
+
+void SkillEska::castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const {
+ sc_type type = skill_get_sc(getSkillId());
+ status_change *tsc = status_get_sc(target);
+ status_change_entry *tsce = (tsc && type != SC_NONE)?tsc->getSCE(type):nullptr;
+ map_session_data* sd = BL_CAST( BL_PC, src );
+
+ if (tsce) {
+ if(sd)
+ clif_skill_fail( *sd, getSkillId() );
+ status_change_start(src,src,SC_STUN,10000,skill_lv,0,0,0,10000,SCSTART_NORATEDEF);
+ status_change_end(target, SC_SWOO);
+ return;
+ }
+ if (sd && !battle_config.allow_es_magic_pc && target->type != BL_MOB) {
+ clif_skill_fail( *sd, getSkillId() );
+ status_change_start(src,src,SC_STUN,10000,skill_lv,0,0,0,500,SCSTART_NOTICKDEF|SCSTART_NORATEDEF);
+ return;
+ }
+
+ StatusSkillImpl::castendNoDamageId(src, target, skill_lv, tick, flag);
+}
diff --git a/src/map/skills/taekwon/eska.hpp b/src/map/skills/taekwon/eska.hpp
new file mode 100644
index 00000000000..1df21d21bc2
--- /dev/null
+++ b/src/map/skills/taekwon/eska.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 SkillEska : public StatusSkillImpl {
+public:
+ SkillEska();
+
+ 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/eske.cpp b/src/map/skills/taekwon/eske.cpp
new file mode 100644
index 00000000000..a95c83580cf
--- /dev/null
+++ b/src/map/skills/taekwon/eske.cpp
@@ -0,0 +1,25 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "eske.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillEske::SkillEske() : StatusSkillImpl(SL_SKE) {
+}
+
+void SkillEske::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 && !battle_config.allow_es_magic_pc && target->type != BL_MOB) {
+ clif_skill_fail( *sd, getSkillId() );
+ status_change_start(src,src,SC_STUN,10000,skill_lv,0,0,0,500,SCSTART_NOTICKDEF|SCSTART_NORATEDEF);
+ return;
+ }
+
+ StatusSkillImpl::castendNoDamageId(src, target, skill_lv, tick, flag);
+
+ sc_start(src,src,SC_SMA,100,skill_lv,skill_get_time(SL_SMA,skill_lv));
+}
diff --git a/src/map/skills/taekwon/eske.hpp b/src/map/skills/taekwon/eske.hpp
new file mode 100644
index 00000000000..2afa6768b50
--- /dev/null
+++ b/src/map/skills/taekwon/eske.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 SkillEske : public StatusSkillImpl {
+public:
+ SkillEske();
+
+ 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/esma.cpp b/src/map/skills/taekwon/esma.cpp
new file mode 100644
index 00000000000..46631f05916
--- /dev/null
+++ b/src/map/skills/taekwon/esma.cpp
@@ -0,0 +1,28 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "esma.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillEsma::SkillEsma() : SkillImpl(SL_SMA) {
+}
+
+void SkillEsma::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &base_skillratio, int32 mflag) const {
+ // Base damage is 40% + lv%
+ base_skillratio += -60 + status_get_lv(src);
+}
+
+void SkillEsma::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_end(src, SC_SMA);
+ if (sd && !battle_config.allow_es_magic_pc && target->type != BL_MOB) {
+ status_change_start(src,src,SC_STUN,10000,skill_lv,0,0,0,500,SCSTART_NOTICKDEF|SCSTART_NORATEDEF);
+ clif_skill_fail( *sd, getSkillId() );
+ return;
+ }
+ skill_attack(BF_MAGIC,src,src,target,getSkillId(),skill_lv,tick,flag);
+}
diff --git a/src/map/skills/taekwon/esma.hpp b/src/map/skills/taekwon/esma.hpp
new file mode 100644
index 00000000000..31622ebd312
--- /dev/null
+++ b/src/map/skills/taekwon/esma.hpp
@@ -0,0 +1,14 @@
+// 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 SkillEsma : public SkillImpl {
+public:
+ SkillEsma();
+
+ 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/taekwon/estin.cpp b/src/map/skills/taekwon/estin.cpp
new file mode 100644
index 00000000000..b6a7c23144f
--- /dev/null
+++ b/src/map/skills/taekwon/estin.cpp
@@ -0,0 +1,29 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "estin.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillEstin::SkillEstin() : SkillImpl(SL_STIN) {
+}
+
+void SkillEstin::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &base_skillratio, int32 mflag) const {
+ const status_data* tstatus = status_get_status_data(*target);
+
+ // Target size must be small (0) for full damage
+ base_skillratio += (tstatus->size != SZ_SMALL ? -99 : 10 * skill_lv);
+}
+
+void SkillEstin::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 );
+
+ if (sd && !battle_config.allow_es_magic_pc && target->type != BL_MOB) {
+ status_change_start(src,src,SC_STUN,10000,skill_lv,0,0,0,500,SCSTART_NOTICKDEF|SCSTART_NORATEDEF);
+ clif_skill_fail( *sd, getSkillId() );
+ return;
+ }
+ skill_attack(BF_MAGIC,src,src,target,getSkillId(),skill_lv,tick,flag);
+}
diff --git a/src/map/skills/taekwon/estin.hpp b/src/map/skills/taekwon/estin.hpp
new file mode 100644
index 00000000000..d91b38b9221
--- /dev/null
+++ b/src/map/skills/taekwon/estin.hpp
@@ -0,0 +1,14 @@
+// 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 SkillEstin : public SkillImpl {
+public:
+ SkillEstin();
+
+ 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/taekwon/estun.cpp b/src/map/skills/taekwon/estun.cpp
new file mode 100644
index 00000000000..efc2e925097
--- /dev/null
+++ b/src/map/skills/taekwon/estun.cpp
@@ -0,0 +1,33 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "estun.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillEstun::SkillEstun() : SkillImpl(SL_STUN) {
+}
+
+void SkillEstun::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &base_skillratio, int32 mflag) const {
+ base_skillratio += 5 * skill_lv;
+}
+
+void SkillEstun::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 );
+
+ if (sd && !battle_config.allow_es_magic_pc && target->type != BL_MOB) {
+ status_change_start(src,src,SC_STUN,10000,skill_lv,0,0,0,500,SCSTART_NOTICKDEF|SCSTART_NORATEDEF);
+ clif_skill_fail( *sd, getSkillId() );
+ return;
+ }
+ skill_attack(BF_MAGIC,src,src,target,getSkillId(),skill_lv,tick,flag);
+}
+
+void SkillEstun::applyAdditionalEffects(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32 attack_type, enum damage_lv dmg_lv) const {
+ status_data* tstatus = status_get_status_data(*target);
+
+ if (tstatus->size==SZ_MEDIUM) //Only stuns mid-sized mobs.
+ sc_start(src,target,SC_STUN,(30+10*skill_lv),skill_lv,skill_get_time(getSkillId(),skill_lv));
+}
diff --git a/src/map/skills/taekwon/estun.hpp b/src/map/skills/taekwon/estun.hpp
new file mode 100644
index 00000000000..f2e4ebaf44d
--- /dev/null
+++ b/src/map/skills/taekwon/estun.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 SkillEstun : public SkillImpl {
+public:
+ SkillEstun();
+
+ 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 &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/taekwon/eswoo.cpp b/src/map/skills/taekwon/eswoo.cpp
new file mode 100644
index 00000000000..63d150b6cca
--- /dev/null
+++ b/src/map/skills/taekwon/eswoo.cpp
@@ -0,0 +1,33 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "eswoo.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillEswoo::SkillEswoo() : StatusSkillImpl(SL_SWOO) {
+}
+
+void SkillEswoo::castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const {
+ sc_type type = skill_get_sc(getSkillId());
+ status_change *tsc = status_get_sc(target);
+ status_change_entry *tsce = (tsc && type != SC_NONE)?tsc->getSCE(type):nullptr;
+ map_session_data* sd = BL_CAST( BL_PC, src );
+
+ if (tsce) {
+ if(sd)
+ clif_skill_fail( *sd, getSkillId() );
+ status_change_start(src,src,SC_STUN,10000,skill_lv,0,0,0,10000,SCSTART_NORATEDEF);
+ status_change_end(target, SC_SWOO);
+ return;
+ }
+ if (sd && !battle_config.allow_es_magic_pc && target->type != BL_MOB) {
+ clif_skill_fail( *sd, getSkillId() );
+ status_change_start(src,src,SC_STUN,10000,skill_lv,0,0,0,500,SCSTART_NOTICKDEF|SCSTART_NORATEDEF);
+ return;
+ }
+
+ StatusSkillImpl::castendNoDamageId(src, target, skill_lv, tick, flag);
+}
diff --git a/src/map/skills/taekwon/eswoo.hpp b/src/map/skills/taekwon/eswoo.hpp
new file mode 100644
index 00000000000..4e4b641c4b4
--- /dev/null
+++ b/src/map/skills/taekwon/eswoo.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 SkillEswoo : public StatusSkillImpl {
+public:
+ SkillEswoo();
+
+ 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/kaahi.cpp b/src/map/skills/taekwon/kaahi.cpp
new file mode 100644
index 00000000000..5d505e729b0
--- /dev/null
+++ b/src/map/skills/taekwon/kaahi.cpp
@@ -0,0 +1,32 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "kaahi.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillKaahi::SkillKaahi() : StatusSkillImpl(SL_KAAHI) {
+}
+
+void SkillKaahi::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 );
+ map_session_data *dstsd = BL_CAST( BL_PC, target );
+
+ if (sd) {
+ if (!dstsd || !(
+ (sd->sc.getSCE(SC_SPIRIT) && sd->sc.getSCE(SC_SPIRIT)->val2 == SL_SOULLINKER) ||
+ (dstsd->class_&MAPID_SECONDMASK) == MAPID_SOUL_LINKER ||
+ dstsd->status.char_id == sd->status.char_id ||
+ dstsd->status.char_id == sd->status.partner_id ||
+ dstsd->status.char_id == sd->status.child
+ )) {
+ status_change_start(src,src,SC_STUN,10000,skill_lv,0,0,0,500,SCSTART_NORATEDEF);
+ clif_skill_fail( *sd, getSkillId() );
+ return;
+ }
+ }
+
+ StatusSkillImpl::castendNoDamageId(src, target, skill_lv, tick, flag);
+}
diff --git a/src/map/skills/taekwon/kaahi.hpp b/src/map/skills/taekwon/kaahi.hpp
new file mode 100644
index 00000000000..83f4df95f87
--- /dev/null
+++ b/src/map/skills/taekwon/kaahi.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 SkillKaahi : public StatusSkillImpl {
+public:
+ SkillKaahi();
+
+ 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/kaite.cpp b/src/map/skills/taekwon/kaite.cpp
new file mode 100644
index 00000000000..4e64310c3a6
--- /dev/null
+++ b/src/map/skills/taekwon/kaite.cpp
@@ -0,0 +1,32 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "kaite.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillKaite::SkillKaite() : StatusSkillImpl(SL_KAITE) {
+}
+
+void SkillKaite::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 );
+ map_session_data *dstsd = BL_CAST( BL_PC, target );
+
+ if (sd) {
+ if (!dstsd || !(
+ (sd->sc.getSCE(SC_SPIRIT) && sd->sc.getSCE(SC_SPIRIT)->val2 == SL_SOULLINKER) ||
+ (dstsd->class_&MAPID_SECONDMASK) == MAPID_SOUL_LINKER ||
+ dstsd->status.char_id == sd->status.char_id ||
+ dstsd->status.char_id == sd->status.partner_id ||
+ dstsd->status.char_id == sd->status.child
+ )) {
+ status_change_start(src,src,SC_STUN,10000,skill_lv,0,0,0,500,SCSTART_NORATEDEF);
+ clif_skill_fail( *sd, getSkillId() );
+ return;
+ }
+ }
+
+ StatusSkillImpl::castendNoDamageId(src, target, skill_lv, tick, flag);
+}
diff --git a/src/map/skills/taekwon/kaite.hpp b/src/map/skills/taekwon/kaite.hpp
new file mode 100644
index 00000000000..c643fa2442d
--- /dev/null
+++ b/src/map/skills/taekwon/kaite.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 SkillKaite : public StatusSkillImpl {
+public:
+ SkillKaite();
+
+ 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/kaizel.cpp b/src/map/skills/taekwon/kaizel.cpp
new file mode 100644
index 00000000000..04b28b5f2b6
--- /dev/null
+++ b/src/map/skills/taekwon/kaizel.cpp
@@ -0,0 +1,32 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "kaizel.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillKaizel::SkillKaizel() : StatusSkillImpl(SL_KAIZEL) {
+}
+
+void SkillKaizel::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 );
+ map_session_data *dstsd = BL_CAST( BL_PC, target );
+
+ if (sd) {
+ if (!dstsd || !(
+ (sd->sc.getSCE(SC_SPIRIT) && sd->sc.getSCE(SC_SPIRIT)->val2 == SL_SOULLINKER) ||
+ (dstsd->class_&MAPID_SECONDMASK) == MAPID_SOUL_LINKER ||
+ dstsd->status.char_id == sd->status.char_id ||
+ dstsd->status.char_id == sd->status.partner_id ||
+ dstsd->status.char_id == sd->status.child
+ )) {
+ status_change_start(src,src,SC_STUN,10000,skill_lv,0,0,0,500,SCSTART_NORATEDEF);
+ clif_skill_fail( *sd, getSkillId() );
+ return;
+ }
+ }
+
+ StatusSkillImpl::castendNoDamageId(src, target, skill_lv, tick, flag);
+}
diff --git a/src/map/skills/taekwon/kaizel.hpp b/src/map/skills/taekwon/kaizel.hpp
new file mode 100644
index 00000000000..a0cc2d5bd86
--- /dev/null
+++ b/src/map/skills/taekwon/kaizel.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 SkillKaizel : public StatusSkillImpl {
+public:
+ SkillKaizel();
+
+ 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/kaupe.cpp b/src/map/skills/taekwon/kaupe.cpp
new file mode 100644
index 00000000000..f9815ac5e0f
--- /dev/null
+++ b/src/map/skills/taekwon/kaupe.cpp
@@ -0,0 +1,32 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "kaupe.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillKaupe::SkillKaupe() : StatusSkillImpl(SL_KAUPE) {
+}
+
+void SkillKaupe::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 );
+ map_session_data *dstsd = BL_CAST( BL_PC, target );
+
+ if (sd) {
+ if (!dstsd || !(
+ (sd->sc.getSCE(SC_SPIRIT) && sd->sc.getSCE(SC_SPIRIT)->val2 == SL_SOULLINKER) ||
+ (dstsd->class_&MAPID_SECONDMASK) == MAPID_SOUL_LINKER ||
+ dstsd->status.char_id == sd->status.char_id ||
+ dstsd->status.char_id == sd->status.partner_id ||
+ dstsd->status.char_id == sd->status.child
+ )) {
+ status_change_start(src,src,SC_STUN,10000,skill_lv,0,0,0,500,SCSTART_NORATEDEF);
+ clif_skill_fail( *sd, getSkillId() );
+ return;
+ }
+ }
+
+ StatusSkillImpl::castendNoDamageId(src, target, skill_lv, tick, flag);
+}
diff --git a/src/map/skills/taekwon/kaupe.hpp b/src/map/skills/taekwon/kaupe.hpp
new file mode 100644
index 00000000000..63f26a4ca56
--- /dev/null
+++ b/src/map/skills/taekwon/kaupe.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 SkillKaupe : public StatusSkillImpl {
+public:
+ SkillKaupe();
+
+ 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/skill_factory_taekwon.cpp b/src/map/skills/taekwon/skill_factory_taekwon.cpp
index 26fa2850342..4486fb92687 100644
--- a/src/map/skills/taekwon/skill_factory_taekwon.cpp
+++ b/src/map/skills/taekwon/skill_factory_taekwon.cpp
@@ -8,11 +8,37 @@
#include "counter.hpp"
#include "downkick.hpp"
+#include "eska.hpp"
+#include "eske.hpp"
+#include "esma.hpp"
+#include "estin.hpp"
+#include "estun.hpp"
+#include "eswoo.hpp"
#include "highjump.hpp"
#include "jumpkick.hpp"
+#include "kaahi.hpp"
+#include "kaite.hpp"
+#include "kaizel.hpp"
+#include "kaupe.hpp"
#include "mission.hpp"
#include "run.hpp"
#include "sevenwind.hpp"
+#include "spiritofrebirth.hpp"
+#include "spiritofthealchemist.hpp"
+#include "spiritoftheartist.hpp"
+#include "spiritoftheassasin.hpp"
+#include "spiritoftheblacksmith.hpp"
+#include "spiritofthecrusader.hpp"
+#include "spiritofthehunter.hpp"
+#include "spiritoftheknight.hpp"
+#include "spiritofthemonk.hpp"
+#include "spiritofthepriest.hpp"
+#include "spiritoftherogue.hpp"
+#include "spiritofthesage.hpp"
+#include "spiritofthesoullinker.hpp"
+#include "spiritofthestargladiator.hpp"
+#include "spiritofthesupernovice.hpp"
+#include "spiritofthewizard.hpp"
#include "stormkick.hpp"
#include "turnkick.hpp"
@@ -52,6 +78,58 @@ std::unique_ptr SkillFactoryTaekwon::create(const e_skill skill
return std::make_unique(skill_id);
case SKE_RISING_MOON:
return std::make_unique(skill_id);
+ case SL_ALCHEMIST:
+ return std::make_unique();
+ case SL_ASSASIN:
+ return std::make_unique();
+ case SL_BARDDANCER:
+ return std::make_unique();
+ case SL_BLACKSMITH:
+ return std::make_unique();
+ case SL_CRUSADER:
+ return std::make_unique();
+ case SL_HIGH:
+ return std::make_unique();
+ case SL_HUNTER:
+ return std::make_unique();
+ case SL_KAAHI:
+ return std::make_unique();
+ case SL_KAITE:
+ return std::make_unique();
+ case SL_KAIZEL:
+ return std::make_unique();
+ case SL_KAUPE:
+ return std::make_unique();
+ case SL_KNIGHT:
+ return std::make_unique();
+ case SL_MONK:
+ return std::make_unique();
+ case SL_PRIEST:
+ return std::make_unique();
+ case SL_ROGUE:
+ return std::make_unique();
+ case SL_SAGE:
+ return std::make_unique();
+ case SL_SKA:
+ return std::make_unique();
+ case SL_SKE:
+ return std::make_unique();
+ case SL_SMA:
+ return std::make_unique();
+ case SL_SOULLINKER:
+ return std::make_unique();
+ case SL_STAR:
+ return std::make_unique();
+ case SL_STIN:
+ return std::make_unique();
+ case SL_STUN:
+ return std::make_unique();
+ case SL_SUPERNOVICE:
+ return std::make_unique();
+ case SL_SWOO:
+ return std::make_unique();
+ case SL_WIZARD:
+ return std::make_unique();
case SP_SOULREAPER:
return std::make_unique(skill_id);
case TK_COUNTER:
diff --git a/src/map/skills/taekwon/spiritofrebirth.cpp b/src/map/skills/taekwon/spiritofrebirth.cpp
new file mode 100644
index 00000000000..fa3ccfff9c7
--- /dev/null
+++ b/src/map/skills/taekwon/spiritofrebirth.cpp
@@ -0,0 +1,26 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "spiritofrebirth.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillSpiritofRebirth::SkillSpiritofRebirth() : SkillImpl(SL_HIGH) {
+}
+
+void SkillSpiritofRebirth::castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const {
+ sc_type type = skill_get_sc(getSkillId());
+ map_session_data* sd = BL_CAST( BL_PC, src );
+
+ if( sc_start2( src, target, type, 100, skill_lv, getSkillId(), skill_get_time( getSkillId(), skill_lv ) ) ){
+ clif_skill_nodamage(src, *target, getSkillId(), skill_lv);
+
+ sc_start( src, src, SC_SMA, 100, skill_lv, skill_get_time( SL_SMA, skill_lv ) );
+ }else{
+ if( sd ){
+ clif_skill_fail( *sd, getSkillId() );
+ }
+ }
+}
diff --git a/src/map/skills/taekwon/spiritofrebirth.hpp b/src/map/skills/taekwon/spiritofrebirth.hpp
new file mode 100644
index 00000000000..dfd49c23a63
--- /dev/null
+++ b/src/map/skills/taekwon/spiritofrebirth.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 SkillSpiritofRebirth : public SkillImpl {
+public:
+ SkillSpiritofRebirth();
+
+ 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/spiritofthealchemist.cpp b/src/map/skills/taekwon/spiritofthealchemist.cpp
new file mode 100644
index 00000000000..5c7414f9744
--- /dev/null
+++ b/src/map/skills/taekwon/spiritofthealchemist.cpp
@@ -0,0 +1,26 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "spiritofthealchemist.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillSpiritoftheAlchemist::SkillSpiritoftheAlchemist() : SkillImpl(SL_ALCHEMIST) {
+}
+
+void SkillSpiritoftheAlchemist::castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const {
+ sc_type type = skill_get_sc(getSkillId());
+ map_session_data* sd = BL_CAST( BL_PC, src );
+
+ if( sc_start2( src, target, type, 100, skill_lv, getSkillId(), skill_get_time( getSkillId(), skill_lv ) ) ){
+ clif_skill_nodamage(src, *target, getSkillId(), skill_lv);
+
+ sc_start( src, src, SC_SMA, 100, skill_lv, skill_get_time( SL_SMA, skill_lv ) );
+ }else{
+ if( sd ){
+ clif_skill_fail( *sd, getSkillId() );
+ }
+ }
+}
diff --git a/src/map/skills/taekwon/spiritofthealchemist.hpp b/src/map/skills/taekwon/spiritofthealchemist.hpp
new file mode 100644
index 00000000000..143f3c1633e
--- /dev/null
+++ b/src/map/skills/taekwon/spiritofthealchemist.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 SkillSpiritoftheAlchemist : public SkillImpl {
+public:
+ SkillSpiritoftheAlchemist();
+
+ 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/spiritoftheartist.cpp b/src/map/skills/taekwon/spiritoftheartist.cpp
new file mode 100644
index 00000000000..58a698105ff
--- /dev/null
+++ b/src/map/skills/taekwon/spiritoftheartist.cpp
@@ -0,0 +1,26 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "spiritoftheartist.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillSpiritoftheArtist::SkillSpiritoftheArtist() : SkillImpl(SL_BARDDANCER) {
+}
+
+void SkillSpiritoftheArtist::castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const {
+ sc_type type = skill_get_sc(getSkillId());
+ map_session_data* sd = BL_CAST( BL_PC, src );
+
+ if( sc_start2( src, target, type, 100, skill_lv, getSkillId(), skill_get_time( getSkillId(), skill_lv ) ) ){
+ clif_skill_nodamage(src, *target, getSkillId(), skill_lv);
+
+ sc_start( src, src, SC_SMA, 100, skill_lv, skill_get_time( SL_SMA, skill_lv ) );
+ }else{
+ if( sd ){
+ clif_skill_fail( *sd, getSkillId() );
+ }
+ }
+}
diff --git a/src/map/skills/taekwon/spiritoftheartist.hpp b/src/map/skills/taekwon/spiritoftheartist.hpp
new file mode 100644
index 00000000000..7b0541b859d
--- /dev/null
+++ b/src/map/skills/taekwon/spiritoftheartist.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 SkillSpiritoftheArtist : public SkillImpl {
+public:
+ SkillSpiritoftheArtist();
+
+ 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/spiritoftheassasin.cpp b/src/map/skills/taekwon/spiritoftheassasin.cpp
new file mode 100644
index 00000000000..5c94dc594fe
--- /dev/null
+++ b/src/map/skills/taekwon/spiritoftheassasin.cpp
@@ -0,0 +1,26 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "spiritoftheassasin.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillSpiritoftheAssasin::SkillSpiritoftheAssasin() : SkillImpl(SL_ASSASIN) {
+}
+
+void SkillSpiritoftheAssasin::castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const {
+ sc_type type = skill_get_sc(getSkillId());
+ map_session_data* sd = BL_CAST( BL_PC, src );
+
+ if( sc_start2( src, target, type, 100, skill_lv, getSkillId(), skill_get_time( getSkillId(), skill_lv ) ) ){
+ clif_skill_nodamage(src, *target, getSkillId(), skill_lv);
+
+ sc_start( src, src, SC_SMA, 100, skill_lv, skill_get_time( SL_SMA, skill_lv ) );
+ }else{
+ if( sd ){
+ clif_skill_fail( *sd, getSkillId() );
+ }
+ }
+}
diff --git a/src/map/skills/taekwon/spiritoftheassasin.hpp b/src/map/skills/taekwon/spiritoftheassasin.hpp
new file mode 100644
index 00000000000..3ce15884e28
--- /dev/null
+++ b/src/map/skills/taekwon/spiritoftheassasin.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 SkillSpiritoftheAssasin : public SkillImpl {
+public:
+ SkillSpiritoftheAssasin();
+
+ 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/spiritoftheblacksmith.cpp b/src/map/skills/taekwon/spiritoftheblacksmith.cpp
new file mode 100644
index 00000000000..cacce29cc4e
--- /dev/null
+++ b/src/map/skills/taekwon/spiritoftheblacksmith.cpp
@@ -0,0 +1,26 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "spiritoftheblacksmith.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillSpiritoftheBlacksmith::SkillSpiritoftheBlacksmith() : SkillImpl(SL_BLACKSMITH) {
+}
+
+void SkillSpiritoftheBlacksmith::castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const {
+ sc_type type = skill_get_sc(getSkillId());
+ map_session_data* sd = BL_CAST( BL_PC, src );
+
+ if( sc_start2( src, target, type, 100, skill_lv, getSkillId(), skill_get_time( getSkillId(), skill_lv ) ) ){
+ clif_skill_nodamage(src, *target, getSkillId(), skill_lv);
+
+ sc_start( src, src, SC_SMA, 100, skill_lv, skill_get_time( SL_SMA, skill_lv ) );
+ }else{
+ if( sd ){
+ clif_skill_fail( *sd, getSkillId() );
+ }
+ }
+}
diff --git a/src/map/skills/taekwon/spiritoftheblacksmith.hpp b/src/map/skills/taekwon/spiritoftheblacksmith.hpp
new file mode 100644
index 00000000000..1f06dde79c8
--- /dev/null
+++ b/src/map/skills/taekwon/spiritoftheblacksmith.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 SkillSpiritoftheBlacksmith : public SkillImpl {
+public:
+ SkillSpiritoftheBlacksmith();
+
+ 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/spiritofthecrusader.cpp b/src/map/skills/taekwon/spiritofthecrusader.cpp
new file mode 100644
index 00000000000..723e9c1175f
--- /dev/null
+++ b/src/map/skills/taekwon/spiritofthecrusader.cpp
@@ -0,0 +1,26 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "spiritofthecrusader.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillSpiritoftheCrusader::SkillSpiritoftheCrusader() : SkillImpl(SL_CRUSADER) {
+}
+
+void SkillSpiritoftheCrusader::castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const {
+ sc_type type = skill_get_sc(getSkillId());
+ map_session_data* sd = BL_CAST( BL_PC, src );
+
+ if( sc_start2( src, target, type, 100, skill_lv, getSkillId(), skill_get_time( getSkillId(), skill_lv ) ) ){
+ clif_skill_nodamage(src, *target, getSkillId(), skill_lv);
+
+ sc_start( src, src, SC_SMA, 100, skill_lv, skill_get_time( SL_SMA, skill_lv ) );
+ }else{
+ if( sd ){
+ clif_skill_fail( *sd, getSkillId() );
+ }
+ }
+}
diff --git a/src/map/skills/taekwon/spiritofthecrusader.hpp b/src/map/skills/taekwon/spiritofthecrusader.hpp
new file mode 100644
index 00000000000..d9984931ac1
--- /dev/null
+++ b/src/map/skills/taekwon/spiritofthecrusader.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 SkillSpiritoftheCrusader : public SkillImpl {
+public:
+ SkillSpiritoftheCrusader();
+
+ 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/spiritofthehunter.cpp b/src/map/skills/taekwon/spiritofthehunter.cpp
new file mode 100644
index 00000000000..6981b2ebbfb
--- /dev/null
+++ b/src/map/skills/taekwon/spiritofthehunter.cpp
@@ -0,0 +1,26 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "spiritofthehunter.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillSpiritoftheHunter::SkillSpiritoftheHunter() : SkillImpl(SL_HUNTER) {
+}
+
+void SkillSpiritoftheHunter::castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const {
+ sc_type type = skill_get_sc(getSkillId());
+ map_session_data* sd = BL_CAST( BL_PC, src );
+
+ if( sc_start2( src, target, type, 100, skill_lv, getSkillId(), skill_get_time( getSkillId(), skill_lv ) ) ){
+ clif_skill_nodamage(src, *target, getSkillId(), skill_lv);
+
+ sc_start( src, src, SC_SMA, 100, skill_lv, skill_get_time( SL_SMA, skill_lv ) );
+ }else{
+ if( sd ){
+ clif_skill_fail( *sd, getSkillId() );
+ }
+ }
+}
diff --git a/src/map/skills/taekwon/spiritofthehunter.hpp b/src/map/skills/taekwon/spiritofthehunter.hpp
new file mode 100644
index 00000000000..32ea00f15ec
--- /dev/null
+++ b/src/map/skills/taekwon/spiritofthehunter.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 SkillSpiritoftheHunter : public SkillImpl {
+public:
+ SkillSpiritoftheHunter();
+
+ 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/spiritoftheknight.cpp b/src/map/skills/taekwon/spiritoftheknight.cpp
new file mode 100644
index 00000000000..23bfc05a9b2
--- /dev/null
+++ b/src/map/skills/taekwon/spiritoftheknight.cpp
@@ -0,0 +1,26 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "spiritoftheknight.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillSpiritoftheKnight::SkillSpiritoftheKnight() : SkillImpl(SL_KNIGHT) {
+}
+
+void SkillSpiritoftheKnight::castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const {
+ sc_type type = skill_get_sc(getSkillId());
+ map_session_data* sd = BL_CAST( BL_PC, src );
+
+ if( sc_start2( src, target, type, 100, skill_lv, getSkillId(), skill_get_time( getSkillId(), skill_lv ) ) ){
+ clif_skill_nodamage(src, *target, getSkillId(), skill_lv);
+
+ sc_start( src, src, SC_SMA, 100, skill_lv, skill_get_time( SL_SMA, skill_lv ) );
+ }else{
+ if( sd ){
+ clif_skill_fail( *sd, getSkillId() );
+ }
+ }
+}
diff --git a/src/map/skills/taekwon/spiritoftheknight.hpp b/src/map/skills/taekwon/spiritoftheknight.hpp
new file mode 100644
index 00000000000..0e8621c8004
--- /dev/null
+++ b/src/map/skills/taekwon/spiritoftheknight.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 SkillSpiritoftheKnight : public SkillImpl {
+public:
+ SkillSpiritoftheKnight();
+
+ 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/spiritofthemonk.cpp b/src/map/skills/taekwon/spiritofthemonk.cpp
new file mode 100644
index 00000000000..dc75660d238
--- /dev/null
+++ b/src/map/skills/taekwon/spiritofthemonk.cpp
@@ -0,0 +1,26 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "spiritofthemonk.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillSpiritoftheMonk::SkillSpiritoftheMonk() : SkillImpl(SL_MONK) {
+}
+
+void SkillSpiritoftheMonk::castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const {
+ sc_type type = skill_get_sc(getSkillId());
+ map_session_data* sd = BL_CAST( BL_PC, src );
+
+ if( sc_start2( src, target, type, 100, skill_lv, getSkillId(), skill_get_time( getSkillId(), skill_lv ) ) ){
+ clif_skill_nodamage(src, *target, getSkillId(), skill_lv);
+
+ sc_start( src, src, SC_SMA, 100, skill_lv, skill_get_time( SL_SMA, skill_lv ) );
+ }else{
+ if( sd ){
+ clif_skill_fail( *sd, getSkillId() );
+ }
+ }
+}
diff --git a/src/map/skills/taekwon/spiritofthemonk.hpp b/src/map/skills/taekwon/spiritofthemonk.hpp
new file mode 100644
index 00000000000..e66616c9966
--- /dev/null
+++ b/src/map/skills/taekwon/spiritofthemonk.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 SkillSpiritoftheMonk : public SkillImpl {
+public:
+ SkillSpiritoftheMonk();
+
+ 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/spiritofthepriest.cpp b/src/map/skills/taekwon/spiritofthepriest.cpp
new file mode 100644
index 00000000000..70f018f3982
--- /dev/null
+++ b/src/map/skills/taekwon/spiritofthepriest.cpp
@@ -0,0 +1,26 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "spiritofthepriest.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillSpiritofthePriest::SkillSpiritofthePriest() : SkillImpl(SL_PRIEST) {
+}
+
+void SkillSpiritofthePriest::castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const {
+ sc_type type = skill_get_sc(getSkillId());
+ map_session_data* sd = BL_CAST( BL_PC, src );
+
+ if( sc_start2( src, target, type, 100, skill_lv, getSkillId(), skill_get_time( getSkillId(), skill_lv ) ) ){
+ clif_skill_nodamage(src, *target, getSkillId(), skill_lv);
+
+ sc_start( src, src, SC_SMA, 100, skill_lv, skill_get_time( SL_SMA, skill_lv ) );
+ }else{
+ if( sd ){
+ clif_skill_fail( *sd, getSkillId() );
+ }
+ }
+}
diff --git a/src/map/skills/taekwon/spiritofthepriest.hpp b/src/map/skills/taekwon/spiritofthepriest.hpp
new file mode 100644
index 00000000000..ce12d9da817
--- /dev/null
+++ b/src/map/skills/taekwon/spiritofthepriest.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 SkillSpiritofthePriest : public SkillImpl {
+public:
+ SkillSpiritofthePriest();
+
+ 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/spiritoftherogue.cpp b/src/map/skills/taekwon/spiritoftherogue.cpp
new file mode 100644
index 00000000000..b564bcf68c0
--- /dev/null
+++ b/src/map/skills/taekwon/spiritoftherogue.cpp
@@ -0,0 +1,26 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "spiritoftherogue.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillSpiritoftheRogue::SkillSpiritoftheRogue() : SkillImpl(SL_ROGUE) {
+}
+
+void SkillSpiritoftheRogue::castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const {
+ sc_type type = skill_get_sc(getSkillId());
+ map_session_data* sd = BL_CAST( BL_PC, src );
+
+ if( sc_start2( src, target, type, 100, skill_lv, getSkillId(), skill_get_time( getSkillId(), skill_lv ) ) ){
+ clif_skill_nodamage(src, *target, getSkillId(), skill_lv);
+
+ sc_start( src, src, SC_SMA, 100, skill_lv, skill_get_time( SL_SMA, skill_lv ) );
+ }else{
+ if( sd ){
+ clif_skill_fail( *sd, getSkillId() );
+ }
+ }
+}
diff --git a/src/map/skills/taekwon/spiritoftherogue.hpp b/src/map/skills/taekwon/spiritoftherogue.hpp
new file mode 100644
index 00000000000..6e82352d585
--- /dev/null
+++ b/src/map/skills/taekwon/spiritoftherogue.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 SkillSpiritoftheRogue : public SkillImpl {
+public:
+ SkillSpiritoftheRogue();
+
+ 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/spiritofthesage.cpp b/src/map/skills/taekwon/spiritofthesage.cpp
new file mode 100644
index 00000000000..04bc47b612d
--- /dev/null
+++ b/src/map/skills/taekwon/spiritofthesage.cpp
@@ -0,0 +1,26 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "spiritofthesage.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillSpiritoftheSage::SkillSpiritoftheSage() : SkillImpl(SL_SAGE) {
+}
+
+void SkillSpiritoftheSage::castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const {
+ sc_type type = skill_get_sc(getSkillId());
+ map_session_data* sd = BL_CAST( BL_PC, src );
+
+ if( sc_start2( src, target, type, 100, skill_lv, getSkillId(), skill_get_time( getSkillId(), skill_lv ) ) ){
+ clif_skill_nodamage(src, *target, getSkillId(), skill_lv);
+
+ sc_start( src, src, SC_SMA, 100, skill_lv, skill_get_time( SL_SMA, skill_lv ) );
+ }else{
+ if( sd ){
+ clif_skill_fail( *sd, getSkillId() );
+ }
+ }
+}
diff --git a/src/map/skills/taekwon/spiritofthesage.hpp b/src/map/skills/taekwon/spiritofthesage.hpp
new file mode 100644
index 00000000000..6ffa12af891
--- /dev/null
+++ b/src/map/skills/taekwon/spiritofthesage.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 SkillSpiritoftheSage : public SkillImpl {
+public:
+ SkillSpiritoftheSage();
+
+ 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/spiritofthesoullinker.cpp b/src/map/skills/taekwon/spiritofthesoullinker.cpp
new file mode 100644
index 00000000000..f3bec271a55
--- /dev/null
+++ b/src/map/skills/taekwon/spiritofthesoullinker.cpp
@@ -0,0 +1,26 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "spiritofthesoullinker.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillSpiritoftheSoulLinker::SkillSpiritoftheSoulLinker() : SkillImpl(SL_SOULLINKER) {
+}
+
+void SkillSpiritoftheSoulLinker::castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const {
+ sc_type type = skill_get_sc(getSkillId());
+ map_session_data* sd = BL_CAST( BL_PC, src );
+
+ if( sc_start2( src, target, type, 100, skill_lv, getSkillId(), skill_get_time( getSkillId(), skill_lv ) ) ){
+ clif_skill_nodamage(src, *target, getSkillId(), skill_lv);
+
+ sc_start( src, src, SC_SMA, 100, skill_lv, skill_get_time( SL_SMA, skill_lv ) );
+ }else{
+ if( sd ){
+ clif_skill_fail( *sd, getSkillId() );
+ }
+ }
+}
diff --git a/src/map/skills/taekwon/spiritofthesoullinker.hpp b/src/map/skills/taekwon/spiritofthesoullinker.hpp
new file mode 100644
index 00000000000..50ed07878f9
--- /dev/null
+++ b/src/map/skills/taekwon/spiritofthesoullinker.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 SkillSpiritoftheSoulLinker : public SkillImpl {
+public:
+ SkillSpiritoftheSoulLinker();
+
+ 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/spiritofthestargladiator.cpp b/src/map/skills/taekwon/spiritofthestargladiator.cpp
new file mode 100644
index 00000000000..d8fe4f47a91
--- /dev/null
+++ b/src/map/skills/taekwon/spiritofthestargladiator.cpp
@@ -0,0 +1,26 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "spiritofthestargladiator.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillSpiritoftheStarGladiator::SkillSpiritoftheStarGladiator() : SkillImpl(SL_STAR) {
+}
+
+void SkillSpiritoftheStarGladiator::castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const {
+ sc_type type = skill_get_sc(getSkillId());
+ map_session_data* sd = BL_CAST( BL_PC, src );
+
+ if( sc_start2( src, target, type, 100, skill_lv, getSkillId(), skill_get_time( getSkillId(), skill_lv ) ) ){
+ clif_skill_nodamage(src, *target, getSkillId(), skill_lv);
+
+ sc_start( src, src, SC_SMA, 100, skill_lv, skill_get_time( SL_SMA, skill_lv ) );
+ }else{
+ if( sd ){
+ clif_skill_fail( *sd, getSkillId() );
+ }
+ }
+}
diff --git a/src/map/skills/taekwon/spiritofthestargladiator.hpp b/src/map/skills/taekwon/spiritofthestargladiator.hpp
new file mode 100644
index 00000000000..59823b83730
--- /dev/null
+++ b/src/map/skills/taekwon/spiritofthestargladiator.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 SkillSpiritoftheStarGladiator : public SkillImpl {
+public:
+ SkillSpiritoftheStarGladiator();
+
+ 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/spiritofthesupernovice.cpp b/src/map/skills/taekwon/spiritofthesupernovice.cpp
new file mode 100644
index 00000000000..a7fc23dea28
--- /dev/null
+++ b/src/map/skills/taekwon/spiritofthesupernovice.cpp
@@ -0,0 +1,34 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "spiritofthesupernovice.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillSpiritoftheSupernovice::SkillSpiritoftheSupernovice() : SkillImpl(SL_SUPERNOVICE) {
+}
+
+void SkillSpiritoftheSupernovice::castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const {
+ sc_type type = skill_get_sc(getSkillId());
+ map_session_data* sd = BL_CAST( BL_PC, src );
+ map_session_data *dstsd = BL_CAST( BL_PC, target );
+
+ if( sc_start2( src, target, type, 100, skill_lv, getSkillId(), skill_get_time( getSkillId(), skill_lv ) ) ){
+ clif_skill_nodamage(src, *target, getSkillId(), skill_lv);
+
+ // 1% chance to erase death count on successful cast
+ if( dstsd && dstsd->die_counter && rnd_chance( 1, 100 ) ){
+ pc_setparam( dstsd, SP_PCDIECOUNTER, 0 );
+ clif_specialeffect( target, EF_ANGEL2, AREA );
+ status_calc_pc( dstsd, SCO_NONE );
+ }
+
+ sc_start( src, src, SC_SMA, 100, skill_lv, skill_get_time( SL_SMA, skill_lv ) );
+ }else{
+ if( sd ){
+ clif_skill_fail( *sd, getSkillId() );
+ }
+ }
+}
diff --git a/src/map/skills/taekwon/spiritofthesupernovice.hpp b/src/map/skills/taekwon/spiritofthesupernovice.hpp
new file mode 100644
index 00000000000..97b3959b697
--- /dev/null
+++ b/src/map/skills/taekwon/spiritofthesupernovice.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 SkillSpiritoftheSupernovice : public SkillImpl {
+public:
+ SkillSpiritoftheSupernovice();
+
+ 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/spiritofthewizard.cpp b/src/map/skills/taekwon/spiritofthewizard.cpp
new file mode 100644
index 00000000000..95c151592ea
--- /dev/null
+++ b/src/map/skills/taekwon/spiritofthewizard.cpp
@@ -0,0 +1,26 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "spiritofthewizard.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillSpiritoftheWizard::SkillSpiritoftheWizard() : SkillImpl(SL_WIZARD) {
+}
+
+void SkillSpiritoftheWizard::castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const {
+ sc_type type = skill_get_sc(getSkillId());
+ map_session_data* sd = BL_CAST( BL_PC, src );
+
+ if( sc_start2( src, target, type, 100, skill_lv, getSkillId(), skill_get_time( getSkillId(), skill_lv ) ) ){
+ clif_skill_nodamage(src, *target, getSkillId(), skill_lv);
+
+ sc_start( src, src, SC_SMA, 100, skill_lv, skill_get_time( SL_SMA, skill_lv ) );
+ }else{
+ if( sd ){
+ clif_skill_fail( *sd, getSkillId() );
+ }
+ }
+}
diff --git a/src/map/skills/taekwon/spiritofthewizard.hpp b/src/map/skills/taekwon/spiritofthewizard.hpp
new file mode 100644
index 00000000000..cc326b92096
--- /dev/null
+++ b/src/map/skills/taekwon/spiritofthewizard.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 SkillSpiritoftheWizard : public SkillImpl {
+public:
+ SkillSpiritoftheWizard();
+
+ 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/counterinstinct.cpp b/src/map/skills/thief/counterinstinct.cpp
new file mode 100644
index 00000000000..8ccb482826b
--- /dev/null
+++ b/src/map/skills/thief/counterinstinct.cpp
@@ -0,0 +1,13 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "counterinstinct.hpp"
+
+#include "map/status.hpp"
+
+SkillCounterInstinct::SkillCounterInstinct() : StatusSkillImpl(ST_REJECTSWORD) {
+}
+
+void SkillCounterInstinct::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_AUTOCOUNTER,(skill_lv*15),skill_lv,skill_get_time(getSkillId(),skill_lv));
+}
diff --git a/src/map/skills/thief/counterinstinct.hpp b/src/map/skills/thief/counterinstinct.hpp
new file mode 100644
index 00000000000..06651782d5a
--- /dev/null
+++ b/src/map/skills/thief/counterinstinct.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 SkillCounterInstinct : public StatusSkillImpl {
+public:
+ SkillCounterInstinct();
+
+ 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/divestall.cpp b/src/map/skills/thief/divestall.cpp
new file mode 100644
index 00000000000..6e23174ad90
--- /dev/null
+++ b/src/map/skills/thief/divestall.cpp
@@ -0,0 +1,32 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "divestall.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillDivestAll::SkillDivestAll() : SkillImpl(ST_FULLSTRIP) {
+}
+
+void SkillDivestAll::castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const {
+ status_change *tsc = status_get_sc(target);
+ map_session_data* sd = BL_CAST( BL_PC, src );
+
+ bool i;
+
+ //Special message when trying to use strip on FCP [Jobbie]
+ if( sd && tsc && tsc->getSCE(SC_CP_WEAPON) && tsc->getSCE(SC_CP_HELM) && tsc->getSCE(SC_CP_ARMOR) && tsc->getSCE(SC_CP_SHIELD))
+ {
+ clif_gospel_info( *sd, 0x28 );
+ return;
+ }
+
+ if( i = skill_strip_equip(src, target, getSkillId(), skill_lv) )
+ clif_skill_nodamage(src,*target,getSkillId(),skill_lv,i);
+
+ //Nothing stripped.
+ if( sd && !i )
+ clif_skill_fail( *sd, getSkillId() );
+}
diff --git a/src/map/skills/thief/divestall.hpp b/src/map/skills/thief/divestall.hpp
new file mode 100644
index 00000000000..221b04c8c22
--- /dev/null
+++ b/src/map/skills/thief/divestall.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 SkillDivestAll : public SkillImpl {
+public:
+ SkillDivestAll();
+
+ 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 66bd261f90f..a20b0bc8e5c 100644
--- a/src/map/skills/thief/skill_factory_thief.cpp
+++ b/src/map/skills/thief/skill_factory_thief.cpp
@@ -10,8 +10,10 @@
#include "backstab.hpp"
#include "cloaking.hpp"
#include "closeconfine.hpp"
+#include "counterinstinct.hpp"
#include "createdeadlypoison.hpp"
#include "detoxify.hpp"
+#include "divestall.hpp"
#include "divestarmor.hpp"
#include "divesthelm.hpp"
#include "divestshield.hpp"
@@ -32,6 +34,7 @@
#include "sonicblow.hpp"
#include "souldestroyer.hpp"
#include "steal.hpp"
+#include "stealth.hpp"
#include "stonefling.hpp"
#include "throwvenomknife.hpp"
#include "venomdust.hpp"
@@ -109,10 +112,14 @@ std::unique_ptr SkillFactoryThief::create(const e_skill skill_i
return std::make_unique(skill_id);
case SHC_SHADOW_EXCEED:
return std::make_unique(skill_id);
+ case ST_CHASEWALK:
+ return std::make_unique();
+ case ST_FULLSTRIP:
+ return std::make_unique();
case ST_PRESERVE:
return std::make_unique(skill_id);
case ST_REJECTSWORD:
- return std::make_unique(skill_id);
+ return std::make_unique();
case TF_BACKSLIDING:
return std::make_unique();
case TF_DETOXIFY:
diff --git a/src/map/skills/thief/stealth.cpp b/src/map/skills/thief/stealth.cpp
new file mode 100644
index 00000000000..ddd592faf53
--- /dev/null
+++ b/src/map/skills/thief/stealth.cpp
@@ -0,0 +1,24 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "stealth.hpp"
+
+#include "map/clif.hpp"
+#include "map/status.hpp"
+
+SkillStealth::SkillStealth() : SkillImpl(ST_CHASEWALK) {
+}
+
+void SkillStealth::castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const {
+ sc_type type = skill_get_sc(getSkillId());
+ status_change *tsc = status_get_sc(target);
+ status_change_entry *tsce = (tsc && type != SC_NONE)?tsc->getSCE(type):nullptr;
+
+ if (tsce)
+ {
+ clif_skill_nodamage(src,*target,getSkillId(),-1,status_change_end(target, type)); //Hide skill-scream animation.
+ flag |= SKILL_NOCONSUME_REQ;
+ return;
+ }
+ clif_skill_nodamage(src,*target,getSkillId(),-1,sc_start(src,target,type,100,skill_lv,skill_get_time(getSkillId(),skill_lv)));
+}
diff --git a/src/map/skills/thief/stealth.hpp b/src/map/skills/thief/stealth.hpp
new file mode 100644
index 00000000000..f070b88d3aa
--- /dev/null
+++ b/src/map/skills/thief/stealth.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 SkillStealth : public SkillImpl {
+public:
+ SkillStealth();
+
+ void castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const override;
+};