Update Healer Man server
This commit is contained in:
1 parent
69809f7228
commit
ff20ab8779
101 files changed
+16713
-945
No files matched your search
@@ -1,6 +1,6 @@
|
||||
# Active Class Mechanics Backlog
|
||||
|
||||
Updated 2026-10-06. This document lists unresolved ability and talent mechanics for all ten WoW 3.3.5a classes and all ten RuneWaker primary classes. It excludes completed fixes and all visual or sound review. Some items need source confirmation or simulator support before they can be implemented; do not guess missing values. For RoM conflicts, prefer clearly matching current Chronicles of Arcadia behavior over the RuneWaker snapshot; verify skill identity and class pairing, and document the source and any simulator approximation. See [the full audit](ACTIVE_CLASS_AUDIT.md) for the supporting findings and source conflicts.
|
||||
Updated 2026-10-07. This document lists unresolved ability and talent mechanics for all ten WoW 3.3.5a classes and all ten RuneWaker primary classes. It excludes completed fixes and all visual or sound review. Some items need source confirmation or simulator support before they can be implemented; do not guess missing values. For RoM conflicts, prefer clearly matching current Chronicles of Arcadia behavior over the RuneWaker snapshot; verify skill identity and class pairing, and document the source and any simulator approximation. See [the full audit](ACTIVE_CLASS_AUDIT.md) for the supporting findings and source conflicts.
|
||||
|
||||
New routine mechanic/browser diagnostics use **Stormwind Stockade: Cellblock Rush** (`bite-sized-stormwind-stockade`). Each run selects one of the five Stockade bosses from its shared run ID, so record the boss actually observed. Import `scripts/playtest-defaults.cjs` and follow [the test policy](TEST_DUNGEON_POLICY.md); full Stockade campaigns require explicit selection. Isolated Boss Testing remains a separate mode that defaults to Hamhock. Historical Wailing findings below do not select future tests.
|
||||
|
||||
@@ -34,7 +34,9 @@ New routine mechanic/browser diagnostics use **Stormwind Stockade: Cellblock Rus
|
||||
- [x] Recover the matching pinned enemy equipment table, validate virtual slots against Item.dbc, retain explicit source spawn GUIDs, and enable AUTO offhand attacks for proven ordinary NPC offhand weapons. Selectors and alternate entries fail closed; runtime tests cover independent timing and reset persistence. See [the equipment source mapping](ENEMY_EQUIPMENT_MAPPING_2026-10-06.md).
|
||||
- [x] Add guarded ordinary-Creature self-cast Critical Block 47294–47296 imports, exact WoW335 Shield Bash 72 full utility blocking for player/party writers, and source shout aura 31 +25% speed with whole-spell fear immunity and separate stun-effect immunity. No source NPC Critical Block assignment was found, so no creature cast is invented. The stance/Thrash audit confirms no source meaning for Ascension DUMMY +42 or exact Targorr Thrash cadence; keep both gated. See [the utility/control completion](ENEMY_UTILITY_CONTROL_COMPLETION_2026-10-06.md).
|
||||
- [x] Import exact WoW335 Shield Bash 72's child 29703 as a six-second 50% SNARE, integrate safe source-informed fear routes for local player/party/mobile summons, and bind named-shout immunity purge/escape to exact Berserker Rage 18499 and Bladestorm 46924 source grants. Whole child/rider removal, overlapping generic controls, blocked paths, expiry and accepted grant/cast consumers are covered. Icebound Fortitude has no sourced purge flag; Bladestorm has no controlled-casting bypass. See [the control-runtime follow-up](ENEMY_CONTROL_RUNTIME_FOLLOWUP_2026-10-06.md).
|
||||
- [ ] Extend utility full hit tables/ranks/profiles only with exact source proof. General shout Magic hit/resist/deflect, exact server flee paths/RNG, additional immunity-grant purge rules, Deterrence siblings, private Ascension stance DUMMY consumer, exact source Targorr Thrash timing, native custom equipment/rate and cast prerequisites, and broader weapon/proc formulas remain open. False direct hits stay omitted for unsupported effects. See [the current boundaries](ENEMY_CONTROL_RUNTIME_FOLLOWUP_2026-10-06.md).
|
||||
- [x] Add exact Lichborne player/party cast bypass and named-shout purge, source-bound Kick 1766/Pummel 6552 blocking, removal of Kick's prototype damage/duplicate interrupt, and actor-local pacify gates for weapon autos. The public `rogue-kick` ID persists. Audit Deterrence 19263's linked 67801 package while keeping its playable deflect import gated. See [the control/utility continuation](CONTROL_UTILITY_CONTINUATION_2026-10-06.md).
|
||||
- [x] Import selected Hunter Deterrence 19263 with linked 67801 for actual player/companion casts, five-second owner-local lifecycle, parry/ranged-hit inputs and exact-source direct spell deflection. Preserve sourced pacify distinctions, off-GCD/cooldown/equipment rules, defensive NPC selection and hostile-rider suppression. Raw hit flags now reach normalized WoW attacks. See [the integration](DETERRENCE_INTEGRATION_2026-10-07.md).
|
||||
- [ ] Extend utility full hit tables/ranks/profiles only with exact source proof. General shout Magic hit/resist/deflect, ordinary miss/resist control-rider fidelity, exact server flee paths/RNG, Charm/general immunity-grant purge rules, private Ascension stance DUMMY consumer, exact source Targorr Thrash timing, native custom equipment/rate and cast prerequisites, and broader weapon/proc formulas remain open. False direct hits stay omitted for unsupported effects. See [the current boundaries](DETERRENCE_INTEGRATION_2026-10-07.md).
|
||||
|
||||
## Native stat input update (2026-10-03)
|
||||
|
||||
|
||||
@@ -0,0 +1,168 @@
|
||||
# Control and utility continuation — 2026-10-06
|
||||
|
||||
Lichborne now uses exact source-backed player/companion cast allowances and
|
||||
named-shout purge. Kick and Pummel join Shield Bash's source-bound ordinary-NPC
|
||||
full blocking. Player weapon autos respect pacify. Deterrence's complete linked
|
||||
source package is audited; missing runtime inputs remain explicit.
|
||||
|
||||
## Implemented behavior
|
||||
|
||||
- `enemyControlImmunityPurge.ts` binds Lichborne 49039 to its selected WoW335
|
||||
identity, class, retained raw attributes and three Aura77 scalar signatures.
|
||||
Explicit fear/stun/confuse cast permissions are separate from purge. Player
|
||||
and configured companion casts remove only the four named FEAR-mechanic
|
||||
shout auras, including 20511's stun/rider. Known generic fear/stun/confuse can
|
||||
permit Lichborne but remain active and keep the actor controlled. Unknown
|
||||
source controls and unsupported generic sleep fail closed. Berserker Rage
|
||||
retains its narrower behavior. Existing Fear/Sleep immunity metadata is
|
||||
consumed; Charm is source-proven but has no runtime immunity value.
|
||||
- `partyRuntime.ts` selects a learned, source-proven escape ability for its
|
||||
owner, retaining target validity, costs and cooldowns. Lichborne's source
|
||||
GCD is zero: it neither waits for nor clears another active GCD. Retained
|
||||
action-blocking control keeps the companion holding.
|
||||
- `enemyUtilitySpellBlocking.ts` binds exact WoW335 Shield Bash 72, Kick 1766
|
||||
and Pummel 6552 to identity/class/profile/raw metadata and the complete
|
||||
projected effects. Only source-bound ability validation reconstructs the
|
||||
two audited custom bits; an unbound raw disposition without proof falls back.
|
||||
Foreign profiles/ranks, modified effects/wrappers, native actors/targets and
|
||||
nonordinary recipients cannot borrow the contracts. Full block suppresses
|
||||
effects while committing cost/cooldown, emits a zero-damage blocked result
|
||||
and has no critical-block roll. A nonmelee-casting defender cannot block;
|
||||
real interruption and the source school lockout remain.
|
||||
- `abilityCatalog.ts` keeps the saved public `rogue-kick` identity and only
|
||||
its imported five-second interrupt. The generic merge previously attached
|
||||
prototype damage and a second four-second interrupt to this exact source
|
||||
row. Only that known merge changes. Pummel retains its four-second lockout
|
||||
and level 38 unlock. Tests use level 40 actors and pinned Kam Deepfury at
|
||||
level 25, with deterministic rolls and synthetic health/cast preparation.
|
||||
- `combatStore.ts` suppresses main/offhand autos and the owned Scout ranged
|
||||
scheduler while that actor has an active pacified tag. Target selection
|
||||
persists; expiry resumes ordinary cadence. Another actor's aura cannot
|
||||
suppress the player. Accepted-aura scheduler fixtures do not claim a live
|
||||
Deterrence cast or native readiness promotion.
|
||||
|
||||
## Source and remaining limits
|
||||
|
||||
Exact client/core evidence: [Lichborne](LICHBORNE_CONTROL_ESCAPE_2026-10-06.md),
|
||||
[utility extension](UTILITY_HIT_EXTENSION_AUDIT_2026-10-06.md) and
|
||||
[Deterrence](WOW335_DETERRENCE_SOURCE_2026-10-06.md). Historical inputs were
|
||||
read only. Pinned `spell_linked_spell` type 2 links Deterrence 19263 to 67801,
|
||||
even without a client trigger. Its five-second package includes parry, deflect,
|
||||
pacify, ignore-hit-direction and ranged-hit penalty. Aura 185's private helper
|
||||
name/comment is corrected; it is not Disarm. The Deterrence helper validates
|
||||
source signatures only, with no playable import or damage outcome claimed.
|
||||
|
||||
Full utility miss/dodge/parry/mechanic-resist tables still need caster hit,
|
||||
attribute7 and target defense inputs, including ignored combat-result/template
|
||||
gates. General Magic miss/resist/deflect stays gated. Deterrence needs the
|
||||
per-hit AlwaysHit source flag and correct post-miss/resist deflect stage;
|
||||
damage class alone cannot provide this. Exact flee RNG, private stance DUMMY,
|
||||
Targorr timing, Charm/general control purges, native custom gear and broader
|
||||
procs remain separate work. Level cap 80, loot and Ready-five scope are intact.
|
||||
|
||||
## Verification
|
||||
|
||||
The final focused selection passes **138/138 tests in 19 files**. JSON evidence is
|
||||
`artifacts/control-utility-followup-2026-10-06/focused-vitest.json`. Eleven more
|
||||
selected existing Kick/Ready/catalog checks pass, with 130 other cases excluded
|
||||
by the title filter. Ready-five passes seven Vitest and twenty Python checks.
|
||||
Initial diagnostics catch fixture identity/learnability/facing errors and an
|
||||
outdated whitelist assertion; corrected fixtures and the final selection pass.
|
||||
The failed whitelist report is retained separately.
|
||||
|
||||
The final selection adds explicit pure and actual learned-cast rejection checks
|
||||
for Bladestorm under named Fear and the 20511 stun. A purge-capable accepted
|
||||
grant does not supply permission to cast through those controls. Rejected casts
|
||||
preserve auras, control, resources, cooldown and GCD. The existing source guard
|
||||
already enforces this; these additions are test coverage. An intermediate
|
||||
14-file selection also passes, but omits five intended files and is preserved
|
||||
as `focused-incomplete-selection.json`; only the final 19-file selection is
|
||||
credited above.
|
||||
|
||||
All three subprocesses use GPT-6 Luna extra-high. Source workers finish, and
|
||||
the independent integration review finds no further actionable issue after
|
||||
generic-fear bypass and source-level fixture corrections. The utility worker
|
||||
verifies the public/source Kick merge and exact contracts. No higher-tier
|
||||
subprocess is used. Concurrent healer-recovery edits briefly lack an import
|
||||
during one worker check; the owning concurrent edit supplies it before final
|
||||
focused validation. Root does not claim ownership of that feature. The first
|
||||
build catches a narrow/wide control-type mismatch; root changes the comparison
|
||||
without changing its runtime behavior before rebuilding.
|
||||
|
||||
## Final build and content freeze
|
||||
|
||||
The normal build's prebuild hooks and 8 GB TypeScript compilation pass. An
|
||||
earlier concurrent terrain fixture has an invalid material enum until its owner
|
||||
corrects it; four targeted terrain checks then pass. The default Vite output
|
||||
fails with Windows EPERM contention in `dist/assets`. A fresh isolated Vite
|
||||
build succeeds, followed by the normal precompression and release-bundle
|
||||
verifier. The failed attempts and `build-isolated.log` are retained in the task
|
||||
artifact directory. No shared output or other process is removed.
|
||||
|
||||
The isolated build is frozen under
|
||||
`artifacts/control-utility-followup-2026-10-06/frozen-20261007-033245765/`.
|
||||
Its 5,967 files contain 118,418,867 bytes, aggregate SHA-256
|
||||
`00b7c1b19b0c8e64aba05732c24c7f3f65fa92c5260b4b3dee55391d5af2a2e4`.
|
||||
The freshly copied content manifest is
|
||||
`91b22f898ddabb4d20f1331f682852c33e5a6781c75caec9b1e435ebc60a0e39`,
|
||||
version `content-d1ec6f1f858f21c1`. All 27,587 referenced objects verify before
|
||||
QA (6,566,442,405 bytes; 21,605 logical files). The prior pass's content is not
|
||||
reused because the current manifest differs. The build's historical Wailing
|
||||
bootstrap assets do not select the live test dungeon.
|
||||
|
||||
## Final Cellblock Rush evidence
|
||||
|
||||
The single final routine run is
|
||||
`playtest-artifacts/stockade-weapon-utilities/20261007-033835372/` (UTC run ID;
|
||||
October 6 locally). Normal UI creates a Discipline Priest and four Ready
|
||||
companions, with isolated pre-entry level 30 preparation. Its seeded boss is
|
||||
Targorr the Dread, entry 1696, source/live actor `creature-84027`. Native progress
|
||||
and the results overlay agree on **1/1 in 03:05.6**, Easy/Normal. No player or
|
||||
party deaths occur; effective player healing totals 2,301.8 HP. Historical
|
||||
`fullClear` field names certify this entered one-boss slice only.
|
||||
|
||||
The committed recorder retains 762 consecutive events, IDs 9–770, with zero
|
||||
gaps, errors or discarded events/states. Companion Kick events 496 and 765
|
||||
have `kind: cast`, zero damage and unblocked hit outcomes. No Kick damage event
|
||||
is recorded. No active source cast is captured for Targorr, so these Kick
|
||||
results do not prove a live interruption. Shield Bash 536/706 immediately
|
||||
precedes Daze grants 537/707; Daze duration/movement remains fixture evidence.
|
||||
Pummel is unobserved: the live actors are below its level 38 unlock. Utility
|
||||
full blocks, Lichborne/control escape and pacify are deterministic-fixture
|
||||
coverage, not observed live applications in this seed. There is no Death
|
||||
Knight in the Ready-only live party.
|
||||
|
||||
Existing Disarm evidence contains four tank windows and seven mainhand autos
|
||||
during them (364, 373, 555, 569, 647, 659, 762). Each records raw damage 57,
|
||||
versus 68/70 outside those windows. This is consistent with the existing unarmed
|
||||
fallback and removed weapon contribution, not a requirement to suppress every
|
||||
swing. Disarm and the new pacify scheduler gate have different source behavior.
|
||||
|
||||
Root's labeled `root-evidence-audit.cjs/.json` independently rehashes all 5,967
|
||||
frozen build files, seven loaded chunks and 2,124 served manifest objects
|
||||
(77,019,550 bytes). Build and full content manifest remain unchanged; every
|
||||
checked object matches its address and captured manifest reference, with zero
|
||||
integrity failures. Raw network response bodies are not retained; the audit
|
||||
matches immutable local bytes to recorded successful response URLs/status.
|
||||
|
||||
Root views the actual roster, equipped-party, route-50 and native results PNGs.
|
||||
Player/companion bodies, the staff and shield silhouette render. Close-party
|
||||
overlap and HUD occlusion limit a complete per-companion equipment review.
|
||||
Nine PNGs exist; no live camera-drag evidence is credited. Page exceptions are
|
||||
zero; the only console error is favicon 404. The harness cleans up its helper,
|
||||
server and browser. No gameplay source change or additional live run follows
|
||||
the frozen build. Final TypeScript compilation also passes after the test-only
|
||||
rejection additions.
|
||||
|
||||
The independent GPT-6 Luna extra-high evidence review finishes without a
|
||||
discrepancy. It separately checks raw event-ID continuity, native one-boss
|
||||
completion and agreement between captured fingerprints and root audit. It
|
||||
confirms the unarmed Disarm evidence and live utility/control attribution above;
|
||||
it does not rehash the content, run tests/builds/browser, or broaden the audit's
|
||||
network-body boundary.
|
||||
|
||||
Final game release hygiene passes 78 changed paths, including untracked files,
|
||||
and is recorded in
|
||||
`artifacts/control-utility-followup-2026-10-06/release-check.log`. Game/vault
|
||||
changes are reviewed separately, canonical notes are updated, and the task
|
||||
worklog closes without staging, commit or deployment.
|
||||
@@ -0,0 +1,168 @@
|
||||
# Hunter Deterrence catalog selection — 2026-10-07
|
||||
|
||||
## Result
|
||||
|
||||
The selected Hunter catalog now exposes the exact Spell.dbc player action
|
||||
Deterrence 19263 as `wow335-hunter-deterrence`, with its source level, cooldown,
|
||||
resource, GCD, target, item requirement, source attributes, and three parent
|
||||
aura rows preserved. Its 67801 linked-aura rows remain a separate, explicit
|
||||
package descriptor; 67801 is not a learned action or a triggered-spell child.
|
||||
|
||||
The generated progression file and its generator were not changed. The
|
||||
catalog-local fallback is inserted only when the generated Hunter chains
|
||||
contain no Deterrence name or package IDs. An imported candidate is accepted
|
||||
only if its selected row matches the verified source fields; a same-name
|
||||
65871 row, an imported linked child, or any candidate drift suppresses the
|
||||
package rather than substituting a row.
|
||||
|
||||
## Why the generated Hunter entry was missing
|
||||
|
||||
The read-only source was the local 3.3.5a `patch-enUS.MPQ` at
|
||||
`../wow335a/Data/enUS/patch-enUS.MPQ`, SHA-256
|
||||
`c1c06b0d0c34c331b21df7cdd25cc422a650efbd477e42b80849ba30b2e5fc99`.
|
||||
Its `SkillLineAbility.dbc` contains this row for 19263:
|
||||
|
||||
```text
|
||||
[10865, 51, 19263, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
|
||||
```
|
||||
|
||||
The Hunter source in `scripts/generate-wow335-abilities.mjs` includes skill
|
||||
line 51 and class mask 4, but `classSpellIds` also requires the row's class-mask
|
||||
field 4 to contain bit 4. The selected row has class mask zero, so the import
|
||||
filter drops it even though the Hunter skill-line row is present. A read-only
|
||||
generation to a temporary output reproduced the omission; no generated files
|
||||
were written.
|
||||
|
||||
## Selected parent row
|
||||
|
||||
The same archive's `Spell.dbc` has 239 fields and selects spell 19263 named
|
||||
Deterrence. The imported field shift is six. The exact catalog values are:
|
||||
|
||||
| Field | Selected value |
|
||||
| --- | --- |
|
||||
| Source and base level | 60 / 60 |
|
||||
| Maximum scaling level | 0 |
|
||||
| Target and range | Self, range index 1, 0–0 |
|
||||
| Cast time | 0 ms |
|
||||
| Duration | index 28, 5,000 ms |
|
||||
| Cooldown | 90,000 ms; category recovery 0 |
|
||||
| Global cooldown | 0 ms |
|
||||
| Power | Mana, 0 flat cost, 0 percent cost |
|
||||
| Prevention type | 0 (`NONE`) |
|
||||
| Equipped item | class 2, subclass mask 173555, inventory mask 0 |
|
||||
| Attributes 0–7 | `[327696, 16, 0, 0, 0, 0, 0, 0]` |
|
||||
| Damage class / school mask | 0 / 1 |
|
||||
| Icon | `Ability_Whirlwind` |
|
||||
|
||||
The exact DBC effect rows are self-targeted `APPLY_AURA` effects with no
|
||||
triggered spells, period, radius, or mechanic:
|
||||
|
||||
| Index | Aura | Parsed amount | Raw base points | DBC coefficient |
|
||||
| ---: | ---: | ---: | ---: | ---: |
|
||||
| 0 | 47 | +100 | 99 | 1 |
|
||||
| 1 | 287 | +100 | 99 | 1 |
|
||||
| 2 | 25 | 0 | -1 | 0 |
|
||||
|
||||
`wow335AbilityCatalog.ts` maps this one verified row through the ordinary
|
||||
rank path, then uses the source-bound parent aura descriptors from
|
||||
`wow335DeterrenceRuntime.ts`. That override matters for Aura 47: its source
|
||||
payload is +100 parry percentage points, so the descriptor uses a flat parry
|
||||
modifier. The generic Aura 47 mapper uses a percent multiplier and would not
|
||||
represent this row correctly. The descriptors preserve the existing source
|
||||
IDs and five-second duration; the 287 effect has no generic deflect tag.
|
||||
|
||||
The parent row's selected client tooltip resolves to: “When activated,
|
||||
increases parry chance by 100% and grants a 100% chance to deflect spells.
|
||||
While Deterrence is active, you cannot attack. Lasts 5 sec.” The linked server
|
||||
row `(19263, 67801, 2, 'Deterrence')` and exact 67801 child signature are
|
||||
documented in [the source audit](WOW335_DETERRENCE_SOURCE_2026-10-06.md).
|
||||
|
||||
The same DBC field distinguishes attacks blocked by the pacify prevention
|
||||
type from silence-only spells. In the 239-field archive, PreventionType is at
|
||||
raw field 220 (the import shift of six from field 214 in the pinned 234-field
|
||||
layout). The source enum defines 2 as PACIFY, 1 as SILENCE, and 0 as NONE.
|
||||
Direct read-only parsing of the pinned archive verified every one of the 189
|
||||
selected Hunter rank rows plus Deterrence: 32 NONE, 67 SILENCE, and 91 PACIFY.
|
||||
Five additional IDs appear in generated Hunter spell chains but do not become
|
||||
selected cast ranks: rank-zero Tame Beast 13481 and Volley damage children
|
||||
42234, 42243, 42244, and 42245. They are excluded from the runtime lookup
|
||||
because the ability mapper selects the player cast/channel wrappers.
|
||||
Arcane Shot (3044), Steady Shot (56641), Aimed Shot (19434), and Wing Clip
|
||||
(2974) are PACIFY; Explosive Trap (13813) and Mend Pet (136) are SILENCE;
|
||||
Deterrence (19263) is NONE. The complete spell-ID table is in
|
||||
`WOW335_HUNTER_PREVENTION_TYPES_BY_SPELL_ID` in
|
||||
`src/game/wow335AbilityCatalog.ts`. The lookup also checks the selected
|
||||
Hunter/source identity and accepts the public stable ID used when a generated
|
||||
source action overlays a core action. Unknown IDs, another class, source, or
|
||||
name return no prevention value.
|
||||
|
||||
The static cast-gate table is deliberately local to the selected catalog. It
|
||||
was read from `Spell.dbc` with the archive's WDBC record framing and the same
|
||||
six-field schema shift implemented by
|
||||
`scripts/generate-wow335-abilities.mjs::parseSpells`; the DBC generator does
|
||||
not currently retain PreventionType. A second read-only comparison against
|
||||
all 190 table IDs verified every stored value against raw field 220. The DBC
|
||||
source pin is WoW build 3.3.5a.12340 and the MPQ SHA-256 recorded above. Field
|
||||
semantics are pinned to AzerothCore revision
|
||||
`e822d718322289dd036fb2daf8867ba41283bf9a`: `src/server/shared/SharedDefines.h`
|
||||
defines `NONE=0`, `SILENCE=1`, and `PACIFY=2`, and
|
||||
`src/server/game/Spells/Spell.cpp` gates casts using those values. A future
|
||||
change to the selected archive, DBC field layout, selected Hunter ranks, or
|
||||
source profile must re-verify the raw table and update this local mapping. It
|
||||
should move into generated metadata only with explicit profile, class,
|
||||
source-row, and rank provenance; this change does not broaden the generated
|
||||
schema.
|
||||
|
||||
## Linked package and runtime boundary
|
||||
|
||||
`wow335DeterrenceRuntime.ts` owns three parent `apply-aura` descriptors and
|
||||
two linked 67801 descriptors. The child source effects are Aura 288 (+100,
|
||||
raw base 99) and Aura 185 (-100, raw base -101), each lasting 5,000 ms. Aura
|
||||
185 retains its ordinary `incoming-ranged-hit` modifier. Aura 288 has no
|
||||
generic tag; its ignore-facing meaning is resolved only from the complete
|
||||
source-bound Deterrence package.
|
||||
|
||||
The catalog exposes the selected parent action in Hunter progression at level
|
||||
60 and keeps the two linked child descriptors separate. Shared cast/runtime
|
||||
integration applies and removes the full five-aura package atomically. The
|
||||
runtime validator requires the exact parent ability identity and all five
|
||||
active aura instances to share source owner, target, applied time, and exact
|
||||
expiry. It rejects partial, duplicate, expired, foreign-profile, or same-name
|
||||
65871 packages. See `src/game/wow335DeterrenceRuntime.ts`,
|
||||
`src/game/wow335DeterrenceRuntime.test.ts`, and the
|
||||
[Deterrence integration report](DETERRENCE_INTEGRATION_2026-10-07.md).
|
||||
|
||||
## Hunter NPC defensive selection
|
||||
|
||||
The configured Hunter companion can now select the learned 19263 action from
|
||||
its own eligible abilities. The early self-defensive branch considers only
|
||||
engaged mobs currently targeting that companion, and requires the companion to
|
||||
have no active cast and no active Deterrence package. It triggers below the
|
||||
configured defensive-health threshold (55% by default) or when a recognized
|
||||
incoming cooldown mechanic is imminent. The source action must also pass the
|
||||
normal readiness and target checks, including cooldown, resource, equipment,
|
||||
and current pacify restrictions. The branch uses the ordinary ability commit
|
||||
and execution path, preserving its source cost, 90-second cooldown, and zero
|
||||
GCD. The runtime package applies all five source-linked auras and expires them
|
||||
together.
|
||||
|
||||
This is a Hunter-specific defensive choice based on the companion's own threat
|
||||
and health/mechanic state; it does not change the general NPC defensive
|
||||
candidate rules. The player and companion cast gates both consult the exact
|
||||
selected-row PreventionType lookup: PACIFY (2) spells are blocked while the
|
||||
actor has an active pacified aura, while SILENCE (1) actions such as Explosive
|
||||
Trap and Mend Pet remain available. Ordinary melee attacks keep their
|
||||
existing pacify gate. The focused catalog prevention test covers every
|
||||
selected Hunter rank and merged public IDs; shared cast/runtime evidence is in
|
||||
[the Deterrence integration report](DETERRENCE_INTEGRATION_2026-10-07.md).
|
||||
|
||||
## Focused verification
|
||||
|
||||
`npx vitest run src/game/wow335AbilityCatalog.test.ts -t "selects Hunter Deterrence|retains pinned PreventionType"` passes both selected catalog tests.
|
||||
The Deterrence case checks the stable selected ID, level 60 unlock, 90-second
|
||||
cooldown, zero cost/GCD, exact source attributes and weapon requirement, all
|
||||
three parent aura rows, both linked child rows, and rejection of 65871/67801
|
||||
as independent Hunter actions. The prevention case checks all 190 selected
|
||||
rank IDs against the source map, class/source/name/rank rejection, and public
|
||||
merged IDs for Arcane Shot and Steady Shot. Source-contract tests separately
|
||||
cover profile, parent/child, and link drift.
|
||||
@@ -0,0 +1,155 @@
|
||||
# Hunter Deterrence integration — 2026-10-07
|
||||
|
||||
Hunter Deterrence 19263 is available at level 60 to players and configured
|
||||
Hunter companions. It grants its three parent auras and the two linked 67801
|
||||
auras to the same caster for five seconds, costs no Mana, preserves the existing
|
||||
global cooldown and starts its sourced 90-second cooldown. The selected source
|
||||
requires a matching equipped weapon. The existing Training Gear staff satisfies
|
||||
that mask; a source Disarm does not remove the matching item, and the pinned
|
||||
nonpassive aura-spell exception still permits this cast.
|
||||
|
||||
## Source and ownership
|
||||
|
||||
The pinned Spell.dbc SHA-256 is
|
||||
`57011d528fd66cf39f5ab6fb168e389ab9e4cc1b8050f7201a54239d489b415c`;
|
||||
AzerothCore is `e822d718322289dd036fb2daf8867ba41283bf9a`. The exact type-2
|
||||
`spell_linked_spell` row binds 19263 to 67801. Same-name 65871 and child 67801
|
||||
remain unavailable as independent Hunter actions. The older
|
||||
[source audit](WOW335_DETERRENCE_SOURCE_2026-10-06.md) records the raw package.
|
||||
|
||||
- `scripts/dungeon-pipeline/export-enemy-damage-types.mjs` owns generated raw
|
||||
Attributes0/3/7 (DBC fields 4/7/11). `mobDamageTypes.ts` and
|
||||
`enemyAttacks.ts` retain them on normalized, source-identified WoW attacks.
|
||||
All 671 existing WoW source rows and RuneWaker mappings are retained. Unknown,
|
||||
native and omitted non-damage rows do not acquire invented zero attributes.
|
||||
- `wow335AbilityCatalog.ts` supplies a narrow fallback for selected 19263,
|
||||
which the generator's class-mask filter omitted despite its Hunter skill-line
|
||||
row. Its pinned PreventionType lookup covers all 190 selected Hunter rank IDs
|
||||
and the public merged ability aliases.
|
||||
- `wow335DeterrenceRuntime.ts` validates the selected ability and all five real
|
||||
aura instances: exact behavior, owner, target, application time and lifetime.
|
||||
- `combatStore.ts` applies the linked children after accepted parent effects,
|
||||
forces this self cast to the caster even when a caller supplies a foreign
|
||||
target, synchronizes malformed/expired packages and resolves incoming results.
|
||||
- `partyRuntime.ts` selects a learned, ready self defense while a live enemy
|
||||
targets the Hunter and health is below its configured defensive threshold
|
||||
(default 55%), or a recognized defensive mechanic is imminent. It rejects an
|
||||
active cast and respects equipment, cooldown, resources and existing GCD.
|
||||
|
||||
## Defense and attack behavior
|
||||
|
||||
The parent supplies +100 parry percentage points, sourced spell deflection and
|
||||
pacify. Linked 67801 supplies ignore-facing and -100 incoming ranged-hit
|
||||
percentage points. Simultaneous Hunters keep separate owner-local packages.
|
||||
Incomplete, foreign and expired packages cannot lend parry or ranged-hit stats
|
||||
to incoming resolution; the shared tick removes their package members.
|
||||
|
||||
Eligible landed, direct WoW Magic/ranged spell packets become an explicit
|
||||
`deflect` outcome with zero effective damage. Raw damage remains diagnostic;
|
||||
critical/block/resistance mitigation is discarded, no absorb is consumed and
|
||||
no landed-hit proc is credited. Earlier miss/full resist remains the actual
|
||||
outcome. Ordinary ranged autos use Aura185's miss modifier, and melee uses
|
||||
parry. Known source flags are matched against the complete source row tuple
|
||||
before applying AlwaysHit, NoActiveDefense, NoAttackMiss or defense exclusions.
|
||||
The complete package rejects the front-arc requirement through its linked aura.
|
||||
|
||||
The exact 100% deflect package also suppresses eligible hostile control, aura,
|
||||
periodic application, pull and leech-healing riders. Damage retains its real
|
||||
roll. Stun is read from the original combat-update snapshot, before a newly
|
||||
queued slow changes control state. Source bypasses, stunned defenders, periodic
|
||||
ticks, autos and unknown/native source records do not borrow spell deflection.
|
||||
|
||||
Pacify stops owner weapon autos and selected Hunter PACIFY=2 attacks, including
|
||||
Arcane Shot and Steady Shot. SILENCE=1 actions such as traps and Mend Pet remain
|
||||
eligible under their ordinary prerequisites. This does not pacify the pet.
|
||||
|
||||
## Verification
|
||||
|
||||
The final focused run passes **110/110 checks in 15 files**, including 12
|
||||
actual cast/defense integration cases. The exporter Node test and two selected
|
||||
catalog/prevention checks pass. Ready-five passes seven Vitest and twenty Python
|
||||
checks. Final 8 GB TypeScript, normal prebuild hooks, isolated Vite output,
|
||||
precompression and release-bundle verification pass; the isolated output avoids
|
||||
the previously observed shared `dist` lock. Build logs and JSON reports are in
|
||||
`artifacts/deterrence-continuation-2026-10-07/`. Actual player/NPC fixtures are
|
||||
`wow335DeterrenceCast.integration.test.ts` and
|
||||
`wow335DeterrenceDefense.integration.test.ts`.
|
||||
|
||||
The required avatar scope also passes **56 checks in 11 files**, following the
|
||||
equipped-item requirement change. No character/gear rendering code changed.
|
||||
|
||||
The fixtures prove actual player and NPC Frostbolt deflection, no newly applied
|
||||
slow on a deflected spell, existing stun exclusion, melee parry, periodic and
|
||||
AlwaysHit exclusions, source-bound cast requirements, linked expiry and
|
||||
simultaneous owners. Source ranged spell 2643 truthfully misses under Aura185;
|
||||
the helper separately verifies its eligible deflect branch for a landed input.
|
||||
Arcane/Steady casts reject while Freezing Trap succeeds under pacify. A torn
|
||||
Aura185 package matches the same-seed auto baseline; regular tick cleanup leaves
|
||||
the second Hunter's valid package intact. Native/unknown source rejection is
|
||||
helper evidence, not a new native live encounter.
|
||||
|
||||
The final frozen build contains 5,967 files / 118,501,108 bytes; aggregate SHA-256
|
||||
`a30787cafc7e1421e872cb37f883147177981b6627dc4238bf89f46ffb850ec2`.
|
||||
Fresh content `content-151109efcb20cc00` has manifest SHA-256
|
||||
`40d5c9e16d8045b8c240d57ca52017aaf95e423c44f96507aceb02285dca693c`;
|
||||
all 27,587 referenced objects / 6,554,643,247 bytes verify against that captured
|
||||
manifest before entry. The isolated snapshot is
|
||||
`artifacts/deterrence-continuation-2026-10-07/frozen-20261007-161003375/`.
|
||||
|
||||
One ordinary Cellblock Rush run, `20261007-161404213`, selects **Hamhock 1717**
|
||||
(`creature-79098`) and clears native **1/1 in 03:13.6**, with no deaths. The
|
||||
isolated UI-created Discipline Priest enters at level 30 with four asserted
|
||||
Ready companions; normal progression finishes the Priest at 32 and companions
|
||||
at 31. Six attributed Lesser Heal events supply **1,952 effective healing**,
|
||||
zero overheal. No live combat-state seeding or Boss Testing is used.
|
||||
|
||||
Root independently verifies the unchanged frozen build/manifest, all seven
|
||||
loaded chunks and 2,124 served manifest objects / 77,019,550 bytes with zero
|
||||
integrity failures. Event coverage is **745 consecutive IDs 9–753**, with no
|
||||
gaps, discarded events or recorder errors. There are zero page exceptions;
|
||||
the only console error is the existing favicon 404. The audit matches immutable
|
||||
local bytes to captured successful response URLs/status and manifest references;
|
||||
raw response bodies are not retained or independently hashed.
|
||||
|
||||
Root inspects the actual roster, equipped entrance, route-50 and results PNGs
|
||||
under `playtest-artifacts/stockade-weapon-utilities/20261007-161404213/campaign/`.
|
||||
Bodies and visible equipment render; entrance overlap and partly offscreen
|
||||
companions limit certification of every gear/race silhouette. The file named
|
||||
`bite-sized-stormwind-stockade-boss-arrival.png` shows the native results overlay.
|
||||
No camera-drag proof or level-60 live Deterrence claim is credited. This is the
|
||||
one selected boss slice, despite the results screen's generic full-clear label.
|
||||
The harness cleans up its browser/helper/server. No gameplay change or second
|
||||
live run follows the freeze.
|
||||
|
||||
The independent Luna extra-high evidence review confirms those fingerprints,
|
||||
event coverage and native result without launching another run or rehashing
|
||||
content. Native completion ends traversal at checkpoint 75/86 before the
|
||||
dedicated boss handler (`bossClearAttempted:false`); observed boss death and
|
||||
persisted kill progress prove the clear. Do not claim a completed scripted boss
|
||||
handler or every route checkpoint. Its report is
|
||||
`artifacts/deterrence-continuation-2026-10-07/luna-evidence-review.md`.
|
||||
Final release hygiene passes all 101 changed paths, including untracked files;
|
||||
the user Git index remains empty.
|
||||
|
||||
## Remaining boundaries
|
||||
|
||||
The underlying miss/resist/armor formulas remain the existing simulator model,
|
||||
not a complete AzerothCore hit table or RNG reproduction. The exported enemy
|
||||
table excludes unsupported/non-damage rows, so general shout/utility deflection
|
||||
remains unproven. Ordinary miss/resist control riders without this exact
|
||||
Deterrence package retain their earlier behavior. Same-update controls use the
|
||||
original-frame simultaneous policy; source server event ordering is not claimed.
|
||||
The always-equipped Training Gear fixture does not exercise a truly empty
|
||||
matching-equipment branch. Unknown/custom/native rates and equipment remain
|
||||
separate source gaps.
|
||||
|
||||
The routine level-30 Ready-only live party does not unlock level-60 Deterrence;
|
||||
its player/NPC behavior is actual store-fixture evidence. Cellblock Rush proves
|
||||
only the selected one-boss route and regression behavior. Level cap 80, saved
|
||||
stat/profile compatibility, loot wiring and readiness policy remain intact.
|
||||
No full suite, expanded balance sweep, staging, commit or deployment is part of
|
||||
this continuation. All subprocesses use GPT-6 Luna extra-high.
|
||||
|
||||
Related: [catalog](DETERRENCE_CATALOG_2026-10-07.md),
|
||||
[runtime contract](DETERRENCE_RUNTIME_CONTRACT_2026-10-07.md),
|
||||
[hit source inputs](ENEMY_HIT_SOURCE_INPUTS_2026-10-07.md).
|
||||
@@ -0,0 +1,87 @@
|
||||
# WoW 3.3.5 Hunter Deterrence runtime contract — 2026-10-07
|
||||
|
||||
## Scope
|
||||
|
||||
`src/game/wow335DeterrenceRuntime.ts` binds the selected Hunter catalog row to
|
||||
the audited Spell.dbc 19263 parent and its `spell_linked_spell` Aura link to
|
||||
67801. It supplies source-shaped aura descriptors and a narrow post-hit
|
||||
deflect gate. The shared combat store, party runtime, and combat-result paths
|
||||
own cast execution, actual aura application/removal, and outcome recording.
|
||||
|
||||
The five source aura definitions are identified by their source spell/effect
|
||||
IDs: parent 19263 Auras 47, 287, and 25; linked child 67801 Auras 288 and 185.
|
||||
All five instances must belong to the same Hunter self-cast, target that Hunter,
|
||||
share one application time, and expire exactly five seconds later. The runtime
|
||||
contract returns no Deterrence package when any member is missing, duplicated,
|
||||
expired, foreign-owned, or out of step with the other members. Removing or
|
||||
expiring one member should remove the other members for that same owner,
|
||||
target, and application time.
|
||||
|
||||
The helper exports the parent effects for the selected catalog mapping and the
|
||||
linked-child effects for the original cast target. Aura 47 carries a flat +100
|
||||
parry modifier. Aura 25 carries the pacify tag. Aura 287 supplies the 100-point
|
||||
spell-deflect source aura. Aura 288 removes the attacker's frontal-arc
|
||||
requirement for this package. Aura 185 carries the -100 incoming ranged-hit
|
||||
modifier; the existing shared hit-stat path consumes it, so the combat caller
|
||||
must not add a second copy of that penalty.
|
||||
|
||||
## Deflect gate
|
||||
|
||||
`resolveWow335DeterrenceIncoming` is a final gate after the existing combat
|
||||
resolver has produced a landed `hit`, `crit`, or `block`. It preserves `miss`,
|
||||
`resist`, `dodge`, and `parry`. For an otherwise eligible event it returns the
|
||||
distinct `deflect` outcome; the source aura is 100%, so this gate adds no random
|
||||
roll.
|
||||
|
||||
The input must identify a non-periodic WoW 3.3.5 spell source and match the
|
||||
exact enemy damage-source row, including DamageClass, SchoolMask, and raw
|
||||
AttributesEx0/3/7. Only Magic (DamageClass 1) and ranged (DamageClass 3) spells
|
||||
qualify. DamageClass None, melee, unknown, foreign-profile, periodic, and
|
||||
weapon-auto inputs remain unchanged. A stun suppresses deflection. The core's
|
||||
source bypasses are preserved: AttributesEx3 `ALWAYS_HIT` (`0x00040000`)
|
||||
suppresses both branches; ranged DamageClass also skips the deflect check for
|
||||
AttributesEx0 `NO_ACTIVE_DEFENSE` (`0x00200000`); Magic DamageClass skips it for
|
||||
AttributesEx7 `NO_ATTACK_MISS` (`0x02000000`). The front-arc gate applies unless
|
||||
Aura 288 is active. A complete accepted Deterrence package always contains Aura
|
||||
288, so an attacker behind the Hunter remains eligible.
|
||||
|
||||
Ordinary ranged autos never produce `deflect`. They receive Aura 185's separate
|
||||
incoming ranged-hit modifier through the existing aura-stat path. The helper
|
||||
does not calculate general miss/resist chances, and it does not widen the
|
||||
simulator's existing combat table to other spells or profiles.
|
||||
|
||||
The shared combat path also uses this exact eligibility gate before applying
|
||||
non-damage spell riders while the complete Deterrence package is active. For a
|
||||
source event that is guaranteed to deflect if it lands, control, target-aura,
|
||||
periodic, pull, and leech-healing riders are skipped while damage still goes
|
||||
through the ordinary hit resolver and records `deflect` only after its normal
|
||||
landed result. This suppression is package-specific; ordinary sourced attacks
|
||||
outside Deterrence retain the simulator's existing rider behavior on miss or
|
||||
resist. Same-update incoming events use the combat store's original-frame stun
|
||||
snapshot, consistent with its simultaneous batch policy.
|
||||
|
||||
## Identity and provenance
|
||||
|
||||
The source contract continues to use the exact audited 19263, 67801, and
|
||||
type-2 link signatures in `src/game/wow335Deterrence.ts`. The runtime ability
|
||||
contract accepts only the selected `wow335-hunter-deterrence` Hunter mapping,
|
||||
its `wow335-progression` source, DBC ID 19263, self target, and the three exact
|
||||
parent source effects. Runtime activation is derived from the actual serializable
|
||||
`ActiveAura` records; callers do not pass a copied source-package object as
|
||||
proof. Incoming deflection independently checks its spell ID and hit attributes
|
||||
against the exact WoW damage-source table. Missing or mismatched source fields
|
||||
fail closed.
|
||||
|
||||
The pinned source evidence and the limits of the imported behavior are recorded
|
||||
in [`WOW335_DETERRENCE_SOURCE_2026-10-06.md`](WOW335_DETERRENCE_SOURCE_2026-10-06.md).
|
||||
The source row authenticates hit-class and bypass metadata; the game's current
|
||||
miss/resist calculations remain its own policy. This contract does not create a
|
||||
complete AzerothCore hit table.
|
||||
|
||||
## Focused verification
|
||||
|
||||
Run `npx vitest run src/game/wow335Deterrence.test.ts src/game/wow335DeterrenceRuntime.test.ts`
|
||||
for the exact source rows, linked package identity and lifetime, cleanup scope,
|
||||
branch-specific bypass bits, and unsupported-input exclusions. The mechanics
|
||||
work remains within the project's Ready-five certification boundary, level-80
|
||||
cap, and existing loot scope.
|
||||
@@ -0,0 +1,64 @@
|
||||
# Enemy hit source inputs — 2026-10-07
|
||||
|
||||
The enemy damage source exporter now preserves the raw WoW attribute words that
|
||||
the pinned 3.3.5a hit-result path checks before miss, avoidance, and deflect
|
||||
resolution. The work adds source inputs only; the runtime consumer owns how
|
||||
these flags affect hit resolution.
|
||||
|
||||
## Pinned source and field mapping
|
||||
|
||||
The WoW source is the local 3.3.5a `Spell.dbc` at
|
||||
`../wow-pvt-server-backups-2/wow335a/Data/patch-A.MPQ/DBFilesClient/Spell.dbc`.
|
||||
Its SHA-256 is
|
||||
`57011d528fd66cf39f5ab6fb168e389ab9e4cc1b8050f7201a54239d489b415c`;
|
||||
the verified layout is 234 fields and 936-byte rows.
|
||||
|
||||
The pinned AzerothCore `src/server/shared/DataStores/DBCStructure.h` maps
|
||||
Spell.dbc field 4 to `Attributes`, field 7 to `AttributesEx3`, and field 11 to
|
||||
`AttributesEx7`. `SpellInfo.cpp` copies those DBC words to the corresponding
|
||||
server fields. `SharedDefines.h` identifies the relevant source bits:
|
||||
|
||||
| Field | Core bit | Core meaning |
|
||||
|---|---|---|
|
||||
| `Attributes` (4) | `SPELL_ATTR0_NO_ACTIVE_DEFENSE`, `0x00200000` | Prevent physical avoidance |
|
||||
| `AttributesEx3` (7) | `SPELL_ATTR3_ALWAYS_HIT`, `0x00040000` | Ignore hit result |
|
||||
| `AttributesEx7` (11) | `SPELL_ATTR7_NO_ATTACK_MISS`, `0x02000000` | Spell cannot be missed |
|
||||
|
||||
In the pinned `Unit.cpp`, `MeleeSpellHitResult` returns early for
|
||||
`SPELL_ATTR3_ALWAYS_HIT` and `SPELL_ATTR0_NO_ACTIVE_DEFENSE`; the latter follows
|
||||
the miss check and precedes resist, avoidance, and deflect handling.
|
||||
`MagicSpellHitResult` returns early for `SPELL_ATTR3_ALWAYS_HIT` and
|
||||
`SPELL_ATTR7_NO_ATTACK_MISS` before its ordinary hit/deflect checks. The exact
|
||||
raw attributes remain available so the runtime can follow these source gates.
|
||||
|
||||
## Data path and limits
|
||||
|
||||
`scripts/dungeon-pipeline/export-enemy-damage-types.mjs` reads fields 4, 7, and
|
||||
11 into a structured `hitSource` object for each exported WoW damage row. It
|
||||
records explicit zeros when the matched DBC row contains zero. The generated
|
||||
catalog records these source field indexes in
|
||||
`generatedFrom.wowSpellHitFields` and the pinned DBC hash above.
|
||||
|
||||
`src/game/mobDamageTypes.ts` carries `hitSource` only from a matched `wow335`
|
||||
source spell. `src/game/enemyAttacks.ts` copies the same object to
|
||||
`wowHitSource` during normalization. Unknown spell IDs have no source object;
|
||||
RuneWaker rows remain in their separate numeric spell namespace and do not
|
||||
receive WoW hit metadata.
|
||||
|
||||
This metadata does not define complete WoW hit, miss, resist, dodge, parry,
|
||||
block, or deflect tables. Those outcomes and their ordering remain in the
|
||||
combat runtime. Non-damage/script rows excluded by the exporter, unknown DBC
|
||||
spells, and native/RuneWaker attacks remain without this WoW source object.
|
||||
|
||||
## Focused checks
|
||||
|
||||
- `node --test scripts/dungeon-pipeline/export-enemy-damage-types.test.mjs`
|
||||
builds a small WDBC fixture and proves fields 4/7/11 are read independently,
|
||||
including a real zero-valued raw word.
|
||||
- `npx vitest run src/game/mobDamageTypes.test.ts` checks the generated WoW
|
||||
metadata through resolution and attack normalization, and verifies absent
|
||||
metadata for unknown and RuneWaker source lookups.
|
||||
|
||||
The exporter can target a temporary JSON path with `--output` for its focused
|
||||
fixture; the production output remains
|
||||
`src/game/generated/enemyDamageTypeSources.generated.json`.
|
||||
@@ -0,0 +1,44 @@
|
||||
# Healer mana recovery
|
||||
|
||||
A living player or NPC healer now supplies **Healer Mana Recovery** to living
|
||||
mana users in the local party between fights. The buff restores **15% of each
|
||||
recipient's maximum mana per second**, in addition to existing recovery. It
|
||||
supports primary and secondary mana pools, caps at maximum, and does not stack
|
||||
with multiple healers. It grants no recovery while any living enemy is engaged
|
||||
or has party threat. Dead recipients and parties without a living healer are
|
||||
excluded. Native RoM recovery formulas and pulse cadence remain unchanged.
|
||||
|
||||
**Pause > Options > Gameplay and interface > Healer mana recovery** toggles
|
||||
the buff. It defaults to On, including for older profiles missing the setting.
|
||||
Changes use normal character settings persistence. Turning it off removes
|
||||
existing applications immediately. The player status panel and mana-using
|
||||
NPC frames show its icon and tooltip.
|
||||
|
||||
## Ownership
|
||||
|
||||
- `src/game/healerManaRecovery.ts`: definition, provider selection, recipients,
|
||||
non-stacking lifecycle, and maximum-mana recovery amount.
|
||||
- `src/game/combatStore.ts`: saved setting, combat gating, player recovery.
|
||||
- `src/game/partyRuntime.ts`: companion recovery and shared aura refresh.
|
||||
- `src/ui/OptionsPanel.tsx`, `src/ui/PartyFrames.tsx`: menu and buff display.
|
||||
- Native recovery parity tests explicitly disable the convenience aura.
|
||||
|
||||
## Verification
|
||||
|
||||
136 focused tests pass across the new recovery integration, native recovery
|
||||
parity, combat store, Options, and AuraStrip suites. Ready-five verification
|
||||
passes (7 Vitest and 20 Python checks). The final production build, static bundle verification, and release
|
||||
candidate check pass.
|
||||
|
||||
`scripts/playtest-healer-mana-recovery.cjs` enters Cellblock Rush through the
|
||||
normal dungeon picker using an isolated offline RoM Priest profile. The final
|
||||
run selected Targorr the Dread, as observed in its live Boss Guide. Pre-entry
|
||||
profile preparation sets level 30. Ordinary menu clicks switch the buff off
|
||||
and on; ordinary Urgent Heal spending is followed by natural idle recovery.
|
||||
Evidence lives in `artifacts/playtest/healer-mana-recovery/`, including loaded
|
||||
asset URLs, actual selected boss from the live guide, saved toggle state,
|
||||
resource samples, desktop and 960x540 menu screenshots, and runtime errors.
|
||||
Exact rate, combat transitions, NPC providers and recipients, no stacking,
|
||||
healer death, and maximum clamping are verified by focused integration tests.
|
||||
The browser run is an idle recovery and UI check, not a boss-clear or broader
|
||||
RoM balance certification.
|
||||
@@ -0,0 +1,35 @@
|
||||
# Lichborne control escape — 2026-10-06
|
||||
|
||||
## Source proof
|
||||
|
||||
Lichborne spell 49039 is an exact WoW 3.3.5a source row, not a tooltip-based inference. The selected generated row is `wow335-death-knight-lichborne`, class `death-knight`, source profile `wow335`, talent node `talent-2215`, learned at level 55. It is a self spell with a 10-second duration, zero cast time, zero GCD, 120-second cooldown, and no power cost. Its spell defense fields are `damageClass=0`, `schoolMask=32`, `directDamageFromEffects=false`, and the complete retained attribute words are `Attributes0=262144`, `Attributes1=163872`, `Attributes3=0`, `Attributes5=393224`.
|
||||
|
||||
The local client profile is World of Warcraft build `3.3.5a.12340`, read from `../wow335a/Data/enUS/patch-enUS.MPQ`, table `DBFilesClient/Spell.dbc`. The source-audit artifact at `artifacts/enemy-control-followup-2026-10-06/source-audit.json` records the raw `Spell.dbc` row. Its eight raw attribute words, in order, are `[262144, 163872, 0, 0, 0, 393224, 0, 0]` (`0x00040000`, `0x00028020`, then three zero words, `0x00060008`, then two zero words). The active generated source remains `src/game/wow335AbilityData.generated.json`.
|
||||
|
||||
The selected row has exactly three effects. Each is effect type 6 (`APPLY_AURA`) and aura type 77 (`MECHANIC_IMMUNITY`), with caster recipient and zero points-per-level. The raw `Spell.dbc` base-points are zero for all three; the selected generator represents them as base points 1 and preserves `sourceBasePoints=0`.
|
||||
|
||||
| Effect | Raw misc value | Mechanic | Raw base points | Die sides | Selected source base points |
|
||||
| --- | ---: | --- | ---: | ---: | ---: |
|
||||
| 0 | 1 | Charm | 0 | 1 | 0 |
|
||||
| 1 | 5 | Fear | 0 | 0 | 0 |
|
||||
| 2 | 10 | Sleep | 0 | 0 | 0 |
|
||||
|
||||
`Attributes1=163872` is `0x00028020`; it includes `SPELL_ATTR1_IMMUNITY_PURGES_EFFECT=0x00008000`. `Attributes5=393224` is `0x00060008`; it includes `SPELL_ATTR5_ALLOW_WHILE_STUNNED=0x00000008`, `SPELL_ATTR5_ALLOW_WHILE_FLEEING=0x00020000`, and `SPELL_ATTR5_ALLOW_WHILE_CONFUSED=0x00040000`. The source row therefore proves Charm, Fear, and Sleep immunity and purge, plus casting while stunned, feared, or confused. Its cast allowances are separate from the mechanics it grants: Lichborne does not grant Stun or Confuse immunity.
|
||||
|
||||
The existing generated aura mapping represents the selected Fear and Sleep effects as control immunities. The current `AuraDefinition` control-immunity type has no Charm value, so the source proof records Charm from the exact DBC effect but does not alias it to a different runtime mechanic.
|
||||
|
||||
## Pinned core behavior
|
||||
|
||||
The read-only AzerothCore reference is pinned to `e822d718322289dd036fb2daf8867ba41283bf9a`. In `src/server/shared/SharedDefines.h`, the attribute definitions name the purge, stunned, fleeing, and confused flags above. In `src/server/game/Spells/SpellInfo.cpp:2488–2537`, `SpellInfo::ApplyAllSpellImmunitiesTo` applies each mechanic-immunity mask and, when the purge flag is present, removes existing auras whose spell mechanic masks intersect it. Lichborne therefore purges matching Charm, Fear, and Sleep mechanics when applied; its source effects do not include Stun or Confuse, so a separate Stun or Confuse aura stays active.
|
||||
|
||||
In `src/server/game/Spells/Spell.cpp:6836–6853`, `Spell::CheckCasterAuras` derives the cast-time mechanic mask from immunity effects on spells carrying the purge flag. The later active-aura check skips an aura whose whole spell mechanic mask intersects that immunity mask (`Spell.cpp:6920–6978`). The `Attributes5` allowances independently cover stunned, fleeing, and confused caster states. This explains both shared shout cases: 49039 can start while feared, and it can start while the 20511 child applies a stun effect because that aura retains spell-level `Mechanic=FEAR`. A standalone stun also permits casting through the explicit stunned flag, but remains active after the cast. Confusion likewise permits casting and remains active.
|
||||
|
||||
## Runtime boundary
|
||||
|
||||
`enemyControlImmunityPurge.ts` recognizes only the exact selected WoW rows for Berserker Rage 18499, Bladestorm 46924, and Lichborne 49039. For Lichborne it checks the class, ability identity, source profile, damage class, school mask, all retained attribute words, and each aura's effect index, aura type, mechanic value, base-points scalar, die sides, points-per-level, recipient, and generated source aura ID. Missing or changed fields fail closed.
|
||||
|
||||
The Lichborne proof grants `charm`, `fear`, and `sleep`, records the named-shout Fear purge, and separately records the direct cast allowances `fear`, `stun`, and `confuse`. The named cleanup remains limited to active, same-target auras from spells 5246, 19134, 20511, and 29544. It removes those because their complete spell-level mechanic is Fear, including the 20511 aura that applies a stun effect. A recognized generic Fear, stun, or confusion label can also allow Lichborne to be cast through its explicit `Attributes5` flags; those auras remain active and keep their control state. Berserker Rage remains limited to its named-shout Fear purge and blocked by separate stun, confusion, and generic Fear; Bladestorm remains unable to start through control despite its later Fear and Stun immunity aura. Unknown source-spell controls fail closed.
|
||||
|
||||
Player and party integration must select the learned Lichborne row before using this proof. That integration retains the existing target validity, cooldown, global cooldown, and cost checks. No generic magic miss, resist, or deflect roll is part of this proof.
|
||||
|
||||
Focused helper validation: `npm test -- --run src/game/enemyControlImmunityPurge.test.ts`.
|
||||
@@ -0,0 +1,197 @@
|
||||
# RoM residual rendering and Raksha route review — 2026-10-06
|
||||
|
||||
This follows the completed all-30 texture/lighting pass in
|
||||
`ROM_ENVIRONMENT_REVIEW_2026-10-06.md`. The user requested continuation on the
|
||||
remaining Origin root cards and Raksha camera/route defects. Evidence uses new
|
||||
paths under `artifacts/playtest/rom-residual-review-20261006/`; the accepted v5
|
||||
build, source assets, manifests and screenshots remain historical baselines.
|
||||
|
||||
Final status on 2026-10-07: Raksha's corrected source entrance/navigation package
|
||||
and reviewed local build are installed. Ordinary entry/first-step walking and
|
||||
camera checks pass. Origin's source-opaque dark root card and Raksha's disconnected
|
||||
Shadoj route remain unresolved; this follow-up does not certify full clears.
|
||||
|
||||
## Starting evidence
|
||||
|
||||
- Origin's `elves_gaint_roots_village` material requests native alpha test 192,
|
||||
but its raw DDS, prepared PNG and shipping KTX mips are fully opaque. The prior
|
||||
exporter omits vertex color/alpha and face-culling data. A fresh source review
|
||||
found `IRuMorphTarget::GetDiffuse()` and native shader multiplication by vertex
|
||||
RGBA; the exact affected meshes and values require verification before a patch.
|
||||
No black-keyed alpha or guessed blend semantics are authorized by this evidence.
|
||||
- Raksha's authoritative source entrance `[1857,297,1161]` maps to local
|
||||
`[-0.020312,21.013313,11.334656]`. Packaged navigation projected it to
|
||||
`[0.021786,10.664467,17.560761]`, a 12.077449 m displacement. That large shift
|
||||
requires source-floor and runtime attribution; it is not yet proof of the
|
||||
camera or walking failure's complete cause.
|
||||
- Shared camera obstruction currently combines physical sphere sweeps with a
|
||||
dedicated wall/pillar sight ray. Raksha also mounts its navigation GLB as
|
||||
physical ground, a workaround introduced before its WDB floor was verified.
|
||||
Any correction must distinguish source geometry, derived navigation and
|
||||
camera-only obstruction, while preserving ordinary right-drag input.
|
||||
|
||||
## Scope and validation
|
||||
|
||||
Luna subprocesses independently inspect native material streams, actual camera
|
||||
framing and source/navigation/collision correspondence. Root owns shared runtime
|
||||
changes and asset promotion. Source experiments remain staged until exact
|
||||
identities, material semantics and preservation proofs are reviewed.
|
||||
|
||||
Ordinary UI/keyboard checks must verify Raksha entry and reachable movement,
|
||||
Origin material rendering, and Stockade fallback where shared runtime changes
|
||||
apply. Runtime stores remain read-only in gameplay proofs. The review does not
|
||||
certify full clears, combat balance, or a bridge to Origin's disconnected
|
||||
Falynum approach. Final focused checks, build and release hygiene follow the
|
||||
actual implementation.
|
||||
|
||||
## Confirmed follow-up findings
|
||||
|
||||
The fresh, hash-matched `gaint_tree_a.ros` probe reports vertex format 9, no
|
||||
`ruVERTEXFORMAT_DIFFUSE`, and no diffuse-color pointer on material 1's mesh.
|
||||
There is no omitted vertex alpha on this exact root card. The native standard
|
||||
shader defaults to one-sided `D3DCULL_CCW` without a material override, whereas
|
||||
the GLB and runtime draw both sides. The exact-face A/B and reverse-side control
|
||||
confirm that Three FrontSide matches its native winding. However, the dark face
|
||||
visible from the recorded leg-18 walking location is front-facing and remains
|
||||
under FrontSide. Culling therefore does not fix that panel. Its sole native
|
||||
texture channel is diffuse, and DDS/PNG/KTX alpha remains fully opaque. No
|
||||
vertex mask, extra opacity channel or color-key rule supports a transparency
|
||||
patch. Origin remains unchanged; this residual appearance is unresolved.
|
||||
|
||||
The culling comparison is an isolated environment-preview diagnostic at a
|
||||
recorded walking location, not a new ordinary gameplay run. Exact source,
|
||||
served-asset and screenshot identities are recorded in
|
||||
`origin/culling-ab/origin-roots-village-culling-conclusion.json` under this
|
||||
review's evidence directory.
|
||||
|
||||
Raksha's bad runtime position has no visible floor below it. The visible deck
|
||||
above it is at Y≈13.408, with physical collision at Y≈13.412; the camera stops
|
||||
0.320 m below it, matching its radius/gap. At the authored XZ the visible and
|
||||
physical source floors are at Y≈20.770/20.765. Ordinary right-drags confirm the
|
||||
camera is responding correctly within the misplaced volume.
|
||||
|
||||
The native collision floor in chunk 003 (`01_1_mesh_0`) has interleaved POSITION
|
||||
data (stride 8, offset 0). Recast's Three adapter copies the backing array and
|
||||
steps by three floats, while the pipeline's inspection correctly uses attribute
|
||||
getters. Generation therefore consumes different coordinates than its own
|
||||
input report. The durable fix unpacks positions in memory before generation;
|
||||
source collision and visual bytes remain unchanged. Corrected navigation and
|
||||
entrance candidates require staging, route checks and ordinary gameplay review.
|
||||
|
||||
## Packaging gate
|
||||
|
||||
The corrected full bake restores the entry to
|
||||
`[-0.020312,20.837463,11.334656]`, 0.17585 m from its Lua source point. Exact
|
||||
Detour queries connect the first 2 m and 10 m forward; the route to Shadoj
|
||||
remains partial. Its complete topology contains 137,575 polygons, 268,162 links
|
||||
and 588,703 detail triangles, exceeding the runtime's existing limits of
|
||||
50,000/100,000/200,000. A packaged-asset integration test caught this before a
|
||||
new build was installed. The first local asset promotion was restored from its
|
||||
exact backups; both promotion and rollback proofs remain in the evidence tree.
|
||||
|
||||
The full bake remains diagnostic evidence. Shipping selection must retain whole
|
||||
actual Detour components tied to source entrance/population anchors, preserve
|
||||
their exact directed links, and pass all runtime limits. It must not raise
|
||||
budgets or connect disconnected islands. That smaller candidate and ordinary
|
||||
gameplay validation are pending.
|
||||
|
||||
Source-anchor analysis confirms the source-to-local transform agrees with all
|
||||
123 active combat/boss rows within 7.5e-7 m. Of 251 entrance/support/population
|
||||
anchor records (including duplicates), only 29 are within the existing 4 m
|
||||
population projection limit of the corrected full navigation. All accepted
|
||||
faces point upward. The other 222 must remain unmatched; snapping them to remote
|
||||
surfaces is not supported. The source entrance and Shadoj are within 0.176 m and
|
||||
0.034 m respectively, but their components remain disconnected.
|
||||
|
||||
The workspace-wide prebuild reached the performance audit and failed on an
|
||||
unrelated, concurrently modified Utgarde Pinnacle visual asset: 16,277 draw
|
||||
calls with 14,695 unbatched savings against its existing 14,018 savings ceiling.
|
||||
No RoM visual changed. The previously published immutable Utgarde asset passes
|
||||
the same budget (16,277/14,018), as recorded in
|
||||
`utgarde-frozen-release-budget-proof.json`. This pass will publish only the three
|
||||
Raksha navigation/metadata files and preserve other manifest entries. The
|
||||
workspace-wide audit failure must not be described as a complete prebuild pass.
|
||||
|
||||
## Reviewed source-anchored package
|
||||
|
||||
The fresh v2 bake uses the same path as normal environment regeneration:
|
||||
`lib/source-navigation-anchors.mjs` transforms native recipe points with the
|
||||
full inverse WDB placement; `recast-bake.mjs` queries actual Detour references
|
||||
within explicit limits, rejects missing required anchors, then retains complete
|
||||
weak components. Lua entry must be within 0.5 m and Shadoj within 0.25 m. Other
|
||||
native anchors retain the existing 4 m limit. No runtime budget is raised.
|
||||
|
||||
V2 contains six complete components, 239 polygons, 514 actual directed links,
|
||||
653 detail triangles and 1,492 spatial-index references. The exact query input
|
||||
has 128 records (126 native support coordinates plus the two required guards):
|
||||
16 are retained, 112 remain unmatched. This differs from the preliminary
|
||||
251-record diagnostic, which duplicated population/support rows. Excluded areas
|
||||
are not individually proven decorative; this is sparse source-anchor coverage,
|
||||
not full-dungeon navigation.
|
||||
|
||||
Independent review matched every retained polygon, triangle coordinate and
|
||||
directed link against the full bake. V1/v2 BIN chunks are identical; v2 preserves
|
||||
source coordinates/evidence/required flags in JSON provenance. Required entry
|
||||
and boss snaps are 0.17585/0.03368 m. Actual runtime graph checks pass for 2 m and
|
||||
10 m forward routes; entry-to-Shadoj remains disconnected.
|
||||
|
||||
The reviewed navigation SHA is
|
||||
`77b2b22bb89474bfe2bd9974d9f58cd680634d4f7feef6163723bb8f3afe6117`
|
||||
(166,048 bytes). Shipping/canonical navigation and reports plus import metadata
|
||||
were promoted with a separate exclusive backup. Visual and all seven collision
|
||||
files are byte-identical to their baselines. Registry regeneration changes only
|
||||
Raksha's navigation identity/counts and entrance/area center; source yaw remains.
|
||||
The scoped content update changes three Raksha files and preserves all 21,602
|
||||
other manifest entries, frozen as `content-151109efcb20cc00` with manifest SHA
|
||||
`40d5c9e16d8045b8c240d57ca52017aaf95e423c44f96507aceb02285dca693c`.
|
||||
|
||||
Focused checks pass: 13 Node pipeline tests, 12 runtime tests, and ten Raksha
|
||||
GLBs with zero validator errors/warnings (230 known tooling messages excluded).
|
||||
TypeScript and the isolated production Vite build pass (11.26 s). Static
|
||||
compression produces 258 files from 129 sources; release-bundle verification
|
||||
passes with 126 chunks and 5,569 bootstrap objects/63,571,471 stored bytes. Build
|
||||
index SHA is `8ca382b4ad8919ba100ee1e0ee6c7d64a30b87c7acfbf6d65fc8184eb10c9958`.
|
||||
|
||||
## Final gameplay and installation
|
||||
|
||||
The fresh ordinary Raksha entry is ready/grounded at
|
||||
`[-0.020324,20.857564,11.334658]`. Scene rays hit the actual source deck near
|
||||
Y=20.770, and then its collision-backed initial slope. Four WASD targets are
|
||||
reached; all eight movement samples are grounded and browser errors are zero.
|
||||
Movement completion is 8.554469 m; the later post-release settled screenshot
|
||||
snapshot is 8.876903 m, also grounded. These are separate timestamps, not two
|
||||
route runs. Standard/High use 150% resolution, 16× filtering and authored fill.
|
||||
Held right-drag works without pointer lock, and no overhead obstruction is
|
||||
reported within 40 m. Root reviewed the final entry/step screenshots. The blue
|
||||
exterior background remains visible in side-facing views; broader scenery and
|
||||
the route to Shadoj are not certified by this eight-metre check.
|
||||
|
||||
The same-build graphics fallback selects **Bazil Thredd** in Stockade Cellblock
|
||||
Rush, validates default 150% and High 200%, plus the Forsaken Abbey comparison,
|
||||
with zero errors. Root reviewed the High Stockade capture. The later complete
|
||||
performance audit is green for 106 assets with 60 known exceptions and zero
|
||||
regressions: the earlier transient unrelated Utgarde failure has cleared. This
|
||||
does not retroactively turn the earlier prebuild invocation into a passing run.
|
||||
|
||||
The reviewed build is installed as local `dist`; all 5,967 files match it
|
||||
byte-for-byte. The actual previous dist is preserved in the new exclusive
|
||||
`pre-bounded-raksha-dist-backup` (prior index SHA
|
||||
`76096ccd244c96b8163bd179858f3b25f53f29fc13c0a7a03a2edcf0da948a5e`).
|
||||
Earlier asset/build backups remain intact. Local installation proof is
|
||||
`local-build-install-proof.json`; live and frozen content manifests match at
|
||||
the final check. No remote deployment or full-clear/balance certification is
|
||||
implied.
|
||||
|
||||
Final evidence paths under this review directory:
|
||||
|
||||
- `raksha-route/source-anchored-v2/`: fresh bake, exact geometry/link/source
|
||||
preservation and runtime graph fixtures.
|
||||
- `raksha-final-gameplay/qa-report.md` and `frames/`: ordinary controls,
|
||||
graphics settings, source-floor/camera rays and frozen build identity.
|
||||
- `graphics-fallback-final/`: selected Stockade boss/settings and screenshots.
|
||||
- `source-anchored-navigation-promotion-proof.json`,
|
||||
`bounded-navigation-content-proof.json`, `local-build-install-proof.json`:
|
||||
guarded asset/content/build installation identities and backups.
|
||||
- `release-check-final.log`: final repository text hygiene, including untracked
|
||||
files. The check passed across 81 changed paths after the final documentation
|
||||
update.
|
||||
@@ -0,0 +1,85 @@
|
||||
# Utility hit extension audit — 2026-10-06
|
||||
|
||||
## Result
|
||||
|
||||
The exact WoW 3.3.5a single-rank Shield Bash (72), Kick (1766), and Pummel
|
||||
(6552) can share the existing ordinary-creature **full-block** result. The
|
||||
binding is intentionally exact to the selected playable row, source profile,
|
||||
class, rank, source effects, and projected effect list. It does not add miss,
|
||||
dodge, parry, or mechanic-resist rolls. Those outcomes remain on the current
|
||||
effect path until the runtime carries the source inputs needed to calculate
|
||||
them faithfully.
|
||||
|
||||
Kick's playable identity is `rogue-kick`; `wow335-rogue-kick` is its raw
|
||||
generated source-chain identity. The catalog merge must retain the source
|
||||
Kick's pure five-second interrupt rather than merge the legacy prototype's
|
||||
damage and second interrupt. Pummel's selected row is the level-38 rank, so
|
||||
the contract does not permit it before its source unlock. Shield Bash remains
|
||||
the only selected rank in its chain and retains its 29703 trigger alongside
|
||||
its six-second interrupt.
|
||||
|
||||
## Source proof
|
||||
|
||||
The local `wow335a/Data/patch-A.MPQ/DBFilesClient/Spell.dbc` records for IDs
|
||||
72, 1766, and 6552 share `DmgClass=2` (melee), physical `SchoolMask=1`,
|
||||
`Attributes0=327696`, `Attributes3=8`, and `Attributes7=0`. `Attributes3=8`
|
||||
is `SPELL_ATTR3_COMPLETELY_BLOCKED`. The relevant custom-attribute bits
|
||||
`SPELL_ATTR0_CU_DIRECT_DAMAGE` (`0x00000100`) and
|
||||
`SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET` (`0x00020000`) are both clear in
|
||||
the pinned core: `SpellInfo::Initialize` starts `AttributesCu` at zero, and
|
||||
the active custom-attribute update SQL contains no rows for these three IDs.
|
||||
This proves only those two custom bits, not the complete custom word.
|
||||
|
||||
The exact effect slots are:
|
||||
|
||||
| Spell | Source effects | Selected projection |
|
||||
| --- | --- | --- |
|
||||
| Shield Bash 72 | Effect 68, mechanic 26, target A 6; effect 64, target A 6, trigger 29703 | Interrupt 6,000 ms; trigger spell 29703 |
|
||||
| Kick 1766 | Effect 68, mechanic 26, target A 6; second slot empty | Interrupt 5,000 ms |
|
||||
| Pummel 6552 | Effect 68, mechanic 26, target A 6; second slot empty | Interrupt 4,000 ms |
|
||||
|
||||
These signatures are also present in `src/game/wow335AbilityData.generated.json`
|
||||
and are locked in `src/game/enemyUtilitySpellBlocking.ts`. `SpellInfo.cpp`
|
||||
identifies effect 68 as `SPELL_EFFECT_INTERRUPT_CAST`; `SpellEffects.cpp`
|
||||
dispatches it to `EffectInterruptCast`. It is not a direct-damage effect.
|
||||
|
||||
The pinned AzerothCore `Unit::MeleeSpellHitResult` in
|
||||
`../wow-pvt-server-backups-2/azerothcore-wotlk/ElunaTrinityWotlk/src/server/game/Entities/Unit/Unit.cpp`
|
||||
explains why the source proof does not justify the whole table:
|
||||
|
||||
- It checks `MeleeSpellMissChance` first. Attribute 7 bit `0x02000000`
|
||||
(`SPELL_ATTR7_CANT_MISS`) is clear for all three records, so they can miss.
|
||||
- It adds `GetMechanicResistChance` next. The interrupt effect's mechanic is
|
||||
26; the target's `SPELL_AURA_MOD_MECHANIC_RESISTANCE` can resist it.
|
||||
- It then considers dodge, parry, and block. Melee attacks can block; casting
|
||||
or controlled defenders lose active avoidance/block; attacking from behind
|
||||
disables parry/block absent hit-direction immunity. Creature no-dodge,
|
||||
no-parry, and no-block flags and `SPELL_AURA_IGNORE_COMBAT_RESULT` also
|
||||
alter eligibility.
|
||||
|
||||
The generated defense projection currently omits `Attributes7`, while the
|
||||
utility resolver has no exact mechanic-resistance, miss-chance/weapon-skill,
|
||||
or complete target-state input for these spells. Consequently, a generic
|
||||
Magic miss/resist roll or guessed melee miss/dodge/parry values would not
|
||||
match this source. The implementation keeps those outcomes gated and
|
||||
resolves only the already modeled block result.
|
||||
|
||||
## Runtime boundary and verification
|
||||
|
||||
`enemyUtilitySpellBlockAbilityContract` binds the policy to the selected
|
||||
ability ID (including the public Kick identity), class, exact source, DBC
|
||||
rank, defense metadata, and full projected effect signature. It reconstructs
|
||||
only the audited known custom-bit evidence when the generated row omits it;
|
||||
conflicting explicit metadata fails closed. `resolveNpcUtilityBlockResult`
|
||||
then restricts the check to player/party casters and ordinary source NPCs,
|
||||
and asks the existing defender model for a physical melee block result with
|
||||
miss, crit, dodge, and parry disabled. A block suppresses all utility effects
|
||||
while preserving the accepted cast's cost/cooldown path. Player and party
|
||||
effect application both consume that blocked result.
|
||||
|
||||
Validation: `npx vitest run src/game/enemyUtilitySpellBlocking.test.ts
|
||||
src/game/wow335InterruptUtilityBlocking.integration.test.ts` passes 13 tests
|
||||
across two files. The unit cases verify the three exact source/projection
|
||||
contracts, selected-rank identity, and mismatch rejection. The integration
|
||||
cases cover blocked player and companion Kick/Pummel casts and ensure the
|
||||
interrupt effect is not applied on a full block.
|
||||
@@ -0,0 +1,130 @@
|
||||
# WoW 3.3.5 Hunter Deterrence source audit — 2026-10-06
|
||||
|
||||
## Result
|
||||
|
||||
This is the dated pre-integration audit. The selected catalog row, five-aura
|
||||
player/companion package and guarded hit resolution are implemented in the
|
||||
[October 7 continuation](DETERRENCE_INTEGRATION_2026-10-07.md). Missing-runtime
|
||||
statements below describe the October 6 source-audit boundary.
|
||||
|
||||
Spell 19263 is a five-second, self-targeted, aura-only source row. Its linked
|
||||
`spell_linked_spell` aura 67801 is part of the same defensive package. The
|
||||
source contract in `src/game/wow335Deterrence.ts` accepts that exact parent,
|
||||
child, and link signature and fails closed on profile or sibling drift. It
|
||||
does not import the ability or resolve combat outcomes.
|
||||
|
||||
## Client and linked-row evidence
|
||||
|
||||
The read-only WoW 3.3.5a `Spell.dbc` is
|
||||
`../wow-pvt-server-backups-2/wow335a/Data/patch-A.MPQ/DBFilesClient/Spell.dbc`,
|
||||
SHA-256
|
||||
`57011d528fd66cf39f5ab6fb168e389ab9e4cc1b8050f7201a54239d489b415c`.
|
||||
`Spell.dbc` has 234 fields, so the parsed field shift is zero. Duration index
|
||||
28 resolves to 5,000 ms in the pinned `SpellDuration.dbc` at
|
||||
`../LadiksMPQEditor/client-current/patch-S/DBFilesClient/SpellDuration.dbc`,
|
||||
SHA-256
|
||||
`eeae44ef0185924f3d6ec57ab2701c66566db86e51ab0bae017a9449126eb3a`.
|
||||
|
||||
Raw aura values below show the parsed DBC base-points value (the raw field plus
|
||||
one). All listed effects are `APPLY_AURA`, target A 1, target B 0, mechanic 0,
|
||||
radius 0, period 0, and misc value 0. No effect has a triggered spell.
|
||||
|
||||
| Spell row | Attributes 0–7 | Damage class | School | Duration | Effects |
|
||||
| --- | --- | ---: | ---: | ---: | --- |
|
||||
| 19263 Deterrence | `[327696, 16, 0, 0, 0, 0, 0, 0]` | None (0) | 1 | 5,000 ms | `47:+100`, `287:+100`, `25:0` |
|
||||
| 67801 Deterrence | `[328080, 16, 0, 0, 0, 0, 0, 0]` | None (0) | 1 | 5,000 ms | `288:+100`, `185:-100` |
|
||||
| 65871 Deterrence | `[327696, 0, 0, 0, 0, 0, 0, 0]` | None (0) | 1 | 5,000 ms | `47:+100`, `287:+100`, `25:0` |
|
||||
|
||||
The pinned read-only AzerothCore data row is
|
||||
`(19263,67801,2,'Deterrence')` in
|
||||
`../wow-pvt-server-backups-2/azerothcore-wotlk/data/sql/base/db_world/spell_linked_spell.sql`.
|
||||
The selected core defines type 2 as `SPELL_LINK_AURA` in
|
||||
`src/server/game/Spells/SpellMgr.h`. `SpellMgr::LoadSpellLinked` stores this
|
||||
under the Aura link key, and `Aura::HandleAuraSpecificMods` applies 67801 to
|
||||
the same target through the original caster when 19263 is added. On removal, the core removes
|
||||
the linked 67801 aura from that target and caster. The link is an aura
|
||||
relationship, not a Spell.dbc trigger effect.
|
||||
|
||||
Spell 65871 is a same-name DBC row, but it is not the selected package: its
|
||||
Attributes1 differs, it has no SkillLineAbility row, and no `spell_linked_spell`
|
||||
row references it. Spell 19263 is the only one of these rows listed on
|
||||
SkillLineAbility skill line 51. That source metadata does not establish how the
|
||||
current HealerMan catalog exposes or learns the spell. The generated Hunter
|
||||
catalog currently contains no 19263 entry.
|
||||
|
||||
## Pinned core behavior
|
||||
|
||||
Historical core behavior is pinned to read-only AzerothCore
|
||||
`e822d718322289dd036fb2daf8867ba41283bf9a`; the link row above comes from its
|
||||
base world SQL. The active project and generated data remain authoritative for
|
||||
implementation.
|
||||
|
||||
- Aura 47 is `SPELL_AURA_MOD_PARRY_PERCENT`. Its player aura handler enables
|
||||
parry and updates the player's parry percentage. The 19263 effect contributes
|
||||
+100 to that aura type; the actual attack result still depends on the
|
||||
defender's parry capability and the incoming attack path.
|
||||
- Aura 287 is `SPELL_AURA_DEFLECT_SPELLS`. The pinned `Unit::MagicSpellHitResult`
|
||||
and `Unit::MeleeSpellHitResult` check it for Magic-class spells and ranged
|
||||
damage-class spells. Deflection is checked after miss/resist and requires the
|
||||
defender not to be stunned. The attacker must be in the defender's front arc
|
||||
unless the target has Aura 288. The linked 67801 supplies that Aura 288, so
|
||||
the complete 19263 package does not retain a frontal-facing requirement.
|
||||
Ordinary ranged weapon auto attacks do not enter these spell deflection
|
||||
checks; linked Aura 185 changes their ranged miss chance separately.
|
||||
- Aura 25 is `SPELL_AURA_MOD_PACIFY`. Its amount is zero, but the aura handler
|
||||
still sets the pacified unit flag. The pinned `AttackerStateUpdate` returns
|
||||
for a pacified unit, and spell casts with `PreventionType=PACIFY` are rejected.
|
||||
- Aura 185 is `SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE`, not a disarm aura.
|
||||
On the target, its -100 modifier raises the attacker's ranged miss chance by
|
||||
100 percentage points in `Unit::GetUnitMissChance`. It applies to ranged
|
||||
weapon attacks and ranged-damage-class spells, subject to each spell's own
|
||||
hit attributes.
|
||||
- The parent is DamageClass None, has SchoolMask 1, Dispel 0, Mechanic 0, and
|
||||
contains only self-targeted aura effects. Its own application is not an
|
||||
incoming Magic, melee, or ranged hit. Its triggered-spell fields are zero;
|
||||
67801 comes from the separate linked-aura row.
|
||||
|
||||
Relevant pinned paths are `src/server/game/Spells/Auras/SpellAuraDefines.h`,
|
||||
`SpellAuraEffects.cpp`, `SpellMgr.cpp`, and `Auras/SpellAuras.cpp`, plus
|
||||
`src/server/game/Entities/Unit/Unit.cpp` and `src/server/game/Spells/Spell.cpp`.
|
||||
The enum and consumer paths establish the raw aura roles and gates; they do not
|
||||
provide a complete simulator hit table.
|
||||
|
||||
## HealerMan boundary
|
||||
|
||||
Generic WoW aura conversion already recognizes Aura 47 as a parry stat and
|
||||
Aura 25 as a pacify tag. The incoming player and companion hit paths consume
|
||||
parry from target-local aura stats. No current Hunter Deterrence definition
|
||||
applies those auras, because 19263 is absent from the generated Hunter catalog.
|
||||
The existing 67801 contract in `enemyBlockAuras.ts` uses Aura 288 only as an
|
||||
ordinary enemy Creature block input; that is not player/party deflection
|
||||
coverage.
|
||||
|
||||
The normalized enemy attack record carries `spellId`, `damageClass`,
|
||||
`schoolMask`, `attackKind`, and `damageOrigin`, but the generated enemy damage
|
||||
source table does not retain raw `Attributes3`. The pinned
|
||||
`SPELL_ATTR3_ALWAYS_HIT` bit is `0x00040000` and bypasses the deflect hit gate.
|
||||
The current shared incoming result also lacks a distinct deflect stage and does
|
||||
not pass attacker-relative facing or defender stunned state into that resolver.
|
||||
Those missing inputs block a safe generic deflect runtime. An exact adapter
|
||||
would need the active 19263/67801 aura package on the actual defender, the
|
||||
source spell's profile, damage class and raw AlwaysHit attributes, ordinary
|
||||
ranged-auto identity, attacker-facing relation, stun state, and placement after
|
||||
the source miss/resist checks.
|
||||
|
||||
At the start of this source audit, the player autoattack scheduler lacked the
|
||||
`pacified` aura gate already present in the party action loop. The shared runtime
|
||||
continuation now gates player main/offhand and owned Scout ranged autos on active
|
||||
actor-local pacify. Actual accepted-aura scheduler fixtures cover that gate;
|
||||
they do not prove a Deterrence cast. A future 19263 import still needs the linked
|
||||
aura lifetime and the missing deflect inputs above. This source helper records
|
||||
exact rows and linkage only. See
|
||||
[the integration report](CONTROL_UTILITY_CONTINUATION_2026-10-06.md).
|
||||
|
||||
## Focused verification
|
||||
|
||||
`src/game/wow335Deterrence.test.ts` verifies the parent/child signatures and
|
||||
the exact type-2 aura link. It rejects another profile, the same-name 65871
|
||||
duplicate, changed aura siblings, changed duration, and missing or extra link
|
||||
rows. Only this focused helper test was run; no build, live run, or full suite
|
||||
was part of the scoped source audit.
|
||||
@@ -1,5 +1,7 @@
|
||||
# WoW dungeon texture and lighting review — 2026-10-06
|
||||
|
||||
The [October 7 continuation](WOW_ENVIRONMENT_QUALITY_CONTINUATION_2026-10-07.md) supersedes the Utgarde Pinnacle and Shadowfang visual identities in this historical pass and adds the rendered native-terrain pilot and source-lighting investigation.
|
||||
|
||||
## Coverage and player access
|
||||
|
||||
Three GPT-6 Luna agents at extra-high reasoning reviewed texture imports,
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
# WoW environment quality continuation
|
||||
|
||||
The shared RoM quality controls also work in WoW: 16× texture filtering, High shadows, High ambient fill, and 200% render resolution. This continuation improves source UV preservation in Utgarde Pinnacle and Shadowfang Keep and produces a rendered, source-backed Zul'Farrak terrain pilot. Original-client WoW baked lighting remains diagnostic evidence, not a production replacement.
|
||||
|
||||
## Accepted local visual packages
|
||||
|
||||
| Dungeon | Previous visual bytes | Accepted visual bytes | SHA-256 |
|
||||
| --- | ---: | ---: | --- |
|
||||
| Utgarde Pinnacle | 59,344,144 | 29,792,924 | `bffaf126d0f65b2863d54418b1889f9e62adf5562491c3e74e6a5c5e05664844` |
|
||||
| Shadowfang Keep | 8,566,408 | 8,803,744 | `6c69f739383fc98f440f181785c4f27c7f39cfcb18d9a8b5ac8282262070bf75` |
|
||||
|
||||
Both assets are installed in local public packages. The publisher updated all four matching visual descriptors per dungeon and regenerated the campaign catalog. All 20 Utgarde and 26 Shadowfang collision/navigation files remained unchanged. No deployment was performed.
|
||||
|
||||
The optimizer now uses explicit 16-bit positions and UVs in its final meshopt packing. It avoids automatic texture resizing/compression and mesh simplification before the separate KTX2 encoder. Utgarde's recipe additionally preserves spatial boundaries by disabling global flattening, joining, welding and offline instancing. Existing production runtime instancing still applies.
|
||||
|
||||
Nine views per dungeon (entrance, middle encounter, final encounter, each forward/side/reverse) were compared after the same production material preparation, static instancing and visibility setup. Accepted candidates have exactly the same measured draw and triangle counts as their respective previous assets in all nine views. Utgarde retains 1,780 instance batches / 11,055 instances / 1,383 visibility cells; Shadowfang retains 78 visibility cells. These are sampled asset-render checks, not full encounter or mobile performance certification.
|
||||
|
||||
Utgarde's static prebuild estimate remains 16,277 calls. Its repeated-mesh savings estimate increased from 14,018 to 14,695; the one existing budget entry was updated after the runtime comparisons above. The overall 106-asset performance audit passes.
|
||||
|
||||
All 916 remaining source-comparable images retain their original dimensions. Utgarde's 629 shared KTX2 payloads are byte-identical to the previous package. Four old entries were accounted for: two exact decoded image duplicates were deduplicated, and two solid-color images were folded into correct linear material factors on their active triangles. Shadowfang retains all 287 KTX2 payloads byte-for-byte.
|
||||
|
||||
Relative to original staged source, Utgarde's added UV-degenerate area falls from 122.17 to 58.44 m²; added rank-collapse area falls from 107.30 to 2.14 m². Shadowfang's added UV-degenerate area falls from 8.38 to 0.47 m², while rank-collapse area changes from +0.35 to −6.52 m². Small residuals remain: +105 UV-degenerate triangles in Utgarde and +7 in Shadowfang. This is an improvement, not a claim of perfect source topology.
|
||||
|
||||
Global-join Utgarde alternatives were rejected: they rendered roughly 7.6–8.1 million triangles in the sampled views, compared with about 1.5–3.4 million for the retained spatial layout. A smaller file alone was insufficient.
|
||||
|
||||
Evidence: `artifacts/dungeon-pipeline/wow-continuation-published-audit.{json,md}`, candidate reports and hotspot audits under `artifacts/dungeon-pipeline/`, and before/after captures under `artifacts/playtest/wow-environment-quality/continuation/`.
|
||||
|
||||
## Zul'Farrak native terrain pilot
|
||||
|
||||
The cached ADT/BLP source has terrain textures and blending data, but the exported OBJ and staged GLB contain only zero UVs and flat `ADT_Terrain` material. This proves conversion loss rather than an authored flat surface.
|
||||
|
||||
The entrance tile `TanarisInstance_30_29.adt` matches the winning `patch.MPQ` bytes exactly: SHA-256 `8ad75da6b9485d61537ee3b451c08b79e25b1b1b2c7d4e91c8e57ad0a65ff75b`. Provenance lock and source snapshot both identify `3.3.5a-Ascension`; a diagnostic helper's earlier hardcoded Epoch label was corrected. All 256 chunks, 746 layers and 490 alpha maps were recovered, with zero missing maps. All 1,024 disjoint geometry streams passed hash/size checks. The recovered tile has 37,120 vertices and 65,536 triangles; source-to-staged world-position error is below 0.000277 m. This tile has no holes.
|
||||
|
||||
`src/scene/wowTerrainMaterial.ts` consumes an explicit native WoW contract: source provenance, one to four layers, normalized chunk UVs, 8× diffuse repetition and linear RGB overlay weights. The base receives the residual weight. Classic sequential opacity maps are converted by the decoder; the shader does not normalize them or treat tile alpha as surface opacity. Color textures repeat in sRGB; blend weights clamp in linear space. Missing or incompatible contracts fail closed. Shared material cloning, filtering and disposal include auxiliary textures.
|
||||
|
||||
The complete diagnostic GLB is `artifacts/dungeon-pipeline/zulfarrak-30-29-native-terrain-pilot.glb`, 29,350,772 bytes, SHA-256 `864d8885413808f46c3397243ecf3a7bf21477b54e7fb8ff1853514243c7794d`. It preserves the original shipping binary prefix and all old images byte-for-byte, replacing only the selected flat terrain node with 256 disjoint chunks. New source textures are lossless PNG and new geometry is float32/uint16. It deliberately avoids solid-image pruning, which can discard a weight image whose red channel is constant while its other channels vary.
|
||||
|
||||
Nine prepared-runtime preview views passed with no browser errors. The entrance ground is visibly textured; its height is 0.0021 m below the authored footing versus 0.0074 m above in the old quantized terrain. Entrance forward rendering changes from 718 calls / 1,075,915 triangles to 828 calls / 1,038,795 triangles. Chunk boundaries improve culling but add calls; the largest sampled call increase is 225. The pilot has not been shipped. Other Zul'Farrak tiles retain their current fallback, and native terrain shadows/colors, water and original-client lighting are outside this pilot.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
Source bundle: `artifacts/playtest/wow-terrain-recovery/zulfarrak-30-29-chunk-slices-ascension-provenance-2026-10-06/`. Regenerate sidecars with `build-wow-adt-terrain-tile.mjs`; package the source-pinned diagnostic with `pack-wow-adt-terrain-pilot.mjs`. The running local preview accepts the pilot through `visualOverride` and `runtimePreparation=1`.
|
||||
|
||||
All 21 cached Zul'Farrak ADTs and their 24 texture references are available for further recovery. Pit of Saron's nine cached ADTs and eight textures are also available, but strict decoding currently recovers only 2,122 of 3,766 alpha maps across those tiles; unsupported spans remain gated. Do not extrapolate the one clean pilot to fleet completeness.
|
||||
|
||||
## Original WoW baked lighting
|
||||
|
||||
`wow-native-wmo-audit.mjs` inventories source-matched WMO roots/groups, MOCV colors, MOLT lights and MOLR references. Stockade has 97 local-light records and exact color correspondence for all 55,730 exported OBJ vertices. Raw and documented-fixup diagnostic sidecars are preserved. Shadowfang has 176 light records, but its color correspondence is incomplete; no guessed color sidecar was emitted.
|
||||
|
||||
Original WMO color alpha is lighting data, not opacity. Gamma/composition, portal attenuation, exact byte quantization and a disputed MOHD flag still need a validated consumer. These records have not been turned into Three.js point lights or production vertex colors. Evidence and primary source references are in `artifacts/dungeon-pipeline/wow-native-lighting/README.md`.
|
||||
|
||||
## Validation
|
||||
|
||||
- 65 focused scene/material tests and 21 focused pipeline/native-source tests pass.
|
||||
- App TypeScript and isolated preview TypeScript checks pass. The normal production build, KTX2/performance audits, precompression and release-bundle verification pass.
|
||||
- Fresh production Options smoke uses entry `index-DIqor-kq.js`, built `2026-10-07T03:55:23.055Z`. Stockade Cellblock Rush selected **Hamhock**. 16× filtering, High shadows, High ambient fill and 200% resolution passed; 200% carried into Forsaken Abbey. No page errors. Options, WoW and RoM screenshots were visually inspected. Evidence: `artifacts/playtest/graphics-options/run-wow-continuation-current-build-2026-10-06/`.
|
||||
- Asset screenshots prove the bounded visual changes; this pass does not certify encounter clears or broad class balance.
|
||||
- `npm run release:check` passes, including untracked files.
|
||||
|
||||
The initial 54-dungeon review remains in `docs/WOW_ENVIRONMENT_QUALITY_2026-10-06.md`; its earlier package sizes and captures are historical evidence. This continuation supersedes the two accepted visual package identities above.
|
||||
Reference in new issue
Block a user