Files
healer-man/docs/ROM_WARLOCK_WARRIOR_PSYCHIC_WARRIOR.md
2026-10-02 10:38:12 -04:00

6.1 KiB
Raw Permalink Blame History

RoM Warlock/Warrior Psychic Warrior (499868)

Source review verified 2026-10-02 against the current Chronicles of Arcadia skill list and the relevant 12.1.4/12.1.5 patch history.

Source hierarchy and current behavior

The current CoA Warlock/Warrior skill list is the authority for the present identity and tooltip: Psychic Warrior is passive 499868, Warlock-primary/Warrior-secondary, learned at level 70, levelable to 105. Its text says magical spells manifest ethereal weapons that deal Physical Dark damage:

  • Area Damage skills add an Ethereal Hammer for 187.5% main-hand weapon DPS.
  • Single Target Damage skills add an Ethereal Sword for 1,050% main-hand weapon DPS.
  • Slash and Consistent Heart Strike have a separate conditional main-hand-DPS rider when Strength or Dexterity exceeds both Intelligence and Wisdom. CoA publishes no coefficient for this rider, so it is excluded.

Patch history resolves the Hammer value. Patch 12.1.4.1500 introduced the Warlock/Warrior physical-dark hybrid rework and initially gave the Hammer 250% main-hand DPS and Sword 1,050%. Patch 12.1.5.1000 explicitly reduced the Hammer to 187.5% and made Psychic Warrior levelable to 105. The current skill page and later patch value supersede the initial 250%.

Exact trigger gate

The modeled passive is enabled only when the caster is Warlock primary / Warrior secondary and has learned passive ID 499868. The triggering ability must be a damaging RuneWaker Warlock ability representing a magical spell; a passive marker, non-damaging action, or a different primary/secondary pair does not qualify. This gate is applied in the isolated resolver, separate from the spell's own AbilityDefinition pair fields because many qualifying Warlock spells are Warlock-general actions.

romWarlockPsychicWarriorRuntime.ts now accepts explicit caster build context and checks both class slots, the learned passive, and a caller-supplied isMagicalSpell gate before selecting a coefficient. The future caller must derive that flag from the resolved action/event classification; this helper does not guess from ability names. It preserves the local ability-source gate and rejects passive or non-damaging definitions. Its area-vs-single classification uses targetingRulesForAbility; that is a local classification input, not a CoA definition of event cadence.

Physical Dark representation and unresolved mitigation

The simulator's ordinary combat result accepts one DamageSchool. CoA's Physical Dark label has two source tags; the isolated CombatDamageProfile retains them together as schools: ["physical", "shadow"], using the project's shadow school for Dark. combatDamageProfileMatchesSchool is only a tag-membership helper. It does not apply armor, resistance, penetration, damage modifiers, absorbs, or ordering.

Mitigation remains unresolved and unwired. CoA describes the damage as Physical Dark but does not say whether both Physical armor/block and Dark resistance/penetration apply, how modifiers of the two tags stack, or their order. Do not collapse the packet to physical or shadow, apply both defenses in sequence, or otherwise pick a defense formula without a source or explicit product decision. The current catalog/helper layer does not calculate this packet, and no shared player/companion combat consumer is implemented here.

Local mapping, exclusions, and source gaps

The generated RuneWaker catalog contains the pair's local ID 499868. The catalog override already presents current CoA's Psychic Warrior name and tooltip, with no generic damage effect attached; the isolated resolver returns the current coefficients and composite profile. It does not yet alter combat results. The hidden local child 499869 is not mapped to current CoA Enraged 499871; those are kept distinct.

The sources provide the class pair, passive gate, general magical-spell trigger, area/single-target mode, weapon hand, and two coefficients. They do not settle:

  • Whether an ethereal weapon is one event per cast, per target, per damage packet, or per channel tick, especially for AoE, channels, multi-hit casts, or periodic damage.
  • Whether the rider has its own hit, critical, block, dodge, and resistance rolls, or inherits any result from its triggering spell.
  • How the Physical and Dark tags interact with defenses and damage modifiers.
  • The conditional Slash/Consistent Heart Strike bonus amount.

Do not infer the missing Slash/Consistent Heart Strike amount, substitute a single damage school, or generate two full-value packets to represent the two tags.

Integration proposal

When the shared player and companion damage paths are available, integrate from the originating Warlock damage event after identifying the exact caster pair, learned passive, eligible magical spell, target mode, and main-hand weapon DPS. Resolve one additional packet at 1.875× DPS for area spells or 10.5× DPS for single-target spells, retaining both profile tags. Reuse the existing target and source actor so player and generated-companion paths behave consistently.

Before enabling damage, the owner must decide or source the packet cadence/result inheritance and the hybrid mitigation formula. The proposed helper deliberately returns a descriptor, not a combat amount; this prevents the current ratios from accidentally acquiring an unsupported mitigation, crit, or multi-hit interpretation. Focused future integration tests should cover both exact-pair gates, missing passive, area/single-target ratios, player/companion source stats, and whichever explicit hybrid mitigation and trigger-event policy is approved. Keep direct tests of this helper separate from central combat integration coverage.

Focused helper validation

romWarlockPsychicWarriorRuntime.test.ts verifies catalog identity and current tooltip values, 187.5% vs 1,050% selection, both retained damage tags without a mitigation formula, and exact Warlock/Warrior plus learned-passive gates. Run:

npx vitest run src/game/romWarlockPsychicWarriorRuntime.test.ts