[Milestone M3] Necromancer Curses Tree (10 Skills) #443

Closed
opened 2026-09-24 10:49:01 +00:00 by troytt · 1 comment
Owner

Milestone M3: Necromancer Curses Tree (10 Skills)

Overview

Implementation and ground truth verification for all 10 Necromancer Curse skills according to Diablo II v1.13c binary assembly (D2Game.dll, D2Common.dll) and MPQ authoritative tables (Skills.txt, SkillDesc.txt, Missiles.txt, Overlay.txt).


1. Universal Curse Rules & Priority Architecture

  1. Curse Exclusivity: Standard curses share cursetype = 1. Casting a new standard curse unconditionally overwrites and evicts any existing cursetype = 1 curse on the target.
  2. Attract Overwrite Inviolability: Attract is uniquely classified with cursetype = 2. It CANNOT be overwritten by any curse (cursetype = 1 or 2). Attempts to apply another curse yield ApplyStateResult.blockedByAttract.
  3. Boss / Champion Mental Immunity: Mental curses (Dim Vision, Terror, Confuse, Attract) CANNOT be applied to Champions, Uniques, SuperUniques, or Act Bosses (monflags & MONFLAG_BOSS). Physical/combat curses (Amplify Damage, Weaken, Iron Maiden, Life Tap, Decrepify, Lower Resist) apply universally across all monster ranks.
  4. 1/5th Resistance Penalty on Immune Targets:
    • For any resistance >= 100%, curse debuffs apply at 1/5th effectiveness (Math.trunc(penalty / 5)).
    • Amplify Damage (-100%): applies as -20% against physical immunes (breaks up to 119% res).
    • Decrepify (-50%): applies as -10% against physical immunes (breaks up to 109% res).
    • Lower Resist (-32% to -63%): applies at 1/5th (e.g. -63% becomes -12%, breaking elemental resistances up to 111%).
  5. 2:1 Isometric Radius Geometry: Curse targeting uses authentic 2:1 isometric ground space (ISO_GROUND_ASPECT_RATIO = 0.5).
  6. Visual Overlays: Every curse spawns casting missiles cursecast (148) and cursecenter (192), and binds overhead animated looping overlays (Overlays 128-137).

2. Skill Specifications (IDs 66, 71, 72, 76, 77, 81, 82, 86, 87, 91)

Skill 66: Amplify Damage (傷害加深)

  • ID: 66 | ReqLevel: 1 | Prerequisites: None | Mana Cost: 4 (Constant)
  • Functions: srvdofunc: 30, State: amplifydamage, Overhead Overlay: 128 (CurseAmplifyDamageEffect)
  • Duration: ln34 (par3=200, par4=75): slvl 1: 200 frames (8.0s) | slvl 10: 875 frames (35.0s) | slvl 20: 1625 frames (65.0s)
  • Radius: ln12 (par1=3, par2=1 sub-tiles): slvl 1: 3 sub-tiles (2.0 yds) | slvl 10: 12 sub-tiles (8.0 yds) | slvl 20: 22 sub-tiles (14.7 yds)
  • Debuff: -100% Physical Resistance (+100% damage taken). Breaks physical immunity at 1/5th (-20%).

Skill 71: Dim Vision (微暗靈視)

  • ID: 71 | ReqLevel: 6 | Prerequisites: None | Mana Cost: 9 (Constant)
  • Functions: srvdofunc: 30, State: dimvision, Overhead Overlay: 129 (CurseDimVisionEffect)
  • Duration: ln34 (par3=175, par4=50): slvl 1: 175 frames (7.0s) | slvl 10: 625 frames (25.0s) | slvl 20: 1125 frames (45.0s)
  • Radius: ln12 (par1=4, par2=1 sub-tiles): slvl 1: 4 sub-tiles (2.7 yds) | slvl 10: 13 sub-tiles (8.7 yds) | slvl 20: 23 sub-tiles (15.3 yds)
  • Debuff: Blinds normal monsters by reducing target acquisition and sight radius to 1 sub-tile. Boss/Champion immune.

