Skip to content

feat(rules): Hand to Hand Expert, Martial Arts, Assassin & Commando#39

Merged
StreamDemon merged 2 commits into
mainfrom
feat/hth-types
Jul 5, 2026
Merged

feat(rules): Hand to Hand Expert, Martial Arts, Assassin & Commando#39
StreamDemon merged 2 commits into
mainfrom
feat/hth-types

Conversation

@StreamDemon

@StreamDemon StreamDemon commented Jul 5, 2026

Copy link
Copy Markdown
Owner

Closes #15.

What

Adds the four remaining Hand-to-Hand combat progressions from RUE printed pp.347-349 to content/combat/hand-to-hand.json:

  • Expert — 4 attacks, the police/soldier style
  • Martial Arts — 4 attacks, full martial-art move set
  • Assassin — 3 attacks (+2 at level 2 — fastest ramp), evil-only via the existing alignment gate
  • Commando — 4 attacks, auto-dodge + Horror Factor saves (not an LLW upgrade option, but part of the printed table)

Content-only for the engine: attacksPerMelee/hthBonuses/combatProfile are data-driven and read the new types without code changes.

New bonus keys

The advanced styles grant bonuses beyond strike/parry/dodge/damage. These are encoded with the same accumulative semantics under new keys — initiative, entangle, autoDodge, bodyFlipThrow, saveVsHorrorFactor, strikeThrown, strikeGuns — and validate through the schema's open bonus record. They surface via hthBonuses() today; wiring them into the sheet/rolls is #16 (attack resolver) scope. Special moves without a flat modifier (karate kick damage, back flips, death blows, knockout ranges) are captured as page-faithful notes.

Builder fallout (by design)

hthIdFromName now resolves all three printed LLW upgrades, so the wizard's upgrade options flip available: true automatically — no UI changes needed. Tests updated accordingly:

  • LLW upgrade plan pins expert/martial-arts/assassin as available with printed costs
  • Upgrading to Expert (1 related pick) and Martial Arts (2 picks) now assembles cleanly end-to-end on the real LLW
  • The Assassin evil-alignment gate is now exercised through a modeled target (scrupulous → rejected)
  • The unmodeled-upgrade rejection path stays covered via a synthetic style ("Ninjutsu")
  • The unknown-H2H-id throw test uses a genuinely unknown id

Verification

  • 152 rules tests green (vp run rules#test), incl. accumulated-bonus totals at level 15 for each new type hand-checked against the book pages
  • vp run rules#check / root vp check clean

Bonus fix: root vp test was silently non-reactive for apps/web

While validating, root-level vp test failed apps/web/tests/convex.test.ts ("resubscribes when reactive args change") — reproduced on clean main, so pre-existing, not caused by this PR. Root cause: root vp test loaded only the root vite.config.ts as a single Vitest project, so apps/web's own config (solid plugin + the resolve.conditions fix from #31) never applied and solid-js resolved to its non-reactive server buildcreateRenderEffect ran once but never re-ran on signal change. Per-package vp run web#test was unaffected, which is why CI (per-package) stayed green.

Fixed by declaring test.projects: ["apps/*", "packages/*"] in the root config, so root runs load each package's own config (plugins, resolve conditions, node/edge-runtime environments) exactly like the per-package commands. Verified: 170/170 from root, 152/6/12 per-package, vp check clean.


Summary by cubic

Adds the remaining Hand-to-Hand progressions — Expert, Martial Arts, Assassin, and Commando (RUE pp.347–349) — to packages/rules/src/content/combat/hand-to-hand.json. The engine consumes them as-is; Ley Line Walker upgrade options now auto-enable and are tested.

  • New Features
    • Added four H2H types with base attacks and level bonuses; new accumulative keys: initiative, entangle, autoDodge, bodyFlipThrow, saveVsHorrorFactor, strikeThrown, strikeGuns (special moves captured as notes).
    • No engine changes; attacksPerMelee, hthBonuses, and combatProfile read the new content.
    • Builder: hthIdFromName resolves expert/martial-arts/assassin; LLW upgrades flip to available; Assassin still requires evil alignment.
    • Tests updated to pin attacks/bonuses per type and upgrade costs; unknown-id path now uses ninjutsu.

Written for commit 19e9a48. Summary will update on new commits.

Review in cubic

Adds the four remaining RUE Hand-to-Hand progressions (printed
pp.347-349) to combat content. The engine is data-driven, so no engine
changes: attacksPerMelee/hthBonuses read the new types as-is.

New accumulative bonus keys carried by the tables (initiative, entangle,
autoDodge, bodyFlipThrow, saveVsHorrorFactor, strikeThrown, strikeGuns)
validate through the open bonus record and await the attack resolver
(#16) to be consumed; special moves without flat modifiers are notes.

Builder fallout: the LLW wizard upgrades (Expert/Martial Arts/Assassin)
light up automatically via hthIdFromName resolution. Tests updated to
pin the flipped availability, upgrade costs against the real LLW, the
Assassin evil-alignment gate through a modeled target, and the
still-unavailable path via a synthetic unmodeled style.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No issues found across 4 files

Auto-approved: Content-only addition of four hand-to-hand combat progressions with corresponding tests. No engine logic, infrastructure, or security changes.

Re-trigger cubic

Root-level `vp test` loaded ONLY the root vite.config.ts as a single
Vitest project, so per-package configs never applied: apps/web lost its
solid plugin and `resolve.conditions` fix, solid-js resolved to the
non-reactive server build, and the Convex bindings resubscription test
failed (createRenderEffect never re-ran on signal change). Per-package
`vp run web#test` was unaffected, which is why CI stayed green.

Declaring `test.projects: ["apps/*", "packages/*"]` makes root runs
load each package's own config — same plugins, resolve conditions and
test environments as the per-package commands. 170/170 from root and
per-package. Pre-existing on main; surfaced while validating #15.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

0 issues found across 1 file (changes from recent commits).

Requires human review: This PR adds core combat data (H2H progressions) and updates builder logic/tests. Even though no engine changes are needed, the content addition affects core character progression and the schema changes introduce new bonus keys that will be wired into the attack resolver.

Re-trigger cubic

@StreamDemon StreamDemon merged commit 0fd0d56 into main Jul 5, 2026
2 checks passed
@StreamDemon StreamDemon deleted the feat/hth-types branch July 5, 2026 07:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Hand-to-Hand: Expert / Martial Arts / Assassin / Commando

1 participant