diff --git a/src/map/battle.cpp b/src/map/battle.cpp
index 2c3e0b159f4..c3697a8139d 100644
--- a/src/map/battle.cpp
+++ b/src/map/battle.cpp
@@ -4776,24 +4776,8 @@ static int32 battle_calc_attack_skill_ratio(struct Damage* wd, block_list *src,b
case NPC_REVERBERATION_ATK:
skillratio += 400 + 200 * skill_lv;
break;
- case CR_SHIELDCHARGE:
- skillratio += 20 * skill_lv;
- break;
- case CR_SHIELDBOOMERANG:
-#ifdef RENEWAL
- skillratio += -100 + skill_lv * 80;
-#else
- skillratio += 30 * skill_lv;
-#endif
- break;
case NPC_DARKCROSS:
- case CR_HOLYCROSS:
-#ifdef RENEWAL
- if(sd && sd->status.weapon == W_2HSPEAR)
- skillratio += 70 * skill_lv;
- else
-#endif
- skillratio += 35 * skill_lv;
+ skillratio += 35 * skill_lv;
break;
case MO_FINGEROFFENSIVE:
#ifdef RENEWAL
diff --git a/src/map/map-server-generator.vcxproj b/src/map/map-server-generator.vcxproj
index 23d178723a7..56c1814769c 100644
--- a/src/map/map-server-generator.vcxproj
+++ b/src/map/map-server-generator.vcxproj
@@ -377,11 +377,18 @@
+
+
+
+
+
+
+
@@ -606,11 +613,18 @@
+
+
+
+
+
+
+
diff --git a/src/map/map-server-generator.vcxproj.filters b/src/map/map-server-generator.vcxproj.filters
index a9809d2191b..2f6aeb1f4d5 100644
--- a/src/map/map-server-generator.vcxproj.filters
+++ b/src/map/map-server-generator.vcxproj.filters
@@ -780,6 +780,12 @@
Header Files\Skills\Swordman
+
+ Header Files\Skills\Swordman
+
+
+ Header Files\Skills\Swordman
+
Header Files\Skills\Swordman
@@ -789,12 +795,27 @@
Header Files\Skills\Swordman
+
+ Header Files\Skills\Swordman
+
+
+ Header Files\Skills\Swordman
+
Header Files\Skills\Swordman
+
+ Header Files\Skills\Swordman
+
+
+ Header Files\Skills\Swordman
+
Header Files\Skills\Swordman
+
+ Header Files\Skills\Swordman
+
Header Files\Skills\Swordman
@@ -1325,6 +1346,12 @@
Source Files\Skills\Swordman
+
+ Source Files\Skills\Swordman
+
+
+ Source Files\Skills\Swordman
+
Source Files\Skills\Swordman
@@ -1334,12 +1361,27 @@
Source Files\Skills\Swordman
+
+ Source Files\Skills\Swordman
+
+
+ Source Files\Skills\Swordman
+
Source Files\Skills\Swordman
+
+ Source Files\Skills\Swordman
+
+
+ Source Files\Skills\Swordman
+
Source Files\Skills\Swordman
+
+ Source Files\Skills\Swordman
+
Source Files\Skills\Swordman
diff --git a/src/map/map-server.vcxproj b/src/map/map-server.vcxproj
index 83197a0f239..f34fd11172a 100644
--- a/src/map/map-server.vcxproj
+++ b/src/map/map-server.vcxproj
@@ -377,11 +377,18 @@
+
+
+
+
+
+
+
@@ -606,11 +613,18 @@
+
+
+
+
+
+
+
diff --git a/src/map/map-server.vcxproj.filters b/src/map/map-server.vcxproj.filters
index a9809d2191b..2f6aeb1f4d5 100644
--- a/src/map/map-server.vcxproj.filters
+++ b/src/map/map-server.vcxproj.filters
@@ -780,6 +780,12 @@
Header Files\Skills\Swordman
+
+ Header Files\Skills\Swordman
+
+
+ Header Files\Skills\Swordman
+
Header Files\Skills\Swordman
@@ -789,12 +795,27 @@
Header Files\Skills\Swordman
+
+ Header Files\Skills\Swordman
+
+
+ Header Files\Skills\Swordman
+
Header Files\Skills\Swordman
+
+ Header Files\Skills\Swordman
+
+
+ Header Files\Skills\Swordman
+
Header Files\Skills\Swordman
+
+ Header Files\Skills\Swordman
+
Header Files\Skills\Swordman
@@ -1325,6 +1346,12 @@
Source Files\Skills\Swordman
+
+ Source Files\Skills\Swordman
+
+
+ Source Files\Skills\Swordman
+
Source Files\Skills\Swordman
@@ -1334,12 +1361,27 @@
Source Files\Skills\Swordman
+
+ Source Files\Skills\Swordman
+
+
+ Source Files\Skills\Swordman
+
Source Files\Skills\Swordman
+
+ Source Files\Skills\Swordman
+
+
+ Source Files\Skills\Swordman
+
Source Files\Skills\Swordman
+
+ Source Files\Skills\Swordman
+
Source Files\Skills\Swordman
diff --git a/src/map/skill.cpp b/src/map/skill.cpp
index 50332438945..259d6038213 100755
--- a/src/map/skill.cpp
+++ b/src/map/skill.cpp
@@ -1438,7 +1438,6 @@ int32 skill_additional_effect( block_list* src, block_list *bl, uint16 skill_id,
break;
case NPC_DARKCROSS:
- case CR_HOLYCROSS:
sc_start(src,bl,SC_BLIND,3*skill_lv,skill_lv,skill_get_time2(skill_id,skill_lv));
break;
@@ -1446,16 +1445,6 @@ int32 skill_additional_effect( block_list* src, block_list *bl, uint16 skill_id,
sc_start(src, bl, SC_BLIND, 100, skill_lv, skill_get_time2(skill_id, skill_lv));
break;
- case CR_GRANDCROSS:
- //Chance to cause blind status vs demon and undead element, but not against players
- if(!dstsd && (battle_check_undead(tstatus->race,tstatus->def_ele) || tstatus->race == RC_DEMON))
- sc_start(src,bl,SC_BLIND,100,skill_lv,skill_get_time2(skill_id,skill_lv));
- break;
-
- case CR_SHIELDCHARGE:
- sc_start(src,bl,SC_STUN,(15+skill_lv*5),skill_lv,skill_get_time2(skill_id,skill_lv));
- break;
-
#ifndef RENEWAL
case PA_PRESSURE:
status_percent_damage(src, bl, 0, 15+5*skill_lv, false);
@@ -7685,17 +7674,6 @@ int32 skill_castend_nodamage_id (block_list *src, block_list *bl, uint16 skill_i
}
break;
- case CR_PROVIDENCE:
- if(sd && dstsd){ //Check they are not another crusader [Skotlex]
- if ((dstsd->class_&MAPID_SECONDMASK) == MAPID_CRUSADER) {
- clif_skill_fail( *sd, skill_id );
- return 1;
- }
- }
- clif_skill_nodamage(src,*bl,skill_id,skill_lv,
- sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
- break;
-
case CG_MARIONETTE:
{
if( (sd && dstsd && (dstsd->class_&MAPID_SECONDMASK) == MAPID_BARDDANCER && dstsd->status.sex == sd->status.sex) || (tsc && (tsc->getSCE(SC_CURSE) || tsc->getSCE(SC_QUAGMIRE))) )
@@ -7857,7 +7835,6 @@ int32 skill_castend_nodamage_id (block_list *src, block_list *bl, uint16 skill_i
}
sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv));
break;
- case CR_REFLECTSHIELD:
case MS_REFLECTSHIELD:
if (tsc && tsc->getSCE(SC_DARKCROW)) { // SC_DARKCROW prevents using reflecting skills
if (sd)
@@ -8133,13 +8110,10 @@ int32 skill_castend_nodamage_id (block_list *src, block_list *bl, uint16 skill_i
break;
case ML_DEVOTION:
- case CR_DEVOTION:
{
- int32 count, lv;
- if( !dstsd || (!sd && !mer) )
+ int32 lv;
+ if( !dstsd || !mer )
{ // Only players can be devoted
- if( sd )
- clif_skill_fail( *sd, skill_id );
break;
}
@@ -8147,34 +8121,15 @@ int32 skill_castend_nodamage_id (block_list *src, block_list *bl, uint16 skill_i
lv = -lv;
if( lv > battle_config.devotion_level_difference || // Level difference requeriments
(dstsd->sc.getSCE(type) && dstsd->sc.getSCE(type)->val1 != src->id) || // Cannot Devote a player devoted from another source
- (skill_id == ML_DEVOTION && (!mer || mer != dstsd->md)) || // Mercenary only can devote owner
+ mer != dstsd->md || // Mercenary only can devote owner
(dstsd->class_&MAPID_SECONDMASK) == MAPID_CRUSADER || // Crusader Cannot be devoted
(dstsd->sc.getSCE(SC_HELLPOWER))) // Players affected by SC_HELLPOWER cannot be devoted.
{
- if( sd )
- clif_skill_fail( *sd, skill_id );
return 1;
}
i = 0;
- count = (sd)? min(skill_lv,MAX_DEVOTION) : 1; // Mercenary only can Devote owner
- if( sd )
- { // Player Devoting Player
- ARR_FIND(0, count, i, sd->devotion[i] == bl->id );
- if( i == count )
- {
- ARR_FIND(0, count, i, sd->devotion[i] == 0 );
- if( i == count )
- { // No free slots, skill Fail
- clif_skill_fail( *sd, skill_id );
- return 1;
- }
- }
-
- sd->devotion[i] = bl->id;
- }
- else
- mer->devotion_flag = 1; // Mercenary Devoting Owner
+ mer->devotion_flag = 1; // Mercenary Devoting Owner
clif_skill_nodamage(src, *bl, skill_id, skill_lv,
sc_start4(src, bl, type, 10000, src->id, i, skill_get_range2(src, skill_id, skill_lv, true), 0, skill_get_time2(skill_id, skill_lv)));
@@ -13218,7 +13173,6 @@ int32 skill_castend_pos2(block_list* src, int32 x, int32 y, uint16 skill_id, uin
// Skill Unit Setting
case NPC_GROUNDDRIVE:
- case CR_GRANDCROSS:
case NPC_GRANDDARKNESS:
case MA_SKIDTRAP:
case MA_LANDMINE:
diff --git a/src/map/skills/swordman/grandcross.cpp b/src/map/skills/swordman/grandcross.cpp
new file mode 100644
index 00000000000..3bc8488dc81
--- /dev/null
+++ b/src/map/skills/swordman/grandcross.cpp
@@ -0,0 +1,26 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "grandcross.hpp"
+
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillGrandCross::SkillGrandCross() : SkillImpl(CR_GRANDCROSS) {
+}
+
+void SkillGrandCross::castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const {
+ //Set flag to 1 to prevent deleting ammo (it will be deleted on group-delete).
+ flag|=1;
+
+ skill_unitsetting(src,getSkillId(),skill_lv,x,y,0);
+}
+
+void SkillGrandCross::applyAdditionalEffects(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32 attack_type, enum damage_lv dmg_lv) const {
+ map_session_data* dstsd = BL_CAST(BL_PC, target);
+ status_data* tstatus = status_get_status_data(*target);
+
+ //Chance to cause blind status vs demon and undead element, but not against players
+ if(!dstsd && (battle_check_undead(tstatus->race,tstatus->def_ele) || tstatus->race == RC_DEMON))
+ sc_start(src,target,SC_BLIND,100,skill_lv,skill_get_time2(getSkillId(),skill_lv));
+}
diff --git a/src/map/skills/swordman/grandcross.hpp b/src/map/skills/swordman/grandcross.hpp
new file mode 100644
index 00000000000..00cf0678f76
--- /dev/null
+++ b/src/map/skills/swordman/grandcross.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 SkillGrandCross : public SkillImpl {
+public:
+ SkillGrandCross();
+
+ void castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const override;
+ void applyAdditionalEffects(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32 attack_type, enum damage_lv dmg_lv) const override;
+};
diff --git a/src/map/skills/swordman/holycross.cpp b/src/map/skills/swordman/holycross.cpp
new file mode 100644
index 00000000000..888104ad8e4
--- /dev/null
+++ b/src/map/skills/swordman/holycross.cpp
@@ -0,0 +1,27 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "holycross.hpp"
+
+#include
+
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillHolyCross::SkillHolyCross() : WeaponSkillImpl(CR_HOLYCROSS) {
+}
+
+void SkillHolyCross::calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const {
+#ifdef RENEWAL
+ const map_session_data* sd = BL_CAST(BL_PC, src);
+
+ if(sd && sd->status.weapon == W_2HSPEAR)
+ base_skillratio += 70 * skill_lv;
+ else
+#endif
+ base_skillratio += 35 * skill_lv;
+}
+
+void SkillHolyCross::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_BLIND,3*skill_lv,skill_lv,skill_get_time2(getSkillId(),skill_lv));
+}
diff --git a/src/map/skills/swordman/holycross.hpp b/src/map/skills/swordman/holycross.hpp
new file mode 100644
index 00000000000..915177d3242
--- /dev/null
+++ b/src/map/skills/swordman/holycross.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 SkillHolyCross : public WeaponSkillImpl {
+public:
+ SkillHolyCross();
+
+ void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override;
+ void applyAdditionalEffects(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32 attack_type, enum damage_lv dmg_lv) const override;
+};
diff --git a/src/map/skills/swordman/resistantsouls.cpp b/src/map/skills/swordman/resistantsouls.cpp
new file mode 100644
index 00000000000..a74bb0708e7
--- /dev/null
+++ b/src/map/skills/swordman/resistantsouls.cpp
@@ -0,0 +1,25 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "resistantsouls.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillResistantSouls::SkillResistantSouls() : SkillImpl(CR_PROVIDENCE) {
+}
+
+void SkillResistantSouls::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 && dstsd){ //Check they are not another crusader [Skotlex]
+ if ((dstsd->class_&MAPID_SECONDMASK) == MAPID_CRUSADER) {
+ clif_skill_fail( *sd, getSkillId() );
+ return;
+ }
+ }
+ clif_skill_nodamage(src,*target,getSkillId(),skill_lv,
+ sc_start(src,target,skill_get_sc(getSkillId()), 100, skill_lv, skill_get_time(getSkillId(), skill_lv)));
+}
diff --git a/src/map/skills/swordman/resistantsouls.hpp b/src/map/skills/swordman/resistantsouls.hpp
new file mode 100644
index 00000000000..c16ff944149
--- /dev/null
+++ b/src/map/skills/swordman/resistantsouls.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 SkillResistantSouls : public SkillImpl {
+public:
+ SkillResistantSouls();
+
+ void castendNoDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const override;
+};
diff --git a/src/map/skills/swordman/sacrifice.cpp b/src/map/skills/swordman/sacrifice.cpp
new file mode 100644
index 00000000000..b5a7a4f955f
--- /dev/null
+++ b/src/map/skills/swordman/sacrifice.cpp
@@ -0,0 +1,60 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "sacrifice.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillSacrifice::SkillSacrifice() : SkillImpl(CR_DEVOTION) {
+}
+
+void SkillSacrifice::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) {
+ return;
+ }
+
+ sc_type type = skill_get_sc(getSkillId());
+
+ int32 count, lv;
+ if( !dstsd )
+ { // Only players can be devoted
+ clif_skill_fail( *sd, getSkillId() );
+ return;
+ }
+
+ if( (lv = status_get_lv(src) - dstsd->status.base_level) < 0 )
+ lv = -lv;
+ if( lv > battle_config.devotion_level_difference || // Level difference requeriments
+ (dstsd->sc.getSCE(type) && dstsd->sc.getSCE(type)->val1 != src->id) || // Cannot Devote a player devoted from another source
+ (dstsd->class_&MAPID_SECONDMASK) == MAPID_CRUSADER || // Crusader Cannot be devoted
+ (dstsd->sc.getSCE(SC_HELLPOWER))) // Players affected by SC_HELLPOWER cannot be devoted.
+ {
+ clif_skill_fail( *sd, getSkillId() );
+ return;
+ }
+
+ int32 i = 0;
+ count = min(skill_lv,MAX_DEVOTION);
+
+ ARR_FIND(0, count, i, sd->devotion[i] == target->id );
+ if( i == count )
+ {
+ ARR_FIND(0, count, i, sd->devotion[i] == 0 );
+ if( i == count )
+ { // No free slots, skill Fail
+ clif_skill_fail( *sd, getSkillId() );
+ return;
+ }
+ }
+
+ sd->devotion[i] = target->id;
+
+ clif_skill_nodamage(src, *target, getSkillId(), skill_lv,
+ sc_start4(src, target, type, 10000, src->id, i, skill_get_range2(src, getSkillId(), skill_lv, true), 0, skill_get_time2(getSkillId(), skill_lv)));
+ clif_devotion(src, nullptr);
+}
diff --git a/src/map/skills/swordman/sacrifice.hpp b/src/map/skills/swordman/sacrifice.hpp
new file mode 100644
index 00000000000..5cb4a23ed70
--- /dev/null
+++ b/src/map/skills/swordman/sacrifice.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 SkillSacrifice : public SkillImpl {
+public:
+ SkillSacrifice();
+
+ void castendNoDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const override;
+};
diff --git a/src/map/skills/swordman/shieldboomerang.cpp b/src/map/skills/swordman/shieldboomerang.cpp
new file mode 100644
index 00000000000..bf7162a55c6
--- /dev/null
+++ b/src/map/skills/swordman/shieldboomerang.cpp
@@ -0,0 +1,17 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "shieldboomerang.hpp"
+
+#include
+
+SkillShieldBoomerang::SkillShieldBoomerang() : WeaponSkillImpl(CR_SHIELDBOOMERANG) {
+}
+
+void SkillShieldBoomerang::calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const {
+#ifdef RENEWAL
+ base_skillratio += -100 + skill_lv * 80;
+#else
+ base_skillratio += 30 * skill_lv;
+#endif
+}
diff --git a/src/map/skills/swordman/shieldboomerang.hpp b/src/map/skills/swordman/shieldboomerang.hpp
new file mode 100644
index 00000000000..365dfec9268
--- /dev/null
+++ b/src/map/skills/swordman/shieldboomerang.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 SkillShieldBoomerang : public WeaponSkillImpl {
+public:
+ SkillShieldBoomerang();
+
+ void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override;
+};
diff --git a/src/map/skills/swordman/shieldreflect.cpp b/src/map/skills/swordman/shieldreflect.cpp
new file mode 100644
index 00000000000..fc50e2fa307
--- /dev/null
+++ b/src/map/skills/swordman/shieldreflect.cpp
@@ -0,0 +1,24 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "shieldreflect.hpp"
+
+#include "map/clif.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillShieldReflect::SkillShieldReflect() : StatusSkillImpl(CR_REFLECTSHIELD) {
+}
+
+void SkillShieldReflect::castendNoDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const {
+ map_session_data* sd = BL_CAST(BL_PC, src);
+ status_change* tsc = status_get_sc(target);
+
+ if (tsc && tsc->getSCE(SC_DARKCROW)) { // SC_DARKCROW prevents using reflecting skills
+ if (sd)
+ clif_skill_fail( *sd, getSkillId(), USESKILL_FAIL );
+ return;
+ }
+
+ StatusSkillImpl::castendNoDamageId(src, target, skill_lv, tick, flag);
+}
diff --git a/src/map/skills/swordman/shieldreflect.hpp b/src/map/skills/swordman/shieldreflect.hpp
new file mode 100644
index 00000000000..26167081172
--- /dev/null
+++ b/src/map/skills/swordman/shieldreflect.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 SkillShieldReflect : public StatusSkillImpl {
+public:
+ SkillShieldReflect();
+
+ void castendNoDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const override;
+};
diff --git a/src/map/skills/swordman/skill_factory_swordman.cpp b/src/map/skills/swordman/skill_factory_swordman.cpp
index f5195f88483..7ae68c084a0 100644
--- a/src/map/skills/swordman/skill_factory_swordman.cpp
+++ b/src/map/skills/swordman/skill_factory_swordman.cpp
@@ -11,10 +11,17 @@
#include "bowlingbash.hpp"
#include "brandishspear.hpp"
#include "counterattack.hpp"
+#include "grandcross.hpp"
+#include "holycross.hpp"
#include "magnum.hpp"
#include "pierce.hpp"
#include "provoke.hpp"
+#include "resistantsouls.hpp"
+#include "sacrifice.hpp"
#include "selfprovoke.hpp"
+#include "shieldboomerang.hpp"
+#include "shieldreflect.hpp"
+#include "smite.hpp"
#include "spearboomerang.hpp"
#include "spearstab.hpp"
@@ -24,12 +31,20 @@ std::unique_ptr SkillFactorySwordman::create(const e_skill skil
return std::make_unique(skill_id, true);
case CR_DEFENDER:
return std::make_unique(skill_id, true);
+ case CR_DEVOTION:
+ return std::make_unique();
+ case CR_GRANDCROSS:
+ return std::make_unique();
case CR_HOLYCROSS:
- return std::make_unique(skill_id);
+ return std::make_unique();
+ case CR_PROVIDENCE:
+ return std::make_unique();
+ case CR_REFLECTSHIELD:
+ return std::make_unique();
case CR_SHIELDBOOMERANG:
- return std::make_unique(skill_id);
+ return std::make_unique();
case CR_SHIELDCHARGE:
- return std::make_unique(skill_id);
+ return std::make_unique();
case CR_SHRINK:
return std::make_unique(skill_id, true);
case CR_SPEARQUICKEN:
diff --git a/src/map/skills/swordman/smite.cpp b/src/map/skills/swordman/smite.cpp
new file mode 100644
index 00000000000..976163bf11b
--- /dev/null
+++ b/src/map/skills/swordman/smite.cpp
@@ -0,0 +1,17 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "smite.hpp"
+
+#include "map/status.hpp"
+
+SkillSmite::SkillSmite() : WeaponSkillImpl(CR_SHIELDCHARGE) {
+}
+
+void SkillSmite::calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const {
+ base_skillratio += 20 * skill_lv;
+}
+
+void SkillSmite::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,(15+skill_lv*5),skill_lv,skill_get_time2(getSkillId(),skill_lv));
+}
diff --git a/src/map/skills/swordman/smite.hpp b/src/map/skills/swordman/smite.hpp
new file mode 100644
index 00000000000..7dcb7c40c3b
--- /dev/null
+++ b/src/map/skills/swordman/smite.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 SkillSmite : public WeaponSkillImpl {
+public:
+ SkillSmite();
+
+ void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override;
+ void applyAdditionalEffects(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32 attack_type, enum damage_lv dmg_lv) const override;
+};