11 KiB
RoM Knight periodic and triggered reference audit
This audit closes the bounded review of triggered references on Knight-primary RuneWaker rows. It distinguishes source data that exists locally from fields the player exporter omits, and records where current combat behavior still depends on missing state or target semantics.
Current runtime correction: Panther's Blessing 493047 follows the current same-name Knight/Rogue passive and restores 10% max HP plus 1% max MP after a resolved dodge. The max-pool basis and whole-point rounding are simulator interpretations; the legacy RuneWaker +2 Dodge child remains suppressed. God's Vengeance is the separate level-50 passive 499934, linked to learned child Punishment 499909. See the Panther runtime note and this audit's current table entries; older source rows below document the legacy conflict.
Source and runtime ownership
The player catalog retains component IDs and trigger spell IDs, but not MagicRunPlot.PlotName. The field exists in F:\Projects\Runewaker\SourceCodeVS2019\Libraries\Union\RoleData\ObjectStruct.h (MagicRunPlot::PlotName); MagicProcess.cpp's Magic07_RunPlot reads that field and calls the Lua function for proc targets. The local F:\Projects\Runewaker\Resource\data\magicobject.db, magiccollectobject.db, and the referenced Resource\luascript\*.lua files are present. scripts/runewaker-pipeline/export-player-catalog.mjs currently does not export the RunPlot name, so the omission is in the generated player record, not evidence that the local scripts are missing. This audit does not expand the exporter into a Lua-runtime implementation.
Generated player source IDs and component payloads are in src/game/romPlayerCatalog.generated.json. Translation and the unsupported generic radius fallback are in src/game/romAbilityCatalog.ts; Knight-specific passive shaping is in src/game/romKnightOverrides.ts; pair-specific Knight and Scout behavior is in src/game/romPriestKnightOverrides.ts. Incoming-hit, periodic, and companion event wiring lives in shared combat/runtime files and needs a separately scoped change.
Knight-primary trigger references
| Parent → child | Local source/script result | Current implementation and disposition |
|---|---|---|
| 490192 → 490469 | Component 500149 triggers on magic-attack rebound during its 30-second shield. Child payload 500213 is Light damage. | Covered by the custom Shield of Discipline path in romAbilityCatalog.ts; complete for this audit. |
| 492935 → 493094 | Component 503192 triggers every 3 seconds for 15 seconds. Child RunPlot is lua_star_ParryState in 01129.lua:120: it checks EM_RoleValue_ParryState == 1, checks buff 503192, then adds buff 503200 (Lua argument 20); if 503192 is absent it cancels 503200. Component 503200 carries +5000 Parry and a 15-second lifetime in the local object data. |
Current runtime applies +5000 Parry for 15 seconds and consumes it after two blocks; the hidden periodic aura is also kept for 15 seconds. The EM_RoleValue_ParryState set/reset condition and the distinct conditional 503200 application are not represented. Prerequisite: map that role-state value and its event lifecycle before wiring the child; do not turn the Lua argument into a duration by assumption. |
| 492939 → 493246 | Component 503207 triggers on timeout after 15 seconds. Child RunPlot calls lua_Dy_DELAnother(503207, 506236) in 01129.lua:518; the helper cancels 506236 only when 503207 is absent. Both local effects are 15 seconds. |
No distinct numeric combat payload is added by the child. Natural expiry aligns; early removal of 503207 and the resulting cleanup of 506236 are not represented. Prerequisite: source-backed buff-removal/timeout event semantics if early cancellation is intended to be observable. |
| 493273 → 491614 | Component 502056 triggers on hit. lua_star_ProtectAlly in 01129.lua:313 reads last damage, the buff owner, and BuffInfoType_Power (PLV), removes 502056, then computes p = 0.40 + 0.008 × PLV; it casts child 491612 on the original buff owner with floor(abs(lastDamage × p / (1 − p))) × 2. |
romPriestKnightOverrides.ts currently uses a fixed 40% one-hit redirect and +20 Parry. This is an active approximation: it does not preserve the buff's PLV or apply the rank-dependent split formula. Prerequisite for a correct shared player/companion implementation: define the source value stored as BuffInfoType_Power for 502056, then carry it through the application and incoming-hit paths in combatStore.ts/partyRuntime.ts; cover it in romPriestKnightPairValidation.test.ts. |
| 499923 → 499910 | Component 623167 triggers every second for 30 seconds. lua_bico_kni_sco_es_70_blood in 02708.lua:257 cancels 623167 whenever owner buff 500871 is absent. |
Superseded by current CoA's matching Knight/Scout passive: +15% received healing and +5% Light/Holy damage while Blood Arrow is active. romKnightScoutBloodPunishment.ts attaches both modifiers to the actual owner Blood Arrow aura, so removal/expiry ends the rider without a separate child timer. The base Blood Arrow still uses the local 30-second, periodic-HP-cost model; CoA toggle/per-ranged-skill cost parity remains open. See docs/ROM_FIVE_MECHANIC_GAPS_2026-10-04.md. |
| 495402 → 497924, 497926 | These are timeout children of the old Leopard Instinct active effects. The local un_495402_cancelbuff RunPlot in 02383.lua:182 cancels old buffs 620144/620141/620142/620143. |
Superseded by current CoA's passive stack behavior. Existing pair handling suppresses the old active effects; do not restore these timeout children. |
| 493047 → 493183 | The local RuneWaker 493183 child is a MagicFunc1 on-hit self-reference. Its tooltip conditions a chance-based +2 Dodge aura on being attacked while Shield of Valor or Shield of Discipline is active, but the numeric chance and required-shield check are absent. | Current CoA's Knight/Rogue row identifies 493047 as Panther's Blessing, a level-45 passive that restores 10% HP and 1% MP on dodge. The exact learned Knight/Rogue passive now triggers from the actual resolved incoming dodge result for the player and generated companions. Because CoA does not publish the percentage bases or a rounding rule, the simulator uses the owner's maximum HP and mana pools and rounds to whole points; each restore is capped to its current pool. The published current row has no rank curve, so these percentages are flat and no scaling is inferred. The legacy 493183 shield-conditioned +2 Dodge child stays suppressed. God's Vengeance is the separate passive 499934. See docs/ROM_KNIGHT_PANTHER_DODGE_PROC_2026-10-02.md. |
| 499934 → 499909 | Current CoA's Knight/Rogue list identifies God's Vengeance as passive 499934, level 50: when Punishment hits a target with exactly four Holy Seal stacks, reset Shadow Step. The local LearnMagic row independently makes child 499909 learnable by Knight/Rogue at level 50 with key item 542123 and prerequisite 499934. Its MagicCollect components match general Punishment 490151's payload; 499909 remains a separate child row rather than an alias of general 490151. | The exporter emits this exact linked child as a second level-50 row. It keeps Punishment's direct damage and ordinary Seal consumption, scales the one hit by the pre-spend Seal count, and removes the retired Seal DoT. Player and generated-companion casts reset only the casting actor's learned Shadow Step (490344) when the exact child lands against its own target with four of that target's Seals. A landed combat event is the runtime's “hits” boundary, including full absorbs; miss/dodge, wrong pair, missing passive/Shadow Step, general 490151, and three/five-stack cases do not reset. Companion AI selects 499909 when it is ready and usable, otherwise retaining its general Punishment fallback. |
| 491606 → 497471 | Parent component 502049 triggers every 2 seconds for 6 seconds. Child RunPlot Dy_KM15_01 exists in 01129.lua:571; it reads MagicPowerLv_SP + 42 and casts 491607 on the owner. MagicCollectObject 491607 is present and names components 502050 and 502051. Component 502050 has Light damage fields damagePower=-20, fixedValue=-0.2; 502051 is the tooltip's damage-reduction aura. |
The periodic damage and reduction component are retained by the catalog override, but the child's actual affected-unit geometry/radius is not established. See the separate radius finding below. |
| 490078 → 490079 | Parent component 502103 triggers every 3 seconds for 18 seconds. Child RunPlot YOYO_JOB6_4_ExpeditionBlessing exists in 02842.lua:236; it advances owner buffs 500140 → 500146 → 500168 → 500169. |
This is the old RuneWaker child behavior, not the current War Prayer result. Current CoA/patch behavior applies a personal Holy Seal stack every 3 seconds; the existing six-pulse runtime follows that current behavior. Do not import the stale four-buff sequence as Holy Seal. |
Holy Light Domain's 10-unit fallback
areaRadius() in romAbilityCatalog.ts matches the tooltip phrase “surrounding targets within range.” Holy Light Domain is self-targeted with catalog range 0.1, so the generic fallback assigns radius 10. The focused romKnightPeriodicRuntime.test.ts currently asserts that radius and verifies the compatibility behavior: targets at x=5 and x=9 receive the effect, while x=12 does not. This is test coverage for the existing approximation, not source evidence for a 10-unit radius.
The child source record exposes effectRange=50 and rangeType=3, but the player export does not preserve a verified conversion of those fields to the runtime's target geometry. The RunPlot confirms the child cast is made on the owner; it does not define the server's affected-unit selection rule. Until a verified interpretation of the child target/range fields is available, leave the radius explicitly unsupported: do not treat 50 as a runtime radius, do not infer a 5-unit radius, and do not map child 497471 to another effect.
Validation
- Focused validation passes:
romCombatMechanics.test.ts,romKnightPeriodicRuntime.test.ts,romKnightOverrides.test.ts,romPlayerCatalog.test.ts,partyAbilityAi.test.ts, andromKnightGodsVengeance.integration.test.ts(77 tests total). The touched Knight Holy Seal semantics case also passes when run alone fromromAbilityCatalogSemantics.test.ts. - The previously reported baseline failures are resolved by matching behavior to current sources: Divine Punishment emits one direct hit plus the seal-scaled vulnerability rather than two damage outputs; current CoA God's Vengeance resets Shadow Step on the linked 499909 Punishment at four Seals, rather than expecting the retired Holy Seal DoT.
- Official source rows reviewed: the current CoA Knight/Rogue list gives 493047 Panther's Blessing (passive, level 45) and 499934 God's Vengeance (passive, level 50); the official 10.6.1 patch notes document Holy Seal's damage/vulnerability behavior and removal of its periodic damage. Shadow Step is local Rogue general 490344, level 28 (official Rogue/Mage list). Panther's Blessing event ownership and the explicit max-pool simulator interpretation are covered in
docs/ROM_KNIGHT_PANTHER_DODGE_PROC_2026-10-02.md.