31 lines
2.2 KiB
Markdown
31 lines
2.2 KiB
Markdown
# NEO-85 — Manual QA checklist
|
||
|
||
| Field | Value |
|
||
|-------|-------|
|
||
| Key | NEO-85 |
|
||
| Title | E5M1-11: Client combat feedback + target HP HUD |
|
||
| Linear | https://linear.app/neon-sprawl/issue/NEO-85/e5m1-11-client-combat-feedback-target-hp-hud |
|
||
| Plan | `docs/plans/NEO-85-implementation-plan.md` |
|
||
|
||
## 1) Server
|
||
|
||
- [ ] Start server: `cd server/NeonSprawl.Server && dotnet run`.
|
||
- [ ] `curl -s http://localhost:5253/health` returns JSON with `status: ok`.
|
||
- [ ] Optional reset between runs (Development host): `curl -sS -X POST http://localhost:5253/game/__dev/combat-targets-fixture -H 'Content-Type: application/json' -d '{"schemaVersion":1}'` returns **200** when the dev fixture route is enabled.
|
||
|
||
## 2) Client — combat HUD
|
||
|
||
- [ ] Open Godot main scene with server running; after hotbar sync, slot **0** auto-binds to **`prototype_pulse`** when empty (NEO-85 dev bootstrap — same as Bruno `Post hotbar bind slot0 pulse`).
|
||
- [ ] Locate combat dummies near spawn: **orange capsule "Dummy α"** at **`(-3, -3)`** (west of player) and **purple "Dummy β"** at **`(3, 3)`**; each has a flat lock ring on the ground. Walk toward the orange dummy if needed.
|
||
- [ ] **Tab** to lock **`prototype_target_alpha`** — dummy **brightens**; **`CombatTargetHpLabel`** shows **`Target HP: prototype_target_alpha 100/100`** (or **`…`** briefly until GET completes).
|
||
- [ ] Press **1** (hotbar slot 1 → index 0): **`CastFeedbackLabel`** shows **`Cast: 25 dmg → 75 HP`** (not Output-only).
|
||
- [ ] **`CombatTargetHpLabel`** updates to **`75/100`** after the cast (event-driven GET refresh).
|
||
- [ ] Cast **three more** pulse hits (respect cooldown): feedback steps **`50`**, **`25`**, then **`Cast: 25 dmg → 0 HP — defeated!`** on the lethal hit; HP label shows **`0/100 (defeated)`**.
|
||
- [ ] Press **1** again on the defeated dummy: **`CastFeedbackLabel`** shows **`ability_cast_denied: target_defeated`**; HP label remains defeated.
|
||
- [ ] **Esc** to clear lock: **`CombatTargetHpLabel`** shows **`Target HP: — (no lock)`**.
|
||
|
||
## 3) Regression
|
||
|
||
- [ ] Cast without lock still shows **`ability_cast_denied: invalid_target`** on **`CastFeedbackLabel`** (NEO-28).
|
||
- [ ] Cooldown HUD still refreshes after accepted casts (NEO-32).
|