Skip to content

Reveal the village one option at a time - #141

Merged
dmccoystephenson merged 1 commit into
mainfrom
feature/progressive-disclosure
Aug 1, 2026
Merged

Reveal the village one option at a time#141
dmccoystephenson merged 1 commit into
mainfrom
feature/progressive-disclosure

Conversation

@dmccoystephenson

Copy link
Copy Markdown
Member

Summary

A new game now opens on the docks with a single thing to do — fish. Every other option in the village arrives later, one per screen, as the player earns it, and each arrival is announced with the reason it appeared:

 You caught 7 Minnow over 6 hours! A perfect hook!  [Milestone unlocked: First Catch!]
 [Your basket is heavy with fish. Gilbert buys them at the shop - better go sell them.]

 [1] Fish
 [2] Go to Shop
 [3] Quit

This is pacing, not difficulty — nothing is made harder or more expensive, and an established save opens with the whole village available exactly as before.

  • Adds src/progression, a data-driven unlock table (id, announcement, condition over Player/Stats) built the same way as src/achievements' milestones — add a row and it is tracked, gated and announced automatically.
  • Persists the granted ids on Stats.unlockedFeatures, with the matching schemas/stats.json entry and StatsJsonReaderWriter field.
  • Starts the game at the docks, and grants already-earned unlocks silently on load, so a save written before this existed is never re-locked around its player.
  • Gates the docks, shop, bank, tavern and home menus on the unlocks. The docks grow downward, so an option the player already knows keeps its number when a new one shows up.
  • Adds Quit to the docks: that is now where a new player starts, and they would otherwise have no way to stop before earning the home menu.
  • Hides the $10,000 goal line from the status header until the player's first $1,000 — "$20 / $10,000" on cast one gives away the whole arc.
  • Stages Sam's "What other locations can I visit?" answer to the places the player has actually found.

Design notes

One reveal per screen, always. A single long cast can land a first catch and empty the energy bar at once. Announcing both would produce exactly the wall of new options this exists to avoid, so getNextUnlock grants one; the rest are still earned and arrive on the following screens.

No deadlocks. Go Home unlocks on the first sale or on energy dropping below the 10 needed to fish, so a player who fishes themselves flat before selling anything can always still get their energy back.

Test plan

  • python3 -m compileall -q src tests
  • SDL_VIDEODRIVER=dummy SDL_AUDIODRIVER=dummy python3 -m pytest --verbose -vv --cov=src --cov-report=term-missing --cov-report=xml:cov.xml — 676 passed (was 638); src/progression at 100% coverage
  • black src tests + autoflake per format.sh
  • Front-end parity: this is entirely game-layer, so all three front-ends get it through showOptions. Verified live on the console front-end (opening menu, first-catch reveal, save/reload) and on the web front-end over HTTP (GET /state / POST /input) — both show the staged menus and the empty goal line. The pygame front-end renders the same optionList and already hides an empty goalProgress.
  • Scripted 1,500-action playthrough to check pacing: all 12 unlocks land across ~83 actions / 9 in-game days, no dead zones.
  • Save/reload round-trip: unlockedFeatures persists, and a legacy stats.json with no such field catches up on load.

A new game now opens on the docks with a single thing to do - fish - and
every other option arrives later, one per screen, as the player earns it.
Each arrival is announced with the reason it appeared, so the newly-added
menu entry explains itself on the screen it first shows up on.

- add src/progression, a data-driven unlock table (id, announcement,
  condition over Player/Stats) alongside src/achievements' milestones
- persist the granted ids on Stats.unlockedFeatures, with a matching
  schema entry and reader/writer field
- start the game at the docks, and grant already-earned unlocks silently
  on load so an established save is never re-locked
- gate the docks, shop, bank, tavern and home menus on the unlocks, with
  the docks growing downward so a known option keeps its number
- add Quit to the docks, since that is where a new player starts
- hide the $10,000 goal line until the player's first $1,000
- stage Sam's tour of the village to the places found so far

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@dmccoystephenson
dmccoystephenson merged commit 11dc824 into main Aug 1, 2026
1 check passed
@dmccoystephenson
dmccoystephenson deleted the feature/progressive-disclosure branch August 1, 2026 18:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant