Files
healer-man/docs/ROM_WARDEN_REMAINING_MECHANICS_AUDIT.md
T

6.2 KiB
Raw Blame History

RoM Warden remaining mechanics audit

Revival (local 499542): source formula found

The RuneWaker source snapshot resolves the local Revival chain despite CoA reusing skill ID 499542 for a different Rogue/Warden skill. Local MagicCollect 499542 references MagicObject 623078; its raw magicobject.db PlotName bytes at record offset +0x284..+0x2c3 decode to un_499542 (the catalog exporter does not retain PlotName). In F:\Projects\Runewaker\Resource\luascript\02709.lua:49-53, that function counts component 623072, passes the count as MagicLv when self-casting child 499543, then clears the stack buff. The local skill tooltip caps the stack at ten. The Lua function has no positive-stack guard: with MagicLv zero, the source formula still begins at 10% unless an upstream cast condition prevents this function from running.

The child MagicCollect 499543 references MagicObject 623071. Its raw source fields are MagicFunc=AddHP, AtkType=HP, AtkCalType=8 (FixPer), DmgPower=10, DmgPower_SkillLVArg=50, FixValue=0, and random range zero. FixDmg_SkillLVArg=5 is not used by the FixPer branch. The enum value 8 means FixPer (F:\Projects\Runewaker\SourceCodeVS2019\Libraries\Union\RoleData\ObjectStruct.h:3965-3977). The RuneWaker server first calculates OrgPower = DmgPower + DmgPower × DmgPower_SkillLVArg × MagicLv / 100 (F:\Projects\Runewaker\SourceCodeVS2019\Server\NetGameServer\MainProc\MagicProc\MagicProcess.cpp:2302). Its FixPer branch keeps that as PurePower and converts it to Target.MaxHP × PurePower / 100 (MagicProcess.cpp:2751-2754, 2777-2795). Because the Lua passes stack count as MagicLv, the normal requested heal is:

targetMaxHP × (10 + 5 × stackCount) / 100

At zero, one, and ten stacks, that is 10%, 15%, and 60% of max HP. This FixPer branch does not use weapon damage, attack speed, MagicPow, or critical power. The target is self, and positive CalMagicDMG input is returned unchanged (F:\Projects\Runewaker\SourceCodeVS2019\Libraries\Union\RoleData\RoleAttr.cpp:951-955). The helper in romWardenRevivalRuntime.ts captures the normal amount before overheal.

The player and generated-companion casts now use the source formula and only their own unexpired 623072 charges. The generated catalog retains the supplemental level-60 499544 learn row for the exact Rogue-primary/Warden-secondary build, sourced from key item 546772 and prerequisite 499542. Learned 499544 arms actor-owned state 623079 for 900 seconds; its 499545 chain grants a 15-second, max-ten 623072 charge and applies component 623527's six-second +20 physical-dodge-rate aura only after a normal noncritical hit causes positive post-absorb HP loss and leaves that actor alive. Authored player and party incoming-hit paths carry this event boundary. The direct damagePlayer adapter lacks an outcome payload, so that path treats positive post-absorb HP loss as a normal hit; this is an explicit simulator approximation, not a source claim about environmental or other callers.

The separate 620302 HolyHeal rider remains unwired because the simulator does not expose validated native MND/MPow/heal-rate inputs. The source's type-200 magical-dodge contribution also remains unwired because there is no separate magical-dodge resolver. Do not synthesize neutral-stat healing rates or merge magical dodge into physical Dodge. Exact state ownership, hit gates, and focused regression detail are recorded in the Revival state-chain audit.

The local 499542/623078 to un_499542 to 499543/623071 identity chain is sourced from the local RuneWaker snapshot. Do not import CoA's unrelated Rogue/Warden Low Blow behavior from the reused ID.

Weak Point Strike (local 494043): proc chance still absent

The RuneWaker row for local 494043 points to damage components 620294 and 620295. They hold the main hit and bonus-hit formulas; neither component carries an on-attack-trigger ID, and the local 494043 component data exposes no proc rate. A search of the local Resource/luascript files found no additional reference defining the chance or trigger. Keep the bonus hit disabled until source supplies its chance and the event that checks it.

Current CoA reuses 494043 for Rogue/Warden Blood Hound. That different name and conditional behavior does not source the local RuneWaker Weak Point Strike chance. Do not bridge the proc by ID or borrow the CoA condition/value.

Tough Oak (Warden/Mage): defense inputs and application order still absent

Current CoA describes +60% pet Physical Defense, while local RuneWaker component 504600 describes +5% physical-defense-percent. The simulator's generic summons have no Physical Defense stat or corresponding mitigation formula. The CoA page does not provide a pet baseline/scaling rule or defense-to-damage conversion, so the +60% cannot safely be translated into armor or damage reduction. The existing Tough Oak source and runtime review records the pet-scope, Damage Transfer/absorb ordering, and local-versus-CoA pet-skill ID gaps.

Before implementing the rider, source or define each of these separately: (1) eligible pet/summon scope; (2) base pet Physical Defense and its scaling; (3) the Physical Defense-to-damage formula; and (4) whether transferred damage passes through pet defense before pet absorbs. Keep the local +5% component separate from the current CoA +60% behavior.

Focused validation

The focused Warden state-chain run passed 77 tests across the Revival and Warden suites, and the supplemental 499544 catalog prerequisite assertion passed its filtered check. The source/runtime regressions cover the exact 0/1/10-stack heal amounts, actor-owned charge consumption, state duration/cap, player and companion hit gates, normal versus critical hits, shield absorption, death, and physical-dodge scope. The full player-catalog tests still include two unrelated failures reproduced on clean baseline b16821e9: the Mage/Druid elite unlock sequence duplicates level 25 where the source expects level 30, and Druid/Rogue Speed Catalysis 494023 expects 15 Energy while the existing CoA override provides none. See the state-chain audit for the exact event approximation and native-input limits.