Files
healer-man/docs/ROM_ROTATION_ADDON_REFERENCE_2026-10-03.md
T
2026-10-04 13:13:35 -04:00

20 KiB

RoM rotation add-on reference and clean-room profiles — 2026-10-03

Scope and conclusion

This note records source research for the five exact Chronicles of Arcadia (CoA) class pairs used by the native five-character roster:

Main / secondary class Roster identity Role
Knight / Scout Rorik Tank
Priest / Knight Serenna Healer
Rogue / Warrior Veyra Damage
Scout / Rogue Caelan Damage
Mage / Warlock Durnik Damage

The mapping is defined in romFiveIdentities.ts. The current CoA add-on source I could verify is KittyCombo, a user-configurable priority engine, rather than a set of published, maintained rotations for these five pairs. The only detailed DIYCE rotation material located for an exact target pair is a 2018 Scout/Rogue example; it is historical and cannot be treated as a current CoA rotation. No source found verifies a complete, current, exact-pair rotation for any of the five builds. The priority sketches below are clean-room proposals informed by current CoA skill references and local runtime features; they are not copied add-on rotations.

Add-on source provenance

KittyCombo — current CoA add-on, engine rather than preset source

CurseForge identifies KittyCombo as a customizable combat engine for class combinations. Users create ordered actions and conditions, then can import or export rotation configurations. The project page names mdnss as author and devikaria as contributor; it lists GPLv3, version 2.4.1003 / file 8487473, uploaded 2026-07-22, with game version 11.0.0.0000. The listing and its source page do not publish a current rotation package or a verified skill priority for any target pair.

The source page advertises source availability, but did not expose a repository URL in the browser view. A read-only archive fetch was attempted for file 8487473 to the ignored artifacts/rom-rotation-reference/ directory. The ordinary network sandbox blocked the first request; an authorized retry reached a Cloudflare JavaScript/cookie challenge instead of an archive, so no file was created. No add-on code was executed or installed. Public metadata and source-page references remain available above.

DIYCE — historical priority-engine ideas, not current-pair guidance

The official CoA forum has a 2016 DIYCE post describing a skill-discovery/readiness loop and a 2018 DIYCE post describing an ordered, button-triggered priority evaluation. They illustrate durable ideas—evaluate learned skills, check cooldown/resource/use predicates, then choose the first eligible action—but the post code is historical and has no stated license. I did not copy or adapt its code.

The 2018 thread includes a Scout/Rogue-oriented example with resource thresholds, a silence condition, control, and damage priorities. That is an exact pair and orientation match for Caelan, but it is an eight-year-old reference; its priorities, spell names, timings, or API assumptions should not be carried into present-day CoA. It also shows a Warrior/Rogue branch, the reverse of Veyra's Rogue/Warrior, so it is not a pair match for Veyra.

CurseForge also retains DIY Combat Engine v2, an old RoM project (project 55223, updated 2013-04-18, game version 5.0.9) by _ForgeUser10895305. Its “Just give credit” terms do not make it a current CoA source, and its description says users supply/build class-combination scripts. I treated it as historical context only.

Current CoA class-pair references

The official CoA skill pages below were used to confirm pair orientation and selected skill prerequisites or mechanics. Pair lists are live references and may change; in particular, the Priest/Knight pair page could not be retrieved in the browser session. That profile proposal therefore uses the current general Priest list, the current special-skills index, and current CoA patch notes, and requires runtime checks against the actual learned catalog before a skill can be selected.

One practical versioning warning: the local romPlayerCatalog.generated.json contains a RuneWaker-derived source snapshot with CoA overrides. It is useful as the project's runtime candidate catalog, but it is not itself proof that every base skill value matches the current CoA live pages. Rotations must select only skills present in the active ruleset catalog, then respect that catalog's learned-level, weapon, range, resource, cooldown, and target gates. In particular, historical Priest/Knight behavior must not be used to infer today's Sacrificial Cure cost.

Clean-room selection contract

combatRotation.ts retains the WoW specialization profiles; rotationProfileFor selects on primary class and specialization and does not discriminate a secondary class or role. The companion romFiveRotation.ts resolves native RoM profiles separately by the exact tuple (ruleset, primaryClassId, secondaryClassId, role) and returns no profile when the tuple does not match. The five pairs above are ordered pairs: rom-scout/rom-rogue does not imply rom-rogue/rom-scout.

The existing rotation context already carries most useful decisions: learned abilities, readiness/cooldown, resource and maximum resource maps, health, hostile target/cast, enemy count, threat state, defensive-mechanic signals, party health/role/status, movement, maintained effects, and pets. Runtime availability (learned, ready, canUse, in-range, valid weapon, sufficient resource, legal target) must be a hard gate, not merely a score penalty. Every profile is an ordered set of predicates, with emergency overrides before ordinary damage priorities.

