From 2d94560dde6e5b8b884e220a45ed79fd13f69b68 Mon Sep 17 00:00:00 2001 From: Atemo Date: Wed, 8 Apr 2026 11:00:09 +0200 Subject: [PATCH 1/3] 6th rebalance - Biolo (#9982) Creeper, Wooden Warrior, Wooden Fairy, Hell Tree - Reduces damage taken to 1/10. --- db/re/mob_db.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/db/re/mob_db.yml b/db/re/mob_db.yml index 4ff6123d2d8..6c5944d7b36 100644 --- a/db/re/mob_db.yml +++ b/db/re/mob_db.yml @@ -109053,6 +109053,7 @@ Body: AttackMotion: 960 ClientAttackMotion: 480 DamageMotion: 576 + DamageTaken: 10 Ai: 24 - Id: 20849 AegisName: SUMMON_WOODEN_FAIRY @@ -109076,6 +109077,7 @@ Body: AttackMotion: 1152 ClientAttackMotion: 864 DamageMotion: 576 + DamageTaken: 10 Ai: 24 - Id: 20850 AegisName: SUMMON_CREEPER @@ -109099,6 +109101,7 @@ Body: AttackMotion: 840 ClientAttackMotion: 600 DamageMotion: 576 + DamageTaken: 10 Ai: 24 - Id: 20851 AegisName: SUMMON_HELLTREE @@ -109122,6 +109125,7 @@ Body: AttackMotion: 1080 ClientAttackMotion: 840 DamageMotion: 480 + DamageTaken: 10 Ai: 24 # - Id: 20856 # AegisName: MD_N_ARENA_1 From a9cc9be3ab3ee7576a6beef4c50bca6cd6a4e737 Mon Sep 17 00:00:00 2001 From: Atemo Date: Wed, 8 Apr 2026 11:06:39 +0200 Subject: [PATCH 2/3] 6th rebalance - Imperial Guard (#9981) Shield Shooting - Removes Attack Stance requirement. --- db/re/skill_db.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index d37eaed14aa..33bef910649 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -36687,8 +36687,6 @@ Body: - Level: 5 Amount: 60 State: Shield - Status: - Attack_Stance: true Status: Shield_Power - Id: 5266 Name: IG_OVERSLASH From fd3e2b6a2849c1b2c2071009b9242d4a81646898 Mon Sep 17 00:00:00 2001 From: Atemo Date: Wed, 8 Apr 2026 11:07:53 +0200 Subject: [PATCH 3/3] 6th rebalance - Shadow Cross (#9983) * Shadow Stab - Removes dagger exclusive condition. - Removes Cloaking Exceed bonus. - Changes base damage from 2750%/3250%(Cloaking Exceed) ATK per hit to 3250% ATK per hit based on level 5. * Impact Crater - Removes katar exclusive condition. - Removes spin count condition, the skill will deal damage for 5 hits regardless of spin count. - No longer apply critical damage by default, apply critical damage when equipping katar, the critical chance is half of the user's CRI. --- db/re/skill_db.yml | 8 +------- src/map/battle.cpp | 7 ++++++- src/map/skills/thief/impactcrater.cpp | 7 ------- src/map/skills/thief/impactcrater.hpp | 1 - src/map/skills/thief/shadowstab.cpp | 13 ++----------- 5 files changed, 9 insertions(+), 27 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 33bef910649..b39c56b75df 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -37616,8 +37616,6 @@ Body: Amount: 55 - Level: 5 Amount: 60 - Weapon: - Dagger: true - Id: 5292 Name: SHC_IMPACT_CRATER Description: Impact Crater @@ -37628,7 +37626,7 @@ Body: Splash: true Critical: true Hit: Multi_Hit - HitCount: 1 + HitCount: 5 Element: Weapon SplashArea: - Level: 1 @@ -37666,10 +37664,6 @@ Body: Amount: 70 - Level: 5 Amount: 78 - Weapon: - Katar: true - Status: - Rollingcutter: true Status: WeaponBlock_On - Id: 5293 Name: SHC_ENCHANTING_SHADOW diff --git a/src/map/battle.cpp b/src/map/battle.cpp index bc9f8091ac6..171b0523a9c 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -3082,8 +3082,13 @@ static bool is_attack_critical(struct Damage* wd, block_list *src, const block_l case GC_CROSSIMPACT: case SHC_SAVAGE_IMPACT: case SHC_ETERNAL_SLASH: - case SHC_IMPACT_CRATER: case SHC_CROSS_SLASH: + cri /= 2; + break; + case SHC_IMPACT_CRATER: + if (sd == nullptr || sd->weapontype1 != W_KATAR) + return false; + cri /= 2; break; case WH_GALESTORM: diff --git a/src/map/skills/thief/impactcrater.cpp b/src/map/skills/thief/impactcrater.cpp index 0504cf75c5d..420bbf7109d 100644 --- a/src/map/skills/thief/impactcrater.cpp +++ b/src/map/skills/thief/impactcrater.cpp @@ -11,13 +11,6 @@ SkillImpactCrater::SkillImpactCrater() : SkillImplRecursiveDamageSplash(SHC_IMPACT_CRATER) { } -void SkillImpactCrater::modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_lv) const { - const status_change *sc = status_get_sc(&src); - - if (sc != nullptr && sc->hasSCE(SC_ROLLINGCUTTER)) - dmg.div_ = sc->getSCE(SC_ROLLINGCUTTER)->val1; -} - void SkillImpactCrater::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const { const status_data* sstatus = status_get_status_data(*src); diff --git a/src/map/skills/thief/impactcrater.hpp b/src/map/skills/thief/impactcrater.hpp index 9cb8b18cf31..66e95006790 100644 --- a/src/map/skills/thief/impactcrater.hpp +++ b/src/map/skills/thief/impactcrater.hpp @@ -9,7 +9,6 @@ class SkillImpactCrater : public SkillImplRecursiveDamageSplash { public: SkillImpactCrater(); - void modifyDamageData(Damage& dmg, const block_list& src, const block_list& target, uint16 skill_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/shadowstab.cpp b/src/map/skills/thief/shadowstab.cpp index 4a233d4c7dd..3f5bf607572 100644 --- a/src/map/skills/thief/shadowstab.cpp +++ b/src/map/skills/thief/shadowstab.cpp @@ -14,22 +14,13 @@ SkillShadowStab::SkillShadowStab() : WeaponSkillImpl(SHC_SHADOW_STAB) { void SkillShadowStab::calculateSkillRatio(const Damage *wd, const block_list *src, const block_list *target, uint16 skill_lv, int32 &skillratio, int32 mflag) const { const status_data* sstatus = status_get_status_data(*src); - skillratio += -100 + 550 * skill_lv; - skillratio += 5 * sstatus->pow; - - if (wd->miscflag & SKILL_ALTDMG_FLAG) { - skillratio += 100 * skill_lv + 2 * sstatus->pow; - } + skillratio += -100 + 650 * skill_lv; + skillratio += 5 * sstatus->pow; // TODO : check pow ratio RE_LVL_DMOD(100); } void SkillShadowStab::castendDamageId(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32& flag) const { - status_change *sc = status_get_sc(src); - - if (sc && sc->getSCE(SC_CLOAKINGEXCEED)) - flag |= SKILL_ALTDMG_FLAG; - status_change_end(src, SC_CLOAKING); status_change_end(src, SC_CLOAKINGEXCEED);