7.8 KiB
RoM Warlock source follow-up — 2026-10-02
This bounded review checks unresolved Warlock links against the local RuneWaker data snapshot, Lua callbacks, and available server consumers. It does not change runtime code, shared audits, or the backlog. Current Chronicles of Arcadia behavior remains as recorded in the current-CoA audit; local RuneWaker values below are version-qualified and are not substituted into current-CoA mode.
Version anchor and scope
The generated catalog identifies its source as the RuneWaker snapshot. Its learnMagic, magicCollect, and magicObject SHA-256 values match F:/Projects/Runewaker/Resource/data/learnmagic.db, magiccollectobject.db, and magicobject.db respectively:
learnMagic:6148199bcd1484ba1a122a6db5e2b3c2f2a161402bfe67fc67eb53f55fc6cfa3magicCollect:4aae19865cb07b30f99945aa7319a0096db244ff5e5b4b5d902fc6889474f501magicObject:52af13a2d8cfa9a66d4caa2d3c38832edc232f058995a64ef8135a6b82e43691
The review followed learned-skill rows, ordered Rand/Self_Buff/Self_Skill checks, linked component records, CheckUseLua/EndUseLua/PlotName values, and the corresponding Lua functions. Native consumers were checked in F:/Projects/Runewaker/SourceCodeVS2019 for check gating, hit phases, callback order, and timed-magic fields. Relevant Lua script is F:/Projects/Runewaker/Resource/luascript/02551.lua.
Findings
Breathing Control 498634 and Deep Breathing Control 499870 — no new local trigger contract
Both are learned Warlock/Warrior (class pair 9-1) passives in this snapshot: 498634 is level 30, key 545883, prerequisite 490053; 499870 is level 60, key 546843, prerequisite 490053. Their passive collections contain no ordered check groups, linked effect components, or callback binding for the described automatic Enraged proc or heal.
I checked the local collections for Psychic Arrows 497957, Warp Charge 497958, Weakening Weave Curse 497959, Soul Trauma 498550, Puzzlement 498553, Heart Collection Strike 498545, Surge of Malice 497966, and Enraged 490492. No bound check or component references 498634, 499870, or a related heal/reset child. The Self_Skill 100 check in 497957 instead references 498694. Linked MagicObject attack/hit fields have no active IDs for these passives; the default OnAttackMagicRate=10 with ID 0 is not an enabled event or a 10% roll. No source-complete RuneWaker trigger candidate was found. This does not resolve the probability, event phase, extra Focus amount, or current-CoA heal trigger already listed in the current-CoA audit.
Mind Shield 498648 / Ring of Comfort 498641 — local reset is guaranteed after a landed Urgent Heal
The learned pair is Warlock/Priest (9-5). Local Urgent Heal 491147 has an ordered Self_Skill check with RandValue=100 for learned Mind Shield 498648, followed by component 621391. Native Check_MySkill first searches the learned-skill slots for the exact ID, then applies rand() % 100 >= RandValue; with 100 the roll always passes once 498648 is learned (MagicProcess.cpp:5365-5392).
Component 621391 is a RunPlot for un_skill_498648 in 02551.lua:242. The function directly calls Lua_CDtime_set(OwnerID(), 498641, 0) and contains no random call. Native Magic07_RunPlot invokes PlotName only for HIT or CRITICAL results, then invokes EndUseLua for each result (MagicProcess.cpp:4719-4785). Therefore this local RuneWaker binding resets Ring of Comfort cooldown on each qualifying landed Urgent Heal result while Mind Shield is learned. The adjacent Lua comment mentions 18%, but executable code has no such probability. This is a complete local-only reset contract, not evidence for the current-CoA “chance” clause: current CoA still omits the probability, so do not carry the guaranteed local reset into current-CoA mode. The local Mind Shield passive does not quantify the Defense Net defense increase. The local Ring of Comfort heal component 621319 has no linked Psi addition; current CoA's +1 Psi remains version-specific.
Learned local 499869 is Mind Transference, not current-CoA Psychic Warrior or Enraged
The local learnmagic.db contains a learned 499869 row: Warlock/Warrior (9-1), level 70, key 546844, prerequisite 499868, save slot 25. Its omission from the generated catalog does not mean it is absent or unlearnable. Local 499869 is named Mind Transference; local passive 499868 is Enhanced Mind Transference. Keep this acquired local active separate from current CoA Psychic Warrior 499868 and Enraged 499871.
Local 499869 links component 623411, whose RunPlot is Un_skill_499869 and whose EndUseLua is Add_SoulP_1. On a HIT or CRITICAL result, the Lua function computes floor(current Rage / 20), subtracts 20 Rage per conversion, and adds that many Soul Points; the enhanced passive's local tooltip changes the base 35-Rage rate to 20 Rage. Native RunPlot separately invokes EndUseLua for each returned result, where Add_SoulP_1 attempts one additional Soul Point, subject to its existing suppression when buff 501571 or 501572 is present (02551.lua:19-27, 611-623; MagicProcess.cpp:4719-4785). This is a source-complete RuneWaker-only candidate if that older local class mode is explicitly selected. The reused number and behavior are incompatible with the current-CoA identity and must not be used to fill a current-CoA gap.
End of Thought 498699 — pre-hit threshold callback is live; periodic child consumer is not located
The local learned row is Warlock/Rogue (9-3), level 45, key 545894, prerequisite 490306—not the current CoA Warlock/Priest pairing. Local End of Thought is instant, has a 15-second cooldown and source range 200 (catalog scale 20), and costs 3 Soul Points (MagicSpellCostType value 15 is EM_MagicSpellCostType_SoulPoint in ObjectStruct.h:1286-1304).
Damage component 621435 binds EndUseLua=un_skill_498699_check. The callback reads the target's current HP percentage and applies caster buff 621436 for 4 seconds when HP is at or below 35% (02551.lua:340-350). Native Magic00_AddHP invokes EndUseLua before classifying miss/absorb/no-effect results and before Global::AddHP applies the pending HP change (MagicProcess.cpp:2926-2930, 2940-2965, 3000-3007). This proves the callback checks pre-hit HP; it ignores the result argument, so the threshold buff can be applied even when that component later resolves as a miss, absorb, or no-effect.
Buff 621436 encodes OnTimeMagic_Magic=498784 and OnTimeMagic_Time=1. Hidden child collection 498784 has component 621437, whose RunPlot calls un_skill_498699 to add one Soul Point. The one-second child cadence is encoded in the data, but the available C++ tree contains no runtime use of OnTimeMagic_Magic/OnTimeMagic_Time; these fields appear in ObjectStruct.h and the database reader ObjectStructEx.cpp only. Thus the callback and threshold are source-proven, while periodic execution is not. Do not treat the intended interval or repeated Soul Point gain as a live local contract, and do not transfer this pair-mismatched local timing into current-CoA mode.
Handoff
The source-complete local candidates are Mind Shield's Ring reset and the learned 499869 conversion; both belong only to the RuneWaker snapshot and supply no current-CoA candidate. End of Thought has a live pre-hit threshold hook but its timed child lacks a located native consumer. Breathing Control and Deep Breathing Control still lack a linked local trigger contract. No runtime edits are proposed by this source-only follow-up.
The Champion CheckData cross-check produced no new chance contract beyond the already documented Forge Effect 498590 and Dark Energy Strike 498599 records in ROM_CHAMPION_SOURCE_FOLLOWUP_2026-10-02.md. Druid/Scout 499935 is not duplicated here; its two existing reports already identify native healing inputs as the remaining blocker.