Dated source reference. Current release status: handoff state. Full original relative paths are in the developer archive.
OpenHoops native IFF tools
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.
Read-only C++17 tooling for NBA 2K14's 94ef3bff container family. The library decodes generic segment/resource tables and raw or ZLIB-wrapped payloads. The texture exporter deliberately supports only a narrow standalone DXT1/DXT5 subset. Format evidence and limitations.
Build on the tested macOS ARM64 host
mkdir -p build/iff
clang++ -std=c++17 -O2 -Wall -Wextra -Werror native/iff/iff.cpp native/tools/iff_inspect.cpp -lz -o build/iff/openhoops_iff_inspect
clang++ -std=c++17 -O2 -Wall -Wextra -Werror native/iff/iff.cpp native/iff/texture.cpp native/tools/iff_texture.cpp -lz -o build/iff/openhoops_iff_texture
The supplied CMake targets require a C++17 compiler and zlib development package. CMake Release builds now pass on macOS ARM64; other operating-system builds remain untested. See the viewer notes below for the colon-path workaround used on this host.
Inspect or extract
build/iff/openhoops_iff_inspect NBA2K14-extracted/tunedata.iff
build/iff/openhoops_iff_inspect --extract 0 build/iff/tunedata-new.bin NBA2K14-extracted/tunedata.iff
build/iff/openhoops_iff_texture NBA2K14-extracted/logo000.iff 0 build/iff/logo000-new.dds
The inspector prints one JSON object per input, including segment sizes/CRCs and resource address lists. Exit status 1 means at least one input failed. Unsupported signatures and malformed structures are errors. Extraction writes only to the explicitly supplied new path and refuses to overwrite an existing output.
iff_texture INPUT RESOURCE_INDEX NEW_OUTPUT.dds uses the original resource-table index, not an editor's sorted image-list index. It exports only the top mip of a standalone two-address DXT1/DXT5 resource in direct layout 69 or 101. Grouped textures and all other layouts are rejected. The .dds retains compressed pixels exactly; PNG previews are a separate Pillow-based verification step.
The parser limits a source file and aggregate decoded data to 512 MiB, individual decoded segments to 256 MiB, segment descriptors to 4,096, and resources to 100,000. It checks ranges, index pointers, overlapping segments, compression checksums and stream consumption. Parsing the container does not validate every unknown resource payload or trailer byte.
Verification
.venv/bin/python tools/survey_iff.py
.venv/bin/python tools/verify_iff.py
.venv/bin/python tools/survey_iff_textures.py
.venv/bin/python tools/verify_iff_textures.py
Results: all 4,323 matching original containers, 7,875 segments and 78,330 resources matched the independent survey. Selected extraction bytes matched SHA-256. Sanitizers covered 551 malformed/mutated inputs. Seventy-seven native DDS exports preserved payload bytes and decoded with Pillow. Reports under analysis/iff record exact scope and source hashes.
These are native asset tools tested on macOS ARM64, not a reconstruction of the game's asset-loader implementation. They do not install mods, change original assets, launch the game, or implement a graphics backend.
Native viewer and pixel decoding
The openhoops_pixels library decodes the exporter's DXT1/DXT5 top mip into bounded RGBA8 using attributed bcdec. openhoops_iff_pixels writes raw pixels; openhoops_asset_viewer displays them through SDL3. See viewer evidence and build instructions. The top-level native/CMakeLists.txt builds these components and the reconstruction experiments together. macOS ARM64 is the only executed target.