design(combat): position-and-timing duel (no hit-dice), demonstrable balance via CombatSim #214

Open
opened 2026-07-26 01:08:31 +02:00 by marco · 0 comments
Owner

Design agreed (game-design skill: interview → critical panel → owner-derived numbers). Full doc: docs/game-design/systems/combat.md. This issue is the design — the why/what from the player's seat + a player-observable Definition of Done. Technical breakdown to follow in a separate critical-design-review.

The system, from the player's POV

A classless duel of position and timing, not dice. You carry every tool at once — sword (adjacent), bow (range + line of sight), spells (a public, paced power-word incantation) — and you are whatever you're doing right now, not a class. There are no missed-swing dice: a blow lands if you're on target and your friend didn't step out of it in time — you dodge by moving. So the whole fight is a dance of distances: position to land your light, reliable hits and deny theirs; close to interrupt a cast; kite a chaser; break line of sight to close on an archer. A clean hit ≈ 1/20 of the bar, nothing is lethal alone, and a real fight runs ~60 seconds decided by who reads and moves better. Losing is legible ("I got kited"), never "the dice screwed me."

Six-lens summary

  • Player POV — read what your friend commits to, switch to the counter, out-space them; light reliable hits, ~60s fights, no luck.
  • Motivation & loop — the PvP-arena showcase (3-6 friends, no-loss, LOS mind-game); reward = mastery expression (out-play, not out-grind); use-based skills you see climb.
  • Coherence — classless UO DNA; skills uncapped, a total stat cap for soft body identity; skill lives in position/timing (character skill → damage + dodge window, not to-hit); server-enforceable (reach/LOS already re-checked at swing resolution = spacing; cast-disrupt is new server work above World).
  • UI/UX — the reads must be visible: mode+cooldown HUD, pre-shot in-range/LOS reticle, a legible cast interrupt, selected-target marker, self-danger vignette (opponent HP stays hidden), "how you died" cue.
  • Breakage & mitigations — deterministic slugfest → spacing; INT-dead/cast-dominated → per-incantation disrupt budget + cast payoff; DEX double-dip → speed trades damage, dodge off DEX (sim: all-DEX ≈ even); kite/stalemate → falloff + backpedal stamina + a ~5-min terminator; newcomer wall → 7-3 is between active players + a steep early curve.
  • Scope & MVP — tune the no-heal, per-mode ratios to the derived targets; spacing + stats + counter-web + HUD + terminator. Deferred: heal sustain, Tier-2 positional sim, PvE tuning, weapon-variety.

