neon-sprawl/docs/manual-qa/NEO-43.md

2.7 KiB

Manual QA — NEO-43 (mission / quest → skill XP, mission_reward)

Reference: implementation plan, NEO-38 (skill progression grant), NEO-42 (prep-hook analogue).

Preconditions

  • Run NeonSprawl.Server from server/NeonSprawl.Server (dotnet run; default http://localhost:5253).
  • Player dev-local-1 (default seed).
BASE=http://localhost:5253
ID=dev-local-1

Automated coverage

MissionRewardSkillXpGrantTests exercises the NEO-38 grant path with disk prototype_skills.json (salvage allows mission_reward) and a stub registry where salvage omits mission_reward from allowedXpSourceKinds.

Control: direct POST grant (same stack as E7.M2 hook)

Move once so GET …/skill-progression is not 404:

curl -sS -i -X POST "${BASE}/game/players/${ID}/move" \
  -H "Content-Type: application/json" \
  -d '{"schemaVersion":1,"target":{"x":0.5,"y":0.9,"z":0.5}}'

Baseline:

curl -sS "${BASE}/game/players/${ID}/skill-progression"

Apply salvage + mission_reward (mirrors what MissionRewardSkillXpGrant.GrantFromMissionReward does internally for that skill/amount):

curl -sS -i -X POST "${BASE}/game/players/${ID}/skill-progression" \
  -H "Content-Type: application/json" \
  -d '{"schemaVersion":1,"skillId":"salvage","amount":25,"sourceKind":"mission_reward"}'

Expect HTTP 200, granted": true, and salvage xp increased (repeat POST to see cumulative XP).

Deny path (catalog guard)

With default catalog, trainer is not allowed for salvage:

curl -sS -i -X POST "${BASE}/game/players/${ID}/skill-progression" \
  -H "Content-Type: application/json" \
  -d '{"schemaVersion":1,"skillId":"salvage","amount":5,"sourceKind":"trainer"}'

Expect HTTP 200, granted": false, reasonCode":"source_kind_not_allowed".

Combat vs mission XP

Skill XP from missions uses mission_reward (this story). Combat encounters must not grant skill XP by default — they award gig XP separately; see progression.md (Mission rewards vs combat XP). There is no encounter reward implementation under server/ yet; when E5 / E7 adds encounter payouts, keep skill progression grants off the default encounter pipe unless a product exception is explicitly modeled.

E7.M2 follow-up

When quest hand-in / QuestRewardBundle apply exists, confirm one server-side call to MissionRewardSkillXpGrant.GrantFromMissionReward per scripted skill XP line item (with content-driven skillId and amount), then GET …/skill-progression shows expected totals.