fuzzyworld

dm / commit

docs: update README and plan.md to reflect completed Cypher migration

4aedf3e4eb0b2f21e2a993874d066757bd89d86c · Pavel Safronov · 2026-05-27 23:18:15 -0700 · parents 7aa0370d19e2

docs: update README and plan.md to reflect completed Cypher migration

README:
- Descriptor count 20 → 34, Focus count 20 → 69
- Add Setting selector feature (Fantasy/Numenera/Modern/Sci-Fi)
- Add Skills feature (sidebar rank badges, starting skills from Type+Descriptor)
- Add Advancement modal feature (pool/edge/train/specialize/other)

plan.md:
- Background: migration is complete, SAVE_VERSION = 3
- Phase 1a: correct data counts (34 descriptors, 69 foci)
- Phase 3b: button now opens advancement modal (not a direct click)
- Phase 5 intro: reflects fully implemented state
- Remove duplicate blank line before Phase 5
- Phase 5 marked complete (✅)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
 README.md |  5 ++++-
 plan.md   | 16 +++++++---------
 2 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/README.md b/README.md
index 5333d01..3377931 100644
--- a/README.md
+++ b/README.md
@@ -14,10 +14,13 @@ The game is powered by `claude-haiku-4-5-20251001` and uses Claude's tool-use AP
 
 ## Features
 
-- **Cypher System character creation** — pick a Descriptor (20 options), Type (Warrior, Adept, Explorer, Speaker), and Focus (20 options) to form the sentence *"I am a Clever Warrior who Hunts."*
+- **Cypher System character creation** — pick a Descriptor (34 options), Type (Warrior, Adept, Explorer, Speaker), and Focus (69 options) to form the sentence *"I am a Clever Warrior who Hunts."*
+- **Setting selector** — choose Classic Fantasy, Ninth World (Numenera), Modern Thriller, or Science Fiction at character creation; adjusts currency, tone, special-ability vocabulary, and available Foci
 - **Three stat pools** — Might, Speed, and Intellect each with current/max and Edge displayed; colour-coded bars shift green → amber → red as pools deplete
 - **Damage track** — one pool at 0 → Impaired; two at 0 → Debilitated; all at 0 → Dead
+- **Skills** — starting skills populated from Type and Descriptor; sidebar section shows each skill with a colour-coded rank badge (green Trained / gold Specialized / red Inability); overlapping trained skills automatically promote to Specialized
 - **Cyphers** — one-use items found during play; displayed in the sidebar with Cypher Limit enforcement
+- **Advancement modal** — spending 4 XP opens a choice dialog: increase a pool max by 4, add +1 Edge to a stat, train a new skill, specialize in a trained skill, or describe a custom improvement; four improvements advance your Tier (max Tier 6)
 - **Session persistence** — adventure state and conversation history saved to `localStorage`; reloading the page resumes mid-scene; save version guard offers Markdown export before discarding incompatible sessions
 - **Cost display** — per-turn and session cost estimates shown in the sidebar (based on token counts from the SSE stream)
 - **Dice roller** — d4 through d100, configurable count
diff --git a/plan.md b/plan.md
index 7ac2928..670a769 100644
--- a/plan.md
+++ b/plan.md
@@ -2,7 +2,7 @@
 
 ## Background
 
-The app currently runs D&D 5e via Claude. The goal is to switch to the Cypher System Reference Document (CSRD) — Monte Cook Games' open ruleset used in Numenera, The Strange, and others.
+The app migrated from D&D 5e to the Cypher System Reference Document (CSRD) — Monte Cook Games' open ruleset used in Numenera, The Strange, and others. The migration is complete. `SAVE_VERSION` is currently **3**.
 
 Every phase that changes `gameState` shape must increment `SAVE_VERSION` in `public/index.html`. Old saves are automatically offered for export and discarded.
 
@@ -28,9 +28,9 @@ The biggest structural change. D&D's Race + Class becomes Cypher's **Descriptor
 
 ### 1a — Data definitions
 
-- [x] Replace `RACES` array with `DESCRIPTORS` (20 entries implemented)
-- [x] Replace `CLASSES` array with `TYPES` (4 entries: Warrior, Adept, Explorer, Speaker — each with starting pools, Cypher Limit, and starting equipment)
-- [x] Add `FOCI` array (20 entries implemented)
+- [x] Replace `RACES` array with `DESCRIPTORS` (34 entries, each with pool bonus and starting skills)
+- [x] Replace `CLASSES` array with `TYPES` (4 entries: Warrior, Adept, Explorer, Speaker — each with starting pools, Cypher Limit, starting abilities, and starting skills)
+- [x] Add `FOCI` array (69 entries, each with settings tags, playstyle description, and Tier 1 ability)
 
 ### 1b — New `gameState.character` shape
 
@@ -145,7 +145,7 @@ Complete replacement of `buildSystemPrompt`. Claude needs to understand:
 - [x] Replace XP progress bar (which tracked D&D level thresholds) with a plain XP counter
 - [x] Tier shown as Roman numeral next to XP
 - [x] Show advancement progress: 4 dot pips below XP/Tier row
-- [x] "Spend 4 XP" button — disabled when XP < 4 or Tier 6; spending 4 steps increments dots; at 4 dots tier advances and dots reset
+- [x] "Spend 4 XP" button — disabled when XP < 4 or Tier 6; opens advancement modal (see Phase 5c); four steps advances the Tier and resets dots
 
 ### 3c — Cyphers panel
 
@@ -175,11 +175,9 @@ Cypher System is genre-neutral. Offer a setting choice at creation that adjusts
 
 ---
 
----
-
-## Phase 5 — Skill system
+## Phase 5 — Skill system ✅
 
-The `skills` array already exists in `gameState.character` as `[{ name, rank: 'trained'|'specialized'|'inability' }]` but nothing populates or displays it yet. Claude knows about skills in the system prompt (trained = difficulty −1, specialized = −2, inability = +1) but the player has no visibility or control.
+The `skills` array in `gameState.character` is fully implemented: populated from Type and Descriptor starting skills, displayed in the sidebar with rank badges, managed via the advancement modal, and passed to Claude in the system prompt.
 
 ### 5a — Display