Skill 72: Weaken (削弱)

  • ID: 72 | ReqLevel: 6 | Prerequisites: Amplify Damage (66) | Mana Cost: 4 (Constant)
  • Functions: srvdofunc: 30, State: weaken, Overhead Overlay: 130 (CurseWeakenEffect)
  • Duration: ln34 (par3=350, par4=60): slvl 1: 350 frames (14.0s) | slvl 10: 890 frames (35.6s) | slvl 20: 1490 frames (59.6s)
  • Radius: ln12 (par1=9, par2=1 sub-tiles): slvl 1: 9 sub-tiles (6.0 yds) | slvl 10: 18 sub-tiles (12.0 yds) | slvl 20: 28 sub-tiles (18.7 yds)
  • Debuff: Reduces target physical damage dealt by strictly 33%.

Skill 76: Iron Maiden (攻擊反噬)

  • ID: 76 | ReqLevel: 12 | Prerequisites: Amplify Damage (66) | Mana Cost: 5 (Constant)
  • Functions: srvdofunc: 30, event handler auraeventfunc: 4 on damagedinmelee, State: ironmaiden, Overlay: 131, Hit Overlay: 138
  • Duration: ln34 (par3=300, par4=60): slvl 1: 300 frames (12.0s) | slvl 10: 840 frames (33.6s) | slvl 20: 1440 frames (57.6s)
  • Radius: ln12 (par1=7, par2=0) -> FIXED at 7 sub-tiles (4.7 yards) across all levels
  • Reflection Formula: ln56 (par5=200, par6=25): slvl 1: 200% | slvl 10: 425% | slvl 20: 675% physical melee damage reflected to attacker. (Ranged attacks/spells bypass).

Skill 77: Terror (恐懼)

  • ID: 77 | ReqLevel: 12 | Prerequisites: Weaken (72) | Mana Cost: 7 (Constant)
  • Functions: srvdofunc: 30, State: terror, Overhead Overlay: 132 (CurseTerrorEffect)
  • Duration: ln34 (par3=200, par4=25): slvl 1: 200 frames (8.0s) | slvl 10: 425 frames (17.0s) | slvl 20: 675 frames (27.0s)
  • Radius: ln12 (par1=4, par2=0) -> FIXED at 4 sub-tiles (2.7 yards) across all levels
  • Debuff: Forces affected normal monsters to flee from caster at elevated walk/run speed. Boss/Champion immune.

Skill 81: Confuse (迷亂)

  • ID: 81 | ReqLevel: 18 | Prerequisites: Dim Vision (71) | Mana Cost: 13 (Constant)
  • Functions: srvdofunc: 61 (SKILLS_SrvDo061_Confuse), State: confuse, Overhead Overlay: 135
  • Duration: ln34 (par3=250, par4=50): slvl 1: 250 frames (10.0s) | slvl 10: 700 frames (28.0s) | slvl 20: 1200 frames (48.0s)
  • Radius: ln12 (par1=6, par2=1 sub-tiles): slvl 1: 6 sub-tiles (4.0 yds) | slvl 10: 15 sub-tiles (10.0 yds) | slvl 20: 25 sub-tiles (16.7 yds)
  • Debuff: Forces affected monsters to attack the nearest unit regardless of faction. Boss/Champion immune.

Skill 82: Life Tap (偷取生命)

  • ID: 82 | ReqLevel: 18 | Prerequisites: Iron Maiden (76) | Mana Cost: 9 (Constant)
  • Functions: srvdofunc: 30, event handler auraeventfunc: 5, State: lifetap, Overhead Overlay: 134
  • Duration: ln34 (par3=400, par4=60): slvl 1: 400 frames (16.0s) | slvl 10: 940 frames (37.6s) | slvl 20: 1540 frames (61.6s)
  • Radius: ln12 (par1=4, par2=1 sub-tiles): slvl 1: 4 sub-tiles (2.7 yds) | slvl 10: 13 sub-tiles (8.7 yds) | slvl 20: 23 sub-tiles (15.3 yds)
  • Debuff: Attackers dealing physical damage to cursed unit heal for 50% (Math.trunc(remPhys256 / 2)) of damage dealt. Unaffected by difficulty drain penalties or skeleton/undead drain immunities.

