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>
93 lines
4.5 KiB
XML
93 lines
4.5 KiB
XML
<Project Sdk="Microsoft.NET.Sdk">
|
|
<PropertyGroup>
|
|
<AssemblyName>TeslaConsole</AssemblyName>
|
|
<GenerateAssemblyInfo>False</GenerateAssemblyInfo>
|
|
<OutputType>WinExe</OutputType>
|
|
<!-- net40 (XP11): the newest .NET Framework that installs on Windows XP SP3;
|
|
net40 assemblies load in-place on the 4.8 runtime in Win10/11, so this ONE
|
|
exe covers XP SP3 through Windows 11 — same deal as the Launcher. The
|
|
original console was net20, so the decompiled core needs nothing newer.
|
|
WinForms comes via plain framework references (UseWindowsForms is not
|
|
wired up for net40). -->
|
|
<TargetFramework>net40</TargetFramework>
|
|
<LangVersion>Preview</LangVersion>
|
|
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
|
|
<ApplicationIcon>app.ico</ApplicationIcon>
|
|
<RootNamespace />
|
|
<!-- Decompiled from the original net20 TeslaConsole.exe; legacy WinForms 2.0 sources -->
|
|
<Nullable>disable</Nullable>
|
|
<ImplicitUsings>disable</ImplicitUsings>
|
|
<!-- CS0649: decompiled WinForms designer 'components' fields are never assigned -->
|
|
<NoWarn>$(NoWarn);CS0649</NoWarn>
|
|
</PropertyGroup>
|
|
|
|
<ItemGroup>
|
|
<!-- .NET Framework reference assemblies so the project builds without a full targeting pack installed -->
|
|
<PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.3" PrivateAssets="all" />
|
|
</ItemGroup>
|
|
|
|
<ItemGroup>
|
|
<!-- The UI images, embedded as their raw original bytes (extracted 1:1 from the
|
|
old .resx BinaryFormatter blobs). Loaded by Properties.Resources.EmbeddedBitmap/
|
|
EmbeddedIcon: the .resx blob route needs System.Resources.Extensions at
|
|
runtime, which is net461+ and cannot load on net40/XP. -->
|
|
<EmbeddedResource Include="assets\icons\*.*" LogicalName="TeslaConsole.Icons.%(Filename)%(Extension)" />
|
|
</ItemGroup>
|
|
|
|
<ItemGroup>
|
|
<!-- Runtime content the console loads relative to the exe (RPConfig.cs / RPStrings.cs / AppRegistry.cs) -->
|
|
<Content Include="RedPlanet\RPConfig.xml" CopyToOutputDirectory="PreserveNewest" />
|
|
<Content Include="RedPlanet\RPStrings.xml" CopyToOutputDirectory="PreserveNewest" />
|
|
<Content Include="RedPlanet\Apps.xml" CopyToOutputDirectory="PreserveNewest" />
|
|
<Content Include="BattleTech\BTConfig.xml" CopyToOutputDirectory="PreserveNewest" />
|
|
<Content Include="BattleTech\BTStrings.xml" CopyToOutputDirectory="PreserveNewest" />
|
|
<!-- Optional plasma-display art (PlasmaBitmaps.LoadCustomBitmap), shipped with
|
|
the release. The glob is normally empty; the README goes along so the drop
|
|
folder exists on the control PC. The machine's own
|
|
%ProgramData%\Tesla Console\Plasma Images overrides whatever ships here. -->
|
|
<Content Include="Plasma Images\*.bmp" CopyToOutputDirectory="PreserveNewest" />
|
|
<Content Include="Plasma Images\README.md" CopyToOutputDirectory="PreserveNewest" />
|
|
</ItemGroup>
|
|
|
|
<ItemGroup>
|
|
<!-- Reference-only material: original binary + source art. Not compiled, not copied. -->
|
|
<None Remove="original\**" />
|
|
<None Remove="images\**" />
|
|
</ItemGroup>
|
|
|
|
<ItemGroup>
|
|
<!-- The differential test project lives under tests\; keep its sources out of this build. -->
|
|
<Compile Remove="tests\**" />
|
|
<None Remove="tests\**" />
|
|
<Content Remove="tests\**" />
|
|
</ItemGroup>
|
|
|
|
<ItemGroup>
|
|
<Reference Include="System.Windows.Forms" />
|
|
<Reference Include="System.Drawing" />
|
|
<Reference Include="System.Configuration.Install" />
|
|
<Reference Include="System.Xml" />
|
|
<Reference Include="System.ServiceProcess" />
|
|
<Reference Include="Microsoft.VisualBasic" />
|
|
<Reference Include="WeifenLuo.WinFormsUI.Docking">
|
|
<HintPath>lib\WeifenLuo.WinFormsUI.Docking.dll</HintPath>
|
|
</Reference>
|
|
<Reference Include="Munga Net">
|
|
<HintPath>lib\Munga Net.dll</HintPath>
|
|
</Reference>
|
|
<Reference Include="BitmapLibrary">
|
|
<HintPath>lib\BitmapLibrary.dll</HintPath>
|
|
</Reference>
|
|
</ItemGroup>
|
|
|
|
<ItemGroup>
|
|
<!-- The wire contract (Tesla.Net) is now built from source. The project emits an
|
|
assembly still named TeslaConsoleLaunchLib so the BinaryFormatter protocol is
|
|
byte-identical to the old vendored lib\TeslaConsoleLaunchLib.dll. -->
|
|
<ProjectReference Include="..\Contract\Tesla.Contract.csproj" />
|
|
<!-- Secure-config provisioning (Tesla.PodConfigurationServer, OFBCryptoStream...),
|
|
also built from source now, emitting assembly TeslaSecureConfiguration. -->
|
|
<ProjectReference Include="..\SecureConfig\Tesla.SecureConfig.csproj" />
|
|
</ItemGroup>
|
|
</Project>
|