From c7538b3f4b8d87d2250930fa99c99960f2f627c5 Mon Sep 17 00:00:00 2001 From: Atemo Date: Tue, 13 Jan 2026 23:25:16 +0100 Subject: [PATCH] Split up Rogue skills (#9738) Co-authored-by: Lemongrass3110 --- src/map/battle.cpp | 21 ---- src/map/map-server-generator.vcxproj | 22 ++++ src/map/map-server-generator.vcxproj.filters | 66 ++++++++++++ src/map/map-server.vcxproj | 22 ++++ src/map/map-server.vcxproj.filters | 66 ++++++++++++ src/map/skill.cpp | 100 ------------------- src/map/skill.hpp | 2 + src/map/skills/thief/backstab.cpp | 75 ++++++++++++++ src/map/skills/thief/backstab.hpp | 16 +++ src/map/skills/thief/closeconfine.cpp | 17 ++++ src/map/skills/thief/closeconfine.hpp | 13 +++ src/map/skills/thief/divestarmor.cpp | 22 ++++ src/map/skills/thief/divestarmor.hpp | 13 +++ src/map/skills/thief/divesthelm.cpp | 22 ++++ src/map/skills/thief/divesthelm.hpp | 13 +++ src/map/skills/thief/divestshield.cpp | 22 ++++ src/map/skills/thief/divestshield.hpp | 13 +++ src/map/skills/thief/divestweapon.cpp | 22 ++++ src/map/skills/thief/divestweapon.hpp | 13 +++ src/map/skills/thief/mug.cpp | 28 ++++++ src/map/skills/thief/mug.hpp | 13 +++ src/map/skills/thief/remover.cpp | 18 ++++ src/map/skills/thief/remover.hpp | 14 +++ src/map/skills/thief/scribble.cpp | 12 +++ src/map/skills/thief/scribble.hpp | 13 +++ src/map/skills/thief/sightlessmind.cpp | 38 +++++++ src/map/skills/thief/sightlessmind.hpp | 15 +++ src/map/skills/thief/skill_factory_thief.cpp | 33 +++++- src/map/skills/thief/snatch.cpp | 11 ++ src/map/skills/thief/snatch.hpp | 13 +++ 30 files changed, 646 insertions(+), 122 deletions(-) create mode 100644 src/map/skills/thief/backstab.cpp create mode 100644 src/map/skills/thief/backstab.hpp create mode 100644 src/map/skills/thief/closeconfine.cpp create mode 100644 src/map/skills/thief/closeconfine.hpp create mode 100644 src/map/skills/thief/divestarmor.cpp create mode 100644 src/map/skills/thief/divestarmor.hpp create mode 100644 src/map/skills/thief/divesthelm.cpp create mode 100644 src/map/skills/thief/divesthelm.hpp create mode 100644 src/map/skills/thief/divestshield.cpp create mode 100644 src/map/skills/thief/divestshield.hpp create mode 100644 src/map/skills/thief/divestweapon.cpp create mode 100644 src/map/skills/thief/divestweapon.hpp create mode 100644 src/map/skills/thief/mug.cpp create mode 100644 src/map/skills/thief/mug.hpp create mode 100644 src/map/skills/thief/remover.cpp create mode 100644 src/map/skills/thief/remover.hpp create mode 100644 src/map/skills/thief/scribble.cpp create mode 100644 src/map/skills/thief/scribble.hpp create mode 100644 src/map/skills/thief/sightlessmind.cpp create mode 100644 src/map/skills/thief/sightlessmind.hpp create mode 100644 src/map/skills/thief/snatch.cpp create mode 100644 src/map/skills/thief/snatch.hpp diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 35a5703b63d..f73b7e12f24 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -3322,11 +3322,6 @@ static bool is_attack_hitting(struct Damage* wd, block_list *src, block_list *ta hitrate += hitrate * 50 / 100; #endif break; -#ifdef RENEWAL - case RG_BACKSTAP: - hitrate += skill_lv; // !TODO: What's the rate increase? - break; -#endif case RK_SONICWAVE: hitrate += hitrate * 3 * skill_lv / 100; // !TODO: Confirm the hitrate bonus break; @@ -4806,22 +4801,6 @@ 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 RG_BACKSTAP: - if(sd && sd->status.weapon == W_BOW && battle_config.backstab_bow_penalty) - skillratio += (200 + 40 * skill_lv) / 2; - else - skillratio += 200 + 40 * skill_lv; - break; - case RG_RAID: -#ifdef RENEWAL - skillratio += -100 + 50 + skill_lv * 150; -#else - skillratio += 40 * skill_lv; -#endif - break; - case RG_INTIMIDATE: - skillratio += 30 * skill_lv; - break; case CR_SHIELDCHARGE: skillratio += 20 * skill_lv; break; diff --git a/src/map/map-server-generator.vcxproj b/src/map/map-server-generator.vcxproj index 4ca32db7864..71bfdebca23 100644 --- a/src/map/map-server-generator.vcxproj +++ b/src/map/map-server-generator.vcxproj @@ -363,12 +363,23 @@ + + + + + + + + + + + @@ -542,12 +553,23 @@ + + + + + + + + + + + diff --git a/src/map/map-server-generator.vcxproj.filters b/src/map/map-server-generator.vcxproj.filters index 4c5fe9b0369..af5528e1d9e 100644 --- a/src/map/map-server-generator.vcxproj.filters +++ b/src/map/map-server-generator.vcxproj.filters @@ -738,9 +738,27 @@ Header Files\Skills\Thief + + Header Files\Skills\Thief + + + Header Files\Skills\Thief + Header Files\Skills\Thief + + Header Files\Skills\Thief + + + Header Files\Skills\Thief + + + Header Files\Skills\Thief + + + Header Files\Skills\Thief + Header Files\Skills\Thief @@ -750,12 +768,27 @@ Header Files\Skills\Thief + + Header Files\Skills\Thief + + + Header Files\Skills\Thief + Header Files\Skills\Thief + + Header Files\Skills\Thief + + + Header Files\Skills\Thief + Header Files\Skills\Thief + + Header Files\Skills\Thief + Header Files\Skills\Thief @@ -1133,9 +1166,27 @@ Source Files\Skills\Thief + + Source Files\Skills\Thief + + + Source Files\Skills\Thief + Source Files\Skills\Thief + + Source Files\Skills\Thief + + + Source Files\Skills\Thief + + + Source Files\Skills\Thief + + + Source Files\Skills\Thief + Source Files\Skills\Thief @@ -1145,12 +1196,27 @@ Source Files\Skills\Thief + + Source Files\Skills\Thief + + + Source Files\Skills\Thief + Source Files\Skills\Thief + + Source Files\Skills\Thief + + + Source Files\Skills\Thief + 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 c4f34a16ef0..746165e2efe 100644 --- a/src/map/map-server.vcxproj +++ b/src/map/map-server.vcxproj @@ -363,12 +363,23 @@ + + + + + + + + + + + @@ -542,12 +553,23 @@ + + + + + + + + + + + diff --git a/src/map/map-server.vcxproj.filters b/src/map/map-server.vcxproj.filters index 4c5fe9b0369..af5528e1d9e 100644 --- a/src/map/map-server.vcxproj.filters +++ b/src/map/map-server.vcxproj.filters @@ -738,9 +738,27 @@ Header Files\Skills\Thief + + Header Files\Skills\Thief + + + Header Files\Skills\Thief + Header Files\Skills\Thief + + Header Files\Skills\Thief + + + Header Files\Skills\Thief + + + Header Files\Skills\Thief + + + Header Files\Skills\Thief + Header Files\Skills\Thief @@ -750,12 +768,27 @@ Header Files\Skills\Thief + + Header Files\Skills\Thief + + + Header Files\Skills\Thief + Header Files\Skills\Thief + + Header Files\Skills\Thief + + + Header Files\Skills\Thief + Header Files\Skills\Thief + + Header Files\Skills\Thief + Header Files\Skills\Thief @@ -1133,9 +1166,27 @@ Source Files\Skills\Thief + + Source Files\Skills\Thief + + + Source Files\Skills\Thief + Source Files\Skills\Thief + + Source Files\Skills\Thief + + + Source Files\Skills\Thief + + + Source Files\Skills\Thief + + + Source Files\Skills\Thief + Source Files\Skills\Thief @@ -1145,12 +1196,27 @@ Source Files\Skills\Thief + + Source Files\Skills\Thief + + + Source Files\Skills\Thief + Source Files\Skills\Thief + + Source Files\Skills\Thief + + + Source Files\Skills\Thief + 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 65d893df091..352f00f4c74 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -291,7 +291,6 @@ int32 skill_tree_get_max(uint16 skill_id, int32 b_class) { int32 skill_frostjoke_scream(block_list *bl,va_list ap); std::shared_ptr skill_locate_element_field(block_list *bl); // [Skotlex] -int32 skill_graffitiremover(block_list *bl, va_list ap); // [Valaris] static int32 skill_trap_splash(block_list *bl, va_list ap); struct skill_unit_group_tickset *skill_unitgrouptickset_search(block_list *bl,std::shared_ptr sg,t_tick tick); static int32 skill_unit_onplace(skill_unit *src,block_list *bl,t_tick tick); @@ -1511,18 +1510,6 @@ int32 skill_additional_effect( block_list* src, block_list *bl, uint16 skill_id, break; #endif - case RG_RAID: - sc_start(src,bl,SC_STUN,(10+3*skill_lv),skill_lv,skill_get_time(skill_id,skill_lv)); - sc_start(src,bl,SC_BLIND,(10+3*skill_lv),skill_lv,skill_get_time2(skill_id,skill_lv)); -#ifdef RENEWAL - sc_start(src, bl, SC_RAID, 100, skill_lv, 10000); // Hardcoded to 10 seconds since Duration1 and Duration2 are used - break; - - case RG_BACKSTAP: - sc_start(src,bl,SC_STUN,(5+2*skill_lv),skill_lv,skill_get_time(skill_id,skill_lv)); -#endif - break; - case BA_FROSTJOKER: case DC_SCREAM: { @@ -5326,48 +5313,6 @@ int32 skill_castend_damage_id (block_list* src, block_list *bl, uint16 skill_id, status_change_end(src, SC_BLADESTOP); break; - case RG_BACKSTAP: - { -#ifdef RENEWAL - uint8 dir = map_calc_dir(src, bl->x, bl->y); - int16 x, y; - - if (dir > 0 && dir < 4) - x = -1; - else if (dir > 4) - x = 1; - else - x = 0; - - if (dir > 2 && dir < 6) - y = -1; - else if (dir == 7 || dir < 2) - y = 1; - else - y = 0; - - if (battle_check_target(src, bl, BCT_ENEMY) > 0 && unit_movepos(src, bl->x + x, bl->y + y, 2, true)) { // Display movement + animation. -#else - if (check_distance_bl(src, bl, 0)) - break; - - uint8 dir = map_calc_dir(src, bl->x, bl->y), t_dir = unit_getdir(bl); - - if (!map_check_dir(dir, t_dir) || bl->type == BL_SKILL) { -#endif - status_change_end(src, SC_HIDING); - dir = dir < 4 ? dir+4 : dir-4; // change direction [Celest] - unit_setdir(bl,dir); -#ifdef RENEWAL - clif_blown(src); -#endif - skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag); - } - else if (sd) - clif_skill_fail( *sd, skill_id ); - } - break; - case MO_FINGEROFFENSIVE: skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag); if (battle_config.finger_offensive_type && sd) { @@ -5457,7 +5402,6 @@ int32 skill_castend_damage_id (block_list* src, block_list *bl, uint16 skill_id, case AS_SPLASHER: case HT_BLITZBEAT: case MA_SHOWER: - case RG_RAID: #ifdef RENEWAL case SN_SHARPSHOOTING: #endif @@ -7841,10 +7785,6 @@ int32 skill_castend_nodamage_id (block_list *src, block_list *bl, uint16 skill_i } break; - case RG_CLOSECONFINE: - clif_skill_nodamage(src,*bl,skill_id,skill_lv, - sc_start4(src,bl,type,100,skill_lv,src->id,0,0,skill_get_time(skill_id,skill_lv))); - break; case SA_FLAMELAUNCHER: // added failure chance and chance to break weapon if turned on [Valaris] case SA_FROSTWEAPON: case SA_LIGHTNINGLOADER: @@ -8466,16 +8406,6 @@ int32 skill_castend_nodamage_id (block_list *src, block_list *bl, uint16 skill_i } break; - case RG_RAID: - skill_area_temp[1] = 0; - clif_skill_nodamage(src,*bl,skill_id,skill_lv); - map_foreachinrange(skill_area_sub, bl, - skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL, - src,skill_id,skill_lv,tick, flag|BCT_ENEMY|1, - skill_castend_damage_id); - status_change_end(src, SC_HIDING); - break; - //List of self skills that give damage around caster case ASC_METEORASSAULT: case RK_WINDCUTTER: @@ -8939,20 +8869,6 @@ int32 skill_castend_nodamage_id (block_list *src, block_list *bl, uint16 skill_i break; #endif - case RG_STEALCOIN: - if(sd) { - if(pc_steal_coin(sd,bl)) - { - dstmd->state.provoke_flag = src->id; - mob_target(dstmd, src, skill_get_range2(src, skill_id, skill_lv, true)); - clif_skill_nodamage(src,*bl,skill_id,skill_lv); - - } - else - clif_skill_fail( *sd, skill_id ); - } - break; - case NV_FIRSTAID: clif_skill_nodamage(src,*bl,skill_id,5); status_heal(bl,5,0,0); @@ -9077,10 +8993,6 @@ int32 skill_castend_nodamage_id (block_list *src, block_list *bl, uint16 skill_i } break; - case RG_STRIPWEAPON: - case RG_STRIPSHIELD: - case RG_STRIPARMOR: - case RG_STRIPHELM: case ST_FULLSTRIP: case GC_WEAPONCRUSH: case SC_STRIPACCESSARY: @@ -10007,10 +9919,6 @@ int32 skill_castend_nodamage_id (block_list *src, block_list *bl, uint16 skill_i } break; - case RG_CLEANER: //AppleGirl - clif_skill_nodamage(src,*bl,skill_id,skill_lv); - break; - #ifndef RENEWAL case CG_LONGINGFREEDOM: { @@ -13816,10 +13724,6 @@ int32 skill_castend_pos2(block_list* src, int32 x, int32 y, uint16 skill_id, uin if(skill_unitsetting(src,skill_id,skill_lv,x,y,0)) clif_skill_poseffect( *src, skill_id, skill_lv, x, y, tick ); break; - case RG_GRAFFITI: /* Graffiti [Valaris] */ - skill_unitsetting(src,skill_id,skill_lv,x,y,0); - flag|=1; - break; case NPC_EARTHQUAKE: clif_skill_damage( *src, *src, tick, status_get_amotion(src), 0, DMGVAL_IGNORE, 1, skill_id, -1, DMG_SINGLE ); skill_unitsetting(src, skill_id, skill_lv, x, y, 0); @@ -13850,10 +13754,6 @@ int32 skill_castend_pos2(block_list* src, int32 x, int32 y, uint16 skill_id, uin flag|=1; #endif break; - case RG_CLEANER: // [Valaris] - i = skill_get_splash(skill_id, skill_lv); - map_foreachinallarea(skill_graffitiremover,src->m,x-i,y-i,x+i,y+i,BL_SKILL,1); - break; case SO_WARMER: case SO_CLOUD_KILL: diff --git a/src/map/skill.hpp b/src/map/skill.hpp index 4545227cc97..b96a120a519 100644 --- a/src/map/skill.hpp +++ b/src/map/skill.hpp @@ -639,6 +639,8 @@ int32 skill_calc_heal(block_list *src, block_list *target, uint16 skill_id, uint bool skill_check_cloaking(block_list *bl, struct status_change_entry *sce); int8 skill_isCopyable(map_session_data *sd, uint16 skill_id); +int32 skill_graffitiremover(block_list *bl, va_list ap); // [Valaris] + // Abnormal status bool skill_isNotOk( uint16 skill_id, map_session_data& sd ); bool skill_isNotOk_hom(homun_data *hd, uint16 skill_id, uint16 skill_lv); diff --git a/src/map/skills/thief/backstab.cpp b/src/map/skills/thief/backstab.cpp new file mode 100644 index 00000000000..63972db1068 --- /dev/null +++ b/src/map/skills/thief/backstab.cpp @@ -0,0 +1,75 @@ +// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#include "backstab.hpp" + +#include + +#include "map/pc.hpp" +#include "map/status.hpp" + +SkillBackStab::SkillBackStab() : SkillImpl(RG_BACKSTAP) { +} + +void SkillBackStab::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &base_skillratio, int32 mflag) const { + const map_session_data* sd = BL_CAST( BL_PC, src ); + + if(sd && sd->status.weapon == W_BOW && battle_config.backstab_bow_penalty) + base_skillratio += (200 + 40 * skill_lv) / 2; + else + base_skillratio += 200 + 40 * skill_lv; +} + +void SkillBackStab::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 ); + +#ifdef RENEWAL + uint8 dir = map_calc_dir(src, target->x, target->y); + int16 x, y; + + if (dir > 0 && dir < 4) + x = -1; + else if (dir > 4) + x = 1; + else + x = 0; + + if (dir > 2 && dir < 6) + y = -1; + else if (dir == 7 || dir < 2) + y = 1; + else + y = 0; + + if (battle_check_target(src, target, BCT_ENEMY) > 0 && unit_movepos(src, target->x + x, target->y + y, 2, true)) { // Display movement + animation. +#else + if (check_distance_bl(src, target, 0)) + return; + + uint8 dir = map_calc_dir(src, target->x, target->y), t_dir = unit_getdir(target); + + if (!map_check_dir(dir, t_dir) || target->type == BL_SKILL) { +#endif + status_change_end(src, SC_HIDING); + dir = dir < 4 ? dir+4 : dir-4; // change direction [Celest] + unit_setdir(target,dir); +#ifdef RENEWAL + clif_blown(src); +#endif + skill_attack(BF_WEAPON, src, src, target, getSkillId(), skill_lv, tick, flag); + } + else if (sd) + clif_skill_fail( *sd, getSkillId() ); +} + +void SkillBackStab::applyAdditionalEffects(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32 attack_type, enum damage_lv dmg_lv) const { +#ifdef RENEWAL + sc_start(src,target,SC_STUN,(5+2*skill_lv),skill_lv,skill_get_time(getSkillId(),skill_lv)); +#endif +} + +void SkillBackStab::modifyHitRate(int16& hit_rate, const block_list* src, const block_list* target, uint16 skill_lv) const { +#ifdef RENEWAL + hit_rate += skill_lv; // !TODO: What's the rate increase? +#endif +} diff --git a/src/map/skills/thief/backstab.hpp b/src/map/skills/thief/backstab.hpp new file mode 100644 index 00000000000..58446f5554c --- /dev/null +++ b/src/map/skills/thief/backstab.hpp @@ -0,0 +1,16 @@ +// 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 SkillBackStab : public SkillImpl { +public: + SkillBackStab(); + + 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 &skillratio, int32 mflag) const override; + void castendDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const override; + void modifyHitRate(int16& hit_rate, const block_list* src, const block_list* target, uint16 skill_lv) const override; +}; diff --git a/src/map/skills/thief/closeconfine.cpp b/src/map/skills/thief/closeconfine.cpp new file mode 100644 index 00000000000..10629c1942e --- /dev/null +++ b/src/map/skills/thief/closeconfine.cpp @@ -0,0 +1,17 @@ +// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#include "closeconfine.hpp" + +#include "map/clif.hpp" +#include "map/status.hpp" + +SkillCloseConfine::SkillCloseConfine() : SkillImpl(RG_CLOSECONFINE) { +} + +void SkillCloseConfine::castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const { + sc_type type = skill_get_sc(getSkillId()); + + clif_skill_nodamage(src,*target,getSkillId(),skill_lv, + sc_start4(src,target,type,100,skill_lv,src->id,0,0,skill_get_time(getSkillId(),skill_lv))); +} diff --git a/src/map/skills/thief/closeconfine.hpp b/src/map/skills/thief/closeconfine.hpp new file mode 100644 index 00000000000..9bca621b590 --- /dev/null +++ b/src/map/skills/thief/closeconfine.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 SkillCloseConfine : public SkillImpl { +public: + SkillCloseConfine(); + + 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/divestarmor.cpp b/src/map/skills/thief/divestarmor.cpp new file mode 100644 index 00000000000..9fac9d248c8 --- /dev/null +++ b/src/map/skills/thief/divestarmor.cpp @@ -0,0 +1,22 @@ +// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#include "divestarmor.hpp" + +#include "map/clif.hpp" +#include "map/pc.hpp" + +SkillDivestArmor::SkillDivestArmor() : SkillImpl(RG_STRIPARMOR) { +} + +void SkillDivestArmor::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 ); + + bool 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/divestarmor.hpp b/src/map/skills/thief/divestarmor.hpp new file mode 100644 index 00000000000..7adad69ba0c --- /dev/null +++ b/src/map/skills/thief/divestarmor.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 SkillDivestArmor : public SkillImpl { +public: + SkillDivestArmor(); + + 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/divesthelm.cpp b/src/map/skills/thief/divesthelm.cpp new file mode 100644 index 00000000000..e77fd0567a9 --- /dev/null +++ b/src/map/skills/thief/divesthelm.cpp @@ -0,0 +1,22 @@ +// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#include "divesthelm.hpp" + +#include "map/clif.hpp" +#include "map/pc.hpp" + +SkillDivestHelm::SkillDivestHelm() : SkillImpl(RG_STRIPHELM) { +} + +void SkillDivestHelm::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 ); + + bool 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/divesthelm.hpp b/src/map/skills/thief/divesthelm.hpp new file mode 100644 index 00000000000..a78728efe81 --- /dev/null +++ b/src/map/skills/thief/divesthelm.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 SkillDivestHelm : public SkillImpl { +public: + SkillDivestHelm(); + + 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/divestshield.cpp b/src/map/skills/thief/divestshield.cpp new file mode 100644 index 00000000000..97acc9f7233 --- /dev/null +++ b/src/map/skills/thief/divestshield.cpp @@ -0,0 +1,22 @@ +// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#include "divestshield.hpp" + +#include "map/clif.hpp" +#include "map/pc.hpp" + +SkillDivestShield::SkillDivestShield() : SkillImpl(RG_STRIPSHIELD) { +} + +void SkillDivestShield::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 ); + + bool 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/divestshield.hpp b/src/map/skills/thief/divestshield.hpp new file mode 100644 index 00000000000..187c6d1a8c0 --- /dev/null +++ b/src/map/skills/thief/divestshield.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 SkillDivestShield : public SkillImpl { +public: + SkillDivestShield(); + + 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/divestweapon.cpp b/src/map/skills/thief/divestweapon.cpp new file mode 100644 index 00000000000..0d763c0ee56 --- /dev/null +++ b/src/map/skills/thief/divestweapon.cpp @@ -0,0 +1,22 @@ +// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#include "divestweapon.hpp" + +#include "map/clif.hpp" +#include "map/pc.hpp" + +SkillDivestWeapon::SkillDivestWeapon() : SkillImpl(RG_STRIPWEAPON) { +} + +void SkillDivestWeapon::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 ); + + bool 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/divestweapon.hpp b/src/map/skills/thief/divestweapon.hpp new file mode 100644 index 00000000000..aec24bbcad7 --- /dev/null +++ b/src/map/skills/thief/divestweapon.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 SkillDivestWeapon : public SkillImpl { +public: + SkillDivestWeapon(); + + 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/mug.cpp b/src/map/skills/thief/mug.cpp new file mode 100644 index 00000000000..29e676f857d --- /dev/null +++ b/src/map/skills/thief/mug.cpp @@ -0,0 +1,28 @@ +// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#include "mug.hpp" + +#include "map/clif.hpp" +#include "map/mob.hpp" +#include "map/pc.hpp" + +SkillMug::SkillMug() : SkillImpl(RG_STEALCOIN) { +} + +void SkillMug::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 ); + mob_data *dstmd = BL_CAST(BL_MOB, target); + + if(sd) { + if(pc_steal_coin(sd,target)) + { + dstmd->state.provoke_flag = src->id; + mob_target(dstmd, src, skill_get_range2(src, getSkillId(), skill_lv, true)); + clif_skill_nodamage(src,*target,getSkillId(),skill_lv); + + } + else + clif_skill_fail( *sd, getSkillId() ); + } +} diff --git a/src/map/skills/thief/mug.hpp b/src/map/skills/thief/mug.hpp new file mode 100644 index 00000000000..d766d7df0ee --- /dev/null +++ b/src/map/skills/thief/mug.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 SkillMug : public SkillImpl { +public: + SkillMug(); + + 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/remover.cpp b/src/map/skills/thief/remover.cpp new file mode 100644 index 00000000000..1760e58399b --- /dev/null +++ b/src/map/skills/thief/remover.cpp @@ -0,0 +1,18 @@ +// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#include "remover.hpp" + +#include "map/clif.hpp" + +SkillRemover::SkillRemover() : SkillImpl(RG_CLEANER) { +} + +void SkillRemover::castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const { + clif_skill_nodamage(src,*target,getSkillId(),skill_lv); +} + +void SkillRemover::castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const { + int32 i = skill_get_splash(getSkillId(), skill_lv); + map_foreachinallarea(skill_graffitiremover,src->m,x-i,y-i,x+i,y+i,BL_SKILL,1); +} diff --git a/src/map/skills/thief/remover.hpp b/src/map/skills/thief/remover.hpp new file mode 100644 index 00000000000..a396f588892 --- /dev/null +++ b/src/map/skills/thief/remover.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 SkillRemover : public SkillImpl { +public: + SkillRemover(); + + void castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const override; + void castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const override; +}; diff --git a/src/map/skills/thief/scribble.cpp b/src/map/skills/thief/scribble.cpp new file mode 100644 index 00000000000..de535195cad --- /dev/null +++ b/src/map/skills/thief/scribble.cpp @@ -0,0 +1,12 @@ +// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#include "scribble.hpp" + +SkillScribble::SkillScribble() : SkillImpl(RG_GRAFFITI) { +} + +void SkillScribble::castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const { + skill_unitsetting(src,getSkillId(),skill_lv,x,y,0); + flag|=1; +} diff --git a/src/map/skills/thief/scribble.hpp b/src/map/skills/thief/scribble.hpp new file mode 100644 index 00000000000..229bce7cd58 --- /dev/null +++ b/src/map/skills/thief/scribble.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 SkillScribble : public SkillImpl { +public: + SkillScribble(); + + void castendPos2(block_list* src, int32 x, int32 y, uint16 skill_lv, t_tick tick, int32& flag) const override; +}; diff --git a/src/map/skills/thief/sightlessmind.cpp b/src/map/skills/thief/sightlessmind.cpp new file mode 100644 index 00000000000..598584a3b57 --- /dev/null +++ b/src/map/skills/thief/sightlessmind.cpp @@ -0,0 +1,38 @@ +// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#include "sightlessmind.hpp" + +#include + +#include "map/clif.hpp" +#include "map/status.hpp" + +SkillSightlessMind::SkillSightlessMind() : SkillImplRecursiveDamageSplash(RG_RAID) { +} + +void SkillSightlessMind::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 + 50 + skill_lv * 150; +#else + base_skillratio += 40 * skill_lv; +#endif +} + +void SkillSightlessMind::castendNoDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const { + skill_area_temp[1] = 0; + clif_skill_nodamage(src,*target,getSkillId(),skill_lv); + map_foreachinrange(skill_area_sub, target, + skill_get_splash(getSkillId(), skill_lv), BL_CHAR|BL_SKILL, + src,getSkillId(),skill_lv,tick, flag|BCT_ENEMY|1, + skill_castend_damage_id); + status_change_end(src, SC_HIDING); +} + +void SkillSightlessMind::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,(10+3*skill_lv),skill_lv,skill_get_time(getSkillId(),skill_lv)); + sc_start(src,target,SC_BLIND,(10+3*skill_lv),skill_lv,skill_get_time2(getSkillId(),skill_lv)); +#ifdef RENEWAL + sc_start(src, target, SC_RAID, 100, skill_lv, 10000); // Hardcoded to 10 seconds since Duration1 and Duration2 are used +#endif +} diff --git a/src/map/skills/thief/sightlessmind.hpp b/src/map/skills/thief/sightlessmind.hpp new file mode 100644 index 00000000000..a67c68cc0bb --- /dev/null +++ b/src/map/skills/thief/sightlessmind.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 SkillSightlessMind : public SkillImplRecursiveDamageSplash { +public: + SkillSightlessMind(); + + 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 &skillratio, int32 mflag) const override; + 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 75ebfe4ce43..14d3faabb22 100644 --- a/src/map/skills/thief/skill_factory_thief.cpp +++ b/src/map/skills/thief/skill_factory_thief.cpp @@ -7,11 +7,22 @@ #include "../weapon_skill_impl.hpp" #include "backslide.hpp" +#include "backstab.hpp" +#include "closeconfine.hpp" #include "detoxify.hpp" +#include "divestarmor.hpp" +#include "divesthelm.hpp" +#include "divestshield.hpp" +#include "divestweapon.hpp" #include "envenom.hpp" #include "findstone.hpp" #include "hiding.hpp" +#include "mug.hpp" +#include "remover.hpp" #include "sandattack.hpp" +#include "scribble.hpp" +#include "sightlessmind.hpp" +#include "snatch.hpp" #include "steal.hpp" #include "stonefling.hpp" @@ -37,8 +48,28 @@ std::unique_ptr SkillFactoryThief::create(const e_skill skill_i return std::make_unique(skill_id, true); case GC_WEAPONCRUSH: return std::make_unique(skill_id); + case RG_BACKSTAP: + return std::make_unique(); + case RG_CLEANER: + return std::make_unique(); + case RG_CLOSECONFINE: + return std::make_unique(); + case RG_GRAFFITI: + return std::make_unique(); case RG_INTIMIDATE: - return std::make_unique(skill_id); + return std::make_unique(); + case RG_RAID: + return std::make_unique(); + case RG_STEALCOIN: + return std::make_unique(); + case RG_STRIPWEAPON: + return std::make_unique(); + case RG_STRIPSHIELD: + return std::make_unique(); + case RG_STRIPARMOR: + return std::make_unique(); + case RG_STRIPHELM: + return std::make_unique(); case SC_DEADLYINFECT: return std::make_unique(skill_id); case SC_FEINTBOMB: diff --git a/src/map/skills/thief/snatch.cpp b/src/map/skills/thief/snatch.cpp new file mode 100644 index 00000000000..beaf1d2713a --- /dev/null +++ b/src/map/skills/thief/snatch.cpp @@ -0,0 +1,11 @@ +// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#include "snatch.hpp" + +SkillSnatch::SkillSnatch() : WeaponSkillImpl(RG_INTIMIDATE) { +} + +void SkillSnatch::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &base_skillratio, int32 mflag) const { + base_skillratio += 30 * skill_lv; +} diff --git a/src/map/skills/thief/snatch.hpp b/src/map/skills/thief/snatch.hpp new file mode 100644 index 00000000000..5b565fb0cc8 --- /dev/null +++ b/src/map/skills/thief/snatch.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 SkillSnatch : public WeaponSkillImpl { +public: + SkillSnatch(); + + void calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const override; +};