Skill 86: Attract (吸引)

  • ID: 86 | ReqLevel: 24 | Prerequisites: Confuse (81) | Mana Cost: 17 (Constant)
  • Functions: srvstfunc: 18, srvdofunc: 59, State: attract, Overhead Overlay: 133
  • Duration: ln34 (par3=300, par4=90): slvl 1: 300 frames (12.0s) | slvl 10: 1110 frames (44.4s) | slvl 20: 2010 frames (80.4s)
  • Radius: ln12 (par1=9, par2=0) -> FIXED at 9 sub-tiles (6.0 yards) across all levels
  • Mechanics: Targets cursed unit as the primary target for all other monsters in radius. Possesses cursetype = 2 (cannot be overwritten by any curse). Boss/Champion immune.

Skill 87: Decrepify (衰老)

  • ID: 87 | ReqLevel: 24 | Prerequisites: Terror (77) | Mana Cost: 11 (Constant)
  • Functions: srvdofunc: 30, State: decrepify, Overhead Overlay: 136
  • Duration: ln34 (par3=100, par4=15): slvl 1: 100 frames (4.0s) | slvl 10: 235 frames (9.4s) | slvl 20: 385 frames (15.4s)
  • Radius: ln12 (par1=6, par2=0) -> FIXED at 6 sub-tiles (4.0 yards) across all levels
  • Triple Debuff:
    1. -50% Physical Resistance (breaks physical immunity at 1/5th = -10%).
    2. -50% Physical Damage dealt.
    3. -50% Target Velocity (affects both walk/run movement and attack frame rate). Stacks multiplicatively with chill slows down to 10% speed engine floor.

Skill 91: Lower Resist (降低抵抗)

  • ID: 91 | ReqLevel: 30 | Prerequisites: Life Tap (82), Decrepify (87) | Mana Cost: 22 (Constant)
  • Functions: srvdofunc: 30, State: lowerresist, Overhead Overlay: 137
  • Duration: ln34 (par3=500, par4=50): slvl 1: 500 frames (20.0s) | slvl 10: 950 frames (38.0s) | slvl 20: 1450 frames (58.0s)
  • Radius: ln12 (par1=7, par2=1 sub-tiles): slvl 1: 7 sub-tiles (4.7 yds) | slvl 10: 16 sub-tiles (10.7 yds) | slvl 20: 26 sub-tiles (17.3 yds)
  • Resistance Reduction: dm56 (par5=30, par6=70, diminishing returns formula floor((110*lvl*40)/(100*(lvl+6))) + 30):
    • slvl 1: -32% | slvl 10: -55% | slvl 20: -63% to Fire, Cold, Lightning, and Poison resistances.
    • Immune targets (Res >= 100%): debuff operates at 1/5th effectiveness (e.g. -63% becomes -12%). Does NOT lower Physical or Magic resistances.
