Files
goldeneye-pc-port/docs/LEVEL-PLAYTEST.md
T
James Dansereau 9d118e0b13 M-13: 21-level sweep matrix + D123 (C1 fix) + D124 (C2 Jungle fix)
WS4 level sweep driven to completion: 12/21 solo levels PASS
(load + render + no-crash). Full matrix in docs/LEVEL-STATUS.md,
reusable runner tools_pc/level_sweep.sh, WS6 checklist docs/LEVEL-PLAYTEST.md.

Fixes:
- D123 (tools_pc/d88_propdefs.py): crash class C1 on 6 levels
  (Dam/Runway/Frigate/Statue/Streets/Cradle). D122 fallout - the widened
  Vehichle/AircraftRecord.ailist slot was zeroed instead of carrying its
  read-before-write integer AI-list id, so prop.c -> ailistFindById(0) ->
  GAILIST_AIM_AT_BOND -> ai() ran a CHR aim list with a NULL chr ->
  chrIsNotDeadOrShot(NULL). New OBJ_ID_WORDS arm. 4 levels -> PASS,
  Runway falls through to C2. BUNKER1/Silo unregressed.
- D124 (port/src/gimgfixup.c): crash class C2 on Jungle. Compiled
  explosion-DL pointer-sync keyed on an IMAGESEG marker that texLoad()
  had already erased -> compiled globalDL_0xNNN arrays kept link-time
  IMAGESEG words -> 0xABCDxxxx into fast3d on first explosion draw.
  Latent on every level. Detect the slot from the compiled array instead.

Diagnosed, NOT fixed (write-ups in PCPortResearch.md SF):
- C2-GDL (D124-Facility addendum): Facility/Runway - model texture-pool
  path yields a garbage tex->data; every model file loads at an odd
  bank base (mempAllocBytesInBank does no alignment). Suspect
  d43_emit.py/pcmodels sidecar texture-blob offsets (N64 8B vs PC 16B Gfx).
- C3/C6 (D125): Aztec/Bunker2/Surface2 - converted propDefs blob in RAM
  doesn't match d88_propdefs.py offline output (garbage after record 0);
  runtime sizepropdef() walk drifts ~100 records -> wrong door/modelid.
  d88_propdefs.py convert_stream + sizepropdef() PORT strides verified
  correct; suspect a dest-offset/pd_end bug in d88_emit.py propdefs emit.

Remaining: 9 crashes / 6 classes (C2-GDL, C3/C6, C2m Jungle G_MTX,
C5 Control BG portal, C4 Depot BG tile/room, C7 Surface1 sndSetupSound).
Priority order in docs/LEVEL-STATUS.md.

Also folds in the in-progress docs restructure (HANDOFF/AGENTS/CLAUDE,
PCPortResearch D121/D122 SF/SH entries, PLAN-linear-level-sweep,
HANDOFF-ARCHIVE, BACKLOG).
2026-08-29 16:36:18 -04:00

2.7 KiB

LEVEL-PLAYTEST — WS6 human completion-validation checklist

Run after docs/LEVEL-STATUS.md is all-21 load+render PASS. This is the part that needs real input — a human plays each level start to finish and confirms it matches retail. Findings feed a WS5-style triage round (log each as a crash-class row or a new Dxx candidate).

How to run one level

export PATH="/c/msys64/mingw64/bin:$PATH" && ./build-pc.sh ntsc-final
./build-pc/ge007.x86_64.exe -level_XX          # bare — pools auto-injected (D121)

Controls: port/src/input.c — keyboard+mouse or SDL gamepad. Known input polish gaps (do not re-log): D118a mouse yaw slower than pitch, D118b mouse-Y may feel inverted. Difficulty for a bare -level_XX boot defaults to Agent; use the menu path (mission select → difficulty) to test 00/007.

Objective status: src/game/objective_status.c (get_status_of_objective() :161); objective propDefs are PROPDEF_OBJECTIVE_* (bondconstants.h:4332).

Per-level checklist (copy this block per level)

### <Level> (-level_XX)   difficulty tested: [ ] Agent  [ ] Secret Agent  [ ] 00 Agent

- [ ] Spawn point + start orientation match retail
- [ ] Geometry / textures / lighting recognisable, no missing rooms
- [ ] Guards spawn, path, react, take/deal damage, die correctly
- [ ] Doors / lifts / switches / destructibles work
- [ ] Pickups (ammo, armour, key items, gadgets) present and collectable
- [ ] Each difficulty-gated objective reachable AND registers COMPLETE
      (objective_status)
- [ ] Alarms / reinforcements / scripted events fire
- [ ] Level exit trigger fires → MISSION COMPLETE (not a hang / wrong screen)
- [ ] Auto-advance to next briefing works
- [ ] Frame rate + timing acceptable
- Notes / defects:

21 solo levels (mission order — numbers = -level_XX)

# Level -level Briefing asset
1 Dam 33 UbriefdamZ
2 Facility 34 UbriefarkZ
3 Runway 35 UbriefrunZ
4 Surface 1 36 UbriefsevxZ
5 Bunker 1 09 UbriefsevbunkerZ
6 Silo 20 UbriefsiloZ
7 Frigate 26 UbriefdestZ
8 Surface 2 43 UbriefsevxbZ
9 Bunker 2 27 UbriefsevbZ
10 Statue 22 UbriefstatueZ
11 Archives 24 UbriefarchZ
12 Streets 29 UbriefpeteZ
13 Depot 30 UbriefdepoZ
14 Train 25 UbrieftraZ
15 Jungle 37 UbriefjunZ
16 Control 23 UbriefcontrolZ
17 Caverns 39 UbriefcaveZ
18 Cradle 41 UbriefcradZ
19 Aztec 28 UbriefaztZ
20 Egypt 32 UbriefcrypZ
21 Cuba 54 (post-Egypt unlock)

(Mission table: front.c:433. Cuba = LEVELID_CUBA, not in the standard folder list — unlocked after Egypt.)