Dated source reference. Current release status: handoff state. Full original relative paths are in the developer archive.
Elan 2K Mod — source and runtime rules reference
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.
Upstream repository · Local checkout · Release v1.9 ZIP
Archived October 12, 2026 at commit f77f0faeee55a1c077f52c79d2b4e8e5db0d47f6. The archive includes 30 commits, nine tags, 33 tracked files, release metadata and the only uploaded release asset exposed by GitHub (v1.9). Earlier releases have tags but no uploaded assets. A verified Git bundle preserves the complete fetched history offline.
Why this matters
This is a concrete source-level lead for custom gameplay rules. Its Python program attaches to nba2k14.exe, obtains the module base, then reads and writes live memory using Pymem. A PyQt5 window supplies settings, and a worker thread repeatedly applies changes. The checkout also includes two Cheat Engine tables with 59 entries, build artifacts, a Windows executable, configurations and four-point-line artwork research.
It provides implementations to study for clocks, scoring and periods. It does not supply the game's engine source, a replacement renderer, or a native Mac/Linux runtime. Its custom window is the mod controller, not an in-game menu replacement. Compatibility with our supplied executable has not been tested.
What the source actually does
| Feature | Mechanism in main.py |
Boundary to verify |
|---|---|---|
| Custom shot clock | Detects a clock value of 24 and writes the configured value | Timing near period end; exact-value polling |
| Offensive-rebound reset | Detects a change in either team's offensive-rebound counter | Counter resets and game transitions can look like rebounds |
| Ten-second backcourt | Replaces a remaining-time value of 8 with 10 | Engine enforcement, possession changes and timing |
| Two halves | Changes period 2 into period 4 | Halftime, fouls, statistics, presentation and overtime remain unverified |
| Shorter three-point threshold | Uses shot distance to temporarily change a two-pointer's scoring value | Does not change line geometry; README reports two free throws after qualifying fouls |
| Four/five pointers | Changes three-point scoring value using distance and a half-court flag | Mode combinations, value restoration and foul awards |
| Target score | Tracks scores when period 5 begins, then ends time when the configured increment is reached | Overtime-specific implementation; README reports a free-throw ending issue |
| G-League free throws | Consolidates attempts and changes free-throw value outside the late fourth-quarter window | Two-second sleep pauses other worker logic; halves interaction needs testing |
| Period-length override | Resolves one pointer and writes the configured integer once | Pointer validity and initialization timing |
| Internal year | Writes the year from the Apply handler | Downstream age/calendar behavior |
Source anchors: constants and pointers, scoring handlers, target-score logic, attachment and update loop, UI Apply handler.
Memory reference map
memory-map.json contains 21 source-derived address/pointer constants with line numbers. cheat-table-index.json preserves all 59 table entries, descriptions, types and pointer offsets. Unnamed research entries remain unnamed.
The code adds these offsets to the loaded module base; they are not standalone absolute addresses. Selected observations:
| Field | Module-relative offset | Access in main program |
|---|---|---|
| Period | 0x19EE5EC |
short |
| Time remaining | 0x19EE638 |
float |
| Shot clock | 0x19EE654 |
float |
| Backcourt time | 0x19EE670 |
float |
| Home / away score | 0x19E2188 / 0x19E260C |
short |
| Shot distance | 0x1A16290 |
float |
| Three / two / free-throw value | 0x19EE944 / 0x19EE948 / 0x19EE94C |
short |
| Period-length pointer | 0x011472E4, then +0x50 |
pointer read as int; final write as int |
Type labels are not uniformly consistent: the introductory comment calls the shot clock an integer, but the code and Cheat Engine table use float. The period-length table entry uses Byte while the Python writer uses int. Resolve differences on a matched executable before attempting writes.
Implementation limitations worth preserving
These are static code observations, not runtime test results:
- Attachment checks the process name but does not fingerprint the executable or verify expected data signatures before memory writes. Our original executable must be matched independently.
- The normal update loop has no sleep; exception handling refers to
exitwithout calling it. Errors may be hidden while the loop continues. A future implementation needs explicit lifecycle and error handling. - The free-throw handler sleeps for two seconds inside the same worker that handles clocks and scoring.
- The README lists overly frequent offensive-rebound resets, period-length startup timing, and inconsistent automatic shot makes. Keep these reported failures in the experiment plan.
- The source has no pinned dependency manifest. Imports establish Pymem and PyQt5 as dependencies, but their supported versions are not established here.
The tracked source tree has no LICENSE/COPYING file, and GitHub's license field is null. Preserve attribution and provenance; do not label it an explicitly licensed reusable dependency. This archive is a research reference, with no code incorporated into our implementation.
Next experiments this enables
- Establish a working game baseline and identify the loaded executable before any memory access.
- Build a read-only observer for candidate clock, score, period and possession fields. Validate values across menus, game start, possessions, free throws, halftime, overtime and return to menu.
- Derive a typed, version-specific memory map with explicit validity checks and reproducible captures.
- Test one rule change at a time on working copies, checking enforcement, statistics, presentation and save behavior together.
- Use the verified observations to design a rule interface separate from platform-specific process access. This preserves useful rule knowledge while the Mac/Linux runtime work proceeds independently.
Archive verification
Git object integrity and bundle verification passed. The v1.9 ZIP passed its CRC check. SHA-256 hashes are recorded in source-manifest.json and release-downloads.json. The release executable matches the tracked executable byte for byte. Config-file hashes differ; both copies are preserved in their original containers. HEAD differs from the v1.9 tag only in README content.
No source code, executable, build script or Cheat Engine table was run. The original game remains unchanged. The README's linked NLSC discussion is preserved as a link; this addition does not claim to archive that separate thread.