Design: Backpack weight — weight-bounded carry (not slots) #99

Closed
opened 2026-07-19 18:33:30 +02:00 by panda · 1 comment
Collaborator

Design doc: docs/game-design/systems/backpack-weight.md

Your backpack is bounded by weight, not slots — carry capacity scales with Strength (race-ready), so what you haul is a real choice, UO-style.

Player POV

You loot the world. Every item has a weight in stones; the backpack shows a running current / max. A pickup that would push you over the cap is simply refused — you decide what's worth carrying. Coins/bulk stack into one pile (with an amount) whose combined weight counts like everything else; gold is heavy, so a fortune is a deliberate cost. If something loads you past max (a debuff/trade), you're overweight and can't move until you drop enough.

Six-lens summary

  • Player POV — moment-to-moment "is this worth its weight?"; visible current/max; honest refusals.
  • Coherence — serves server-authoritative fairness, honest/readable UX, emergent depth. Server owns all weight math; client only sends existing pickUp/drop/equip/unequip/move intents and displays the number. MaxWeight = race.BaseCarry + Str * race.CarryPerStr (one Human profile today; a race is data later).
  • UI/UXcurrent / max stones in the backpack panel (red near/over cap); refusal → journal line + overhead ("It's too heavy."); over-max move → "You are too fatigued to move." MVP grid is display-only (weight is the real limit).
  • Motivation & loop — feeds gather/loot/haul; gold-weighs is a gentle sink; higher Str = bigger max (progression you feel).
  • Breakage modes — equipped items count (no equip-dodge); gold weighs (no weightless money); stacks carry combined weight; always-droppable (no soft-lock); overweight-by-retrain is allowed, not vetoed.
  • Scope & MVP — Weight + MaxStack per kind; gold weighs & stacks; Human carry-profile in config; pickup refused over cap; equipped counts; current/max readout; refusal/overweight messages; "over-max → move rejected" rule encoded. Deferred: free (x,y) drag placement, partial-stack pickup, reagent/arrow stacking, the race system proper, container-in-container / bank / slowdown tiers.

Definition of Done (player-observable)

  1. Backpack shows current & max carry weight; updates instantly on pick up / drop.
  2. A pickup that would exceed max is refused with a clear message; the same item succeeds when under max.
  3. Dropping lowers weight; equipping does not (an equipped sword still counts).
  4. Picking up gold forms one pile with its amount; the pile's combined weight counts (a big enough pile is refused).
  5. Pushed over max (GM Str debuff now; Str re-allocation once the stat system ships) → cannot move until you drop enough, and the client says why. Lowering Str while loaded is allowed, not vetoed.
  6. Changing the carry-profile config (base / per-Str) changes max weight — proving the formula is parametric and race-ready.

Verdict: go, with the MVP scope above.

Technical breakdown to follow (separate review).

**Design doc:** `docs/game-design/systems/backpack-weight.md` Your backpack is bounded by **weight, not slots** — carry capacity scales with Strength (race-ready), so *what you haul is a real choice*, UO-style. ## Player POV You loot the world. Every item has a weight in **stones**; the backpack shows a running **current / max**. A pickup that would push you over the cap is simply **refused** — you decide what's worth carrying. Coins/bulk **stack into one pile** (with an amount) whose combined weight counts like everything else; **gold is heavy**, so a fortune is a deliberate cost. If something loads you past max (a debuff/trade), you're **overweight and can't move** until you drop enough. ## Six-lens summary - **Player POV** — moment-to-moment "is this worth its weight?"; visible current/max; honest refusals. - **Coherence** — serves server-authoritative fairness, honest/readable UX, emergent depth. Server owns all weight math; client only sends existing `pickUp`/`drop`/`equip`/`unequip`/`move` intents and *displays* the number. `MaxWeight = race.BaseCarry + Str * race.CarryPerStr` (one Human profile today; a race is data later). - **UI/UX** — `current / max` stones in the backpack panel (red near/over cap); refusal → journal line + overhead ("It's too heavy."); over-max move → "You are too fatigued to move." MVP grid is display-only (weight is the real limit). - **Motivation & loop** — feeds gather/loot/haul; gold-weighs is a gentle sink; higher Str = bigger max (progression you feel). - **Breakage modes** — equipped items **count** (no equip-dodge); gold weighs (no weightless money); stacks carry **combined** weight; always-droppable (no soft-lock); overweight-by-retrain is allowed, not vetoed. - **Scope & MVP** — Weight + MaxStack per kind; gold weighs & stacks; Human carry-profile in config; pickup refused over cap; equipped counts; current/max readout; refusal/overweight messages; "over-max → move rejected" rule encoded. **Deferred:** free (x,y) drag placement, partial-stack pickup, reagent/arrow stacking, the race system proper, container-in-container / bank / slowdown tiers. ## Definition of Done (player-observable) 1. Backpack shows **current & max** carry weight; updates instantly on pick up / drop. 2. A pickup that would exceed **max is refused** with a clear message; the same item succeeds when under max. 3. **Dropping** lowers weight; **equipping does not** (an equipped sword still counts). 4. Picking up gold forms **one pile** with its amount; the pile's **combined weight** counts (a big enough pile is refused). 5. Pushed **over max** (GM Str debuff now; Str re-allocation once the stat system ships) → **cannot move** until you drop enough, and the client says why. Lowering Str while loaded is allowed, not vetoed. 6. Changing the carry-profile config (base / per-Str) **changes max weight** — proving the formula is parametric and race-ready. **Verdict:** go, with the MVP scope above. _Technical breakdown to follow (separate review)._
Owner

Design complete. The design doc docs/game-design/systems/backpack-weight.md was merged in #100, together with the client backpack rework (own-art gump + a weight-agnostic invisible interior grid). Per the game-design workflow, this design issue ends here.

The server-side enforcement (MaxWeight from Str, per-item stone weights, stacking/amount, refuse-a-pickup-over-cap, overweight-can't-move) is a separate implementation issue to open when M6 stats/skills (#8) land. Closing as design-done.

Design complete. The design doc `docs/game-design/systems/backpack-weight.md` was merged in #100, together with the client backpack rework (own-art gump + a weight-agnostic invisible interior grid). Per the game-design workflow, this *design* issue ends here. The server-side enforcement (MaxWeight from Str, per-item stone weights, stacking/amount, refuse-a-pickup-over-cap, overweight-can't-move) is a separate **implementation** issue to open when M6 stats/skills (#8) land. Closing as design-done.
marco closed this issue 2026-07-20 06:41:06 +02:00
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
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#99
No description provided.