## Milestone M3: Necromancer Curses Tree (10 Skills) ### Overview Implementation and ground truth verification for all 10 Necromancer Curse skills according to Diablo II v1.13c binary assembly (`D2Game.dll`, `D2Common.dll`) and MPQ authoritative tables (`Skills.txt`, `SkillDesc.txt`, `Missiles.txt`, `Overlay.txt`). --- ### 1. Universal Curse Rules & Priority Architecture 1. **Curse Exclusivity**: Standard curses share `cursetype = 1`. Casting a new standard curse unconditionally overwrites and evicts any existing `cursetype = 1` curse on the target. 2. **Attract Overwrite Inviolability**: Attract is uniquely classified with `cursetype = 2`. It CANNOT be overwritten by any curse (`cursetype = 1` or `2`). Attempts to apply another curse yield `ApplyStateResult.blockedByAttract`. 3. **Boss / Champion Mental Immunity**: Mental curses (Dim Vision, Terror, Confuse, Attract) CANNOT be applied to Champions, Uniques, SuperUniques, or Act Bosses (`monflags & MONFLAG_BOSS`). Physical/combat curses (Amplify Damage, Weaken, Iron Maiden, Life Tap, Decrepify, Lower Resist) apply universally across all monster ranks. 4. **1/5th Resistance Penalty on Immune Targets**: - For any resistance >= 100%, curse debuffs apply at 1/5th effectiveness (`Math.trunc(penalty / 5)`). - Amplify Damage (-100%): applies as -20% against physical immunes (breaks up to 119% res). - Decrepify (-50%): applies as -10% against physical immunes (breaks up to 109% res). - Lower Resist (-32% to -63%): applies at 1/5th (e.g. -63% becomes -12%, breaking elemental resistances up to 111%). 5. **2:1 Isometric Radius Geometry**: Curse targeting uses authentic 2:1 isometric ground space (`ISO_GROUND_ASPECT_RATIO = 0.5`). 6. **Visual Overlays**: Every curse spawns casting missiles `cursecast` (148) and `cursecenter` (192), and binds overhead animated looping overlays (Overlays 128-137). --- ### 2. Skill Specifications (IDs 66, 71, 72, 76, 77, 81, 82, 86, 87, 91) #### Skill 66: Amplify Damage (傷害加深) - **ID**: 66 | **ReqLevel**: 1 | **Prerequisites**: None | **Mana Cost**: 4 (Constant) - **Functions**: `srvdofunc: 30`, State: `amplifydamage`, Overhead Overlay: 128 (`CurseAmplifyDamageEffect`) - **Duration**: `ln34` (par3=200, par4=75): slvl 1: 200 frames (8.0s) | slvl 10: 875 frames (35.0s) | slvl 20: 1625 frames (65.0s) - **Radius**: `ln12` (par1=3, par2=1 sub-tiles): slvl 1: 3 sub-tiles (2.0 yds) | slvl 10: 12 sub-tiles (8.0 yds) | slvl 20: 22 sub-tiles (14.7 yds) - **Debuff**: -100% Physical Resistance (+100% damage taken). Breaks physical immunity at 1/5th (-20%). #### Skill 71: Dim Vision (微暗靈視) - **ID**: 71 | **ReqLevel**: 6 | **Prerequisites**: None | **Mana Cost**: 9 (Constant) - **Functions**: `srvdofunc: 30`, State: `dimvision`, Overhead Overlay: 129 (`CurseDimVisionEffect`) - **Duration**: `ln34` (par3=175, par4=50): slvl 1: 175 frames (7.0s) | slvl 10: 625 frames (25.0s) | slvl 20: 1125 frames (45.0s) - **Radius**: `ln12` (par1=4, par2=1 sub-tiles): slvl 1: 4 sub-tiles (2.7 yds) | slvl 10: 13 sub-tiles (8.7 yds) | slvl 20: 23 sub-tiles (15.3 yds) - **Debuff**: Blinds normal monsters by reducing target acquisition and sight radius to 1 sub-tile. Boss/Champion immune. #### Skill 72: Weaken (削弱) - **ID**: 72 | **ReqLevel**: 6 | **Prerequisites**: Amplify Damage (66) | **Mana Cost**: 4 (Constant) - **Functions**: `srvdofunc: 30`, State: `weaken`, Overhead Overlay: 130 (`CurseWeakenEffect`) - **Duration**: `ln34` (par3=350, par4=60): slvl 1: 350 frames (14.0s) | slvl 10: 890 frames (35.6s) | slvl 20: 1490 frames (59.6s) - **Radius**: `ln12` (par1=9, par2=1 sub-tiles): slvl 1: 9 sub-tiles (6.0 yds) | slvl 10: 18 sub-tiles (12.0 yds) | slvl 20: 28 sub-tiles (18.7 yds) - **Debuff**: Reduces target physical damage dealt by strictly 33%. #### Skill 76: Iron Maiden (攻擊反噬) - **ID**: 76 | **ReqLevel**: 12 | **Prerequisites**: Amplify Damage (66) | **Mana Cost**: 5 (Constant) - **Functions**: `srvdofunc: 30`, event handler `auraeventfunc: 4` on `damagedinmelee`, State: `ironmaiden`, Overlay: 131, Hit Overlay: 138 - **Duration**: `ln34` (par3=300, par4=60): slvl 1: 300 frames (12.0s) | slvl 10: 840 frames (33.6s) | slvl 20: 1440 frames (57.6s) - **Radius**: `ln12` (par1=7, par2=0) -> FIXED at 7 sub-tiles (4.7 yards) across all levels - **Reflection Formula**: `ln56` (par5=200, par6=25): slvl 1: 200% | slvl 10: 425% | slvl 20: 675% physical melee damage reflected to attacker. (Ranged attacks/spells bypass). #### Skill 77: Terror (恐懼) - **ID**: 77 | **ReqLevel**: 12 | **Prerequisites**: Weaken (72) | **Mana Cost**: 7 (Constant) - **Functions**: `srvdofunc: 30`, State: `terror`, Overhead Overlay: 132 (`CurseTerrorEffect`) - **Duration**: `ln34` (par3=200, par4=25): slvl 1: 200 frames (8.0s) | slvl 10: 425 frames (17.0s) | slvl 20: 675 frames (27.0s) - **Radius**: `ln12` (par1=4, par2=0) -> FIXED at 4 sub-tiles (2.7 yards) across all levels - **Debuff**: Forces affected normal monsters to flee from caster at elevated walk/run speed. Boss/Champion immune. #### Skill 81: Confuse (迷亂) - **ID**: 81 | **ReqLevel**: 18 | **Prerequisites**: Dim Vision (71) | **Mana Cost**: 13 (Constant) - **Functions**: `srvdofunc: 61` (`SKILLS_SrvDo061_Confuse`), State: `confuse`, Overhead Overlay: 135 - **Duration**: `ln34` (par3=250, par4=50): slvl 1: 250 frames (10.0s) | slvl 10: 700 frames (28.0s) | slvl 20: 1200 frames (48.0s) - **Radius**: `ln12` (par1=6, par2=1 sub-tiles): slvl 1: 6 sub-tiles (4.0 yds) | slvl 10: 15 sub-tiles (10.0 yds) | slvl 20: 25 sub-tiles (16.7 yds) - **Debuff**: Forces affected monsters to attack the nearest unit regardless of faction. Boss/Champion immune. #### Skill 82: Life Tap (偷取生命) - **ID**: 82 | **ReqLevel**: 18 | **Prerequisites**: Iron Maiden (76) | **Mana Cost**: 9 (Constant) - **Functions**: `srvdofunc: 30`, event handler `auraeventfunc: 5`, State: `lifetap`, Overhead Overlay: 134 - **Duration**: `ln34` (par3=400, par4=60): slvl 1: 400 frames (16.0s) | slvl 10: 940 frames (37.6s) | slvl 20: 1540 frames (61.6s) - **Radius**: `ln12` (par1=4, par2=1 sub-tiles): slvl 1: 4 sub-tiles (2.7 yds) | slvl 10: 13 sub-tiles (8.7 yds) | slvl 20: 23 sub-tiles (15.3 yds) - **Debuff**: Attackers dealing physical damage to cursed unit heal for 50% (`Math.trunc(remPhys256 / 2)`) of damage dealt. Unaffected by difficulty drain penalties or skeleton/undead drain immunities. #### Skill 86: Attract (吸引) - **ID**: 86 | **ReqLevel**: 24 | **Prerequisites**: Confuse (81) | **Mana Cost**: 17 (Constant) - **Functions**: `srvstfunc: 18`, `srvdofunc: 59`, State: `attract`, Overhead Overlay: 133 - **Duration**: `ln34` (par3=300, par4=90): slvl 1: 300 frames (12.0s) | slvl 10: 1110 frames (44.4s) | slvl 20: 2010 frames (80.4s) - **Radius**: `ln12` (par1=9, par2=0) -> FIXED at 9 sub-tiles (6.0 yards) across all levels - **Mechanics**: Targets cursed unit as the primary target for all other monsters in radius. Possesses `cursetype = 2` (cannot be overwritten by any curse). Boss/Champion immune. #### Skill 87: Decrepify (衰老) - **ID**: 87 | **ReqLevel**: 24 | **Prerequisites**: Terror (77) | **Mana Cost**: 11 (Constant) - **Functions**: `srvdofunc: 30`, State: `decrepify`, Overhead Overlay: 136 - **Duration**: `ln34` (par3=100, par4=15): slvl 1: 100 frames (4.0s) | slvl 10: 235 frames (9.4s) | slvl 20: 385 frames (15.4s) - **Radius**: `ln12` (par1=6, par2=0) -> FIXED at 6 sub-tiles (4.0 yards) across all levels - **Triple Debuff**: 1. -50% Physical Resistance (breaks physical immunity at 1/5th = -10%). 2. -50% Physical Damage dealt. 3. -50% Target Velocity (affects both walk/run movement and attack frame rate). Stacks multiplicatively with chill slows down to 10% speed engine floor. #### Skill 91: Lower Resist (降低抵抗) - **ID**: 91 | **ReqLevel**: 30 | **Prerequisites**: Life Tap (82), Decrepify (87) | **Mana Cost**: 22 (Constant) - **Functions**: `srvdofunc: 30`, State: `lowerresist`, Overhead Overlay: 137 - **Duration**: `ln34` (par3=500, par4=50): slvl 1: 500 frames (20.0s) | slvl 10: 950 frames (38.0s) | slvl 20: 1450 frames (58.0s) - **Radius**: `ln12` (par1=7, par2=1 sub-tiles): slvl 1: 7 sub-tiles (4.7 yds) | slvl 10: 16 sub-tiles (10.7 yds) | slvl 20: 26 sub-tiles (17.3 yds) - **Resistance Reduction**: `dm56` (par5=30, par6=70, diminishing returns formula `floor((110*lvl*40)/(100*(lvl+6))) + 30`): - slvl 1: -32% | slvl 10: -55% | slvl 20: -63% to Fire, Cold, Lightning, and Poison resistances. - Immune targets (Res >= 100%): debuff operates at 1/5th effectiveness (e.g. -63% becomes -12%). Does NOT lower Physical or Magic resistances.
Author
Owner

