Skip to content

A.R. & armor damage in combat: strike-vs-A.R., armor ablation, the M.D.C. scope decision #44

Description

@StreamDemon

Equipment and the pure combat-resolution foundation have landed. This follow-on
connects them into equipment-aware attack and defense selection, persisted hostile
S.D.C. exchanges, armor routing, and the live combat UI.

Foundation retained

  • combatResolutionRules load-validates the page-stamped RUE p.346 constants.
  • resolveStrike(input) resolves a completed strike roll against an optional
    caller-authorized parry, dodge, or automatic dodge and returns the outcome,
    reason, critical state, damage multiplier, and S.D.C./M.D. type.
  • The derived combat profile preserves raw Hand-to-Hand bonuses and exposes named
    maneuver totals.
  • Equipment content and character inventory/worn-armor state remain the source of
    equipped combat capability and protection.

Rendered rules correction

Rendered Rifts Ultimate Edition p.339 explicitly says Natural A.R. does not apply
in Rifts. This issue therefore does not implement a Natural A.R. branch. Artificial
S.D.C. armor keeps its distinct printed routing: a successful strike at or below
A.R. damages the armor, a strike above A.R. reaches the wearer, and depleted armor
stops protecting future hits.

Delivered S.D.C. scope

  • Derive supported owned S.D.C. melee and firearm attacks without leaking P.P. or
    general Hand-to-Hand bonuses into firearm math.
  • Persist a two-phase server-rolled exchange: immediate misses finalize at
    declaration, while potential hits wait for an engine-authorized parry, dodge,
    automatic dodge, or take-the-hit response.
  • Record the submitted combat context, server-owned rolls, action-cost metadata,
    routed result, and immutable incoming/outgoing/recent history.
  • Re-derive both characters inside mutations, reject state drift, and atomically
    finalize the exchange with the target pool update exactly once.
  • Route unprotected hits through body S.D.C. before Hit Points.
  • Pure-test artificial S.D.C. armor equality, penetration, depletion, ablation,
    and final-hit no-spill behavior. Persistence is ready when page-stamped S.D.C.
    armor content is added; the production catalog currently has no such suit.
  • Reset combat drafts, feeds, telemetry, and late mutation results when a dossier
    route changes.

Explicit boundary and follow-up

M.D. weapons and targets wearing nondepleted M.D.C. protection are refused before
dice or exchange insertion. Full M.D.C. interaction remains separate follow-up
work: damage-tier interaction and conversion exceptions, final-point/final-blast
armor absorption, depleted protection, M.D. against an unprotected mortal, and any
injury/coma/death state the current schema cannot represent.

Tracked in #51. That follow-up must reverify rendered RUE pp.288 and 355-359 and
extend this issue's persisted exchange ledger rather than inventing Mega-Damage
behavior from memory.

Verification snapshot

Fresh evidence on 2026-07-20 (Asia/Singapore), through commit a44f193:

  • rules: 17/17 files and 308/308 tests passed;
  • backend: 3/3 files and 82/82 tests passed;
  • web: 2/2 files and 27/27 tests passed;
  • root: 22/22 files and 417/417 tests passed; and
  • all six package gates ran with task caches disabled; root vp check and both working-tree and branch diff checks were clean.

Live two-dossier acceptance covered an immediate miss; a melee defense with
unchanged pools; a ranged exchange with no parry option; body S.D.C. depletion and
a later critical Hit Point hit; matching persisted history in both dossiers; M.D.
weapon and M.D.C.-protection refusal; A-to-B route isolation; labelled keyboard and
screen-reader operation; clean consoles; and a narrow command rail without internal
overflow. The observed page-level 500 px minimum predates this branch.

Still out of scope

Called shots, hit locations, paired weapons, bursts, payload tracking, thrown
weapon modes, a generic spell-effect interpreter, initiative/round/action-budget
enforcement, authentication/ownership/GM permissions, and VTT geometry remain
separately designed work.

Cubic review hardening snapshot

Fresh evidence on 2026-07-20 (Asia/Singapore), through commit a9a0fde:

  • Cubic's recent-history disclosure finding was validated; aria-controls now targets the exact history list ID.
  • Cubic's take-the-hit ledger finding was validated; the shared schema rejects nonzero defense modifiers for none, and the web omits modifier fields for that response.
  • rules: 17/17 files and 309/309 tests passed;
  • backend: 3/3 files and 83/83 tests passed;
  • web: 2/2 files and 29/29 tests passed;
  • root: 22/22 files and 421/421 tests passed; and
  • all six no-cache package gates, root vp check, and git diff --check passed.

Live two-dossier acceptance additionally proved modifier-free take-the-hit persistence and the disclosure/list association. Full M.D.C. remains tracked separately in #51.

Cubic re-review status

Commit a9a0fde is published, CI passed, and both findings have evidence-backed inline replies. A fresh Cubic review was requested, but the bot reported that the workspace had consumed 40,345 of its 40,000 monthly review lines and cannot review again until 2026-08-01. PR #52 remains ready for review and unmerged; this external gate is still open.

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:rulesRules engine (@riftforge/rules)

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions