d3d_OBJECT::LoadTexture never checked D3DXCreateTextureFromFileA, cached the NULL texture, and unconditionally AddRef()ed it - an access violation on any missing/unreadable texture, hit by every bare working copy because the pod skins (VIDEO\player1-8) come from the presets/replacement-material path, not the depot. Failures now log the filename+hr and the draw op renders untextured, matching the existing no-texture-filename path. Also guard the unchecked gReplacementData->find() in LoadObject (same latent UB one branch earlier). Verified in the sandbox working copy: the game now boots to a running RPL4 window with -windowed -egg TEST.EGG (RIO served by vRIO), logging the eight missing pod skins instead of dying in MakeEntityRenderables. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
6.6 KiB
Building Red Planet 4.12 (Win32)
This is the Win32 source for the pod-racing game Red Planet, built on the in-house MUNGA engine and its L4 (Win32 / DirectX 9) platform layer. As of RP 4.12 the build targets Visual Studio 2022 (v143); the legacy VS 2005/2008 projects are retained for reference (see §5).
✅ Verified build (2026-07-12): all 4 projects build clean (
Release|Win32) with VS2022 Build Tools 17.14 (MSVC 14.44, v143) + Windows 11 SDK (10.0.26100) + DirectX SDK (June 2010). Outputs:Release\rpl4opt.exe(the game),Release\RPL4TOOL.exe,lib\Munga_l4.lib,lib\DivLoader.lib. Runtime-verified against the VC9 baseline built from the same tree: identical log output and behavior at every checkpoint, including RIO init against vRIO and mission load (see §4 for the pre-existing crash both builds share).
1. Requirements
| Component | Version | Notes |
|---|---|---|
| VS2022 Build Tools (or any VS2022 with C++ workload) | 17.x, MSVC v143 | Installed at C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools. Install via winget install Microsoft.VisualStudio.2022.BuildTools --override "--quiet --wait --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended". |
| Windows 10/11 SDK | any recent (26100 verified) | Comes with the VCTools workload. |
| DirectX SDK (June 2010) | — | Still needed for d3dx9 and dxerr only; everything else now comes from the Windows SDK. The projects reference it via $(DXSDK_DIR), which the SDK installer sets machine-wide. The DXSDK include/lib paths are appended after the Windows SDK paths (see the IncludePath/LibraryPath properties in the projects) so modern headers win — do not move them to AdditionalIncludeDirectories. |
Bundled third-party libraries (already in the repo)
Committed under lib/, no install needed: OpenAL32.lib, libsndfile-1.lib
(import libs). At run time the game needs OpenAL32.dll (system-wide install —
assets/RP411/oalinst.exe — or beside the exe) and libsndfile-1.dll (beside the
exe; a copy ships in assets/RP411/).
2. Building
& "C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\MSBuild\Current\Bin\MSBuild.exe" `
WinTesla.sln /p:Configuration=Release /p:Platform=Win32 /m
Debug|Win32 also builds. x64 is not configured — this is a 32-bit build.
The solution is WinTesla.sln with four v143 projects:
| Project | Type | Output |
|---|---|---|
| MUNGA_L4/Munga_L4.vcxproj | Static lib | lib\Munga_l4.lib |
| RP_L4/RP_L4.vcxproj | App (Windows) | Release\rpl4opt.exe — the game |
| RP_L4/RPL4TOOL.vcxproj | App (Console) | Release\RPL4TOOL.exe |
| DivLoader/DivLoader.vcxproj | Static lib | lib\DivLoader.lib (Release) |
Build order is resolved by ProjectReference (RP_L4 and RPL4TOOL both reference
Munga_L4).
3. VS2022 migration notes (what changed and why)
Settings preserved from the VC9 projects: /Zp1 struct packing in Munga_L4
and RP_L4 (the engine's on-disk/on-wire binary formats depend on it — RPL4TOOL
and DivLoader never had it), Unicode, subsystems, x86, /DYNAMICBASE:NO,
optimization levels, and /FORCE:MULTIPLE (see below). Deliberate changes:
- CRT unified to
/MD(Release) //MDd(Debug). The VC9 build mixed/MT(Munga_L4, RPL4TOOL) with/MD(RP_L4) and forced the link. - Import libs are no longer merged into
Munga_L4.libby the librarian; the exes link OpenAL32/d3d9/d3dx9/dinput8/dxguid/ws2_32 directly. WINDOWS_IGNORE_PACKING_MISMATCHis defined: the modern Windows SDKstatic_asserts against/Zp1; the VC9 build always compiled Windows headers at/Zp1, so this preserves those exact semantics. Un-/Zp1-ing the engine (pragma-pack only the serialized structs) is future work._SILENCE_STDEXT_HASH_DEPRECATION_WARNINGSis defined: the code still usesstdext::hash_map; porting tostd::unordered_mapis future work.legacy_stdio_definitions.libis linked: the June-2010dxerr.libreferences pre-UCRT stdio symbols.- Source fixes (behavior-preserving): standard copy-ctor/assignment
overloads added to
Time(rvalues can't bind tovolatile&in standard C++);operator==(SOCKADDR_IN&,...)inNETWORK.hmadeinline; the L4DINPUT callbacks renamedDIEnum*(they collided with L4CTRL's under LTCG);std::ios.in→std::ios::ininCAMMGR.cpp. /FORCE:MULTIPLEis still required:gOpNames,gReplacementData(hash_maps defined in a header) andGlobalEggFileNameare genuinely defined in multiple TUs (LNK4006 warnings, same as the VC9 build). Moving them to a single TU is future cleanup.
4. Runtime notes
Fixed (2026-07-12): standalone mission load used to crash with an access
violation in d3d_OBJECT::LoadTexture (MUNGA_L4/L4D3D.cpp):
D3DXCreateTextureFromFileA failures were never checked and the NULL texture
was cached and AddRef()ed. It crashed identically on VC9 — a latent defect
in the 2007 DPL→D3D9 port, exposed by the pod-skin textures (VIDEO\player1–8)
that a bare working copy doesn't contain (they normally come from the
replacement-material/presets path, WTPresets → VIDEO\<name>.png). Missing
textures now log L4D3D.cpp couldn't load texture … and render untextured;
the game boots to a running window with -windowed -res 640 480 -egg TEST.EGG
from a working copy like assets/RP411/.
For runtime debugging the v143 build produces full PDBs — run
cdb -g -G -lines -y Release rpl4opt.exe ... from the working directory
(cdb ships in this machine's Windows Kits).
Also note: Fail() compiles to abort() in release (MUNGA/DEBUGOFF.h) —
e.g. running with L4CONTROLS=KEYBOARD alone aborts at VTV creation because
no keyboard-only pod mapper exists (the old CRT showed a blocking R6010
dialog; the UCRT fail-fasts). Use L4CONTROLS=RIO;KEYBOARD with vRIO serving
the RIO side, exactly like the arcade config.
5. Legacy VS2005/2008 build
The original .vcproj files and solution are kept as
WinTesla_vc9.sln and still build with VC++ 2008 Express
SP1 + DXSDK June 2010:
@echo off
call "C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat"
set "DXSDK_DIR=C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\"
vcbuild /nologo /rebuild WinTesla_vc9.sln "Release|Win32"
See docs/BUILD-NOTES.md for the original repository cleanup history and the findings behind the legacy build.