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