NEO-98 — Manual QA checklist
Preconditions
- Fresh dev player: stop any running server, then start a new instance so in-memory
dev-local-1 NPC HP, aggro/runtime rows, and player combat HP reset.
- No Bruno/curl seeding for this checklist — hotbar
prototype_pulse bind is automatic (NEO-85 dev bootstrap).
- NEO-97 telegraph HUD landed on
main (PR #136).
Archetype reference
| Archetype |
Instance id |
Marker |
maxHp |
Pulses to defeat |
NPC damage |
Windup |
Cooldown |
| Melee |
prototype_npc_melee |
orange west (-3, -3) |
100 |
4 |
15 |
1.5 s |
3.0 s |
| Ranged |
prototype_npc_ranged |
purple SE (3, 3) |
80 |
4 |
12 |
2.0 s |
4.0 s |
| Elite |
prototype_npc_elite |
gold origin (0, 0) |
200 |
8 |
25 |
2.5 s |
5.0 s |
Player casts prototype_pulse (25 damage, ~3 s cooldown).
Melee defeat math
| Cast # |
Expected CastFeedbackLabel |
CombatTargetHpLabel |
| 1 |
Cast: 25 dmg → 75 HP |
75/100 |
| 2 |
Cast: 25 dmg → 50 HP |
50/100 |
| 3 |
Cast: 25 dmg → 25 HP |
25/100 |
| 4 |
Cast: 25 dmg → 0 HP — defeated! |
0/100 (defeated) |
| 5 |
ability_cast_denied: target_defeated |
unchanged defeated |
Checklist
Boot
- Start server:
cd server/NeonSprawl.Server && dotnet run.
- Run Godot main scene (F5). Confirm slot 0 auto-binds
prototype_pulse after hotbar sync.
Melee — full telegraph + player HP spine
- Walk to orange Melee marker west of spawn
(-3, -3).
- Press Tab until
prototype_npc_melee is locked with Validity: ok — marker brightens; CombatTargetHpLabel shows 100/100.
- Press 1 (damaging cast):
CastFeedbackLabel shows damage; NpcStateLabel eventually shows NPC state: Melee → aggro (~1 Hz poll).
PlayerCombatHpLabel shows Player HP: 100/100 once combat poll starts.
- Wait ≥ 3 s from first cast:
NpcStateLabel shows telegraph_windup; TelegraphLabel shows countdown (e.g. Telegraph: Melee … · ~1.x s (melee)) ticking between polls.
- Wait ≥ 4.5 s total from first cast (windup completes):
PlayerCombatHpLabel drops to 85/100 (melee 15 damage).
- Press 1 three more times (respect ~3 s cooldown) until
CombatTargetHpLabel shows 0/100 (defeated) per defeat table above.
- Press 1 again:
ability_cast_denied: target_defeated.
Ranged — defeat + telegraph visible
- Walk to purple Ranged marker south-east
(3, 3); Tab lock prototype_npc_ranged.
- Press 1 (first damaging cast) →
NpcStateLabel shows aggro.
- Wait ≥ 4 s from first cast:
telegraph_windup + readable TelegraphLabel (2.0 s windup after 4.0 s cooldown).
- Press 1 until defeated (4 pulses total); verify
0/80 (defeated) on CombatTargetHpLabel and deny on re-cast.
Elite — defeat + telegraph visible
- Walk to gold Elite marker at origin
(0, 0); Tab lock prototype_npc_elite.
- Press 1 (first damaging cast) →
NpcStateLabel shows aggro.
- Wait ≥ 5 s from first cast:
telegraph_windup + readable TelegraphLabel (2.5 s windup after 5.0 s cooldown).
- Press 1 until defeated (8 pulses total); verify
0/200 (defeated) on CombatTargetHpLabel and deny on re-cast.
Regression
- Cast without lock still shows
ability_cast_denied: invalid_target on CastFeedbackLabel (NEO-28).
CombatTargetHpLabel + cooldown HUD still refresh after accepted casts (NEO-85 / NEO-32).
Notes
Acceptance