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