Files
healer-man/docs/ENEMY_SILENCE_CAST_GATE_2026-10-04.md
2026-10-04 13:13:35 -04:00

22 lines
2.5 KiB
Markdown

# Enemy Silence Cast Gate — 2026-10-04
## Finding
Lady Anacondra's imported spell 8148 is Thorns. The generated Wailing Caverns reference records it as a cast-targeted Nature aura from SmartAI row 4 (`Lady Anacondra - In Combat - Cast Thorns`): `school: nature`, `delivery: melee`, `animation: cast`, and `effect.kind: aura`. The source entry has no `attackKind` or `damageClass`. Since `enemyAttackKind` falls back to `melee` for `delivery: melee`, the previous selection rule (`silenced && attackKind === "spell"`) allowed Thorns to start while Silence was active.
The same Lady Anacondra reference contains spell 9532 Lightning Bolt as a Nature projectile cast from SmartAI row 1 (`Lady Anacondra - In Combat - Cast Lightning Bolt`). Existing active-cast handling already cancels nonphysical casts when Silence takes effect.
## Runtime change
Enemy attack selection now rejects an attack during Silence when its school is nonphysical or its resolved attack kind is `spell`. This uses school and attack kind only for silence eligibility. It leaves shared attack-kind and damage-roll classification unchanged, allows physical melee and ranged attacks, and still suppresses a physical-school attack explicitly classified as a spell.
## Focused coverage
`src/game/enemyCasting.test.ts` uses Lady Anacondra's generated source entries for Thorns 8148 and Lightning Bolt 9532, plus the imported physical melee Tendon Rip. It checks that Lightning Bolt cancels when Silence lands, Thorns neither starts nor resolves over repeated advances in the 8.4-second window, Thorns starts and resolves after Silence expires, physical melee and ranged attacks remain eligible, and physical spells remain blocked. The imported NPC ability data has no separate silence-prevention field; for Thorns it also carries no `attackKind` or `damageClass`, so the test exercises the exact school/delivery ambiguity from source.
The selection test stages a Silence status directly to isolate NPC cast behavior. The separate full Vow of Silence scenario remains the end-to-end validation path for applying the actual player ability and observing its combat result.
## Validation
`node_modules/.bin/vitest run src/game/enemyCasting.test.ts src/game/romPriestChampionRuntime.test.ts src/game/wailingCavernsParity.test.ts` passed: 3 files, 30 tests. Use the direct Vitest binary for this focused workflow; `npm test` invokes the `pretest` loot-generation hook. No build or repository-wide test suite is part of this narrow change.