diff --git a/src/map/battle.cpp b/src/map/battle.cpp
index d707198bbc3..ed2b95af6b1 100644
--- a/src/map/battle.cpp
+++ b/src/map/battle.cpp
@@ -4919,15 +4919,6 @@ static int32 battle_calc_attack_skill_ratio(struct Damage* wd, block_list *src,b
if (sc && sc->getSCE(SC_SHIELD_POWER))// Whats the official increase? [Rytech]
skillratio += skillratio * 50 / 100;
break;
- case WS_CARTTERMINATION:
- i = 10 * (16 - skill_lv);
- if (i < 1) i = 1;
- //Preserve damage ratio when max cart weight is changed.
- if (sd && sd->cart_weight)
- skillratio += sd->cart_weight / i * 80000 / battle_config.max_cart_weight - 100;
- else if (!sd)
- skillratio += 80000 / i - 100;
- break;
case NJ_HUUMA:
#ifdef RENEWAL
skillratio += -150 + 250 * skill_lv;
diff --git a/src/map/map-server-generator.vcxproj b/src/map/map-server-generator.vcxproj
index 98691c10e13..80f5094f455 100644
--- a/src/map/map-server-generator.vcxproj
+++ b/src/map/map-server-generator.vcxproj
@@ -350,6 +350,7 @@
+
@@ -368,6 +369,7 @@
+
@@ -409,6 +411,8 @@
+
+
@@ -437,6 +441,9 @@
+
+
+
@@ -629,6 +636,7 @@
+
@@ -647,6 +655,7 @@
+
@@ -688,6 +697,8 @@
+
+
@@ -716,6 +727,9 @@
+
+
+
diff --git a/src/map/map-server-generator.vcxproj.filters b/src/map/map-server-generator.vcxproj.filters
index c02c0791e28..4564467d5ca 100644
--- a/src/map/map-server-generator.vcxproj.filters
+++ b/src/map/map-server-generator.vcxproj.filters
@@ -699,6 +699,9 @@
Header Files\Skills\Merchant
+
+ Header Files\Skills\Merchant
+
Header Files\Skills\Merchant
@@ -753,6 +756,9 @@
Header Files\Skills\Merchant
+
+ Header Files\Skills\Merchant
+
Header Files\Skills\Merchant
@@ -876,6 +882,12 @@
Header Files\Skills\Taekwon
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
Header Files\Skills\Taekwon
@@ -960,6 +972,15 @@
Header Files\Skills\Taekwon
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
Header Files\Skills\Thief
@@ -1394,6 +1415,9 @@
Source Files\Skills\Merchant
+
+ Source Files\Skills\Merchant
+
Source Files\Skills\Merchant
@@ -1448,6 +1472,9 @@
Source Files\Skills\Merchant
+
+ Source Files\Skills\Merchant
+
Source Files\Skills\Merchant
@@ -1571,6 +1598,12 @@
Source Files\Skills\Taekwon
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
Source Files\Skills\Taekwon
@@ -1655,6 +1688,15 @@
Source Files\Skills\Taekwon
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
Source Files\Skills\Thief
diff --git a/src/map/map-server.vcxproj b/src/map/map-server.vcxproj
index cf56751fbbb..7836b4a290e 100644
--- a/src/map/map-server.vcxproj
+++ b/src/map/map-server.vcxproj
@@ -350,6 +350,7 @@
+
@@ -368,6 +369,7 @@
+
@@ -409,6 +411,8 @@
+
+
@@ -437,6 +441,9 @@
+
+
+
@@ -629,6 +636,7 @@
+
@@ -647,6 +655,7 @@
+
@@ -688,6 +697,8 @@
+
+
@@ -716,6 +727,9 @@
+
+
+
diff --git a/src/map/map-server.vcxproj.filters b/src/map/map-server.vcxproj.filters
index c02c0791e28..4564467d5ca 100644
--- a/src/map/map-server.vcxproj.filters
+++ b/src/map/map-server.vcxproj.filters
@@ -699,6 +699,9 @@
Header Files\Skills\Merchant
+
+ Header Files\Skills\Merchant
+
Header Files\Skills\Merchant
@@ -753,6 +756,9 @@
Header Files\Skills\Merchant
+
+ Header Files\Skills\Merchant
+
Header Files\Skills\Merchant
@@ -876,6 +882,12 @@
Header Files\Skills\Taekwon
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
Header Files\Skills\Taekwon
@@ -960,6 +972,15 @@
Header Files\Skills\Taekwon
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
+
+ Header Files\Skills\Taekwon
+
Header Files\Skills\Thief
@@ -1394,6 +1415,9 @@
Source Files\Skills\Merchant
+
+ Source Files\Skills\Merchant
+
Source Files\Skills\Merchant
@@ -1448,6 +1472,9 @@
Source Files\Skills\Merchant
+
+ Source Files\Skills\Merchant
+
Source Files\Skills\Merchant
@@ -1571,6 +1598,12 @@
Source Files\Skills\Taekwon
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
Source Files\Skills\Taekwon
@@ -1655,6 +1688,15 @@
Source Files\Skills\Taekwon
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
+
+ Source Files\Skills\Taekwon
+
Source Files\Skills\Thief
diff --git a/src/map/skill.cpp b/src/map/skill.cpp
index 6293103a553..d1d52affd07 100755
--- a/src/map/skill.cpp
+++ b/src/map/skill.cpp
@@ -1585,10 +1585,6 @@ int32 skill_additional_effect( block_list* src, block_list *bl, uint16 skill_id,
sc_start(src,bl,SC_CURSE,5*skill_lv,skill_lv,skill_get_time2(skill_id,skill_lv));
break;
- case WS_CARTTERMINATION: // Cart termination
- sc_start(src,bl,SC_STUN,5*skill_lv,skill_lv,skill_get_time2(skill_id,skill_lv));
- break;
-
case CR_ACIDDEMONSTRATION:
case GN_FIRE_EXPANSION_ACID:
skill_break_equip(src,bl, EQP_WEAPON|EQP_ARMOR, 100*skill_lv, BCT_ENEMY);
@@ -8711,13 +8707,6 @@ int32 skill_castend_nodamage_id (block_list *src, block_list *bl, uint16 skill_i
clif_skill_nodamage(src, *bl, skill_id, skill_lv);
break;
- // Weapon Refining [Celest]
- case WS_WEAPONREFINE:
- if( sd != nullptr ){
- clif_item_refine_list( *sd );
- }
- break;
-
case AL_TELEPORT:
case ALL_ODINS_RECALL:
if(sd != nullptr)
@@ -9593,24 +9582,6 @@ int32 skill_castend_nodamage_id (block_list *src, block_list *bl, uint16 skill_i
clif_skill_fail( *sd, skill_id );
break;
- case SG_FEEL:
- //AuronX reported you CAN memorize the same map as all three. [Skotlex]
- if (sd) {
- if(!sd->feel_map[skill_lv-1].index)
- clif_feel_req(sd->fd,sd, skill_lv);
- else
- clif_feel_info(sd, skill_lv-1, 1);
- }
- break;
-
- case SG_HATE:
- if (sd) {
- clif_skill_nodamage(src,*bl,skill_id,skill_lv);
- if (!pc_set_hate_mob(sd, skill_lv-1, bl))
- clif_skill_fail( *sd, skill_id );
- }
- break;
-
case SJ_DOCUMENT:
if (sd) {
switch (skill_lv) {
@@ -13346,15 +13317,6 @@ int32 skill_castend_pos2(block_list* src, int32 x, int32 y, uint16 skill_id, uin
}
break;
- case SG_SUN_WARM:
- case SG_MOON_WARM:
- case SG_STAR_WARM:
- skill_clear_unitgroup(src);
- if ((sg = skill_unitsetting(src,skill_id,skill_lv,src->x,src->y,0)))
- sc_start4(src,src,type,100,skill_lv,0,0,sg->group_id,skill_get_time(skill_id,skill_lv));
- flag|=1;
- break;
-
case PA_GOSPEL:
if (sce && sce->val4 == BCT_SELF)
{
diff --git a/src/map/skills/merchant/carttermination.cpp b/src/map/skills/merchant/carttermination.cpp
new file mode 100644
index 00000000000..efd33f511cc
--- /dev/null
+++ b/src/map/skills/merchant/carttermination.cpp
@@ -0,0 +1,26 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "carttermination.hpp"
+
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillCartTermination::SkillCartTermination() : WeaponSkillImpl(WS_CARTTERMINATION) {
+}
+
+void SkillCartTermination::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &base_skillratio, int32 mflag) const {
+ const map_session_data* sd = BL_CAST( BL_PC, src );
+
+ int32 i = 10 * (16 - skill_lv);
+ if (i < 1) i = 1;
+ //Preserve damage ratio when max cart weight is changed.
+ if (sd && sd->cart_weight)
+ base_skillratio += sd->cart_weight / i * 80000 / battle_config.max_cart_weight - 100;
+ else if (!sd)
+ base_skillratio += 80000 / i - 100;
+}
+
+void SkillCartTermination::applyAdditionalEffects(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32 attack_type, enum damage_lv dmg_lv) const {
+ sc_start(src,target,SC_STUN,5*skill_lv,skill_lv,skill_get_time2(getSkillId(),skill_lv));
+}
diff --git a/src/map/skills/merchant/carttermination.hpp b/src/map/skills/merchant/carttermination.hpp
new file mode 100644
index 00000000000..7a57694566a
--- /dev/null
+++ b/src/map/skills/merchant/carttermination.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 "../weapon_skill_impl.hpp"
+
+class SkillCartTermination : public WeaponSkillImpl {
+public:
+ SkillCartTermination();
+
+ 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;
+};
diff --git a/src/map/skills/merchant/skill_factory_merchant.cpp b/src/map/skills/merchant/skill_factory_merchant.cpp
index 1039064a30c..2ad349cb56d 100644
--- a/src/map/skills/merchant/skill_factory_merchant.cpp
+++ b/src/map/skills/merchant/skill_factory_merchant.cpp
@@ -19,6 +19,7 @@
#include "callhomunculus.hpp"
#include "decoratecart.hpp"
#include "cartrevolution.hpp"
+#include "carttermination.hpp"
#include "changecart.hpp"
#include "greed.hpp"
#include "hammerfall.hpp"
@@ -35,6 +36,7 @@
#include "twilightalchemy1.hpp"
#include "twilightalchemy2.hpp"
#include "twilightalchemy3.hpp"
+#include "upgradeweapon.hpp"
#include "vaporize.hpp"
#include "weaponperfection.hpp"
#include "weaponrepair.hpp"
@@ -148,11 +150,13 @@ std::unique_ptr SkillFactoryMerchant::create(const e_skill skil
case WS_CARTBOOST:
return std::make_unique(skill_id);
case WS_CARTTERMINATION:
- return std::make_unique(skill_id);
+ return std::make_unique();
case WS_MELTDOWN:
return std::make_unique(skill_id);
case WS_OVERTHRUSTMAX:
return std::make_unique(skill_id);
+ case WS_WEAPONREFINE:
+ return std::make_unique();
default:
return nullptr;
diff --git a/src/map/skills/merchant/upgradeweapon.cpp b/src/map/skills/merchant/upgradeweapon.cpp
new file mode 100644
index 00000000000..e7bb2e2b5fe
--- /dev/null
+++ b/src/map/skills/merchant/upgradeweapon.cpp
@@ -0,0 +1,18 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "upgradeweapon.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+
+SkillUpgradeWeapon::SkillUpgradeWeapon() : SkillImpl(WS_WEAPONREFINE) {
+}
+
+void SkillUpgradeWeapon::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 != nullptr ){
+ clif_item_refine_list( *sd );
+ }
+}
diff --git a/src/map/skills/merchant/upgradeweapon.hpp b/src/map/skills/merchant/upgradeweapon.hpp
new file mode 100644
index 00000000000..f0c1057fc92
--- /dev/null
+++ b/src/map/skills/merchant/upgradeweapon.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 SkillUpgradeWeapon : public SkillImpl {
+public:
+ SkillUpgradeWeapon();
+
+ 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/feelingthesunmoonandstars.cpp b/src/map/skills/taekwon/feelingthesunmoonandstars.cpp
new file mode 100644
index 00000000000..99e013af8f1
--- /dev/null
+++ b/src/map/skills/taekwon/feelingthesunmoonandstars.cpp
@@ -0,0 +1,22 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "feelingthesunmoonandstars.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+
+SkillFeelingtheSunMoonandStars::SkillFeelingtheSunMoonandStars() : SkillImpl(SG_FEEL) {
+}
+
+void SkillFeelingtheSunMoonandStars::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 );
+
+ //AuronX reported you CAN memorize the same map as all three. [Skotlex]
+ if (sd) {
+ if(!sd->feel_map[skill_lv-1].index)
+ clif_feel_req(sd->fd,sd, skill_lv);
+ else
+ clif_feel_info(sd, skill_lv-1, 1);
+ }
+}
diff --git a/src/map/skills/taekwon/feelingthesunmoonandstars.hpp b/src/map/skills/taekwon/feelingthesunmoonandstars.hpp
new file mode 100644
index 00000000000..a4e676289c8
--- /dev/null
+++ b/src/map/skills/taekwon/feelingthesunmoonandstars.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 SkillFeelingtheSunMoonandStars : public SkillImpl {
+public:
+ SkillFeelingtheSunMoonandStars();
+
+ 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/hatredofthesunmoonandstars.cpp b/src/map/skills/taekwon/hatredofthesunmoonandstars.cpp
new file mode 100644
index 00000000000..af9b59f5078
--- /dev/null
+++ b/src/map/skills/taekwon/hatredofthesunmoonandstars.cpp
@@ -0,0 +1,20 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "hatredofthesunmoonandstars.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+
+SkillHatredoftheSunMoonandStars::SkillHatredoftheSunMoonandStars() : SkillImpl(SG_HATE) {
+}
+
+void SkillHatredoftheSunMoonandStars::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) {
+ clif_skill_nodamage(src,*target,getSkillId(),skill_lv);
+ if (!pc_set_hate_mob(sd, skill_lv-1, target))
+ clif_skill_fail( *sd, getSkillId() );
+ }
+}
diff --git a/src/map/skills/taekwon/hatredofthesunmoonandstars.hpp b/src/map/skills/taekwon/hatredofthesunmoonandstars.hpp
new file mode 100644
index 00000000000..5cbbba94c86
--- /dev/null
+++ b/src/map/skills/taekwon/hatredofthesunmoonandstars.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 SkillHatredoftheSunMoonandStars : public SkillImpl {
+public:
+ SkillHatredoftheSunMoonandStars();
+
+ 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 4486fb92687..f82659caff3 100644
--- a/src/map/skills/taekwon/skill_factory_taekwon.cpp
+++ b/src/map/skills/taekwon/skill_factory_taekwon.cpp
@@ -14,6 +14,8 @@
#include "estin.hpp"
#include "estun.hpp"
#include "eswoo.hpp"
+#include "feelingthesunmoonandstars.hpp"
+#include "hatredofthesunmoonandstars.hpp"
#include "highjump.hpp"
#include "jumpkick.hpp"
#include "kaahi.hpp"
@@ -41,17 +43,30 @@
#include "spiritofthewizard.hpp"
#include "stormkick.hpp"
#include "turnkick.hpp"
+#include "warmthofthemoon.hpp"
+#include "warmthofthestars.hpp"
+#include "warmthofthesun.hpp"
std::unique_ptr SkillFactoryTaekwon::create(const e_skill skill_id) const {
switch (skill_id) {
+ case SG_FEEL:
+ return std::make_unique();
case SG_FUSION:
return std::make_unique(skill_id, true);
+ case SG_HATE:
+ return std::make_unique();
case SG_MOON_COMFORT:
return std::make_unique(skill_id);
+ case SG_MOON_WARM:
+ return std::make_unique();
case SG_STAR_COMFORT:
return std::make_unique(skill_id);
+ case SG_STAR_WARM:
+ return std::make_unique();
case SG_SUN_COMFORT:
return std::make_unique(skill_id);
+ case SG_SUN_WARM:
+ return std::make_unique();
case SJ_BOOKOFDIMENSION:
return std::make_unique(skill_id);
case SJ_FALLINGSTAR:
diff --git a/src/map/skills/taekwon/warmthofthemoon.cpp b/src/map/skills/taekwon/warmthofthemoon.cpp
new file mode 100644
index 00000000000..5aea29470bc
--- /dev/null
+++ b/src/map/skills/taekwon/warmthofthemoon.cpp
@@ -0,0 +1,19 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "warmthofthemoon.hpp"
+
+#include "map/status.hpp"
+
+SkillWarmthoftheMoon::SkillWarmthoftheMoon() : SkillImpl(SG_MOON_WARM) {
+}
+
+void SkillWarmthoftheMoon::castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const {
+ sc_type type = skill_get_sc(getSkillId());
+ std::shared_ptr sg;
+
+ skill_clear_unitgroup(src);
+ if ((sg = skill_unitsetting(src,getSkillId(),skill_lv,src->x,src->y,0)))
+ sc_start4(src,src,type,100,skill_lv,0,0,sg->group_id,skill_get_time(getSkillId(),skill_lv));
+ flag|=1;
+}
diff --git a/src/map/skills/taekwon/warmthofthemoon.hpp b/src/map/skills/taekwon/warmthofthemoon.hpp
new file mode 100644
index 00000000000..b2ae0be4e14
--- /dev/null
+++ b/src/map/skills/taekwon/warmthofthemoon.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 SkillWarmthoftheMoon : public SkillImpl {
+public:
+ SkillWarmthoftheMoon();
+
+ void castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const override;
+};
diff --git a/src/map/skills/taekwon/warmthofthestars.cpp b/src/map/skills/taekwon/warmthofthestars.cpp
new file mode 100644
index 00000000000..b22306abc6c
--- /dev/null
+++ b/src/map/skills/taekwon/warmthofthestars.cpp
@@ -0,0 +1,19 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "warmthofthestars.hpp"
+
+#include "map/status.hpp"
+
+SkillWarmthoftheStars::SkillWarmthoftheStars() : SkillImpl(SG_STAR_WARM) {
+}
+
+void SkillWarmthoftheStars::castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const {
+ sc_type type = skill_get_sc(getSkillId());
+ std::shared_ptr sg;
+
+ skill_clear_unitgroup(src);
+ if ((sg = skill_unitsetting(src,getSkillId(),skill_lv,src->x,src->y,0)))
+ sc_start4(src,src,type,100,skill_lv,0,0,sg->group_id,skill_get_time(getSkillId(),skill_lv));
+ flag|=1;
+}
diff --git a/src/map/skills/taekwon/warmthofthestars.hpp b/src/map/skills/taekwon/warmthofthestars.hpp
new file mode 100644
index 00000000000..1e76fdbfaa2
--- /dev/null
+++ b/src/map/skills/taekwon/warmthofthestars.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 SkillWarmthoftheStars : public SkillImpl {
+public:
+ SkillWarmthoftheStars();
+
+ void castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const override;
+};
diff --git a/src/map/skills/taekwon/warmthofthesun.cpp b/src/map/skills/taekwon/warmthofthesun.cpp
new file mode 100644
index 00000000000..52398aead2f
--- /dev/null
+++ b/src/map/skills/taekwon/warmthofthesun.cpp
@@ -0,0 +1,19 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "warmthofthesun.hpp"
+
+#include "map/status.hpp"
+
+SkillWarmthoftheSun::SkillWarmthoftheSun() : SkillImpl(SG_SUN_WARM) {
+}
+
+void SkillWarmthoftheSun::castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const {
+ sc_type type = skill_get_sc(getSkillId());
+ std::shared_ptr sg;
+
+ skill_clear_unitgroup(src);
+ if ((sg = skill_unitsetting(src,getSkillId(),skill_lv,src->x,src->y,0)))
+ sc_start4(src,src,type,100,skill_lv,0,0,sg->group_id,skill_get_time(getSkillId(),skill_lv));
+ flag|=1;
+}
diff --git a/src/map/skills/taekwon/warmthofthesun.hpp b/src/map/skills/taekwon/warmthofthesun.hpp
new file mode 100644
index 00000000000..72d294fe32d
--- /dev/null
+++ b/src/map/skills/taekwon/warmthofthesun.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 SkillWarmthoftheSun : public SkillImpl {
+public:
+ SkillWarmthoftheSun();
+
+ void castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const override;
+};