Use actor-owned, target-owned status state when tracking a DoT. Refresh a DoT only when it is absent or close to expiry; do not reapply it on every priority evaluation. Existing Death Knight disease tracking in partyRuntime.ts is a local model for source/target ownership and tick timing. Buffs, marks, and setup effects should likewise refresh only when missing or expiring. A class-specific predicate may add weapon, ammunition, status, resource, enemy-count, movement, cast, or threat requirements, but it cannot bypass the shared runtime gates.

Generic pseudocode:

profile = exactProfile(ruleset, primaryClass, secondaryClass, role)
if profile is absent: use no RoM rotation

for action in profile.emergencyOverrides followed by profile.priorityList:
    if not learned(action) or not ready(action) or not canUse(action): continue
    if weapon/ammo/status/resource/range/target gates fail: continue
    if action applies a maintained effect and that effect is healthy: continue
    if action is a damage-over-time effect and own effect expires later than refreshWindow:
        continue
    if action.predicate(context): cast action; stop this evaluation

refreshWindow should be derived from the active effect duration / tick schedule and evaluated using effect ownership in runtime state, not guessed from an old macro's timer.

Proposed exact-pair priority sketches

These sketches define decision order and use conditions, not mandatory button rotations. Every action is conditional on being learned and unlocked at that character's level, existing in the active CoA ability catalog, and passing runtime use checks.

Knight / Scout — Rorik, tank

if a dangerous cast/mechanic is incoming and an applicable mitigation is ready:
    use the narrowest effective group/personal mitigation
if control is active or imminent and the learned break is ready:
    use control break
if an enemy is loose from the tank or the assigned target is outside threat control:
    use a legal taunt (ranged Arrow of Vengeance only with a ranged weapon)
if multiple enemies are engaged and shield is equipped and threat needs building:
    use Whirlwind Shield
if Holy Seal stacks are absent/low:
    build Holy Seal with a legal builder
if a defensive hit is imminent or self-survival needs a shield:
    spend Holy Seal through Truth Shield Bash when learned/usable
else if a control/interrupt use is required and Shock's seal cost is acceptable:
    spend Holy Seal through Shock
else:
    preserve useful seal stacks; use the best legal single-target threat/damage action
use Heavenly Arrows only when its channel is safe and multiple targets justify it
use non-urgent long cooldowns only for a dangerous encounter window

Holy Seal's current pair page lists a ten-second effect and stack generation; Truth Shield Bash consumes it to create a defensive shield, while Shock is a damage/control spender. Do not spend those stacks automatically when a dangerous mechanic is near. Whirlwind Shield is shield-gated and provides area threat. Arrow of Vengeance is ranged-weapon gated and should respond to real threat loss, not be a routine damage action. Sacred Protection and other long cooldowns belong to incoming group damage or a defensive threshold, not a fixed timer. These candidate mechanics are from the current Knight/Scout page; use current catalog data for unlocks and costs.

Priest / Knight — Serenna, healer

if an ally has an actionable harmful effect and a matching dispel is learned/ready:
    dispel
if a living ally is at emergency health or a lethal mechanic is landing:
    use the fastest safe direct heal / emergency shield
if several allies are hurt and group healing is efficient, affordable, and not exhausted:
    use Group Heal
if one ally has a meaningful deficit and a safe cast window:
    use Heal
if a target needs sustained healing and its own Regenerate is absent/near expiry:
    apply Regenerate
if a major damage window is imminent and a learned mitigation/absorption can prevent it:
    apply it before impact
if Calm Heart's current condition is met (fear/status or boss warning):
    use Calm Heart
if an ally is dead and combat has ended:
    resurrect

Keep urgent single-target healing ahead of cast-time healing when an ally may die before the cast completes. Do not heal a full target, repeatedly overwrite an active HoT, or use Group Heal into its Exhaustion penalty when only one party member needs help. Use party deficits and expected incoming damage to decide whether a group heal is worth its mana cost. Patch 11.1.5 makes Life Link an active skill and changes Sacrificial Cure to MP cost with an MP-based shield; the logic must inspect the live active skill metadata and should use Sacrificial Cure as an emergency action only when the current resource and shield conditions justify it. Do not apply the old HP-cost interpretation. Calm Heart is a conditional fear response, not routine healing. References: the Priest common skill page, special-skills index, and 11.1.5 notes. Exact current Priest/Knight pair-page values remain unverified because that page could not be fetched.

Rogue / Warrior — Veyra, damage

if target is durable enough for setup and a useful bleed/poison is absent or near expiry:
    apply one legal setup effect, respecting weapon and resource requirements
if target has a bleed / Rotten condition and Wound Attack is learned, ready, affordable:
    use Wound Attack
