From ac2a6ecab880914ae40f63d8428aac8bba66046e Mon Sep 17 00:00:00 2001 From: idk-whoami <60462533+idk-whoami@users.noreply.github.com> Date: Fri, 6 Mar 2026 16:25:55 +0700 Subject: [PATCH 1/2] Added new costume items (#9898) --- db/re/item_db_equip.yml | 71 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) 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 From 2aaff2511703abf15b552b0e311babb7780de36b Mon Sep 17 00:00:00 2001 From: Atemo Date: Fri, 6 Mar 2026 10:28:51 +0100 Subject: [PATCH 2/2] Split up leftover skills 2 (#9883) Co-authored-by: Lemongrass3110 --- src/map/battle.cpp | 12 --- src/map/map-server.vcxproj | 12 +++ src/map/map-server.vcxproj.filters | 18 +++++ src/map/skill.cpp | 52 ------------- src/map/skills/acolyte/resurrection.cpp | 74 +++++++++++++++++++ src/map/skills/acolyte/resurrection.hpp | 14 ++++ .../skills/acolyte/skill_factory_acolyte.cpp | 3 + .../homunculus/homunculus_moonlight.cpp | 11 +++ .../homunculus/homunculus_moonlight.hpp | 13 ++++ .../skills/homunculus/homunculus_sbr44.cpp | 11 +++ .../skills/homunculus/homunculus_sbr44.hpp | 13 ++++ .../homunculus/skill_factory_homunculus.cpp | 6 +- 12 files changed, 173 insertions(+), 66 deletions(-) create mode 100644 src/map/skills/acolyte/resurrection.cpp create mode 100644 src/map/skills/acolyte/resurrection.hpp create mode 100644 src/map/skills/homunculus/homunculus_moonlight.cpp create mode 100644 src/map/skills/homunculus/homunculus_moonlight.hpp create mode 100644 src/map/skills/homunculus/homunculus_sbr44.cpp create mode 100644 src/map/skills/homunculus/homunculus_sbr44.hpp 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: