Files
healer-man/docs/ROM_WARLOCK_SOURCE_FOLLOWUP_2026-10-02.md
T

48 lines
7.8 KiB
Markdown

# 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](ROM_WARLOCK_REMAINING_CONFLICTS_AUDIT.md); 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`: `6148199bcd1484ba1a122a6db5e2b3c2f2a161402bfe67fc67eb53f55fc6cfa3`
- `magicCollect`: `4aae19865cb07b30f99945aa7319a0096db244ff5e5b4b5d902fc6889474f501`
- `magicObject`: `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.