Verification Report: Milestone M3 (Curses Tree)

  • Verification Commit: bfc1164 (feat(necro): implement Milestone M3 Necromancer Curses Tree (10 skills))
  • Test Suite Results:
    • Total Test Files Passed: 38/38
    • Total Tests Passed: 233/233
    • Key Test Suites:
      • tests/skills/nec/curses.test.ts
      • tests/skills/nec/adv-curses-stress.test.ts
      • tests/skills/nec/skill-066-amplify-damage.test.ts through skill-091-lower-resist.test.ts
  • Invariants Verified:
    • 1/5th immunity breaking rules across physical and elemental curses.
    • Attract cursetype = 2 inviolability to overwrite.
    • Standard curse exclusivity (cursetype = 1 replacement).
    • 2:1 isometric radius targeting.
    • Mental curse immunity on Bosses and Champions.

Milestone M3 is verified complete and closed.

### Verification Report: Milestone M3 (Curses Tree) - **Verification Commit**: `bfc1164` (`feat(necro): implement Milestone M3 Necromancer Curses Tree (10 skills)`) - **Test Suite Results**: - Total Test Files Passed: 38/38 - Total Tests Passed: 233/233 - Key Test Suites: * `tests/skills/nec/curses.test.ts` * `tests/skills/nec/adv-curses-stress.test.ts` * `tests/skills/nec/skill-066-amplify-damage.test.ts` through `skill-091-lower-resist.test.ts` - **Invariants Verified**: * 1/5th immunity breaking rules across physical and elemental curses. * Attract `cursetype = 2` inviolability to overwrite. * Standard curse exclusivity (`cursetype = 1` replacement). * 2:1 isometric radius targeting. * Mental curse immunity on Bosses and Champions. Milestone M3 is verified complete and closed.
Sign in to join this conversation.
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: troytt/diablo2-web#443
No description provided.