--- id: build-and-run title: "Build / Run / Debug — recipe, repo layout, env gates" status: established source_sections: "PROGRESS_LOG.md §10a, §10a-bis; README.md" related_topics: [wintesla-port, decomp-reference, reconstruction-method] key_terms: [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. ## Build (Win32 / VS2022 BuildTools — the DXSDK link libs are Lib/x86) ``` # 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 ``` - **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=`). [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 -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 ` → `../../engine/MUNGA/.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 - Base: [[wintesla-port]] (the engine build recipe). - Verify loop: [[reconstruction-method]]; env gates: [[decomp-reference]] §6.