NEO-131: Document quest reward HUD and reconcile plan.

pull/170/head
VinPropane 2026-06-07 22:59:19 -04:00
parent 1a2478b289
commit ed7975ca54
6 changed files with 70 additions and 5 deletions

View File

@ -239,6 +239,18 @@ Full checklist: [`docs/manual-qa/NEO-110.md`](../docs/manual-qa/NEO-110.md).
Full checklist: [`docs/manual-qa/NEO-122.md`](../docs/manual-qa/NEO-122.md).
## Quest completion reward HUD (NEO-131)
- **`GET /game/players/{id}/quest-progress`** — completed rows may include **`completionRewardSummary`** with **`itemGrants`** + **`skillXpGrants`** (NEO-129); see [server README — Per-player quest progress](../server/README.md#per-player-quest-progress-neo-119).
- **Scripts:** `scripts/quest_progress_client.gd` (**`completion_reward_summary`** helper), `scripts/quest_hud_controller.gd` (transition detection + reward label render).
- **HUD:**
- **`UICanvas/HudRootScroll/HudRoot/QuestRewardDeliveryLabel`** — **`Quest rewards: —`** until a quest newly becomes **`completed`** in-session; then quest display name + grant lines.
- Item lines use **`ItemDefinitionsClient.display_name_for`** (NEO-110 loot precedent); skill XP lines use title-case **`skillId`** + amount (e.g. **`Salvage +25 XP`**).
- **Refresh:** reuses NEO-122 triggers (boot hydrate + gather/craft/defeat/accept). **Transition-only** — boot with already-completed quests does not replay grant copy (NEO-123 idempotency).
- **Errors:** failed quest-progress GET shows **`sync error — …`** on **`QuestProgressLabel`**; reward label **`—`** (NEO-122 pattern).
Full checklist: [`docs/manual-qa/NEO-131.md`](../docs/manual-qa/NEO-131.md).
## End-to-end onboarding quest loop (NEO-123)
Epic 7 Slice 1 capstone — complete all four prototype quests (three onboarding intros + operator chain) **in Godot** without Bruno.

View File

@ -77,3 +77,5 @@ Epic 7 **Slice 2** — `reward_delivery`, `unlock_granted`; no double-claim on r
**NEO-129 (E7M2-06 HTTP read):** **`GET /game/players/{id}/quest-progress`** projects optional **`completionRewardSummary`** on **`completed`** rows from **`IRewardDeliveryStore.TryGet`** — nested **`itemGrants`** + **`skillXpGrants`** mirroring delivery event snapshots; omitted when no delivery record. **`QuestAcceptApi`** embed rows use the same mapper. See [NEO-129 implementation plan](../../plans/NEO-129-implementation-plan.md); [server README — Per-player quest progress (NEO-119)](../../../server/README.md#per-player-quest-progress-neo-119); Bruno `bruno/neon-sprawl-server/quest-progress/Get quest progress after gather intro complete.bru`.
**NEO-130 (E7M2-07 telemetry hooks):** comment-only **`reward_delivery`** + **`unlock_granted`** stub hook sites in **`RewardRouterOperations.TryDeliverQuestCompletion`** — first-time **`TryRecord`** success and future **`UnlockGrant`** apply region respectively; no production ingest. See [NEO-130 implementation plan](../../plans/NEO-130-implementation-plan.md); [server README — Reward telemetry hooks (NEO-130)](../../../server/README.md#reward-telemetry-hooks-neo-130).
**NEO-131 (E7M2-08 client HUD):** Godot **`QuestRewardDeliveryLabel`** + **`quest_hud_controller.gd`** transition detection paints **`completionRewardSummary`** grant lines when a quest newly becomes **`completed`** in-session (parse via **`quest_progress_client.gd`**). See [NEO-131 implementation plan](../../plans/NEO-131-implementation-plan.md); [client README — Quest completion reward HUD (NEO-131)](../../../client/README.md#quest-completion-reward-hud-neo-131).

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,41 @@
# NEO-131 — Manual QA checklist
| Field | Value |
|-------|-------|
| Key | NEO-131 |
| Title | E7M2-08: Client quest completion reward HUD (Godot) |
| Linear | https://linear.app/neon-sprawl/issue/NEO-131/e7m2-08-client-quest-completion-reward-hud-godot |
| Plan | `docs/plans/NEO-131-implementation-plan.md` |
| Branch | `NEO-131-client-quest-completion-reward-hud` |
## Preconditions
- **Fresh dev player:** stop any running server, then start a new instance so in-memory quest progress and delivery store reset.
- **No Bruno/curl** for this checklist — use Godot gameplay only.
- NEO-129 **`completionRewardSummary`** on quest-progress GET landed on `main`.
- NEO-122 quest HUD + NEO-128 reward delivery wiring landed on `main`.
## Expected reward HUD progression
| After | `QuestRewardDeliveryLabel` |
|-------|----------------------------|
| Boot (no completions yet) | `Quest rewards:` / `—` |
| Gather intro completes (3× scrap) | `Intro: Salvage Run` + `Salvage +25 XP` |
| Godot restart (server still running, quests already completed) | `—` (transition-only; no replay) |
| Operator chain completes | item line (`Survey Drone Kit ×1` when item defs loaded) + `Salvage +50 XP` |
| Quest-progress GET fails (server stopped) | `QuestProgressLabel` shows `sync error — …`; reward label `—` |
## Checklist
1. Start server: `cd server/NeonSprawl.Server && dotnet run`.
2. Run Godot main scene (**F5**). Confirm **`QuestRewardDeliveryLabel`** shows **`Quest rewards:`** / **`—`** below **`QuestAcceptFeedbackLabel`** in **`HudRootScroll`**.
3. Press **Q** to accept gather intro. Gather scrap (**R** on resource node ×3) until **`Intro: Salvage Run: completed`** on **`QuestProgressLabel`**.
4. Verify **`QuestRewardDeliveryLabel`** updates to **`Salvage +25 XP`** (quest display name on the line above when defs loaded).
5. Stop Godot and press **F5** again (server still running). Verify reward label stays **`—`** while progress still shows gather **`completed`** (idempotent boot — no transition replay).
6. Optional — operator chain: follow [NEO-123](NEO-123.md) through **`prototype_quest_operator_chain`** completion. Verify reward label shows **`Survey Drone Kit ×1`** (or raw id fallback) and **`Salvage +50 XP`** on chain completion transition only.
7. Optional: stop server while Godot running; trigger a quest-progress refresh (gather or **Q** accept). Verify **`QuestProgressLabel`** shows **`sync error — …`** and reward label **`—`**.
## Regression spot-check
- [NEO-122](NEO-122.md) — quest progress + accept HUD unchanged except new label below accept feedback.
- [NEO-110](NEO-110.md) — encounter loot label still independent from quest completion bundles.

View File

@ -267,8 +267,10 @@ Combat intro bundle is **skill XP only** — encounter loot already granted **`c
**Acceptance criteria**
- [ ] Completing a quest shows readable reward copy on HUD.
- [ ] Failed GET surfaces visible error (NEO-122 pattern).
- [x] Completing a quest shows readable reward copy on HUD.
- [x] Failed GET surfaces visible error (NEO-122 pattern).
**Landed ([NEO-131](https://linear.app/neon-sprawl/issue/NEO-131)):** **`QuestRewardDeliveryLabel`** + **`quest_hud_controller.gd`** transition detection for **`completionRewardSummary`**; [client README — Quest completion reward HUD (NEO-131)](../../client/README.md#quest-completion-reward-hud-neo-131); plan [NEO-131](../../plans/NEO-131-implementation-plan.md); manual QA [`NEO-131`](../../manual-qa/NEO-131.md).
**Server counterpart:** [NEO-129](https://linear.app/neon-sprawl/issue/NEO-129).

View File

@ -53,8 +53,16 @@
## Acceptance criteria checklist
- [ ] Completing a quest shows readable reward copy on HUD.
- [ ] Failed GET surfaces visible error (NEO-122 pattern).
- [x] Completing a quest shows readable reward copy on HUD.
- [x] Failed GET surfaces visible error (NEO-122 pattern).
## Implementation reconciliation (shipped)
- **`quest_progress_client.gd`:** **`completion_reward_summary`** static helper; parse preserves NEO-129 nested summary on completed rows.
- **`quest_hud_controller.gd`:** transition-only detection (**`_previous_status_by_quest`**); **`QuestRewardDeliveryLabel`** render with item-def display names + title-case skill XP lines; sync error idle state.
- **`main.gd` / `main.tscn`:** **`QuestRewardDeliveryLabel`** after accept feedback; **`ItemDefinitionsClient`** threaded into controller **`setup`**.
- **Tests:** `quest_progress_client_test.gd` (summary parse); `quest_hud_controller_test.gd` (transition, boot idempotency, sync error).
- **Docs:** `client/README.md`; `docs/manual-qa/NEO-131.md`; E7.M2 module + backlog alignment.
## Technical approach