OPENHOOPS / 2K14Final team archive · November 9, 2026Reference libraryChecksums

Dated source reference. Current release status: handoff state. Full original relative paths are in the developer archive.

Engine pause state and API command gating

Development49 correction: the counter's9F2640 dispatch is rendering, not complete simulation suspension. Live49v showed continued clocks/player motion with counter>0. Current owned pause additionally gates9F1D20 and live49zf verifies frozen clocks/positions, resume and expiry. Earlier manually opened native-menu fixtures and clock-write guards remain evidence within their recorded scope.

Earlier API checkpoint (October15,2026): 0.2.0.dev36, HTTP v1, snapshot ABI14/event ABI4, college profile4/court definition3. Use the current contract, verification ledger and remaining scope. Research milestones below retain their original versions, results and uncertainties; their former next-step statements are historical. Latest natural college OT/export and18 both-end release-contact cases passed; rare live exceptions remain unverified. No public release or extra live smoke is required for this documentation pass.

Current scope (October13,2026): Windows-first deep editing and a public extension API; Mac/Linux compatibility follows later. Earlier native-port goals and next-step proposals in this evidence history are superseded. Technical observations and verification limits remain as recorded.

Supported Windows x86 executable: SHA256 7cb5fdaa30586558a3146dcf9023880b1cceeaabfe0f92f967f461c4644f3704. Original corpus preserved. Evidence belongs to the user-supplied game; generated adapter/broker code is OpenHoops development work. This is not native-engine completion.

Engine evidence

0x1E85570 is a signed pause nesting counter. Getter 0x9F0F40 returns whether it is greater than zero. Enter routine 0x9F2E30 increments it and performs first-entry work; exit 0x9F0F10 decrements it and performs last-exit work. Main update dispatch 0x4EDB10 checks game-active 0x1E85578 through getter 0x9F0F50, then checks pause and only tail-jumps to 0x9F2640 when unpaused. This connects the counter to simulation gating, beyond UI correlation.

0x1527F60, setter 0x46D0C0 and getter 0x46D0D0, is a separate replay gate. It becomes one in the manually opened instant-replay screen and returns to zero after resuming normal play. Replay can retain pause depth one. It was also one during an idle-demo initialization sample; do not interpret it as exclusively the user's instant-replay menu. Broader replay/cutscene boundaries need fixtures.

Read-only .data captures from PID5592, each sequential rather than atomic:

Fixture Pause depth Replay gate
running-a / running-b 0 0
paused-a / paused-b 1 0
replay-a 1 1
paused-c (pause overlay still over replay) 1 1
paused-d (after returning to normal play and pausing again) 1 0

All read pages succeeded. Exact bytes and receipts are analysis/api-engine/pause-*; code exports/disassembly are in ghidra-pause and pause-reference-neighborhoods.asm. 009f3060.c is an exploratory interior fragment, not a verified function entry. Pseudocode alone is not reconstructed/verified source. The runtime/UI correlation and original instruction paths are separate forms of evidence.

API contract

Private snapshot mapping version2 appends a 12-byte EngineState after the existing command mailbox: total7856 bytes; command offset7800 and snapshot layout7760 bytes remain unchanged. Mapping name is versioned to prevent old brokers using the new producer silently. The updated broker reads v1 mappings but rejects their clock writes because v1 lacks the verified-pause guard. Public HTTP remains v1 with additive clocks.replay_active and nullable boolean clocks.paused. Missing, inactive or invalid producer state stays null. Pause means engine simulation pause depth greater than zero; it does not establish possession, live/dead ball or a whistle.

Clock writes require the current engine pause depth greater than zero, replay gate zero, active simulation, valid phase10 snapshot, matching raw period, exact clock preimage,750ms of stable game clock, bounded finite value and an unexpired request. The command executes once on the game thread and reads back the volatile destination. This only changes one timer; it does not implement a complete rule change or rewrite dependent state.

Build04 SHA256 0c6eb2bceaa137b43ccc2c807c6f632c832bbee4fb02f17c4a300c89d6154e5c.52 compiled command tests,580 counter comparisons and nine event tests pass. Synthetic tests cover negative/zero/nested pause, replay rejection and inactive-engine rejection, but do not replace live validation.82 broker/protocol tests pass on Mac and Windows. Live build04 checks are underway; no final completeness claim.

Completed build04 live command fixtures

On PID8736, actual paused phase10 accepted paired +1/restore writes for both game and shot clocks. Instant replay (pause=true, replay=true) rejected both commands; resumed gameplay rejected both. Artifacts: analysis/api-engine/live-04-pause-commands-{paused,replay,running}.json. Two earlier fixture attempts hit the750ms frozen-clock guard because restoration/next command followed too soon. The first left a temporary +1 game-clock adjustment, explicitly restored by live-04-pause-command-recovery.json; the second left no unpaired change. Final fixture waits one second after each write/restoration. These are deliberate mutable tests, not untouched gameplay.

The separate replay gate was also1 during pregame phase4/cinematics. It must not be described as exclusive proof that the user opened Instant Replay. It remains a conservative write-inhibition gate; its broader playback semantics require additional mapping.