diff --git a/README.md b/README.md index 733dec5..3fea71e 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,16 @@ Physical S.D.C. is additive: the p.287 `2D6+12` base and every applicable O.C.C./Physical-skill formula are exposed as a sourced breakdown, combined into the preview range, and rolled server-side from that same contribution list. +Starting loadouts follow the same authority boundary. The builder submits only +the player's page-stamped O.C.C. choice-group selections; one backend mutation +reloads the O.C.C. content, validates those choices, rolls grant quantities and +per-suit armor capacity, validates the full character, and atomically stores the +result as ordinary one-entry-per-instance inventory. The client cannot author a +starting manifest, and request-only selections are not persisted. Characters +created before structured loadouts receive no retroactive grants or migration, +while later inventory changes remain ordinary mutable character state and do not +reapply creation-time loadout legality. + ## Development Tooling is [Vite+](https://viteplus.dev) (`vp`) over a pnpm workspace. diff --git a/apps/web/src/builder/loadout-summary.tsx b/apps/web/src/builder/loadout-summary.tsx new file mode 100644 index 0000000..3c22d97 --- /dev/null +++ b/apps/web/src/builder/loadout-summary.tsx @@ -0,0 +1,73 @@ +import { For, Show } from "solid-js"; +import { MonoLabel, Panel, SectionTitle } from "../components/ui.tsx"; +import type { BuilderStore } from "./store.ts"; + +const ROLLED_ON_FORGE = "ROLLED ON FORGE"; + +function range(min: number, max: number): string { + return min === max ? `${min}` : `${min}-${max}`; +} + +/** Unrolled grants and checklist guidance shared by the loadout and review steps. */ +export function LoadoutSummary(props: { store: BuilderStore }) { + const grants = () => props.store.loadoutResolution()?.grants ?? []; + const checklist = () => props.store.loadoutPlan()?.checklist ?? []; + + return ( +
{grant.item.name}
++ GRANT RUE P.{grant.source.page} // ITEM RUE P.{grant.item.page} +
+
+ QTY {grant.quantity.formula}
+
+ M.D.C. {armor().formula} // {range(armor().min, armor().max)} //{" "} + {ROLLED_ON_FORGE} +
+ )} ++ Choose the printed options. The server reloads this O.C.C., rolls quantities and armor, + and creates the concrete manifest when you forge. +
++ QUANTITIES AND ARMOR CAPACITY REMAIN UNROLLED UNTIL FORGE +
++ CHECKLIST GUIDANCE IS NOT STORED INVENTORY +
+