From 921509099835f034e0efcb87a7049ebec98d5425 Mon Sep 17 00:00:00 2001 From: Playtester <3785983+Playtester@users.noreply.github.com> Date: Fri, 13 Mar 2026 23:07:17 +0100 Subject: [PATCH] NPC_MENTALBREAKER SP Drain, Element and Hitrate (#9919) - NPC_MENTALBREAKER will now drain 12%/16%/25%/50%/100% of MaxSP based on level - NPC_MENTALBREAKER now deals ghost element HP damage - NPC_MENTALBREAKER can now miss, but has a 20% hit rate bonus - Fixes #9916 --- db/pre-re/skill_db.yml | 4 +-- db/re/skill_db.yml | 4 +-- src/map/skills/npc/spiritdestruction.cpp | 35 ++++++++++++++++++------ src/map/skills/npc/spiritdestruction.hpp | 1 + 4 files changed, 30 insertions(+), 14 deletions(-) diff --git a/db/pre-re/skill_db.yml b/db/pre-re/skill_db.yml index c922361101a..51956282aa8 100644 --- a/db/pre-re/skill_db.yml +++ b/db/pre-re/skill_db.yml @@ -5343,14 +5343,12 @@ Body: MaxLevel: 5 Type: Weapon TargetType: Attack - DamageFlags: - IgnoreFlee: true Flags: IsNpc: true Range: -7 Hit: Single HitCount: 1 - Element: Weapon + Element: Ghost - Id: 160 Name: NPC_RANGEATTACK Description: Stand off attack diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 232aa1a2f4e..d37eaed14aa 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -5431,14 +5431,12 @@ Body: MaxLevel: 5 Type: Weapon TargetType: Attack - DamageFlags: - IgnoreFlee: true Flags: IsNpc: true Range: -7 Hit: Single HitCount: 1 - Element: Weapon + Element: Ghost - Id: 160 Name: NPC_RANGEATTACK Description: Stand off attack diff --git a/src/map/skills/npc/spiritdestruction.cpp b/src/map/skills/npc/spiritdestruction.cpp index 354ddfaff6a..a5e8e62c05a 100644 --- a/src/map/skills/npc/spiritdestruction.cpp +++ b/src/map/skills/npc/spiritdestruction.cpp @@ -11,13 +11,32 @@ SkillSpiritDestruction::SkillSpiritDestruction() : WeaponSkillImpl(NPC_MENTALBRE } void SkillSpiritDestruction::applyAdditionalEffects(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int32 attack_type, enum damage_lv dmg_lv) const { - status_data* sstatus = status_get_status_data(*src); + //SP Damage 12%/16%/25%/50%/100% of MaxSP + int32 rate; + switch (skill_lv) { + case 1: + rate = 12; + break; + case 2: + rate = 16; + break; + case 3: + rate = 25; + break; + case 4: + rate = 50; + break; + case 5: + rate = 100; + break; + default: + // For easy customization + rate = skill_lv; + break; + } + status_percent_damage(src, target, 0, -rate, false); +} - //Based on observations by Tharis, Mental Breaker should do SP damage - //equal to Matk*skLevel. - int32 rate = sstatus->matk_min; - if (rate < sstatus->matk_max) - rate += rnd()%(sstatus->matk_max - sstatus->matk_min); - rate*=skill_lv; - status_zap(target, 0, rate); +void SkillSpiritDestruction::modifyHitRate(int16& hit_rate, const block_list* src, const block_list* target, uint16 skill_lv) const { + hit_rate += hit_rate * 20 / 100; } diff --git a/src/map/skills/npc/spiritdestruction.hpp b/src/map/skills/npc/spiritdestruction.hpp index 6c74de9ef94..70c26d1f12f 100644 --- a/src/map/skills/npc/spiritdestruction.hpp +++ b/src/map/skills/npc/spiritdestruction.hpp @@ -10,4 +10,5 @@ class SkillSpiritDestruction : public WeaponSkillImpl { SkillSpiritDestruction(); 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 modifyHitRate(int16& hit_rate, const block_list* src, const block_list* target, uint16 skill_lv) const override; };