2.5 KiB
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.