The DOSBox-X preservation pods run the original DOS builds of BattleTech
4.10 / Red Planet 4.10 inside an emulator whose bridged NIC is enumerated
100 above the host pod's last octet. A new checkbox on each game page
(RP Death Race / Martian Football, BT Free For All / No Return) shifts
every siteconfig address the page uses by +100 so the same pages control
either version of the games:
- Munga game connections (port 1501) target host+100; toggling the box
drops and reconnects any requested pods at the new address.
- Mission egg player and camera entries carry the shifted address.
- The checkbox locks while a mission is loaded/running, like the other
mission properties.
Launcher / site-management traffic is untouched -- those services still
run on the pod host itself. Pages share a pod's MungaGame, so the most
recent page to toggle or enable wins if two pages fight over one pod.
Verified end-to-end against vPOD: netstat shows the game connection move
127.0.0.1 -> 127.0.0.101 -> 127.0.0.1 as the box is toggled, and the egg
received by vPOD carries pilot=127.0.0.101. All 103 diff tests pass.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The launcher drops RPC sessions idle >30s (easily hit while the operator sits
in the install dialogs), but a dropped socket still reports Connected until an
I/O fails. InstallProductWorker then skipped its reopen, streamed the archive
on the fresh out-of-band connection, and died on the first progress poll —
and the install-completed handler registered launch entries without checking
e.Error, so AddApp's disconnected-guard exception crashed the whole console.
- PodInfo.EnsureConnectionAlive: probe an "open" connection with a Ping and
reconnect when it is dead; used by the install and uninstall workers.
- SiteManagement.PodInfo_InstallProductCompleted: register launch entries only
on success, and surface registration failures as the row's Install Failed
state instead of an unhandled exception.
- Regression test pins the premise + recovery against vPOD's launcher server
(stale socket reports open, Ping exposes it, reconnect restores service).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Completes the BattleTech console feature to parity with Red Planet:
- BTPrintDocument: the per-pilot landscape score sheet (mech portrait,
placing, kill/death/damage stats, randomized mission-highlights narrative,
pilot-vs-pilot damage matrix, place-over-time chart), mirroring
RPPrintDocument minus the football/lap/boost/score-zone concepts. Wired into
BTGame (Auto Print checkbox + Print Last Mission button) and the shell's File
menu (BT Mission Print Preview / Print BT Mission, loading .btm files).
- BTStrings(.xml): the BT mission-highlight narrative pools (damage tiers,
kill, death-without-honor, recap), loaded from BattleTech\BTStrings.xml like
RPStrings.
- BTDefaultsDialog: two-column (Free For All / No Return) editor for the BT
operator defaults, reachable from Settings (Change/Import/Export BattleTech
Defaults). Verified via UI Automation: opens with all 18 option combos
populated.
- Apps.xml: the BattleTech 4.11 product (btl4.exe on the shared RP411 engine,
same -net/-res/-lc/-mr command line; deploys to C:\Games\BT411) with Game
Client / Live Camera / Mission Review launch entries. CatalogTests updated to
4 products / 8 entries plus the three new BT entry assertions.
Role model spelling corrected to "noreturn": the Mac Console.ini tag and the
game's BTL4.RES role resource are dfltrole/NoReturn; the 4.10 console's eggs
emitted a broken "noretun" that cannot resolve against the RES. BTGoldenEggTests
and BTConfig.xml updated accordingly.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
BTGame mirrors RPGame - same GameStateData/state-machine/NetworkScan engine
driving each pod's MungaGame (take ownership, stream egg on WaitingForEgg,
Run/Abort/Stop, countdown) - with the BT differences: ApplicationID.BTL4, a
pilots grid carrying Mech/Camo/Patch/Badge/Experience, an Advanced Damage
checkbox in place of RP's Score Compression, and the Mech* in-match messages
recorded via BTMissionRecorder into BTMissionResults (.btm, gzip +
BinaryFormatter like .rpm; scores are 1000-based like RP). Free For All and
No Return share the pane; the mode selects the pilots' role. BTDefaults
persists per-mode operator defaults to BTDefaults.btd (no dialog yet).
RPGame's dead decompile members (sStopToIdleStates, IsAllPodsAppState) were
not carried over.
TeslaConsoleForm no longer assumes RP: the "AppID != 0 -> Pod Not Running RP"
check becomes a GameTag map (RPL4 -> RP, BTL4 -> BT, otherwise Unknown Pod
Application) feeding the per-game status strings, and the Games menu gains
BattleTech: Free For All / No Return.
Deferred to phase 4: mech/arena art, BT defaults dialog, BT score-sheet
print document, Apps.xml BT411 product, live-pod verification.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Deployment intent is now implied by the install package field: if a package is
supplied the product is installed to the selected pods after being added; if not,
it is only added to the catalog. Removes the checkbox (dlgAddProduct) and the
push-decision branch (AddProduct_Click). The register-only-without-package path is
retired with it, so the now-dead RegisterProductOnSelectedPods is removed too.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Drops the standalone right-click submenu (and its handler + field). Installing a
product from the console still registers its launch entries on completion, and the
Add New Product dialog's "push now" path still uses RegisterProductOnSelectedPods,
which is retained.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Reconfigure timeout (launcher reinstall of an already-configured pod):
- The console pings each configured pod and connects on success, on a loop, and
never tore that down — so it kept hammering the pod's old IP with a stale
connection while SecureConfig tried to bring the pod up on that address, which
timed out. Only a console restart (closing all sockets) cleared it.
- DeletePod now Disconnect()s the pod's connection (closes the lingering socket)
so delete-to-reconfigure works WITHOUT a console restart.
- Reconfiguring a known pod in place now pauses that pod's ping/connect loop
(OperationInProgress) and drops its stale connection before SecureConfig, and
resumes on completion (success or failure) so it reconnects with the new key.
(StopPing kills the ping thread irreversibly, so pause via OperationInProgress.)
Note: PodInfo's static mPods registry is dead code (nothing registers), so the
real fix is the disconnect, not an unregister.
Console deployment:
- Console/install.bat: installs the console to C:\Program Files\TeslaConsole,
preps the %ProgramData%\Tesla Console data dir (Users: modify), creates a Start
Menu shortcut, and adds a per-program inbound firewall rule so it can receive
pod discovery beacons. net48 is in-box, no runtime install.
- Console/build-package.bat: publishes the console (net48 framework-dependent) to
dist\TeslaConsole\App and assembles the package with install.bat.
74 tests green; the pod-config fix is UI/network behavior, validate on a pod.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-locate the two cockpit-pod projects into a single repository:
- Console/ : TeslaConsole, the net48 WinForms operator console (decompiled
reconstruction) plus its differential + catalog test suite.
- Launcher/ : TeslaLauncher, the net6 pod-side Service + Agent rewrite.
Adds a combined TeslaSuite.sln, root README documenting the shared wire
contract (and its current duplication, the main follow-up), and a root
.gitignore. Histories were not preserved per request; this is a fresh start
from the current working state of both projects.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>