Demonstrable, repeatable numbers (owner's hard requirement)

Balance is never "trust the code": a tools/IsoMmo.CombatSim loads the same Lua combat formulas the server runs (shared, hot-reloadable, zero drift), Monte-Carlos duels, shows it visibly, and the derived target set are CI regression bands (a change that breaks one fails CI). Numbers are derived from the owner's feel, not chosen — a reproducible sim hits them (seed-stable):

  • clean hit ≈ 1/20 of health (~20 to down);
  • even fight ≈ 50% / ~60s (sim 50% / 63s);
  • strong-vs-average active player ≈ 7-3 (sim 85-vs-65 ≈ 73%); small edge = small edge;
  • master-vs-total-rookie ≈ 90% (accepted; the rookie climbs fast);
  • positioning is the skill — same body, better spacing wins ~3-1 (sim ≈ 76%);
  • all-DEX ≈ even (sim ≈ 50%); damage varies ±30% (comebacks from play, never from missed dice); terminator ~5 min.

Definition of Done (player-observable)

  • An even duel between equal players lasts ~60s of real moving combat (not a burst).
  • No missed-swing dice — you land when on target and they didn't move; you dodge by moving; a player can point at why they lost.
  • A strong active player beats an average one ~7-3, and sometimes loses; a newcomer loses a lot at first and visibly climbs.
  • Position is the skill — the same body, played with better spacing, wins clearly.
  • Modes trade off in any space — a kiting archer is beaten by closing under cover / interrupting the draw / out-ranging the falloff; a chaser is kited; a caster is riskier but not perma-locked.
  • Stats create identity and no stat is an auto-win (all-DEX ≈ even) — shown by the sim.
  • Balance is demonstrable + repeatableCombatSim reads the shared Lua formulas and reproduces the target set; the bands are in CI; editing a Lua formula re-tunes with no recompile.

Technical breakdown (CombatSim + formulas→Lua + spacing/stat wiring + counter-web + cues) follows in a separate critical-design-review.

**Design agreed** (game-design skill: interview → critical panel → owner-derived numbers). Full doc: `docs/game-design/systems/combat.md`. This issue is the **design** — the *why/what* from the player's seat + a player-observable Definition of Done. **Technical breakdown to follow in a separate `critical-design-review`.** ## The system, from the player's POV A classless duel of **position and timing, not dice**. You carry every tool at once — sword (adjacent), bow (range + line of sight), spells (a public, paced power-word incantation) — and you are whatever you're *doing right now*, not a class. **There are no missed-swing dice:** a blow lands if you're on target and your friend didn't **step out of it in time** — you dodge by *moving*. So the whole fight is a dance of distances: position to land your light, reliable hits and deny theirs; close to interrupt a cast; kite a chaser; break line of sight to close on an archer. A clean hit ≈ 1/20 of the bar, nothing is lethal alone, and a real fight runs **~60 seconds** decided by who reads and moves better. Losing is legible ("I got kited"), never "the dice screwed me." ## Six-lens summary - **Player POV** — read what your friend commits to, switch to the counter, out-space them; light reliable hits, ~60s fights, no luck. - **Motivation & loop** — the PvP-arena showcase (3-6 friends, no-loss, LOS mind-game); reward = mastery expression (out-play, not out-grind); use-based skills you *see* climb. - **Coherence** — classless UO DNA; skills uncapped, a **total stat cap** for soft body identity; skill lives in position/timing (character skill → damage + dodge window, not to-hit); **server-enforceable** (reach/LOS already re-checked at swing resolution = spacing; cast-disrupt is new server work above `World`). - **UI/UX** — the reads must be visible: mode+cooldown HUD, pre-shot in-range/LOS reticle, a **legible cast interrupt**, selected-target marker, self-danger vignette (opponent HP stays hidden), "how you died" cue. - **Breakage & mitigations** — deterministic slugfest → **spacing**; INT-dead/cast-dominated → per-incantation disrupt budget + cast payoff; **DEX double-dip → speed trades damage, dodge off DEX (sim: all-DEX ≈ even)**; kite/stalemate → falloff + backpedal stamina + a **~5-min terminator**; newcomer wall → 7-3 is between *active* players + a steep early curve. - **Scope & MVP** — tune the no-heal, per-mode ratios to the derived targets; spacing + stats + counter-web + HUD + terminator. Deferred: heal sustain, Tier-2 positional sim, PvE tuning, weapon-variety. ## Demonstrable, repeatable numbers (owner's hard requirement) Balance is never "trust the code": a **`tools/IsoMmo.CombatSim`** loads the **same Lua combat formulas the server runs** (shared, hot-reloadable, zero drift), Monte-Carlos duels, shows it visibly, and the **derived target set are CI regression bands** (a change that breaks one fails CI). Numbers are derived from the owner's feel, not chosen — a reproducible sim hits them (seed-stable): - clean hit ≈ **1/20 of health** (~20 to down); - even fight ≈ **50% / ~60s** *(sim 50% / 63s)*; - strong-vs-average active player ≈ **7-3** *(sim 85-vs-65 ≈ 73%)*; small edge = small edge; - master-vs-total-rookie ≈ **90%** *(accepted; the rookie climbs fast)*; - **positioning is the skill** — same body, better spacing wins ~3-1 *(sim ≈ 76%)*; - **all-DEX ≈ even** *(sim ≈ 50%)*; damage varies ±30% (comebacks from play, never from missed dice); terminator ~5 min. ## Definition of Done (player-observable) - [ ] An even duel between equal players lasts **~60s** of real moving combat (not a burst). - [ ] **No missed-swing dice** — you land when on target and they didn't move; you dodge by *moving*; a player can point at *why* they lost. - [ ] A strong active player beats an average one **~7-3, and sometimes loses**; a newcomer loses a lot at first **and visibly climbs**. - [ ] **Position is the skill** — the same body, played with better spacing, wins clearly. - [ ] **Modes trade off in any space** — a kiting archer is beaten by closing under cover / interrupting the draw / out-ranging the falloff; a chaser is kited; a caster is riskier but not perma-locked. - [ ] **Stats create identity and no stat is an auto-win** (all-DEX ≈ even) — shown by the sim. - [ ] **Balance is demonstrable + repeatable** — `CombatSim` reads the shared Lua formulas and reproduces the target set; the bands are in CI; editing a Lua formula re-tunes with no recompile. --- _Technical breakdown (CombatSim + formulas→Lua + spacing/stat wiring + counter-web + cues) follows in a separate `critical-design-review`._
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
marco/IsoMmo#214
No description provided.