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.

Pregame configuration — current source development37

This milestone ledger preserves development35/ABI11 pregame controls evidence. Current private API46/ABI21 expansion, accepted/pending scenarios and limitations are in LAUNCH-EXPANSION and MATCH-REQUESTS. Older current-at-capture statements below are historical.

Source37/ABI15 exposes13 exhibition controls: all nine Game Options entries (difficulty, Game Style, speed, quarter length, fatigue, injuries, arena and both playbooks), plus both teams/uniforms. Paged loaded catalogs and the independent prepare_matchup.py client support any external manager. Source-only roster preparation writes new ROS copies with starting order/native minutes. Loading and Start remain manual; VIP playback and exact substitution schedules remain unavailable. Current preparation evidence/limits, public contract, writer usage.

College configuration: set HalfMinutes and MediaTimeouts in exe-local openhoops/college-research.ini with the game closed, then restart. Generic quarter_length_minutes is the original-game pregame setting and does not configure college half duration. Binding ruleset metadata does not apply rules. Current ABI15/profile4 retains the original ABI11 preparation prefix and appends team/uniform/preset/catalog support. See versions and current checks.

Historical development35 evidence and ownership

All reverse engineering uses the user-supplied NBA2K14 Windows x86 executable SHA256 7cb5fdaa30586558a3146dcf9023880b1cceeaabfe0f92f967f461c4644f3704, previously captured startup code in analysis/offline-bootstrap, original-menu changes on the Dell, and read-only memory snapshots. Original game corpus is unchanged. This work did not rely on a third-party mod's undocumented addresses. The original pregame live verification used compiled research35a, SHA256 a3737b027190b46ba2374757559fb8e668e64de0fd65ae9d2a12a06c4ca413a0, MSVC19.51 /W4 /WX /O2 /MT. Snapshot ABI11 appends35,172 bytes to ABI10's9,952, total45,124; event ABI4 unchanged.

Private executable-specific details below belong only to the adapter/evidence:

Value Owner / original handler
Difficulty A09F10 profile+0;5381D0/538200
Speed Profile+C float0..1;538290/5382F0
Quarter minutes Profile+20;4B18B0/4B1960 wrap1..12
Fatigue / injuries Profile+8/+4;4B0B50/4B0AE0. Active-game setters' inactive fallbacks target different fields.
Selected arena A09FD0 setup+8 roster pointer;4A8360 setter. B74FA0/B75080 eligibility permits type0 without unlock/mode checks.
Home / away playbook Setup+2C/+30;4A97A0/4A98A0 and4A9820/4A9910. Ordinary sequence0..68 skips33/34.
Teams Setup+C/+10 roster pointers. Historical35 read-only; current37 selects physical rows.
Game style Historical raw Profile+124 is not the menu preset. Current37 uses the original9A5E50 transition and actual slider profile selector.

A09F10 resolves [1F207A8]->350CA8 +28 + index*128h; A09FD0 resolves CAC+28+index*868h. Oversized CA8 captures include adjacent CAC memory. Early labels that called these overlapping bytes “options” are not ownership proof.

Rosterheader+60/+64 supplies arena count/table(stride38h), +6C/+70 teams(stride2F8h), +D8/+DC books(strideDCh). Arena ID=low11bits at+34; eligibilitytype=bits17..21; nameptr+8. Playbook ID=low7bits at+8, nameptr+0. Names are read from loaded data, not a hard-coded NBA catalog. Stock102 arenas/69 books contain45/67 allowed choices. IDs are scoped to that roster's catalog; the public fingerprint changes when its choices/names change. Arena floor/stadium entries were cataloged separately; the API does not load arbitrary new assets.

Original startup9F6548/9F6556 reads home/away book selectors and callsBDE510. That resolves a roster book via873B20→5FE890 and copies220bytes into 1F205E8 + side*DCh through9F4090. Live fixture confirms homeID10(Pelicans) and awayID24(Suns) match entire roster entries after loading. This is runtime selection proof, not proof of each AI play's execution.

Verification

  • Original menu mapping: isolated field changes and restoration, including misnamed captures corrected in work log; screenshots and sequential reads in analysis/match-launch. Keyboard3 opens options,1 returns.
  • Original handlers:292 bounded quarter/book cases; observed changes also cover speed/difficulty/toggles. No mocked original callees for those cases.
  • Compiled preparation:80 cases with synthetic root/captured roster/options and mocked UTF conversion, including expiry, active-game/mode/revision/preimage/range rejection and no duplicate mutation. No main-thread dispatch/SEH/rendering proof from this harness alone.
  • Live public round trips:212 cases including all allowed arenas, both67-choice book selections, all quarters/difficulties, speed bounds and switches. Receipts/readback, retry identity, stale-preimage refusal and original values restored.
  • All eight independently match original menu: top, arena/books. Loaded court, active settings, runtime books, active-game refusal.
  • Existing compiled camera/controller/options/slider checks pass on35a:3,094/2,740/709/2,242, with the original harness's documented mocks.236 broker/client unit tests include refusal before partial-plan writes, indeterminate command handling, roster mismatch, and commit-before-ACK failure recovery. Final cross-platform test/game evidence is updated in WORK-LOG.

Preparation capture runs at existing4E0190 sampler in menus, unlike a prior stale-menu assumption. Availability requires a valid exhibition setup and inactive simulation; it does not assert which menu page is visible. Loading may make observations stale. Prepare before launching. Changed setup, expired commands or active simulation refuse mutation. Commands are sequential and may leave earlier successful writes applied if a later setting fails. Runtime only; no disk serializer or automatic rollback promise.

The independent examples prepare_match.py and match_session.py use public endpoints only. The latter supplies explicit external identities, follows observed clocks/scores, commits results to its own SQLite store before ACK, and stops on review-required state. A separate read-only scoreboard.py/HTML example displays the same public snapshot in a browser and clears stale scores. Neither display replaces the in-game renderer or automatically launches games. Binding currently begins at phase10, after some opening activity, so full-match event completeness remains false.

Historical development35 final fixture and cleanup

The configured35 game finished Spurs14–Heat6 in regulation. Independent-client verification confirms all exported player/team totals match the final API snapshot, exact result persistence in the client's own SQLite database, and successful delivery acknowledgement.5,370 live snapshots have zero adapter errors; all5,901 saved snapshots plus212 preparation commands/receipts pass the32-schema contract. Binding began at59.981361s inQ1 (0.018639s after tip), so whole-match event completeness remains false. The browser display was independently checked at final14–6 and after returning to menus, when it correctly cleared unavailable scores. Final display.

236 tests pass on Mac and Windows. Five Windows installer cases and109 package member hashes pass. The independent preparation example restored the original current settings; after normal game exit,95 original save/cache files were restored by hash. Game/API/browser-test processes stopped; native35a remains installed only in the Dell working copy. Original corpus unchanged. Package and cleanup verification.