60 lines
3.7 KiB
Markdown
60 lines
3.7 KiB
Markdown
# NEO-110 — Manual QA checklist
|
||
|
||
| Field | Value |
|
||
|-------|-------|
|
||
| Key | NEO-110 |
|
||
| Title | E5M3-11: Client encounter progress + loot feedback HUD |
|
||
| Linear | https://linear.app/neon-sprawl/issue/NEO-110/e5m3-11-client-encounter-progress-loot-feedback-hud |
|
||
| Plan | `docs/plans/NEO-110-implementation-plan.md` |
|
||
| Branch | `NEO-110-client-encounter-progress-loot-feedback-hud` |
|
||
|
||
## Preconditions
|
||
|
||
- **Fresh dev player:** stop any running server, then start a new instance so in-memory encounter progress, NPC HP, and inventory reset.
|
||
- **No Bruno/curl** for this checklist — defeat chain uses Godot **Tab** + **1** only.
|
||
- NEO-108 encounter-progress GET and NEO-106 combat wiring landed on `main`.
|
||
- **`Economy HUD`** toggle **on** for inventory verification (step 8).
|
||
|
||
## Archetype reference (defeat order flexible)
|
||
|
||
| Archetype | Instance id | Marker | Pulses to defeat |
|
||
|-----------|-------------|--------|------------------|
|
||
| Melee | `prototype_npc_melee` | orange west **`(-3, -3)`** | 4 |
|
||
| Ranged | `prototype_npc_ranged` | purple SE **`(3, 3)`** | 4 |
|
||
| Elite | `prototype_npc_elite` | gold origin **`(0, 0)`** | 8 |
|
||
|
||
Player casts **`prototype_pulse`** (**25** damage, ~**3 s** cooldown).
|
||
|
||
## Expected encounter HUD progression
|
||
|
||
| After | `EncounterProgressLabel` | `EncounterCompleteLabel` |
|
||
|-------|--------------------------|---------------------------|
|
||
| Boot (no engagement) | `prototype_combat_pocket: not started (0/3)` | `Loot: —` |
|
||
| 1st NPC defeated | `prototype_combat_pocket: 1/3` | `Loot: —` |
|
||
| 2nd NPC defeated | `prototype_combat_pocket: 2/3` | `Loot: —` |
|
||
| 3rd NPC defeated | `prototype_combat_pocket: completed (3/3)` | `scrap_metal_bulk ×10` and `contract_handoff_token ×1` (display names when item defs loaded) |
|
||
|
||
## Checklist
|
||
|
||
1. Start server: `cd server/NeonSprawl.Server && dotnet run`.
|
||
2. Run Godot main scene (**F5**). Confirm boot lines: **`Encounter: … not started (0/3)`** and **`Loot: —`** on **`EncounterProgressLabel`** / **`EncounterCompleteLabel`** (in **`HudRootScroll`**, below **`PlayerCombatHpLabel`**). Scroll **`HudRootScroll`** if the debug stack is taller than the viewport.
|
||
3. Defeat **`prototype_npc_melee`**: walk to orange marker, **Tab** lock, press **1** until **`Cast: … — defeated!`**. Verify **`EncounterProgressLabel`** shows **`1/3`** (may lag one GET behind cast — wait ~1 s or defeat next NPC).
|
||
4. Defeat **`prototype_npc_ranged`**: lock at SE marker, cast until defeated. Verify **`2/3`**.
|
||
5. Defeat **`prototype_npc_elite`**: lock at origin, cast until defeated (**8** pulses). Verify **`completed (3/3)`** and **`EncounterCompleteLabel`** lists **`scrap_metal_bulk ×10`** and **`contract_handoff_token ×1`** (or raw ids if defs still loading).
|
||
6. Open **`Economy HUD`** body: **`InventoryLabel`** shows **`scrap_metal_bulk`** and **`contract_handoff_token`** without pressing **I** (auto-refresh on completion GET).
|
||
7. Defeat any already-defeated NPC again (optional): encounter row stays **`completed (3/3)`**; loot lines unchanged.
|
||
8. Regression: **`GigXpLabel`** still updates per defeat (NEO-86); **`CastFeedbackLabel`** still shows deny on re-cast (**`target_defeated`**).
|
||
|
||
## Notes
|
||
|
||
- Defeat order may differ from table — server tracks order-independent subset; count is **`defeatedTargetIds.size()`**.
|
||
- Capstone baseline prefers **server restart** over mid-session fixture POST.
|
||
- Full three-NPC loop + idempotency capstone: [NEO-111 manual QA](NEO-111.md).
|
||
- Component combat regression: [NEO-98 manual QA](NEO-98.md).
|
||
|
||
## Acceptance
|
||
|
||
- [ ] Steps 1–8 completable in one session without Bruno/curl.
|
||
- [ ] Progress label shows **1/3**, **2/3**, then **completed (3/3)** after defeats.
|
||
- [ ] Loot label matches server grant summary; inventory reflects grants without **I**.
|