Specs everything a game team needs to deploy and command a title in a
Tesla pod bay: package zip + Apps.xml catalog contract, launch/watchdog
semantics, the full Munga wire spec (framing, message set, state machine,
egg envelope), the dedicated game-console escape hatch, the modern bay
address plan, LC/MR presentation roles, score-sheet printing, and RIO
board integration (native preferred over the RIOJoy shim). XP support is
documented as a nice-to-have for new games; the floor remains suite-side.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
BT4/RP4 speak Munga (TCP 1501); BattleTech FireStorm is a MechWarrior 4
conversion and speaks CTCL instead - pod launcher on TCP 1000, game on
1001. Researched from the FireStorm sources at C:\VWE\firestorm and
written up in FIRESTORM-CTCL.md: roles, framing, message/order tables,
the mission handshake (including how the server pod is designated - the
console picks it positionally, there is no election), and the session
rendezvous by game-name GUID over LAN enumeration.
The console already launches FireStorm via Apps.xml; what it cannot do
is build or run a mission. Three blockers: the bit-packed NMP blob is
the MW4 engine's own MWNetMissionParameters serialization, the mech and
map identifiers (including a 64-bit map CRC) come from installed game
content, and CTCL carries no in-mission telemetry at all.
Decision recorded: a pure C# CTCL client is rejected (the NMP layout is
engine-internal and would need reworking on every FireStorm change);
pod-level control is unnecessary since Site Management already covers
it; teaching MW4 to accept a plain mission spec and build the NMP
pod-side is the option if this is ever picked up. Parked for now.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Settings -> Enable Custom Bitmaps was a static bool with no backing store:
it defaulted to off on every launch, so an operator had to re-tick it each
session and any custom plasma art was silently ignored until they did. New
ConsoleSettings persists machine-level menu toggles as XML in
%ProgramData%\Tesla Console\console.settings, alongside RPDefaults.rpd /
BTDefaults.btd / local.siteconfig. It is loaded once from Main and never
from a static initializer: the differential suite drives PlasmaBitmaps
directly and must keep seeing the original defaults rather than whatever
this machine has saved. A missing file is the first-run case; a corrupt one
is ignored and rewritten by the next toggle, because losing a menu setting
must never stop the console starting.
Custom art is now version-controlled and rolls with the release. New
Console\Plasma Images\ is copied into the package, and the lookup searches
%ProgramData%\Tesla Console\Plasma Images first and the exe-relative folder
second, so a release can never clobber a site's own name bitmaps.
install.bat creates the data-dir folder before the icacls grant so an
unelevated operator can write it. Ships with three 128x32 name bitmaps
(Deadmeat, Muerte, Phrogg); Muerte arrived as "Muerte_128x32-2.bmp", a name
the lookup can never build, so it is renamed to match its pilot.
Two fixes fell out of making the flag sticky. Path.Combine ran on the raw
participant name outside the try block, so with the option on a pilot named
"A:B" threw ArgumentException straight out of egg generation; names that
cannot be a Windows file name now just render procedurally. And the art was
loaded with Image.FromFile, which keeps the bitmap backed by the file and
locked for its whole lifetime — it is copied out through a stream now, so
art can be swapped between missions without restarting the console.
Verified against the built net40 exe: all three shipped bitmaps resolve by
pilot name, ProgramData wins over the shipped copy, a wrong-size file is
ignored, an illegal-character name does not throw, the file is not left
locked, and the settings round-trip and corrupt-file tolerance both hold.
Diff suite 106/106.
Version bumped 4.11.4.4 -> 4.11.4.5 across Console, Launcher, vPOD, the
install/build banners, the diff-suite version assertion and the README's
latest-release pointer.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
All targets are net40 now (one binary set for XP SP3 through Win11), the
launcher is a single userland app rather than Service+Agent, the wire is
Newtonsoft JSON, the launcher package bundles the pod redists (incl. the
.NET 4.0 installer), and releases live on Gitea (latest v4.11.4.3).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
vPOD has outgrown its home inside the console's folder: it now emulates both
halves of a pod (Munga game client + TeslaLauncher service / provisioning),
so it lives at the repo root beside Console/, Launcher/, Contract/ and
SecureConfig/, like the peer it has become.
Accompanying changes: project references rebased (Contract, SecureConfig,
the console's vendored Munga Net.dll), solution + DiffTests reference paths,
the console csproj's now-obsolete vPOD source exclusion removed, and the
root README / Apps.xml / vPOD README path mentions updated. pack.ps1 is
self-relative and now emits vPOD/dist/vPOD.zip.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Launcher/build.bat now outputs to dist\TeslaLauncher\ (was TeslaLauncher\ at the
Launcher root) and produces dist\TeslaLauncher-podpkg.zip, matching Console\dist\.
- Both build scripts now zip the package themselves (Compress-Archive) instead of
leaving it as a manual step: Console/build-package.bat -> dist\TeslaConsole-pkg.zip.
- Launcher/.gitignore: ignore /dist/ (drop the obsolete /TeslaLauncher/ + staging
entries); Console already ignores /dist/.
- READMEs updated to point at dist\.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Root README: launcher is .NET Framework 4.8 (was .NET 6/x86); RPC is framed
JSON (was BinaryFormatter); added Contract/ + SecureConfig/; dropped the
now-resolved "known duplication" warning; corrected the lib/*.dll note
(TeslaConsoleLaunchLib/TeslaSecureConfiguration are source-built, kept only as
test baselines); added a short history section.
- Console README: Contract is net48-only; Launcher targets net48.
- Launcher README: net48 framework-dependent (was net8/x64 self-contained);
needs .NET Framework 4.8 (built into Windows), no bundled runtime.
- DiffTests README: original 4.11.3.37076 vs recovered 4.11.4.x (no longer share
identity); noted version-insensitive comparison + the new protocol/crypto guards.
- Removed Launcher/assets/MEMORY.md (stale leftover dev-notes, superseded by the
README and now-moot post-BinaryFormatter).
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>