2.1 KiB
2.1 KiB
NEO-31 — Manual QA checklist
| Field | Value |
|---|---|
| Key | NEO-31 |
| Title | E1M4-02: Input to AbilityCastRequest path |
| Linear | https://linear.app/neon-sprawl/issue/NEO-31/e1m4-02-input-to-abilitycastrequest-path |
| Plan | docs/plans/NEO-31-implementation-plan.md |
| Branch | NEO-31-e1m4-02-input-to-abilitycastrequest-path |
1) Server + Bruno
- Start server:
cd server/NeonSprawl.Server && dotnet run. curl -s http://localhost:5253/healthreturns JSON withstatus: ok.- Run Bruno collection (or at least):
ability-cast/Post hotbar bind slot0 pulse(seq 20) thenability-cast/Post cast happy(seq 21) — expect castaccepted: true. ability-cast/Post cast bad schema→ HTTP 400.ability-cast/Post cast missing player→ HTTP 404.ability-cast/Post cast loadout mismatch(seq 24): runability-cast/Post hotbar bind slot0 pulsein the same session first so slot 0 isprototype_pulse; then expectaccepted: falseandreasonCode == "loadout_mismatch".
2) Client — bound slot
- With server running, open main scene; confirm hotbar hydrated (NEO-29).
- Bind slot 0 to
prototype_pulse(Brunohotbar-loadout/Post loadout bindor equivalentcurl) if not already. - Press 1 (InputMap
hotbar_slot_1): Godot Output shows a line starting withability_cast_requestedincludingslot=0,ability_id=prototype_pulse, andtargetId=matching current HUD lock (null/—when cleared, or the locked id after Tab). - Server log or network trace shows one
POST …/ability-castper key press (no spam while key held; Godotis_action_pressedfires once per press).
3) Client — unbound slot
- Ensure slot 2 has no ability (default empty).
- Press 3 (
hotbar_slot_3): no cast POST; Output showsHotbar cast ignored: slot 2 empty_slot(or equivalentpush_warningtext).
4) Deny UX
- Force a server deny (e.g. cast wrong ability for bound slot via
curl): responseaccepted: false; if exercised through the client, Output includesability_cast_deniedin a warning.