diff --git a/db/re/item_db_equip.yml b/db/re/item_db_equip.yml
index 2afcf1872d8..830e9dc84ce 100644
--- a/db/re/item_db_equip.yml
+++ b/db/re/item_db_equip.yml
@@ -178446,6 +178446,26 @@ Body:
Costume_Head_Top: true
ArmorLevel: 1
View: 2717
+ - Id: 400952
+ AegisName: aegis_400952
+ Name: Costume Indian Feather Headband
+ Type: Armor
+ Locations:
+ Costume_Head_Top: true
+ ArmorLevel: 1
+ View: 809
+ - Id: 400953
+ AegisName: C_Summer_Sunglasses
+ Name: Costume Summer Sunglasses
+ Type: Armor
+ Locations:
+ Costume_Head_Top: true
+ Trade:
+ NoMail: true
+ NoAuction: true
+ NoGuildStorage: true
+ ArmorLevel: 1
+ View: 2720
- Id: 400956
AegisName: C_Chestnut_Helmet
Name: Costume Chestnut Mask
@@ -188677,6 +188697,43 @@ Body:
NoGuildStorage: true
NoMail: true
NoAuction: true
+ - Id: 420545
+ AegisName: C_Vacation_Pope_Hair
+ Name: Costume Vacation Pope Hair
+ Type: Armor
+ Locations:
+ Costume_Head_Low: true
+ Trade:
+ NoMail: true
+ NoAuction: true
+ NoGuildStorage: true
+ ArmorLevel: 1
+ View: 2718
+ - Id: 420546
+ AegisName: C_Miriam_Hair
+ Name: Costume Miriam Ponytail
+ Type: Armor
+ Locations:
+ Costume_Head_Low: true
+ Trade:
+ NoMail: true
+ NoAuction: true
+ NoGuildStorage: true
+ ArmorLevel: 1
+ View: 2719
+ - Id: 420547
+ AegisName: C_Come_On_Soda
+ Name: Costume Blueberry Popsicle
+ Type: Armor
+ Locations:
+ Costume_Head_Low: true
+ Trade:
+ NoDrop: true
+ NoSell: true
+ NoMail: true
+ NoAuction: true
+ ArmorLevel: 1
+ View: 2721
- Id: 420552
AegisName: C_Divine_Sky_Invite
Name: Costume Divine Invitation
@@ -216849,7 +216906,7 @@ Body:
ArmorLevel: 1
View: 228
- Id: 480462
- AegisName: aegis_480462
+ AegisName: C_Hanwha_Pool_Ring
Name: Costume Hanwha X RO Poring Tube
Type: Armor
Locations:
@@ -218113,6 +218170,18 @@ Body:
Costume_Garment: true
ArmorLevel: 1
View: 278
+ - Id: 480619
+ AegisName: C_Melon_Cream_Soda
+ Name: Costume Melon Cream Soda
+ Type: Armor
+ Locations:
+ Costume_Garment: true
+ Trade:
+ NoMail: true
+ NoAuction: true
+ NoGuildStorage: true
+ ArmorLevel: 1
+ View: 279
- Id: 480627
AegisName: C_2025RosFesta
Name: Costume ROS 2025 Champion Coat
diff --git a/src/map/battle.cpp b/src/map/battle.cpp
index 6bda3fc911a..fb3c0ff9789 100644
--- a/src/map/battle.cpp
+++ b/src/map/battle.cpp
@@ -4628,12 +4628,6 @@ static int32 battle_calc_attack_skill_ratio(struct Damage* wd, block_list *src,b
}
switch(skill_id) {
- case HFLI_MOON: //[orn]
- skillratio += 10 + 110 * skill_lv;
- break;
- case HFLI_SBR44: //[orn]
- skillratio += 100 * (skill_lv - 1);
- break;
case SKE_ALL_IN_THE_SKY:
// TODO: refactor
if (status_get_race(target) == RC_DEMIHUMAN || status_get_race(target) == RC_DEMON)
@@ -6365,12 +6359,6 @@ struct Damage battle_calc_magic_attack(block_list *src,block_list *target,uint16
if (sd && ad.div_ > 0)
ad.div_ *= -1; //For players, damage is divided by number of hits
break;
-#ifdef RENEWAL
- case HW_GRAVITATION:
- skillratio += -100 + 100 * skill_lv;
- RE_LVL_DMOD(100);
- break;
-#endif
case HN_GROUND_GRAVITATION:
if (mflag & SKILL_ALTDMG_FLAG) {
// Initial damage
diff --git a/src/map/map-server.vcxproj b/src/map/map-server.vcxproj
index d121cf2b4a6..d3bc60c84db 100644
--- a/src/map/map-server.vcxproj
+++ b/src/map/map-server.vcxproj
@@ -322,6 +322,7 @@
+
@@ -595,12 +596,14 @@
+
+
@@ -1763,6 +1766,9 @@
true
+
+ true
+
true
@@ -2582,6 +2588,9 @@
true
+
+ true
+
true
@@ -2600,6 +2609,9 @@
true
+
+ true
+
true
diff --git a/src/map/map-server.vcxproj.filters b/src/map/map-server.vcxproj.filters
index 6c6a39a4e30..51e2cf550d2 100644
--- a/src/map/map-server.vcxproj.filters
+++ b/src/map/map-server.vcxproj.filters
@@ -621,6 +621,9 @@
Header Files\Skills\Acolyte
+
+ Header Files\Skills\Acolyte
+
Header Files\Skills\Acolyte
@@ -1440,6 +1443,9 @@
Header Files\Skills\Homunculus
+
+ Header Files\Skills\Homunculus
+
Header Files\Skills\Homunculus
@@ -1458,6 +1464,9 @@
Header Files\Skills\Homunculus
+
+ Header Files\Skills\Homunculus
+
Header Files\Skills\Homunculus
@@ -4340,6 +4349,9 @@
Source Files\Skills\Acolyte
+
+ Source Files\Skills\Acolyte
+
Source Files\Skills\Acolyte
@@ -5159,6 +5171,9 @@
Source Files\Skills\Homunculus
+
+ Source Files\Skills\Homunculus
+
Source Files\Skills\Homunculus
@@ -5177,6 +5192,9 @@
Source Files\Skills\Homunculus
+
+ Source Files\Skills\Homunculus
+
Source Files\Skills\Homunculus
diff --git a/src/map/skill.cpp b/src/map/skill.cpp
index 3581dc0f4bb..8c55dff880c 100755
--- a/src/map/skill.cpp
+++ b/src/map/skill.cpp
@@ -4242,11 +4242,6 @@ int32 skill_castend_damage_id (block_list* src, block_list *bl, uint16 skill_id,
FreeBlockLock freeLock;
switch(skill_id) {
- case ALL_RESURRECTION:
- if (!battle_check_undead(tstatus->race, tstatus->def_ele))
- break;
- skill_attack(BF_MAGIC,src,src,bl,skill_id,skill_lv,tick,flag);
- break;
case 0:/* no skill - basic/normal attack */
if(sd) {
@@ -4489,53 +4484,6 @@ int32 skill_castend_nodamage_id (block_list *src, block_list *bl, uint16 skill_i
FreeBlockLock freeLock;
switch(skill_id)
{
- case ALL_RESURRECTION:
- if(sd && (map_flag_gvg2(bl->m) || map_getmapflag(bl->m, MF_BATTLEGROUND)))
- { //No reviving in WoE grounds!
- clif_skill_fail( *sd, skill_id );
- break;
- }
- if (!status_isdead(*bl))
- break;
- {
- int32 per = 0, sper = 0;
- if (tsc && tsc->getSCE(SC_HELLPOWER)) {
- clif_skill_nodamage(src, *bl, ALL_RESURRECTION, skill_lv);
- break;
- }
-
- if (map_getmapflag(bl->m, MF_PVP) && dstsd && dstsd->pvp_point < 0)
- break;
-
- switch(skill_lv){
- case 1: per=10; break;
- case 2: per=30; break;
- case 3: per=50; break;
- case 4: per=80; break;
- }
- if(dstsd && dstsd->special_state.restart_full_recover)
- per = sper = 100;
- if (status_revive(bl, per, sper))
- {
- clif_skill_nodamage(src,*bl,ALL_RESURRECTION,skill_lv); //Both Redemptio and Res show this skill-animation.
- if(sd && dstsd && battle_config.resurrection_exp > 0)
- {
- t_exp exp = 0,jexp = 0;
- int32 lv = dstsd->status.base_level - sd->status.base_level, jlv = dstsd->status.job_level - sd->status.job_level;
- if(lv > 0 && pc_nextbaseexp(dstsd)) {
- exp = (t_exp)(dstsd->status.base_exp * lv * battle_config.resurrection_exp / 1000000.);
- if (exp < 1) exp = 1;
- }
- if(jlv > 0 && pc_nextjobexp(dstsd)) {
- jexp = (t_exp)(dstsd->status.job_exp * lv * battle_config.resurrection_exp / 1000000.);
- if (jexp < 1) jexp = 1;
- }
- if(exp > 0 || jexp > 0)
- pc_gainexp (sd, bl, exp, jexp, 0);
- }
- }
- }
- break;
// New guild skills [Celest]
case GD_BATTLEORDER:
case GD_REGENERATION:
diff --git a/src/map/skills/acolyte/resurrection.cpp b/src/map/skills/acolyte/resurrection.cpp
new file mode 100644
index 00000000000..94139c5d4e9
--- /dev/null
+++ b/src/map/skills/acolyte/resurrection.cpp
@@ -0,0 +1,74 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "resurrection.hpp"
+
+#include "map/battle.hpp"
+#include "map/clif.hpp"
+#include "map/map.hpp"
+#include "map/pc.hpp"
+#include "map/status.hpp"
+
+SkillResurrection::SkillResurrection() : SkillImpl(ALL_RESURRECTION) {
+}
+
+void SkillResurrection::castendDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) const {
+ status_data* tstatus = status_get_status_data(*target);
+
+ if (!battle_check_undead(tstatus->race, tstatus->def_ele))
+ return;
+ skill_attack(BF_MAGIC,src,src,target,getSkillId(),skill_lv,tick,flag);
+}
+
+void SkillResurrection::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);
+ map_session_data* dstsd = BL_CAST(BL_PC, target);
+
+ if(map_flag_gvg2(target->m) || map_getmapflag(target->m, MF_BATTLEGROUND))
+ { //No reviving in WoE grounds!
+ if( sd != nullptr ){
+ clif_skill_fail( *sd, getSkillId() );
+ }
+ return;
+ }
+ if (!status_isdead(*target))
+ return;
+
+ int32 per = 0, sper = 0;
+ if (tsc && tsc->getSCE(SC_HELLPOWER)) {
+ clif_skill_nodamage(src, *target, ALL_RESURRECTION, skill_lv);
+ return;
+ }
+
+ if (map_getmapflag(target->m, MF_PVP) && dstsd && dstsd->pvp_point < 0)
+ return;
+
+ switch(skill_lv){
+ case 1: per=10; break;
+ case 2: per=30; break;
+ case 3: per=50; break;
+ case 4: per=80; break;
+ }
+ if(dstsd && dstsd->special_state.restart_full_recover)
+ per = sper = 100;
+ if (status_revive(target, per, sper))
+ {
+ clif_skill_nodamage(src,*target,ALL_RESURRECTION,skill_lv); //Both Redemptio and Res show this skill-animation.
+ if(sd && dstsd && battle_config.resurrection_exp > 0)
+ {
+ t_exp exp = 0,jexp = 0;
+ int32 lv = dstsd->status.base_level - sd->status.base_level, jlv = dstsd->status.job_level - sd->status.job_level;
+ if(lv > 0 && pc_nextbaseexp(dstsd)) {
+ exp = (t_exp)(dstsd->status.base_exp * lv * battle_config.resurrection_exp / 1000000.);
+ if (exp < 1) exp = 1;
+ }
+ if(jlv > 0 && pc_nextjobexp(dstsd)) {
+ jexp = (t_exp)(dstsd->status.job_exp * lv * battle_config.resurrection_exp / 1000000.);
+ if (jexp < 1) jexp = 1;
+ }
+ if(exp > 0 || jexp > 0)
+ pc_gainexp (sd, target, exp, jexp, 0);
+ }
+ }
+}
diff --git a/src/map/skills/acolyte/resurrection.hpp b/src/map/skills/acolyte/resurrection.hpp
new file mode 100644
index 00000000000..a31e3056ece
--- /dev/null
+++ b/src/map/skills/acolyte/resurrection.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 SkillResurrection : public SkillImpl {
+public:
+ SkillResurrection();
+
+ void castendDamageId(block_list* src, block_list* target, uint16 skill_lv, t_tick tick, int32& flag) 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/acolyte/skill_factory_acolyte.cpp b/src/map/skills/acolyte/skill_factory_acolyte.cpp
index 5fe0dffd72b..f18a17014f8 100644
--- a/src/map/skills/acolyte/skill_factory_acolyte.cpp
+++ b/src/map/skills/acolyte/skill_factory_acolyte.cpp
@@ -86,6 +86,7 @@
#include "redemptio.cpp"
#include "renovatio.cpp"
#include "reparatio.cpp"
+#include "resurrection.cpp"
#include "rideinlightening.cpp"
#include "ruwach.cpp"
#include "sanctuary.cpp"
@@ -158,6 +159,8 @@ std::unique_ptr SkillFactoryAcolyte::create(const e_skill skill
return std::make_unique();
case AB_VITUPERATUM:
return std::make_unique();
+ case ALL_RESURRECTION:
+ return std::make_unique();
case AL_ANGELUS:
return std::make_unique();
case AL_BLESSING:
diff --git a/src/map/skills/homunculus/homunculus_moonlight.cpp b/src/map/skills/homunculus/homunculus_moonlight.cpp
new file mode 100644
index 00000000000..712c67d0e47
--- /dev/null
+++ b/src/map/skills/homunculus/homunculus_moonlight.cpp
@@ -0,0 +1,11 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "homunculus_moonlight.hpp"
+
+SkillMoonlight::SkillMoonlight() : WeaponSkillImpl(HFLI_MOON) {
+}
+
+void SkillMoonlight::calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const {
+ base_skillratio += 10 + 110 * skill_lv;
+}
diff --git a/src/map/skills/homunculus/homunculus_moonlight.hpp b/src/map/skills/homunculus/homunculus_moonlight.hpp
new file mode 100644
index 00000000000..52642bedef1
--- /dev/null
+++ b/src/map/skills/homunculus/homunculus_moonlight.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 SkillMoonlight : public WeaponSkillImpl {
+public:
+ SkillMoonlight();
+
+ void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override;
+};
diff --git a/src/map/skills/homunculus/homunculus_sbr44.cpp b/src/map/skills/homunculus/homunculus_sbr44.cpp
new file mode 100644
index 00000000000..2d1c4b40500
--- /dev/null
+++ b/src/map/skills/homunculus/homunculus_sbr44.cpp
@@ -0,0 +1,11 @@
+// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "homunculus_sbr44.hpp"
+
+SkillSBR44::SkillSBR44() : WeaponSkillImpl(HFLI_SBR44) {
+}
+
+void SkillSBR44::calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const {
+ base_skillratio += 100 * (skill_lv - 1);
+}
diff --git a/src/map/skills/homunculus/homunculus_sbr44.hpp b/src/map/skills/homunculus/homunculus_sbr44.hpp
new file mode 100644
index 00000000000..5b58ba5164c
--- /dev/null
+++ b/src/map/skills/homunculus/homunculus_sbr44.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 SkillSBR44 : public WeaponSkillImpl {
+public:
+ SkillSBR44();
+
+ void calculateSkillRatio(const Damage* wd, const block_list* src, const block_list* target, uint16 skill_lv, int32& base_skillratio, int32 mflag) const override;
+};
diff --git a/src/map/skills/homunculus/skill_factory_homunculus.cpp b/src/map/skills/homunculus/skill_factory_homunculus.cpp
index c8cfdcb89df..8916e106d2e 100644
--- a/src/map/skills/homunculus/skill_factory_homunculus.cpp
+++ b/src/map/skills/homunculus/skill_factory_homunculus.cpp
@@ -30,12 +30,14 @@
#include "homunculus_lightofregene.cpp"
#include "homunculus_magmaflow.cpp"
#include "homunculus_midnightfrenzy.cpp"
+#include "homunculus_moonlight.cpp"
#include "homunculus_needleofparalyze.cpp"
#include "homunculus_needlestinger.cpp"
#include "homunculus_overedboost.cpp"
#include "homunculus_painkiller.cpp"
#include "homunculus_poisonmist.cpp"
#include "homunculus_pyroclastic.cpp"
+#include "homunculus_sbr44.cpp"
#include "homunculus_silentbreeze.cpp"
#include "homunculus_silverveinrush.cpp"
#include "homunculus_sonicclaw.cpp"
@@ -62,9 +64,9 @@ std::unique_ptr SkillFactoryHomunculus::create(const e_skill sk
case HFLI_FLEET:
return std::make_unique(skill_id);
case HFLI_MOON:
- return std::make_unique(skill_id);
+ return std::make_unique();
case HFLI_SBR44:
- return std::make_unique(skill_id);
+ return std::make_unique();
case HFLI_SPEED:
return std::make_unique(skill_id);
case HLIF_AVOID: