Files
wiicompiled/Launcher/WiiCompiled.Setup.Windows/GameLaunchService.cs
T
theofficialgman c0ed2bfbeb refactor WiiCompiled.Setup into WiiCompiled.Setup.Windows and add WiiCompiled.Setup.Common
the idea behind this is C# code that is OS agnostic can go in WiiCompiled.Setup.Common to be shared by any OS specific code (eg: WiiCompiled.Setup.Windows and WiiCompiled.Setup.Linux).
2026-08-29 12:06:58 -04:00

65 lines
3.1 KiB
C#

using System.Diagnostics;
namespace WiiCompiled.Setup.Windows;
internal static class GameLaunchService
{
public static Task<int> LaunchAsync(BuildProfile profile)
{
var installation = new Installation(AppContext.BaseDirectory);
using var operation = InstallOperationLock.Acquire(installation.Root);
// A portable installation the user moved is reconciled before anything is read from its
// recorded location. Launch never needs the discarded native build tree.
PortableInstallHealing.HealMovedInstall(installation,
new DelegatingInstallReporter(Console.Error.WriteLine));
EnsureProductIsCurrent(installation, profile);
return Task.FromResult(LaunchInstalledProduct(installation, profile));
}
private static void EnsureProductIsCurrent(Installation installation, BuildProfile profile)
{
var state = InspectProductForLaunch(installation, profile);
if (state.Status == ProductStatus.Current) return;
if (state.Status == ProductStatus.Absent)
throw new InvalidDataException(
"Retro Rewind is not installed. Install Retro Rewind through Wheel Wizard first.");
throw new InvalidDataException(string.IsNullOrWhiteSpace(state.Detail)
? "This product must be repaired through Wheel Wizard before it can be launched."
: state.Detail);
}
/// <summary>Validates the executable, inputs, build provenance, runtime assets, payload cache, and the
/// canonical Retro Rewind root, so a missing/invalid root fails launch instead of starting a vanilla-looking game.</summary>
internal static ProductState InspectProductForLaunch(Installation installation, BuildProfile profile)
{
var toolkitFingerprint = installation.ResolveToolkitFingerprint();
if (profile == BuildProfile.Base)
return installation.CheckBase(toolkitFingerprint);
var canonical = installation.ResolveCanonicalCompileInputs(null, out var canonicalError);
return installation.CheckRetroRewind(toolkitFingerprint, canonical, canonicalError);
}
private static int LaunchInstalledProduct(Installation installation, BuildProfile profile)
{
var runtimeRoot = profile == BuildProfile.Base ? installation.BaseDirectory : installation.RetroDirectory;
var runtime = profile == BuildProfile.Base ? installation.BaseExecutable : installation.RetroExecutable;
if (!File.Exists(runtime))
throw new FileNotFoundException("The installed recomp is missing. Run the installer again.", runtime);
if (!File.Exists(Path.Combine(installation.GameDataDirectory, "sys", "fst.bin")))
throw new InvalidDataException("The installed Mario Kart Wii game data is missing. Run the installer again.");
var info = new ProcessStartInfo
{
FileName = runtime,
WorkingDirectory = runtimeRoot,
UseShellExecute = false
};
using var process = Process.Start(info) ?? throw new InvalidOperationException("Could not start the recomp.");
process.WaitForExit();
return process.ExitCode;
}
}