Files
BT412/context/build-and-run.md
T
CydandClaude Fable 5 55e4295dc3 Toolchain: VS2022 (v143) is the build of record -- /FORCE:UNRESOLVED retired
The v143 linker refuses to emit an image with unresolved externals even
under /FORCE, so the dead offline-tool ladders in mech3.cpp
(Mech::CreateSubsystemStream / SubsystemDefaultData -- never called at
runtime, resources ship prebuilt in BTL4.RES) are compiled out behind
BT412_OFFLINE_TOOLS (default off). The exe links /FORCE:MULTIPLE only:
a genuinely unresolved symbol is now a hard link error instead of a
hidden runtime AV. No other source changes needed for v143.

Verified: clean build; solo DEV.EGG runs; two-instance loopback MP via
btconsole.py -- mesh forms, mission runs both sides, master + replicant
tick in each world. (Phase 1 of docs/BT412-ROADMAP.md)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 07:36:19 -05:00

4.6 KiB

id, title, status, source_sections, related_topics, key_terms
id title status source_sections related_topics key_terms
build-and-run Build / Run / Debug — recipe, repo layout, env gates established PROGRESS_LOG.md §10a, §10a-bis; README.md
wintesla-port
decomp-reference
reconstruction-method
BTL4OPT
cdb
BTL4.RES
EGG
WinTesla

Build / Run / Debug

The one top-level CMakeLists.txt builds munga_engine (engine) + bt410_l4 (reconstructed BT game lib) + btl4.exe. Full recipe + repo-layout map: docs/PROGRESS_LOG.md §10a / §10a-bis + README.md. Env-gate table: decomp-reference §6.

# configure once (BT412 toolchain of record, moved from VS2019/v142 at the 4.12 fork):
cmake -S . -B build -G "Visual Studio 17 2022" -A Win32 \
  -DCMAKE_GENERATOR_INSTANCE="C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools"
# build:
cmake --build build --config Debug
  • Links DXSDK d3d9/d3dx9/dinput8 + OpenAL/libsndfile (engine/lib/). DXSDK June 2010 at C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\ (overridable -DDXSDK). [T2]
  • Linker uses /FORCE:MULTIPLE — tolerates the ~124 header-defined-global LNK2005s. UNRESOLVED is gone (BT412, 2026-07-14): the v143 linker refuses to emit an image with unresolved externals even under /FORCE, so the dead offline-tool ladders in mech3.cpp (Mech::CreateSubsystemStream / Mech::SubsystemDefaultData — never called at runtime) are compiled out behind BT412_OFFLINE_TOOLS (default off). A genuinely unresolved symbol is now a hard LINK ERROR, not a hidden runtime AV — the reconstruction-gotchas §6 hazard class is retired for the exe link. No other source changes were needed for v143 (verified: clean build, solo DEV.EGG run, two-instance loopback MP with replication). [T2]
  • Editing an engine/ file rebuilds the engine lib automatically (one project). A NEW member on a DPLRenderer/d3d_OBJECT class needs the game objs that embed its layout recompiled — delete stale objs if layout-mismatch corruption appears. [T2]
  • ⚠ Kill the running exe before rebuilding (taskkill //F //IM btl4.exe) or you get LNK1104.

Run

run\run.cmd [EGG]      # default DEV.EGG; cd's to content\ and runs btl4.exe -egg <EGG>
  • cwd MUST be content\ — the engine resolves BTL4.RES, VIDEO\, BTDPL.INI, eggs relative to cwd (the loadTables gotcha: L4VIDEO.cpp:849 fopen("VIDEO\\REPLACEMATS.tbl") is relative + unchecked → fread on NULL if cwd is wrong). Logs to btl4.log in content\ (or BT_LOG=<file>). [T2]
  • Interactive: WASD drive; weapon groups (keyboard, task #43) 1/Space = lasers, 2 = PPCs, 3/Ctrl = missiles; X all-stop; V cockpit/chase view. Default egg = DEV.EGG (map=grass, time=day). Swap mech via the egg's vehicle= (bhk1/madcat/…). The code path is mech-agnostic (verified — Mad Cat booted + fought with zero code changes). [T2]

Debug (cdb x86)

"C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\cdb.exe". Pattern for a faulting stack (cwd = content): -g -c ".lines;sxe av;g;kp 24;q" with BT_ASSERT_TO_DEBUGGER=1. Debug CRT fills fresh heap 0xCDCDCDCD (uninit) + freed 0xFEEEFEEE — invaluable for "was this ever constructed?". BT_HEAPCHECK=1 = whole-heap validation every alloc/free (O(n²) at mission load — SLOW). To attach to a frozen abort dialog: cdb -p <pid> -c ".lines;~*kp 30;q". [T2]

Repo layout (bt411)

  • engine/MUNGA/ + engine/MUNGA_L4/ — the shared 2007 MUNGA engine + Win32/D3D9 HAL (carries our BT render/loader work: bgfload/L4D3D/L4VIDEO + the image codec). engine/shim/ (ATL), engine/lib/ (OpenAL/libsndfile), engine/rp/ (RP headers the audio HAL includes).
  • game/reconstructed/ — the reconstructed BT source (the bulk).
  • game/original/BT/ + BT_L4/ — surviving original BT .cpp + all BT headers (the include path).
  • game/fwd/ — ~186 forwarding shims (#include <EXPLODE.hpp>../../engine/MUNGA/<NAME>.h).
  • game/btl4main.cpp — the WinMain launcher.
  • content/ — the runtime tree (BTL4.RES, VIDEO/, GAUGE/, AUDIO/, eggs, BTDPL.INI). Run cwd.
  • reference/decomp/ — the raw Ghidra pseudocode (all/part_*.c) — the source-of-truth.
  • docs/ — the detailed ledgers (incl. PROGRESS_LOG.md, the full pre-restructure CLAUDE.md).
  • tools/ — btconsole.py, disas2.py, map/res scanners. context/ — this knowledge base.

Key Relationships