From 21b2eb06da970ec25fc96eacb449cd48e25c4495 Mon Sep 17 00:00:00 2001 From: Rijad Zuzo Date: Sat, 8 Aug 2026 20:50:59 +0200 Subject: [PATCH] docs: capture player standing and quest system in plans and schema --- docs/ARCHITECTURE_OVERVIEW.md | 12 ++++++++++++ docs/BUILD_IN_PUBLIC_PLAN.md | 9 +++++++++ docs/LEARNING_ROADMAP.md | 18 ++++++++++++++++++ docs/PROJECT_CONTEXT.md | 21 +++++++++++++++++++++ docs/SIMULATION_STATE_SCHEMA.md | 10 +++++++--- 5 files changed, 67 insertions(+), 3 deletions(-) diff --git a/docs/ARCHITECTURE_OVERVIEW.md b/docs/ARCHITECTURE_OVERVIEW.md index 92c866b..1ca158d 100644 --- a/docs/ARCHITECTURE_OVERVIEW.md +++ b/docs/ARCHITECTURE_OVERVIEW.md @@ -21,6 +21,8 @@ SimulationClock -> EventKnowledgeSystem records, ranks, transfers, and retains bounded knowledge -> RelationshipSystem applies evidence-gated social consequences -> VillageOpportunitySystem projects one known unresolved need + -> PlayerQuestSystem turns open needs into named player quests and + grants Standing as the player resolves them through real supply/feed -> WorldViewManager presents travel, NPC state, and world-state cues -> ActiveWorldAdapter supplies loaded-world positions/capacity -> LoadedResourceSpatialIndex bounds finite-anchor discovery @@ -64,6 +66,15 @@ would otherwise obscure that lifecycle: When no such helper exists, it can separately derive an ephemeral `OpportunityPlayerResponseResult` from the real destination capacity and enabled player-usable finite sources; +- `simulation/quests/PlayerQuestSystem.gd` turns real open needs into named + player quests (`PlayerQuestRecord`) and owns the player's `PlayerStandingRecord` + reputation. A quest is generated only when the player can genuinely act + through the ordinary economy (an unassisted pantry/wood shortage, or a hungry + player-feedable animal), and it is resolved only by a real player supply or + feed event. Completing a quest grants Standing and raises the requester's + gratitude; a requester who personally trusts the player can ask them directly + even when another capable helper exists. Quests, Standing, and gratitude are + persisted and never become quest-only simulation state; - `simulation/persistence/` owns save-slot file safety; - `simulation/state/` owns versioned serialized record contracts; - `simulation/definitions/` owns stable IDs and immutable action/profession @@ -102,6 +113,7 @@ hard to read. | `simulation/relationships/` | Directed social consequences and relationship queries | | `simulation/population/` | Transient per-tick population query indexes | | `simulation/opportunities/` | Knowledge-gated unresolved-condition projections | +| `simulation/quests/` | Named player quests and Standing reputation from real need resolution | | `simulation/state/` | Versioned, serializable mutable records | | `simulation/definitions/` | Stable IDs and immutable gameplay definitions | | `simulation/persistence/` | Validated local save-file storage | diff --git a/docs/BUILD_IN_PUBLIC_PLAN.md b/docs/BUILD_IN_PUBLIC_PLAN.md index 68d66ee..6970a6b 100644 --- a/docs/BUILD_IN_PUBLIC_PLAN.md +++ b/docs/BUILD_IN_PUBLIC_PLAN.md @@ -855,6 +855,15 @@ Next: need for its interested villager, and proves that one ordinary `harvest_resource_node` extraction resolves the same open opportunity and clears the need segment on the next refresh. +3. Give the player a reason to keep helping: a persistent **Standing** loop. + **Complete:** resolving real village needs (pantry, wood, hungry animals) + now grants Standing (Stranger → Known Hand → Trusted → Village Steward → + Voice of Jajce) and raises the requester's gratitude. The world's quest + generator turns each open need into a named player quest in a quiet + `QuestJournalHud`, and villagers who personally trust the player start + asking them directly even when another helper could act. All of it flows + through the ordinary finite-resource harvest/feed contracts, survives + save/restore deterministically, and adds no quest-only state. Do not start with GIS data, a full city, a large asset pack, or more NPC mechanics. The next proof is a beautiful stage for the systems that already diff --git a/docs/LEARNING_ROADMAP.md b/docs/LEARNING_ROADMAP.md index debc738..9ce6838 100644 --- a/docs/LEARNING_ROADMAP.md +++ b/docs/LEARNING_ROADMAP.md @@ -1003,6 +1003,24 @@ The first bounded field-note opportunity surfacing slice is complete: staged pantry-crisis surfacing, helper naming, ordinary harvest resolution, and the absence of saved presentation state. +The first bounded player-Standing and quest slice is complete: + +- `PlayerStandingRecord` is a versioned, deterministic 0–100 reputation with + named tiers (Stranger, Known Hand, Trusted, Village Steward, Voice of Jajce) + and per-requester gratitude, persisted through world schema v12; +- `PlayerQuestRecord` plus `PlayerQuestSystem` turn real open needs into named + player quests: an unassisted pantry or wood shortage (or a hungry, + player-feedable animal) generates one quest for its requester, resolved only + by a real player supply or feed event through the ordinary economy; +- completing a quest grants Standing and raises the requester's gratitude, an + NPC who trusts the player personally can ask them directly even when another + capable helper exists, and tier advances emit a celebration beat; +- a read-only `QuestJournalHud` surfaces the active quest, Standing tier, and + gratitude feedback without entering saves or drawing RNG; +- headless, runtime, schema-restore, and GUT unit regressions cover generation, + completion, invalidation, animal care, personal requests, and tier + progression. + Recently completed: - `Jajce Villager Field Note 12`: a separate player-facing note selects the diff --git a/docs/PROJECT_CONTEXT.md b/docs/PROJECT_CONTEXT.md index 046f105..4ece578 100644 --- a/docs/PROJECT_CONTEXT.md +++ b/docs/PROJECT_CONTEXT.md @@ -276,6 +276,27 @@ The village currently tracks: - per-resource modifiers; - per-resource priorities. +### Player Standing and quests + +The world now rewards player help with a persistent **Standing** reputation +(0–100) and named tiers: Stranger, Known Hand, Trusted, Village Steward, and +Voice of Jajce. The quest generator turns real open needs into player quests: + +- an unassisted pantry or wood shortage generates a named quest from its + worried villager; +- a hungry, player-feedable goat generates an animal-care quest; +- completing a quest through the ordinary finite-resource harvest or feed + contract grants Standing, raises the requester's gratitude, and emits a + thank-you beat; +- a requester who personally trusts the player (gratitude ≥ 0.5 and Standing + tier at least Known Hand) asks them directly even when another capable + helper exists; +- a compact `QuestJournalHud` shows the active quest, Standing tier, and + gratitude feedback; tier advances trigger a celebration beat. + +Quests, Standing, and gratitude persist through world schema v12 and never +become quest-only simulation state. + ### NPC task lifecycle Task states are: diff --git a/docs/SIMULATION_STATE_SCHEMA.md b/docs/SIMULATION_STATE_SCHEMA.md index 427710f..a52e4d8 100644 --- a/docs/SIMULATION_STATE_SCHEMA.md +++ b/docs/SIMULATION_STATE_SCHEMA.md @@ -3,7 +3,7 @@ ## Current contract `SimulationStateRecord` is the versioned JSON boundary for the current -simulation. The current world schema is v11 and captures: +simulation. The current world schema is v12 and captures: - simulation seed, tick interval, tick count, clock remainder, and elapsed clock ticks; @@ -25,14 +25,18 @@ simulation. The current world schema is v11 and captures: historical communicator provenance; - opportunity records with stable type/status, interested NPC, trigger event, target storage/resource/amount, exact later resolution event identity, or a - deterministic invalidation reason and close tick. + deterministic invalidation reason and close tick; +- the player's Standing reputation (0–100), resolved-need count, and per-NPC + gratitude, plus named player quest records that reference the originating + opportunity or animal, requester NPC, resource/target/amount, Standing + reward, and exact resolution or invalidation tick. The top-level identity is: ```json { "schema": "the_steward.simulation", - "schema_version": 11 + "schema_version": 12 } ```