diff --git a/client/README.md b/client/README.md index 32f161b..c02aa61 100644 --- a/client/README.md +++ b/client/README.md @@ -251,6 +251,21 @@ Full checklist: [`docs/manual-qa/NEO-122.md`](../docs/manual-qa/NEO-122.md). Full checklist: [`docs/manual-qa/NEO-131.md`](../docs/manual-qa/NEO-131.md). +## Faction standing + gate feedback HUD (NEO-142) + +- **`GET /game/players/{id}/faction-standing`** — server-authoritative per-faction **`standing`** snapshot (NEO-139); see [server README — Faction standing read](../server/README.md#faction-standing-read-neo-139). +- **`GET /game/world/quest-definitions`** — gated quests expose optional **`factionGateRules`** (`factionId`, `minStanding`) for readable accept deny copy (NEO-140). +- **`GET /game/players/{id}/quest-progress`** — completed rows may include **`completionRewardSummary.reputationGrants`** (`factionId`, `amount`) (NEO-140). +- **Scripts:** `scripts/faction_standing_client.gd`, `scripts/quest_hud_controller.gd` (standing label + gate deny + rep reward lines), `scripts/quest_definitions_client.gd` (**`faction_gate_rules_for`**). +- **HUD:** + - **`UICanvas/HudRootScroll/HudRoot/FactionStandingLabel`** — both prototype factions with readable names + standing values; default **0** before first GET. + - **`QuestAcceptFeedbackLabel`** — **`faction_gate_blocked`** renders readable gate copy (e.g. **`Grid Operators standing 15 required (have 0)`**); other deny codes unchanged (NEO-122). + - **`QuestRewardDeliveryLabel`** — adds **`reputationGrants`** lines (e.g. **`Grid Operators +15 rep`**) on completion transition (NEO-131). +- **Refresh:** boot hydrate + faction GET after in-session quest completion transition (rep grants apply on completion). No periodic poll. +- **Errors:** failed faction-standing GET shows **`error — …`** on **`FactionStandingLabel`**; defaults remain visible at **0**. + +Full checklist: [`docs/manual-qa/NEO-142.md`](../docs/manual-qa/NEO-142.md). + ## End-to-end quest reward loop (NEO-132) Epic 7 Slice 2 capstone — complete all four prototype quests **in Godot** and verify quest completion bundles (skill XP + item grants) apply **once** with idempotent replay. diff --git a/docs/manual-qa/NEO-142.md b/docs/manual-qa/NEO-142.md new file mode 100644 index 0000000..d5c8cf8 --- /dev/null +++ b/docs/manual-qa/NEO-142.md @@ -0,0 +1,43 @@ +# NEO-142 — Manual QA checklist + +| Field | Value | +|-------|-------| +| Key | NEO-142 | +| Title | E7M3-10: Client faction standing + gate feedback HUD (Godot) | +| Linear | https://linear.app/neon-sprawl/issue/NEO-142/e7m3-10-client-faction-standing-gate-feedback-hud-godot | +| Plan | `docs/plans/NEO-142-implementation-plan.md` | +| Branch | `NEO-142-client-faction-standing-gate-hud` | + +## Preconditions + +- **Fresh dev player:** stop any running server, then start a new instance so quest progress, faction standing, and reward delivery reset. +- **No Bruno/curl** for this checklist — use Godot gameplay only. +- NEO-139 **`GET /game/players/{id}/faction-standing`** and NEO-140 quest HTTP rep/gate projections landed on `main`. +- NEO-122 quest HUD + NEO-131 reward HUD landed on `main`. + +## Expected HUD progression + +| After | `FactionStandingLabel` | `QuestAcceptFeedbackLabel` | +|-------|------------------------|----------------------------| +| Boot | `Grid Operators: 0`, `Rust Collective: 0` | idle accept hint | +| Operator chain completes | `Grid Operators: 15` | unchanged | +| Accept grid contract before rep (after chain complete, standing still 0) | still `0` until chain rep lands | readable gate deny with required standing | +| Accept grid contract at standing 15 | unchanged | accept succeeds | + +## Checklist + +1. Start server: `cd server/NeonSprawl.Server && dotnet run`. +2. Run Godot main scene (**F5**). Confirm **`FactionStandingLabel`** appears below **`QuestRewardDeliveryLabel`** with both factions at **0**. +3. Follow [NEO-123](NEO-123.md) through **`prototype_quest_operator_chain`** completion (or use the operator-chain segment from [NEO-131](NEO-131.md) step 6). +4. Verify **`FactionStandingLabel`** updates to **`Grid Operators: 15`** (Rust Collective still **0**). +5. Verify **`QuestRewardDeliveryLabel`** on operator-chain completion includes **`Grid Operators +15 rep`** (alongside item/skill lines when present). +6. Verify readable **`faction_gate_blocked`** copy via GdUnit (`client/test/faction_standing_hud_test.gd`) — normal Godot gameplay completes operator chain with **+15** rep atomically, so live accept of **`prototype_quest_grid_contract`** succeeds at standing **15** rather than denying. Optional server dev setup: `POST …/__dev/quest-fixture` with **`completedQuestIds: [prototype_quest_operator_chain]`** and faction reset (see Bruno seq 10) then attempt grid-contract accept in Godot — expect **`Grid Operators standing 15 required (have 0)`** on **`QuestAcceptFeedbackLabel`**. +7. Accept **`prototype_quest_grid_contract`** when **`Grid Operators: 15`**. Verify accept succeeds. +8. Optional: stop server while Godot running; confirm **`FactionStandingLabel`** shows **`error — …`** while quest labels keep NEO-122 sync error behavior. + +## Regression spot-check + +- [NEO-122](NEO-122.md) — quest progress + accept HUD unchanged except new label below reward label. +- [NEO-131](NEO-131.md) — reward label transition-only behavior unchanged except rep grant lines. + +**Full-flow capstone:** [NEO-143](NEO-143.md) extends this with end-to-end Slice 3 faction reputation verification. diff --git a/docs/plans/NEO-142-implementation-plan.md b/docs/plans/NEO-142-implementation-plan.md index f490a10..662af35 100644 --- a/docs/plans/NEO-142-implementation-plan.md +++ b/docs/plans/NEO-142-implementation-plan.md @@ -52,6 +52,15 @@ Player sees faction standing and accept gate denials in Godot without Bruno. - [ ] Standing visible after operator-chain completion (+15 Grid Operators). - [ ] Accepting grid contract below rep shows readable deny copy on HUD. +## Implementation reconciliation (in progress) + +- **`faction_standing_client.gd`:** GET parse v1, prototype display names, `faction_row` / `standing_for`, pending sync. +- **`quest_definitions_client.gd`:** `faction_gate_rules_for` helper. +- **`quest_hud_controller.gd`:** `FactionStandingLabel` render; boot + completion refresh; readable `faction_gate_blocked` deny; `reputationGrants` reward lines. +- **`main.gd` / `main.tscn`:** `FactionStandingClient` + `FactionStandingLabel` wired into quest HUD setup. +- **Tests:** `faction_standing_client_test.gd`, `faction_standing_hud_test.gd`; `quest_reward_hud_test.gd` rep line assertion. +- **Docs:** `client/README.md`; `docs/manual-qa/NEO-142.md`. + ## Technical approach ### 1. Server contracts (landed — NEO-139 / NEO-140)