Endgame Difficulty — Tactical, Not Spongy
Top-end players have out-scaled the existing bosses and are asking for a real challenge. This page is the working design brief for the next difficulty pass. It documents why maxed characters trivialise the current fights, a concrete per-boss recipe to make them threatening again, a set of module-wide levers and gimmick fights, and a new high-level tier opened by an already-existing key.
North star — tactical difficulty, not HP sponges. Every proposal on this page has to earn its place by making a fight demand the right tactics, gear, or build — resisting crowd control, forcing misses, punishing sloppy play — not by simply adding hit points so the same rotation takes longer. When a change would only lengthen a fight, it is not done: it is paired with something that changes how the fight is played.
The one test — is it a gate or a tax? The honest way to tell a tactical mechanic from a sponge: a gate scales its difficulty against a player choice — build, gear, buff, tactic, positioning — so a prepared player passes and an unprepared one doesn't; a tax scales against nothing, hitting everyone equally, which is mathematically identical to just adding hit points. Gates create decisions; taxes only add minutes.
The honesty checklist (hold every idea below against it):
- Tactical demand? Does it reward a specific counter, build, or positioning — or is it just bigger numbers?
- Sponginess risk? If the only felt effect is "the fight is longer", it fails.
- Exploit surface? Can it be cheesed (kiting, potion-spam, leash abuse, teamwork loopholes)?
- Build effort vs. payoff? Is the implementation cost worth the tactical change it buys?
These levers compose — they are not independent knobs. Soul-fatigue on Heal is the hub: it turns healing into a finite resource, so everything that raises incoming damage — doubled spawns, elemental swarms, the opt-in curse's +damage — feeds it, forcing more heals and stacking fatigue faster. Read the whole page as one healing-economy layer, not a pile of separate difficulty sliders.
Status: design / proposal — not yet applied in-game. Nothing here is live. Numbers, placements, and hook points are recommendations for review, verified against the current source. When approved, apply per the implementation checklist.
Sources. Effective boss stats (AC/saves/SR/DR/immunities including gear)
are in module-index/counter_gear.md; the boss list is module-index/bosses.json;
unused creatures are module-index/unspawned_creatures.json; creature/encounter
cross-refs are module-index/creature_index.json. Raw blueprints are
unpacked/<resref>.utc.json.
Why the top end is too easy
The big CR numbers are cosmetic; two systemic holes let maxed players trivialise the fights.
Nearly every boss forces CRAdjust = 125 (the engine maximum), so the huge displayed
Challenge Ratings (Theoden's Chosen 9540, Summanus 2938, …) are manual labels, not threat.
Underneath, difficulty comes down to a hand-typed HP pool (5,000–13,000) plus inflated ability scores.
counter_gear.md confirms zero current bosses are unbeatable with obtainable gear.
Two weaknesses recur across the roster:
- Lopsided saves. The base save fields (
fortbonus/refbonus/willbonus) are almost always0; the big save numbers come purely from one inflated ability. Every boss therefore has a dumped stat that opens a save category wide to save-or-die / crowd control (Witch King Con 13 → Fort +3; Smaug Dex 10 → Ref +0; Gwathdor Wis 20 → Will +5; Summanus Wis 10 → Will +0). - Flat "Soak" damage reduction is worthless. Players reach weapon enhancement +15 to +18,
which bypasses all flat DR. Real defense on the good bosses comes from percentage damage-type
immunity (the shared
bossring= ~50% physical + magical). Effective AC matters too — but as a build gate, not a wall (see the AC callout in the recipe).
Player-power ceiling (what a boss must beat). Forgeable gear is capped at 6 properties /
~750k gp value (forge_inc.nss). A maxed melee's total attack bonus lands in the
+80s–90s range (BAB 20 + legendary-Str + weapon enhancement/AB + Weapon-Focus feats +
buffs), matching the module's own top creatures (Summanus attacks +90, Witch King +83, High Wizard +78).
An under-invested build sits near +70. So the two decisive, cheese-removing knobs are
every save ≥ ~+25 and % immunity (beats flat DR); AC is
a secondary build gate that only bites the under-built (below).
The per-boss tuning recipe
Per-boss, by hand — no shared script. Three levers, applied only where a boss has the hole.
The three levers do three different tactical jobs, and they are applied in priority order — the first two are the decisive anti-cheese fixes; AC is a lighter, selective touch on top.
- Close the dumped save — the CC gate (do this first). Raise the relevant
fortbonus/refbonus/willbonusso no save sits below ~+25. This is the single biggest anti-cheese fix: it gates save-or-die and crowd control on whether the player brought the save-DC-beating build. Binary and decisive — it does not lengthen the fight, it changes whether the cheese works. - Ensure % immunity, not flat DR — the damage-type gate. If a boss lacks the shared
invisible buff items, equip
bossring(prop 20, ~50% physical + magical) and/ornpcbuffgear(stacked resist + immunities) in its blueprintEquip_ItemList. Drop reliance on prop-23 "Soak" DR. This rewards damage-type diversity and punishes one-note builds. - Raise effective AC — the to-hit/build gate (light touch, selective). Raise
NaturalAC(cleanest, no gear conflicts) only where a boss is in auto-hit territory (AC in the 50s–60s), and only up to roughly the player AB ceiling (~85). Do not blanket-floor every boss to 85, and never push toward an unhittable wall — see the callout below for why AC is a gate and where it turns back into a sponge.
Leave HP and the CR label alone — the goal is tactical difficulty (fights that resist CC and force misses), not longer sponges.
Why AC is a build gate, not a sponge — and why it's only a light touch. AC differs from HP in one way that matters: it scales against the player's attack bonus, a thing players control. NWN is ±5% to hit per AB point, so against AC 85 the outcome swings hard on build:
| Total attack bonus | Primary-attack hit rate vs AC 85 | Read |
|---|---|---|
| +70 (under-invested) | ~30% | whiffs most swings; iteratives don't connect |
| +76 | ~60% | the crossover |
| +80–90 (maxed / buffed) | 80–95% | lands most swings |
So AC 85 differentiates builds rather than throttling everyone equally, and the gate is cheap to clear: Bard Song +6, True Strike +20, Curse Song −15 to the boss's AC, or Knockdown (works on Witch King, Sauron, Angmar, even Summanus — only Huge+ creatures are immune) each shove a marginal build well past the line. That's the point: invest in / buff to-hit and you connect; ignore it and you flounder.
The guardrail (why light touch): the gate is steep — an unbuffed, un-invested character genuinely whiffs — so AC is powerful but easy to over-apply. Keep it in the window (break auto-hit, sit near ~85, never a wall). Pushed to unhittable AC, nobody connects regardless of build and it collapses back into a pure sponge. Hence: fix saves and immunity everywhere they're holed; add AC only where a boss is trivially auto-hit.
witchking)
Already carries bossring + npcbuffgear (immunity backbone present), so only the
save/AC holes needed fixing:
| Field | Before | After | Effect |
|---|---|---|---|
NaturalAC | 0 | 30 | effective AC ~56 → ~86 |
fortbonus | 0 | 27 | Fort ~+3 → ~+30 (closes the dumped Con save) |
refbonus | 3 | 15 | Ref ~+13 → ~+25 |
willbonus | 13 | 22 | Will ~+13 → ~+31 |
Per-boss tuning suggestions
Not everything needs a boost — target the bosses with a glaring hole. Priority tiers below.
nAC = NaturalAC, fB/rB/wB = Fort/Ref/Will save-bonus fields, R/B = already
carries bossring/npcbuffgear. "Effective" saves/AC include gear (from counter_gear.md).
Priority A — glaring single hole (highest value, low effort)
| Boss | resref | The hole | Suggested change |
|---|---|---|---|
| Witch King | witchking | AC 56, Fort +3 | DONE (example): nAC→30, fB→27, rB→15, wB→22 |
| Smaug | themightysmag002 | Ref +0 (Dex 10) — free save-or-die; Will +5 | rB 0→25, wB 0→22; keep AC 78 |
| Summanus | summanus | Will +0 (Wis 10) | wB 0→30; Fort +7 low → fB 0→20 |
| Gwathdor Lord | gwathdorlord001 | Will +5 (Wis 20) | wB 0→27 |
| Sauron the Abhorred | creature019 | AC 65, Fort +4 (Con 20) | fB 0→28 (the real fix); nAC 25→45 (AC→~85, into the gate window); marquee gimmick candidate |
| Gandalf the Gray | gandalf001 | AC 63, Will +10 | wB 0→18 (the real fix); nAC 0→22 (AC→~85) |
Priority B — auto-hit AC (raise into the gate window)
These bosses sit in auto-hit territory (AC in the 60s–70s), where attack-bonus investment is wasted. Raise AC toward ~85 — into the window, not past it — so to-hit builds/buffs start to matter; pair with the real save/immunity fix.
| Boss | resref | The hole | Suggested change |
|---|---|---|---|
| Boromir, Steward | creature009 | AC 66 (saves fine ~+24/+29) | nAC 2→22 (AC→~86) |
| Denethor, Steward | creature003 | AC 72, Ref +7 | rB 0→18 (the real fix); nAC 20→33 (AC→~85) |
| Temple Mistress | templemistress_2 | AC 67, no immunity gear | equip bossring+npcbuffgear (the real fix); nAC 0→18 (AC→~85) |
| Legolas | legolasgreenl001 | Fort +14; has ring, no npcbuffgear | fB 0→12, equip npcbuffgear |
| Theoden's Chosen | creature016 | AB only +49 & no immunity gear — doesn't threaten offensively | equip bossring+npcbuffgear; consider a damage rider / on-hit effect |
Priority C — already strong (leave or light touch)
High Wizard of Gondor (highwizardofgo_2, AC 106) and Heir of Haldor
(thecursedone002, already has the narsil-only damage-immunity gimmick) are close to
where we want the ceiling — at most nudge their lowest save (High Wizard Fort +10 → fB 0→15).
On the High Wizard's AC 106: that's above the ~85 gate window and edges into wall territory for pure melee (a +90 build needs 16+ → ~25%). It's defensible because he's a caster you'd typically burst or debuff — Curse Song −15 drops him to an effective 91, and Knockdown strips his Dex-AC — so the to-hit toolkit becomes mandatory rather than optional. Leave it, but treat it as the top of the scale, not a target to copy: don't push new bosses to 106.
Module-wide difficulty levers new
Two systemic mechanics that raise the skill floor for every hard fight — and close the biggest cheese.
Per-boss tuning fixes the stat holes, but two behaviours let a maxed player ignore tactics entirely: walking around with hundreds of Heal potions, and the tank-and-retreat duo (one player holds aggro while another runs off to rest to full). These two levers target exactly those, and they are designed to reinforce each other.
1. Soul-fatigue on Heal
A stacking penalty that makes reflexive full-heals dangerous, so healing becomes a timed resource rather than a spam button. The order of operations matters — the heal must land first, then the fatigue bites, then the stack grows:
- Each stack lasts 3 minutes on its own independent timer, then falls off.
- When you are healed by the Heal spell (and by extension Heal potions), three
things happen in strict order:
- The heal fully resolves — you go to 100% HP as normal.
- You then take 10% of your max HP as damage per already-active stack — applied after the top-off, so it isn't erased by the heal. This can kill you.
- A new stack is added.
- Because the damage keys off the stacks active before this heal, a heal from zero stacks gives its full benefit and simply leaves you at 100% with 1 stack. Chain-healing is what turns lethal: heal at 1 stack ends you at ~90% (2 stacks), at 2 stacks ~80% (3 stacks), … and at 10 stacks the post-heal hit is 100% of max — a full heal that immediately kills you.
Where it hooks in (verified). The module already installs a module override
spellscript (on_module_load.nss → SetModuleOverrideSpellscript("stop_spellcheat")),
which runs on every cast — including item/potion activations via GetSpellCastItem().
Branch on GetSpellId() == SPELL_HEAL (and the mass-heal variants). Track stacks per PC with a
local int + one DelayCommand(180.0, …) per stack to decrement (precedent:
_build_dont_cast.nss); persist across relog only if wanted (bestiary/merit SQLite pattern).
There is no Mod_OnSpellCast/OnPlayerHeal event — the override spellscript is the hook.
Honesty check: on its own this mostly just makes fights longer (retreat, wait out the stacks, return). It only becomes tactical when paired with enrage-on-retreat below — which removes the "wait it out" option — so the two ship together.
2. Enrage-on-retreat
The direct counter to soul-fatigue's escape hatch and to the tank-and-retreat duo. Applies to qualified bosses only — the CR>60 single-instance set on the Roll of the Fallen registry, not to ordinary creatures players walk away from.
- When a player disengages / leaves combat with the boss — regardless of whether they stay in the area, and regardless of whether other players are still fighting it — the boss:
- Shouts a taunt over the shout channel, naming the fleeing player, e.g. "Fool, <FirstName>, my power only grows as you retreat."
- Gains +2 to all ability scores for the remainder of that life — a permanent, stacking enrage that is never carried to a future respawn.
- Instantly heals 25% of its missing HP.
Every retreat makes the boss stronger and undoes a quarter of the progress made, so the winning line is a single sustained engagement with the throughput and mitigation to see it through — which is exactly the "come properly geared and built" intent.
Open design detail — how "left combat" is detected. This needs a concrete trigger.
Candidates: a boss heartbeat that inspects its recent-attacker / aggro list and flags any PC who was
engaged and is now out of melee/attack range for N seconds; or a per-PC "engaged" flag set when the PC
attacks the boss and cleared on distance/rest. Note the existing leash_to_area.nss sends a
boss home when led out of its area but does not heal it — enrage-on-retreat
closes the attrition gap the leash leaves open, and covers the case where the player retreats within
the same area (which the leash never sees).
Honesty check: pure tactical demand — it doesn't touch boss HP or the CR label; it makes disengaging strictly worse than committing, killing the potion-attrition and tank-swap cheese.
Opt-in curse — risk ↔ reward new
Let players volunteer for a harder game in exchange for rarer loot — difficulty as a choice, not a wall.
Not every player wants the hardest version of every fight, so make the extra difficulty opt-in and pay it back in loot. A player who takes the curse accepts, for example:
- ≈50% more damage taken, and/or
- doubled soul-fatigue — double the per-stack penalty and/or the stack duration.
…in exchange for a materially better reward roll. The reward vehicle is chance-based, rarity-tiered socketed-gem loot. The module has no chance-based loot today (greenfield), but the socket/gem system is already fully specified in a sibling design doc — see Slotted Items (Gem Socketing). That draft already drops gems by creature CR (common mobs → common gems; bosses → rare/epic) built on the existing Forge legality system so socketed items don't trip the contraband/pit-prison sweep. The curse simply bumps the rarity band and/or drop chance while active — no separate loot system needed.
Honesty check: creates a build/greed decision (do I take more risk for a shot at a rarer gem?) rather than more HP; it also gives the difficulty knob to the player instead of flattening everyone.
Gimmick bosses new
Fights that demand a specific answer. Today there is exactly one — let's build more.
The most memorable fight in the module is the Heir of Haldor / King of the Dead
(dunharrowking.nss): a custom OnDamaged handler that fully self-heals all
damage unless the attacker's right hand wields weapon tag narsil, taunting on wrong-weapon
hits and planting a journal hint on the first one. That is the template — a fight with a single correct
answer — and it already coexists cleanly with the bestiary / boss-tracker / leash wrapper chain
(see implementation). Three new gimmicks in that spirit:
a. The Wandering One — an adaptive "Borg" immunity boss you have to hunt
One creature that fuses two ideas: it roams the module (no fixed wiki area — players must find it) and it learns to resist whatever hits it (the real fight). The wandering supplies the hunt; the adaptive immunity supplies the tactics, so the fight itself is a genuine gate rather than just a scavenger hunt.
The adaptive-immunity core. It starts not immune to anything, and as it takes damage it builds type immunity from a shared reserve:
- A universal reserve pool of 500% — enough to become fully (100%) immune to at most 5 damage types at once.
- Each time it takes a damage type, it draws from the pool in 5–10% increments toward 100% immunity for that type.
- When the pool is empty and it takes a type it isn't yet fully immune to, it still adds an increment — but steals that power from the least-recently-received type it is currently immune to (so a party that keeps switching damage types keeps it off-balance; a mono-damage party gets locked out).
The wandering shell. It relocates to a random valid area (filtering out low-level zones) or patrols a route, so it can't be pinned on the wiki and players have to track it down.
Feasibility (verified). Immunity: NWN percentage damage immunity is item property
PropertyName 20, only in discrete steps (5/10/25/50/75/100%), which stack additively
across equipment slots and cap at 100 per type. So the boss carries immunity across several gear
slots and its OnDamaged handler adds/removes those properties at runtime to hit the current
per-type total — the same mechanism bossring/npcbuffgear already use, driven
dynamically. Wandering: a full wander state machine already exists but is unused —
wandering.nss (INIT/MOVING/SEARCHING/REST with random relocation) — ready to attach to the boss's
user-defined/heartbeat event. Critical: the anti-kiting leash_to_area.nss (every
area's OnEnter) would snap a roamer back home, so this boss must set
SetLocalInt(self,"NO_LEASH",1) (the documented exemption). It still qualifies as a single-instance
registry boss; its board/wiki attribution just becomes "roaming". The immunity bookkeeping (pool, per-type
totals, recency) is greenfield script built from existing pieces.
Honesty check: hard tactical demand — the adaptive immunity rewards a party that coordinates and rotates damage types and punishes one-note builds (no HP inflation); the wandering adds discovery/logistics on top of a fight that already stands on its own tactically.
b. Elemental swarm waves
Not a single boss but an attrition arena. Players clear multiple waves, and the element changes each wave (fire → cold → acid → …). Per wave:
- 24 elementals of that wave's type, trickle-spawned to surround the players — 4 at a time every 10 seconds over ~1 minute — so the pressure ramps instead of dumping all at once.
- The element rotates when a wave is cleared, forcing players to re-gear resistances / swap tactics mid-fight.
Reusable elemental blueprints already exist (water nw_watergreat/nw_waterhuge,
frost and frost/fire giants, acid archers). The timed trickle-wave controller is
greenfield, but the building blocks are standard
(CreateObject + DelayCommand, plus the se_respawn timer pattern).
These are trash-wave adds, not single-instance registry bosses — so they don't touch the boss tracker.
They also feed the healing-economy: a surround that keeps chipping the party forces heals,
which stack soul-fatigue — so the pressure is real, not just an HP-over-time bar.
Honesty check: tactical only if each element rotation forces a real counter-swap (resistances, AoE, positioning vs. the surround); keep waves short and lethal so it can't degenerate into a plain HP-over-time slog. If the elements don't demand different answers, it's off-axis.
c. Clone / parent boss
A boss with a chance to gate-crash an existing boss fight as, e.g., "<Existing Boss>'s Mom" (or Dad) — similar to the original but with boosted stats and better gear, turning a known fight into a surprise 2-front battle.
Gear integration (verified path). For the parent to carry better gear, its
drops must be real item blueprints and registered as legal via
bin/gen-forge-legal.py (which whitelists item property fingerprints in
forge_legal_inc.nss) — otherwise the Forge login sweep flags them as contraband and jails the
looter. Where a drop is meant to be contraband, flag it deliberately through the same Warden
system. This is a well-trodden path (it's how all current over-cap boss gear is legal).
Honesty check: tactical via the surprise + target-priority decision it forces; keep the parent's stat boost modest so it's a threat multiplier, not a second sponge.
Encounter density — revised rule
More bodies where a mob is genuinely reused — tactical because it feeds the healing economy.
Status: shipped 2026-07-15 (roadmap: encounter-density-reused-mobs).
Applied exactly as specified below, on the placed .git.json instances: 32 encounter instances
across 9 areas had their per-instance spawn count (RecCreatures) bumped 1 → 2 (nothing raised
above 2, nothing already ≥ 2 touched), thickening 23 genuinely reused creatures. Every solo
(MaxCreatures == 1) encounter — 61 placed instances in total, including all 9 registry boss
encounters — was left untouched, and the Roll-of-the-Fallen build gate still verifies 78 bosses unchanged.
Correction — editing .ute.json templates does nothing at runtime. The
earlier version of this page proposed doubling MaxCreatures/RecCreatures on the
encounter templates. But every one of the 778 placed encounter instances carries
its own CreatureList/MaxCreatures/RecCreatures inside the area
.git.json; the .ute is only a toolset default. 35 of the 81 templates are never
even placed (including weathertop and insectoldforest, previously used as examples).
Any density change must edit the git instances, not the templates.
Revised rule — a targeted nudge, not a blanket doubling:
- Bump a creature's per-instance spawn count 1 → 2 (max 2), and only for a creature that is spawned by more than one encounter across the module. This thickens genuinely reused mobs (the ones that read as "the local rank-and-file") while leaving one-off set-pieces alone.
- Identify the ">1 encounter" creatures from
module-index/creature_index.json— each creature'slocations[]lists itsencounter_resrefentries. Roughly 144 of 382 encounter creatures appear in more than one encounter and qualify.
The boss rule (restated): one spawn per module, not per encounter. This is
already enforced mechanically — bin/gen-boss-registry.py treats any CR>60 creature with
exactly one live instance module-wide as a Roll of the Fallen boss (78 today). Note the built-in
consistency: a boss is by definition not in more than one encounter, so the density rule
(">1 encounter") and the boss carve-out can never both apply to the same creature. And never bump the
19 solo (MaxCreatures == 1) encounters — doing so would add a second live
copy and silently drop that boss from the tracker and the wiki Bosses page.
The previous "any pool entry with CR>150" trigger is retired: per-entry CR is a level-scaling weight, and plenty of ordinary trash exceeds 150, so it caught the wrong encounters.
New tier — the Forbidden Realms Key
Build the top tier on a themed key the module already ships, unlocking areas that already exist.
The key chain
The module already contains forbiddenrealmsk — the Forbidden Realms Key
(tag ForbiddenRealmsKey) — which is pickpocket-only from Summanus
(summanus; it does not drop on death). Its flavour is perfect and completely unused today.
Unidentified description, verbatim:
Nothing is wired to it — no journal, no quest, no door. Build the tier on it:
- Journal quest. Add a new category (
forbidden_realms_key) tomodule.jrl.jsonand a tag branch inacquireditem_tag.nss(the moduleMod_OnAcquirItemhandler) that firesAddJournalQuestEntrywhen the key is acquired — which happens naturally when it's pickpocketed onto the PC. Add a retroactive enter-time check (module OnClientEnter) so players who already stole the key get the journal entry too. Entry text hints: "…search the surrounding realms for the gate it opens." - The gate. The key opens a locked door — placed in a Númenor hub,
Bay of Andúnië (
heavensscorn) or Arnenelos (heavensdisdain) — keyed on tagForbiddenRealmsKey, with a hint-giving NPC nearby (mirroring thedunharrowkingjournal-hint precedent). - Behind the gate. The door leads into the Tombs of the Lost Souls
(
gravesofthelostk) — a finished area that is completely orphaned today (zero connections in or out), so it's a ready-made destination that costs no new art.
Weathertop / Amon Sûl — and what to put in the Tombs
There's a second dangling thread that fits perfectly. weatherhills (Weather Hills) contains a
trigger tagged weatherhills2amonsul whose LinkedTo = whills2amonsul — but
no such waypoint exists anywhere: it's a dead link to an Amon Sûl / Weathertop
area that was never built (other areas have the same orphaned amonsul stubs). That
missing area was meant to house the Weathertop court — the King, Queen, and Archer blueprints that
are all currently unspawned (weathertopking, weathertopkin002–004,
weathertopque002/003, weathertoparcher, weathertoparc001/002,
weathertopfighte).
weatherhills2amonsul/amonsul2whills triggers to it — more work, no
reuse of the orphaned Tombs.)
Apply the tuning recipe per court blueprint on placement (undead lean on Will; close whatever save each one dumps), and equip immunity gear where missing.
The other two tier areas
Two more finished, currently-inaccessible areas round out the tier — each reached from an existing endgame hub and populated with unspawned blueprints tuned on placement.
| Area | resref | Theme & link-in | Candidate bosses |
|---|---|---|---|
| Moria: Deep Caverns | area020 |
Deep-dweller cave horrors below Khazad-dûm. Descent from The Abyss of Moria
(theabyssofmoria) / Balrog of Moria (thebalrogofmoria);
naturally gated by the Balrog, so an open transition is fine. |
Mutated Basilisks (basilisk002/003/004, CR 405–445, petrify pack); Sewer Master
(sewermaster001, CR 1907) mid-boss; a re-skin capstone (% immunity + gimmick, AC ~85). |
| Temple of Nazgûl | area010 |
Ringwraith / dark-arcane sanctum — the hardest of the tier. Already contains 7 encounters; needs
only a link + named bosses. Link from Mirkwood: Dol Guldur (dolguldur) or
Dol Guldur City (dolguldurcity). |
Angmar the Evocator (angmartheevoocat, CR 4260) capstone + marquee gimmick;
Thuringwethil (thuringwethil, 1591); Shadow Lord of Dol Guldur (shadowlordof, 655,
fix its dumped save); Morgrond Captain (akhorahil006, 433). |
Gating references corrected. Earlier drafts of this page invented a "grave-key dropped by a Barrow-downs boss" and a "Morgul-key" — neither exists as an item. Use the real Forbidden Realms Key as the tier's gate (above); if the Nazgûl area also wants a distinct token gate, that key is to-create, not something already in the module.
Implementation checklist
When approved — the order of operations and the systems not to break.
- Boss tuning: edit the
fortbonus/refbonus/willbonus/NaturalACfields (andEquip_ItemListfor immunity gear) directly in eachunpacked/<resref>.utc.json. - Soul-fatigue on Heal: extend the module override spellscript (currently
stop_spellcheat.nss, wired viaon_module_load.nss) — branch onGetSpellId()for Heal + mass-heal. Order: let the heal resolve, then (post-heal) apply 10%-max-HP damage per already-active stack, then add a stack with a 180sDelayCommanddecay. Potions are covered by the same hook. - Enrage-on-retreat: scope strictly to the CR>60 single-instance registry bosses. Decide the "left combat" trigger (heartbeat aggro-list scan vs. per-PC engaged flag), then apply the taunt-shout + permanent-for-this-life +2 all stats + 25%-missing-HP heal. Must not persist onto respawn.
- Encounter density: edit the placed encounter instances in the area
.git.json(never the inert.utetemplates). Bump 1 → 2 only for creatures in >1 encounter; never the 19 solo (MaxCreatures == 1) encounters. - Place new-tier bosses: in each area's
.git.jsonCreature List, deep-copy a working sibling creature struct (keep__struct_id = 4), then overwrite onlyTemplateResRef,Tag, name, and position; add the matching.gic.jsonstub (__struct_id 4+ empty Comment). Usebin/place-helper.py <area> --suggestfor coordinates. VerifyFactionIDis Hostile. - Link the areas & the key gate: add door/trigger transitions (+ return waypoints) in the
source-hub
.git.jsonfiles. For the Tombs, place the locked door in the Númenor hub keyed on tagForbiddenRealmsKey; add the journal category tomodule.jrl.json+ theacquireditem_tag.nssbranch + the retroactive OnClientEnter check. - Wandering adaptive-immunity boss (if built): one creature carries both halves — attach
wandering.nssand setNO_LEASH = 1(elseleash_to_areasnaps it home), and put the adaptive-immunity bookkeeping on its OnDamaged handler (add/removePropertyName 20immunity properties across its gear slots per the 500% pool / recency rules). Both coexist with the wrapper chain below. - New boss gear (clone/parent, tier drops): author the item blueprints, then regenerate
the Forge whitelist with
bin/gen-forge-legal.pyso the login sweep doesn't jail looters (never hand-editforge_legal_inc.nss). - Leashing is automatic for a stationary boss cloned from a sibling with the standard
x2_def_spawnOnSpawn (records its"spawn"home; the area OnEnterleash_to_areakeeps it home). Do not setNO_LEASHon a stationary boss. - Regenerate the boss registry (any CR>60 single-instance placement auto-qualifies):
python3 bin/gen-boss-registry.py(dry run) →--write→python3 tests/check_boss_registry.py. Never hand-edit the generated block inbrd_db.nss. Confirm each new boss's OnDeath reachesSE_DoCreatureRespawn(e.g.x2_def_ondeath) so the board countdown is truthful. - Build gates: a repack runs
tests/smoke-test(boss registry, spawn-leash, forge, divergent-creatures, dialog-integrity). New qualifying content won't break them.
Do not break the wrapper chain. x2_def_spawn → nw_c2_default9
(stores the leash home; runs bst_install) → bst_install re-points OnDamaged/OnDeath
to the bestiary trackers at runtime and chains the originals. A custom per-boss OnDamaged gimmick (Borg
immunity, Narsil-style gate) is preserved as the "original" and still runs — the bestiary, boss-tracker,
and leash systems keep working.
Honesty scorecard
The shared "stay honest" artifact — rate every proposal by what it actually changes.
The middle column is the important one: the mechanism by which each proposal stays a gate (scales against a player choice) rather than a tax (scales against nothing = HP by another name). If a row can't name a player choice it scales against, it's off-axis.
| Proposal | Mechanism — why it's a gate, not a sponge | Tactical demand | Sponginess risk | Build effort |
|---|---|---|---|---|
| Close dumped saves | Scales against the player's save-DC / CC-immunity build — binary pass/fail | High — closes save-or-die & CC | None | Low (data edits) |
| % immunity (not flat DR) | Scales against damage-type diversity — rewards rotation, walls mono-damage | High — damage-type gate | None | Low (equip gear) |
| AC (light touch) | Scales against attack bonus (build + buffs + AC-debuffs) — only in the ~85 window; a wall past it | Med — to-hit/build gate | High if over-applied (keep in window, selective) | Low (data edits) |
| Soul-fatigue on Heal | Scales against heal discipline + throughput — finite healing, only tactical paired with enrage | Med — only with enrage | High if shipped alone | Med (spellhook + stacks) |
| Enrage-on-retreat | Scales against commitment — makes disengage strictly dominated; no HP/CR change | High — kills potion-attrition & tank-swap | None | Med (retreat detection) |
| Opt-in curse + gem loot | Player chooses the difficulty for a reward — risk/greed & build decision | Med — risk/greed choice | Low | High (new loot + gem system) |
| Wandering adaptive-immunity boss | Scales against damage-type coordination (the fight) + discovery (the hunt) | High — damage rotation + hunt | Low | High (prop juggling + wandering.nss) |
| Elemental swarm waves | Scales against per-element counters + AoE/positioning — only if elements demand different answers | Med — conditional on rotation | Med (short/lethal waves) | Med (wave controller) |
| Clone / parent boss | Scales against target-priority + adaptation to a surprise; keep boost modest | Med — target-priority | Med (modest boost) | Med (gear + forge whitelist) |
| Density 1→2 (reused mobs) | Not standalone — a throughput multiplier that feeds soul-fatigue (2× incoming → forced heals) | Med — via the healing economy | Med (cap at 2, off boss encounters) | Low (git edits) |
| Forbidden Realms Key tier | Content, not a mechanic — the bosses inside get the recipe above | N/A | — | Med (link + journal + placement) |
Appendix — candidate unlockable creatures
unspawned_creatures.json lists ~226 non-utility blueprints never placed anywhere. The genuine
lore-boss candidates (CR ≥ 300, excluding DM/summon/companion/merchant blueprints) include: Angmar the
Evocator (4260), Sewer Master (1907), High Wizard of Gondor (1794), Thuringwethil (1591), the Weathertop
court — King (weathertopkin004 1514, plus weathertopking/kin002/003 367–454),
Queen (weathertopque003 594, que002 559), Archers (weathertoparc002 337,
weathertoparcher 277, weathertoparc001 198) — Stinkfest the Peacemaker (1352),
The Executioner of the Living (962), Shadow Lord of Dol Guldur (655), Iidda the Wraith Warrior (603), Greater
Doom Knight (472), the Mutated Basilisks (405–445), Morgrond Captain of Dol Guldur (433), and Fallen Hero of
Gondor (399).
Exclude (not hostile bosses): DM/dev blueprints (*dm, homer,
bubba, POPOE), summons (wwp_*/wwl_*), Meaningwave guides
(mw_*), Dungeon-Solitaire mirrors (ds_*), merchants/utility NPCs, and companion
blueprints (legolas, gimli, samwise, elrond001,
radagastthebrown) unless deliberately reused as hostiles.