From ac16a50aafdb95aefc785129162793358c6e589e Mon Sep 17 00:00:00 2001 From: Developer Date: Wed, 28 Oct 2026 21:50:02 -0500 Subject: [PATCH] feat: lists picked through the features that open them, kept waiting when locked (7a5a1) --- CHANGELOG.md | 7 + README.md | 1 + .../system_builder_nested_choices.test.js | 191 ++++++++++++++++++ .../__tests__/system_builder_picking.test.js | 3 +- backend/systemBuilder/choices.js | 140 +++++++++++-- backend/systemBuilder/picking.js | 38 ++-- e2e/COVERAGE.md | 1 + frontend/src/sheets/choices.ts | 2 +- 8 files changed, 351 insertions(+), 32 deletions(-) create mode 100644 backend/__tests__/system_builder_nested_choices.test.js diff --git a/CHANGELOG.md b/CHANGELOG.md index e9c51031..c7eb2d0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -310,6 +310,13 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Under the hood (tidying) +- **Lists inside lists, the server's half (7a5a1).** A list can now say how it is picked: on its own + (as every list was), only through the features that open it (a SOLDIER's SPECIALTY at level 3), or + both (FEATS: one at creation, more from features). A feature opening a list says how many picks it + gives. A pick made under a feature counts while that feature is unlocked; lower the level or take + the class away and it is kept, waiting, its bonuses and levels gone until the feature unlocks + again. Lists can nest as deep as they go, and the builder names any that open each other in a loop. + The settings on the CHOICES page and the picks under features on the sheet come next. - **Every health model, proven in a browser.** The second gap in e2e/COVERAGE.md is closed: a new browser test plays each of the seven health models a system can choose, one at a time. A player with a token hurts and heals it from HIT_POINTS (a pool under its own name, two tracks where diff --git a/README.md b/README.md index 61529d03..916b13c5 100644 --- a/README.md +++ b/README.md @@ -611,6 +611,7 @@ CITY_NET/ │ ├── system_builder_choices.test.js # A system's choices: a class list with levels and multiclassing, a nested list and an any-number list check clean; every part of a list, an option and a feature refused where it is wrong (picks, levels only in a levelled list, modifier targets and amounts, uses and their rest, rolls and a roll's changes, another list and never itself), ids shared across options and features, an option's @