if axe is equipped and Rotten is absent/near expiry and Death's Touch is legal:
    apply Death's Touch
else if Poison Stab is legal, affordable, and Rotten is absent/near expiry:
    apply Poison Stab
if burst cooldown is ready and target will survive the burst window:
    use Assassin's Rage / other learned burst action
use the best legal direct attack while setup effects tick

Rogue Energy and Warrior Rage are separate resources; verify the specific cost rather than assuming one shared pool. Rotten/bleed effects should be tracked by source and target and refreshed near their actual expiration, so repeated Poison Stab or Death's Touch does not clip remaining damage. Death's Touch is axe-dependent, and other attacks may also be weapon-gated. Wound Attack benefits from existing bleed/grievous conditions, so it should not outrank establishing those conditions. Save major burst for an encounter window that will last long enough to realize it. See the current Rogue/Warrior page; do not import the historical reverse Warrior/Rogue branch from DIYCE.

Scout / Rogue — Caelan, damage

if the target is worth a control effect and control is needed to interrupt/prevent danger:
    use the least disruptive learned control; avoid breaking it with casual damage
if target is durable and poison is missing/near expiry:
    apply the legal poison setup (respect ammunition/status prerequisites)
if Vampire Arrows' required effect is missing and Deadly Poison Bite is a planned follow-up:
    establish Vampire Arrows; then use Bite only when its own effect is absent/near expiry
if own poison effects are healthy:
    do not refresh them early
if a multi-target pack is present and poison spread is useful:
    use an ammunition-legal spread action
otherwise:
    use the best legal ranged/rogue direct action without starving its required resource

This exact pair has both Focus and Energy decisions, ranged ammunition constraints, and setup-dependent poison attacks. Vampire Arrows is a prerequisite for Deadly Poison Bite in the current pair reference; the attack should not be attempted until that current status gate is satisfied. Combo Shot / Reflected Shot can be ammunition-gated and can contribute poison spread when the poison setup is present, so spreading is justified only when there are enough durable targets. Lasso or Blinding Powder should be reserved for a control need because subsequent damage can break control. Weak Spot is an affordable-enough-only decision, not an unconditional cast. These are the current Scout/Rogue page mechanics; the old DIYCE branch is only a historical example.

Mage / Warlock — Durnik, damage

if a useful curse is missing/near expiry and no active channel will apply it:
    apply the curse
if a useful Soul Pain effect is missing/near expiry and no active channel will apply it:
    apply Soul Pain
if Cast Shadow is learned and enemies are in its area and channeling is safe:
    channel Cast Shadow instead of duplicating its automatically applied effects
if Shadow Beam is learned, resources support the channel, and target uptime is good:
    channel Shadow Beam; do not overwrite effects it reapplies
if Elemental Catalysis is ready and a good sustained/channel damage window exists:
    align it with the channel/burst window
if Will of Light's stack threshold is met and mana recovery is useful:
    convert stacks for mana / its current effect
use legal direct damage while preserving sufficient mana/focus to finish a valuable channel

Cast Shadow and Shadow Beam have channel-specific side effects, so the ordinary curse/DoT refresh branch must stand down when that channel will refresh them. Avoid moving or interrupting a channel unless an encounter mechanic requires it. Elemental Catalysis is a burst window; align it with useful channel uptime instead of spending it on an empty or soon-to-die target. Will of Light is a stack-gated recovery choice, not a routine priority. Soul Pain also interacts with Focus; preserve enough resources for useful follow-ups. Confirm the exact active unlock/cost metadata at runtime. References: the current Mage/Warlock page.

Fit with current HealerMan runtime and validation

combatRotation.ts keeps the shared evaluator and WoW profile registry. The exact RoM profiles and their native-only action guards are implemented in romFiveRotation.ts; partyAbilityAi.ts and benchmarkController.ts pass learned, cooldown/resource-ready actions and runtime target/effect state into that evaluator. The evaluator still applies canUseAbility, target, and movement gates. partyRuntime.ts owns actor/target periodic-effect bookkeeping; refresh decisions use the source actor, target, and remaining duration when those records are present.

The focused romFiveRotation.integration.test.ts runs the five exact profiles against active learned catalog abilities and checks Serenna's Group Heal and urgent direct-heal ordering, owned/foreign and near-expiry DoTs, and the unchanged WoW profile selector. The existing romFiveNativeDungeonHealth.test.ts remains the targeted player/companion diagnostic across its selected native dungeon and level cases. Keep follow-up runtime comparisons restricted to the five listed identities and existing diagnostic cases; this work does not authorize a broad RoM sweep or readiness promotion.

This file records source research; the resulting clean-room profile and native/shared-evaluator coverage live separately in romFiveRotation.ts, romFiveRotation.test.ts, and romFiveRotation.integration.test.ts. The focused unit and integration files currently pass together (17 tests).