Deploy: RP loops (no single-shot) + confirm DOSBox needs no bundled DLLs

- net-boot/loop_rp.bat: GO.BAT-style netnub loop for RP (mirror of loop.bat,
  retargeted to rpl4opt). deploy/net_rp.conf.tmpl now calls it instead of the
  single-shot netnub + DOS pause -- the deployable runs in a loop until the
  supervisor kills DOSBox (per operator: no single-shot in the product).
- DLL closure resolved: dosbox-x.exe is a 182MB STATIC build -- import table is
  only Windows system DLLs, delay-import table empty, libpng/SDL/zlib embedded.
  Nothing to bundle; wpcap.dll comes from the Npcap install. package.ps1's "no
  DLLs" case is now informational, and the plan/README note the static build.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Cyd
2026-07-10 12:06:49 -05:00
co-authored by Claude Opus 4.8
parent 9df87f2c01
commit e65ff3f8d7
5 changed files with 33 additions and 16 deletions
+3 -1
View File
@@ -92,7 +92,9 @@ one NIC) and the `200.0.0.x` hardcoding (postinstall stamps the assigned IPs).
Single root folder + `postinstall.bat`. Everything the install needs is inside:
- `dosbox-x.exe` + DLLs (bundle the **VC++ runtime**; don't install it separately)
- `dosbox-x.exe` -- a **static build** (182 MB; imports only Windows system DLLs,
empty delay-import table), so **no MinGW/SDL/VC++ DLLs to bundle**; the only
runtime DLL, `wpcap.dll`, comes from the Npcap install
- `ALPHA_1\` game content (REL410\BT, REL410\RP, SB16, GAUGE, ...) + `net-boot\`
drivers (LSL/NE2000/ODIPKT/NET.CFG @ PORT 340/INT 10, loop.bat)
- **Npcap silent installer** (bundled)
+12 -6
View File
@@ -10,7 +10,7 @@ Sources for the self-contained, air-gapped pod install. See
| `postinstall.bat` | elevated entry TeslaLauncher runs after extraction: finds the package folder, installs bundled Npcap, calls `configure.ps1` |
| `configure.ps1` | the per-pod step: detects the NIC + bay IP, derives the game IP = **bayIP+100**, binds DOSBox's pcap (`realnic`), renders the conf templates, stamps `WATTCP.CFG my_ip` |
| `net_loop.conf.tmpl` | BattleTech conf template (looped netnub) |
| `net_rp.conf.tmpl` | Red Planet conf template (single-shot) |
| `net_rp.conf.tmpl` | Red Planet conf template (looped netnub via `loop_rp.bat`) |
| `package.ps1` | assembles the deployable zip from repo sources + a fresh self-contained `pod-launch` publish |
Template tokens filled at install: `@@ROOT@@` (package dir), `@@REALNIC@@` (this
@@ -71,13 +71,19 @@ zip root + the package folder), and writes `emulator\dist\<PackageName>.zip`.
`-NoContent` skips `ALPHA_1`/`net-boot` for a fast structural check. Externally-
procured pieces are bundled only when their paths are passed (else flagged).
## DLLs / runtime
`dosbox-x.exe` is a **static build** (182 MB): its import table is only Windows
system DLLs and the delay-import table is empty, so there are **no MinGW/SDL DLLs
to bundle**. The one runtime DLL it needs, `wpcap.dll`, is provided by the Npcap
install. (Its other `LoadLibrary` strings are optional features our confs don't
use -- Glide/3dfx, ASPI, ANGLE, inpout -- or Windows-provided D3D/DXGI.)
Both deploy confs run netnub in a **loop** until the supervisor is killed
(`loop.bat` for BT, `loop_rp.bat` for RP) -- no single-shot in the deployable.
## Not yet in the repo / OPEN
- `npcap.exe` (licensed installer -- procured out-of-band) and any `vc_redist`.
- The frozen `renderer.exe` (packaging decision with David; `pod-launch` falls
back to `pyw live_bridge.py` when absent).
- **DOSBox-X runtime DLL closure** (MinGW/SDL DLLs): none sit beside
`dosbox-x.exe` in the dev tree -- it finds them via MSYS2 on PATH. The air-
gapped package must bundle them; `package.ps1` copies any DLLs beside the exe
and warns when there are none.
- RP loop-vs-single-shot for retail parity (template currently mirrors dev).
+4 -8
View File
@@ -2,8 +2,8 @@
# Tokens (filled by postinstall): @@ROOT@@ = package dir (C:\games\<folder>),
# @@REALNIC@@ = this pod's NIC GUID fragment, @@MACADDR@@ = stable derived MAC.
# Red Planet 4.10, networked pod boot (console pushes the mission egg over TCP).
# NOTE: single-shot netnub here (matches dev net_rp.conf); whether RP should loop
# like BT for retail-parity is an OPEN deploy decision (see DEPLOYMENT-PLAN.md).
# Loops netnub (loop_rp.bat) so the pod stays connected + picks up missions;
# runs until the supervisor (pod-launch) kills DOSBox. No single-shot in deploy.
[sdl]
output=opengl
priority=highest,highest
@@ -55,9 +55,5 @@ set TEMP=c:\
set HEAPSIZE=15000000
set L4GAUGE=640x480x16
call setenv.bat r f s p
echo === launching Red Planet via NetNub (RIO + sound; waits for console) ===
32rtm.exe -x
netnub -p -f rpl4opt > nn.log
32rtm.exe -u
echo === RP-NET-RUN-DONE ===
pause
echo === entering netnub loop (waits for console missions; supervisor kills to stop) ===
call d:\loop_rp.bat
+4 -1
View File
@@ -50,9 +50,12 @@ Copy-Item $podLaunch $root
# DOSBox-X + its DLLs
$dbDir = Join-Path $Emu 'src\src'
Copy-Item (Join-Path $dbDir 'dosbox-x.exe') $root
# The build is statically linked (imports only Windows system DLLs; empty
# delay-import table). No MinGW/SDL DLLs to bundle. wpcap.dll is provided by the
# Npcap install. Copy any DLLs that DO sit beside the exe, just in case.
$dlls = Get-ChildItem (Join-Path $dbDir '*.dll') -ErrorAction SilentlyContinue
if ($dlls) { $dlls | ForEach-Object { Copy-Item $_.FullName $root } ; Log "copied $($dlls.Count) DLL(s) beside dosbox-x.exe" }
else { Warn "no DLLs beside dosbox-x.exe -- verify the MinGW/SDL runtime DLLs the build needs are present" }
else { Log "no DLLs beside dosbox-x.exe (static build -- only Windows system DLLs + Npcap's wpcap needed)" }
# conf templates + configure.ps1
Copy-Item (Join-Path $Emu 'deploy\net_loop.conf.tmpl') $root
+10
View File
@@ -0,0 +1,10 @@
echo off
rem GO.BAT-style loop for Red Planet (mirror of loop.bat, retargeted to rpl4opt):
rem keep relaunching netnub so the pod stays connected to the console and picks up
rem a mission whenever one is queued. Runs until the supervisor kills DOSBox.
:go
32rtm.exe -x
netnub -p -f rpl4opt > c:\rel410\rp\nn.log
32rtm.exe -u
echo ===== netnub cycle ended -- reconnecting to console =====
goto go