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>
New TeslaConsole.BattleTech namespace mirroring TeslaConsole.RedPlanet's
mission layer: BTMission/BTFreeForAllMission (egg serializer; RP wire framing
and ordinal bitmaps reused verbatim), BTParticipant/BTPlayer/BTCamera (BT
participant fields: advancedDamage, experience, vehicleValue, patch, role),
and the BTConfig/BTScenario/BTMap/BTVehicle/BTWeather/BTRole catalog loaded
from BattleTech\BTConfig.xml (reconstructed from the Mac Console 4.10 ini BT
tree). Free For All and No Return share one mission class - both send
scenario=freeforall; the mode is the role assigned to each pilot.
BTGoldenEggTests (7 tests, recovered-only) diff the generated egg
field-by-field against two eggs captured from the original consoles
(cavern.egg, TESTARN.EGG): order-independent per-section compare with
font-rendered bitmap pixel rows excluded, ordinal art byte-exact vs
TESTARN.EGG, EggFileMessage framing reassembly, role de-dup, No Return role
semantics, and shipped-catalog contents. Invoker gains BTEggString/
BTEggFraming reflection cases.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Firestorm selects game vs. Live Cam behavior from its assigned IP address, so a
separate LC product entry is unnecessary. Drop it from Apps.xml and update the
catalog tests (now 3 products / 5 entries; removed FirestormLC_Matches_Original).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
RIOJoy lifecycle is now owned by the console + launcher (the auto-start Run entry
was removed on the RioJoy side): Apps.xml autoRestart false -> true, so the
launcher starts RIOJoy and keeps it alive. Safe with uninstall — the watcher only
relaunches a still-tracked process, and uninstall's kill untracks it first.
Uninstall now physically removes the product (was unregister-only):
- Agent CmdUninstallApp: after kill + unregister, reports the product's
C:\Games\<dir> to clean up — but only if no remaining registered launch entry
still uses that folder (orphan check keeps multi-entry products like Red Planet's
GameClient/LC/MR intact until the last entry is removed).
- Service (SYSTEM): on UninstallApp, runs <dir>\pre-uninstall.bat if present
(RIOJoy's removes ViGEmBus + config) then deletes the directory, on a background
thread so it can't trip the Console's RPC timeout. Path-guarded to only ever
delete a proper subdirectory of C:\Games. Logged to podconf.log.
74 tests green; the cleanup path is pod-behavior, not unit-tested here.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
RIOJoy (the cockpit RIO → virtual-gamepad feeder; separate net48 repo) is now an
installable/launchable product in Console/RedPlanet/Apps.xml. Its dist zip is
already TeslaConsole-shaped (postinstall.bat + RIOJoy\ → extracts to C:\Games, the
launcher runs postinstall.bat as SYSTEM to install ViGEmBus + register auto-start),
so this is the only change needed on the TeslaSuite side.
- Launch entry exe C:\Games\RIOJoy\app\RioJoy.Tray.exe, autoRestart=false (the
postinstall HKLM Run entry owns startup; the catalog entry is for registration +
manual restart from the console).
- CatalogTests: bumped the count guard to 4 products / 6 entries and added a
byte-exact LaunchData check for the RIOJoy entry. 74 tests green.
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>
- Console AssemblyVersion/AssemblyFileVersion 4.11.3.37076 -> 4.11.4.1. The
recovered console is no longer a byte-faithful copy of the original baseline;
it is the modernized 4.11.4.x line.
- Launcher Service + Agent Version -> 4.11.4.1 (unified suite version). The Agent
tray menu header now shows the running version ("Tesla Launcher Agent v4.11.4.1").
- Differential tests: the identity guard now expects the original at 4.11.3.37076
and the recovered at 4.11.4.1 (not identical); the public-member surface check
strips Version= stamps before comparing, since generic-argument signatures embed
the assembly version (we compare type names, not versions). 73 tests green.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Make the Console<->Launcher system source-built and modern now that the console
is under our control and the WinXP-era pods are gone.
Contract extraction (Contract/Tesla.Contract.csproj):
- One multi-targeted (net48;net8.0-windows) source project for the RPC contract,
replacing the vendored TeslaConsoleLaunchLib.dll and the hand-synced Tesla.Net
replica in Launcher/LaunchModels_Shared.cs. Emits assembly TeslaConsoleLaunchLib.
SecureConfig extraction (SecureConfig/Tesla.SecureConfig.csproj):
- net48 source of the first-boot provisioning protocol (UDP beacons, OFB crypto,
RSA key exchange), replacing the vendored TeslaSecureConfiguration.dll.
Remove BinaryFormatter from the wire (RCE sink + the reason net6 was pinned):
- Console<->Launcher RPC is now length-prefixed System.Text.Json frames
(Contract/PodRpcProtocol.cs) over the unchanged OFB transport; dispatch by
method name. Deleted the SerializationBinder / MethodInfoProxy machinery.
- Console-local BinaryFormatter (Site config, mission replays) intentionally
retained: local net48 file I/O, not the network surface.
Runtime modernization:
- Launcher Service + Agent: net6 -> net8, win-x86 -> win-x64 (all pods are
64-bit Win10). Kept the SHA1-default PBKDF2 (Console key-derivation compat)
with SYSLIB0041 suppressed and documented.
Tests: differential suite now 73 green. Added SecureConfigCompatTests (OFB
ciphertext byte-identical to the vendored DLL) and PodRpcProtocolTests (JSON
round-trip of every request/response shape); removed the now-obsolete
BinaryFormatter byte-identity guard.
Build hygiene: per-project obj dirs (Launcher/Directory.Build.props) fix a
NuGet restore collision between the two Launcher projects sharing one folder.
NOT runtime-verified against a live 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>