forked from phenom/healer-man
113 lines
7.3 KiB
Markdown
113 lines
7.3 KiB
Markdown
# Enemy stances and NPC blocking — 2026-10-05
|
||
|
||
The approved continuation implements NPC Defensive/Battle Stance and Improved
|
||
Blocking for ordinary source-backed WoW creatures. Separate GPT-6 Luna workers
|
||
with extra-high reasoning supplied source helpers, integration tests and live
|
||
QA. The level cap remains 80; loot and readiness promotion are outside scope.
|
||
|
||
`enemyStances.ts` binds NPC forms 18/17 to core-owned passives 7376/21156 using
|
||
the selected Ascension/Epoch client. The shared source aura is the only owner
|
||
of its stance modifiers. Defensive lasts 180 seconds and multiplies all-school
|
||
damage taken by 0.9 and dealt by 0.95. Battle is permanent until replacement or
|
||
removal. The exclusive group prevents both forms remaining active. Reset,
|
||
evade and expiry remove the owned modifiers. Ascension Battle has zero numeric
|
||
child effects but retains its form identity. Epoch threat modifiers are stored
|
||
without altering the incoming party threat table; this runtime has no hostile
|
||
NPC outgoing-threat consumer. Ascension Defensive's DUMMY +42 remains
|
||
unsupported because no source handler was established.
|
||
|
||
`enemyBlocking.ts` provides an ordinary Creature baseline of 5% plus block aura
|
||
percentage points, and block value `floor(level / 2)`. Historical Creature
|
||
Strength stays zero; the loaded class-level Strength column is not assigned
|
||
to ordinary creatures. This baseline has no equipment/shield requirement.
|
||
The shared player/companion damage resolver applies the level-based skill
|
||
adjustment once, real target facing, active cast/control and evade gates, and
|
||
the pinned template `flags_extra` NO_BLOCK bit. Improved Blocking adds 75
|
||
percentage points for six seconds. Its effect expires exactly at the aura
|
||
boundary. Native RoM attackers use the same ordinary WoW target defense path;
|
||
native RoM defenders and character/summoned defenders retain their own models.
|
||
|
||
This initial stance pass enables the sourced auto-attack block baseline. The
|
||
subsequent [spell continuation](NPC_SPELL_BLOCKING_2026-10-05.md) imports per-rank
|
||
defense attributes and enables direct physical spell mitigation for player and
|
||
party casts, including crit-plus-block. Periodic and non-direct full-hit spell
|
||
blocks remain excluded. Missing source flags, levels outside 1–80 or missing
|
||
spatial evidence disable this block baseline. Runtime Totems/Guardians are
|
||
outside ordinary-creature scope; template type is not a safe Totem identifier.
|
||
Ignore-hit-direction auras are not newly imported by this batch.
|
||
The source CONTROLLED set is stun/fear/confuse. The runtime additionally treats
|
||
sleep/blind/knockdown/freeze as unable to defend, matching its incapacitation
|
||
model; this is a simulator approximation. A plain root still permits blocking.
|
||
|
||
The world importer now preserves `flags_extra` without changing any other
|
||
reference fields: all 1,671 selected templates have an exact mask.
|
||
None of the selected masks sets NO_BLOCK; that gate is verified through the
|
||
importer fixture and pure helper, rather than claimed as a live Stockade case.
|
||
The campaign
|
||
compiler validates form and profile-specific child signatures, including raw
|
||
duration indices, attributes, equipped-item masks, targets, school masks,
|
||
triggers and effect amounts before enabling the three reviewed parent spells.
|
||
Both source profiles must be present; fallback cannot substitute one for the
|
||
other. Generated JSON and compressed TypeScript are refreshed together.
|
||
|
||
Reviewed SmartAI self auras preserve one-shot flags and combat timing.
|
||
Stockade Inmates apply Battle Stance after one idle second, before the pull;
|
||
it is excluded from in-combat selection. Kam Deepfury applies Defensive once
|
||
and repeats Improved Blocking on its source schedule. Reset re-arms the idle
|
||
schedule. Non-boss SmartAI expansion is restricted to these three self auras.
|
||
Catalog comparison against the preserved working baseline changes 14 entities
|
||
in seven dungeons, with unrelated attacks, health and placements unchanged.
|
||
|
||
Focused checks, production build and live evidence are recorded below.
|
||
Source details: [stances](ENEMY_STANCES_2026-10-05.md),
|
||
[blocking](NPC_BLOCKING_2026-10-05.md). Live report:
|
||
[full Stockade](STOCKADE_STANCES_BLOCKING_PLAYTEST_2026-10-05.md).
|
||
|
||
## Validation
|
||
|
||
- All 102 checks across the twelve affected Vitest files pass, including actual
|
||
imported aura casts, idle preparation, player/companion block results,
|
||
exact-boundary expiry, geometry, unsupported packets and source exclusions.
|
||
- Ready-five passes seven Vitest and twenty Python checks. The world importer
|
||
tests pass seven cases; compiler regeneration passes both strict profiles.
|
||
- Independent Luna review confirms formulas, source boundaries, skill applied
|
||
once, stance pins and idle timing. Its control-label precision finding is
|
||
recorded as the explicit simulator approximation above.
|
||
- Production build passes with its content/asset prechecks, 8GB TypeScript/Vite
|
||
and compression/release-bundle hooks. An incorrect test type import and a
|
||
separate concurrent test's ClassId annotation were corrected before the final
|
||
passing build; no runtime behavior changed in those corrections.
|
||
- Pre-live release check passes (211 changed paths including unrelated work).
|
||
One unrelated file's mixed CRLF/LF was normalized to LF for required hygiene.
|
||
Final release check passes 240 changed paths, including concurrent unrelated
|
||
work; the count is not a claim that every path belongs to this continuation.
|
||
- Frozen full Stockade live validation passes on 5,964 files / 116,405,610 bytes,
|
||
aggregate SHA-256
|
||
`1fcd021af0ef90c8d994cf1ab853ef0e62f4d4767fa3acaab698b14121194310`.
|
||
Mutable dist stayed unchanged during the verified copy; the frozen aggregate
|
||
stayed identical before and after live QA.
|
||
- Run `20261005-184333429` enters the normal full dungeon as a level-30
|
||
Discipline Priest with four Ready companions. The native results screen
|
||
confirms all five exact boss IDs, Easy/Normal, at 24:25.4. No observed player
|
||
or party deaths or resurrection recoveries occurred; all finish alive.
|
||
Natural progression ends at player level 40 / companions 39, within cap 80.
|
||
- Live state contains Defensive/Battle and Improved Blocking auras, plus eight
|
||
party attacks blocked by hostile NPCs and 141 hostile attacks blocked by the
|
||
party. Blocked amounts are retained only for the 33 samples matching the
|
||
latest damage event's outcome/raw amount; this is sampled correlation, not
|
||
a stronger actor-and-event-linked packet assertion. Remaining outcomes keep
|
||
their amount unknown. Deterministic tests supply unobserved boundaries and
|
||
melee/player/native-RoM attacker cases.
|
||
Reconstruction keys aura applications by instance ID plus application time:
|
||
one Defensive, 34 Battle and one preserved Improved Blocking application.
|
||
Additional short Improved Blocking applications remain unverified by live
|
||
sampling. The corrected wrapper and prepare-only syntax checks pass.
|
||
- Root reviewed the 25/50/75-percent scene captures and native full-clear image.
|
||
Bodies and weapon/shield silhouettes render; existing overlap/edge occlusion
|
||
remains. There are zero page errors and one missing-favicon console 404.
|
||
All 2,124 fetched hash-addressed content objects verify. The overall content
|
||
manifest changed during the run, so whole-content immutability is not claimed.
|
||
The live report records source-provenance and sampling limits, along with the
|
||
preserved superseded first attempt.
|
||
The run-owned runner/browser have exited and temporary harnesses are removed.
|