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