public void RunDemo(string demoName)
 {
     if (CurrentCartridge is GameCartridge gameCartridge)
     {
         var demoActor             = CurrentCartridge.SceneLayers.DebugScene.AddActor("DebugActor");
         var demoPlaybackComponent = new DemoPlaybackComponent(demoActor);
         DemoPlayback = demoPlaybackComponent.SetDemo(gameCartridge, Demo.FromDisk_Sync(demoName, MachinaClient.FileSystem), demoName, 1);
         demoPlaybackComponent.ShowGui = false;
     }
     else
     {
         MachinaClient.Print("Demo loading is only supported on GameCartridges");
     }
 }
        private void FinishLoadingContent(GameCartridge gameCartridge)
        {
#if DEBUG
            DebugLevel = DebugLevel.Passive;
#endif

            // Most cartridges get setup automatically but since the gamecartridge hasn't been inserted yet we have to do it early here
            gameCartridge.SetupSceneLayers(this, specification, WindowInterface);

            var debugActor            = gameCartridge.SceneLayers.DebugScene.AddActor("DebugActor");
            var demoPlaybackComponent = new DemoPlaybackComponent(debugActor);

            var demoName           = Demo.MostRecentlySavedDemoPath;
            var demoSpeed          = 1;
            var shouldSkipSnapshot = DebugLevel == DebugLevel.Off;

            void SetRandomSeedFromString(string seed)
            {
                gameCartridge.Random.Seed = (int)NoiseBasedRNG.SeedFromString(seed);
            }

            this.specification.commandLineArgs.RegisterEarlyFlagArg("skipsnapshot", () => { shouldSkipSnapshot = true; });
            this.specification.commandLineArgs.RegisterEarlyValueArg("randomseed", SetRandomSeedFromString);
            this.specification.commandLineArgs.RegisterEarlyValueArg("demopath", arg => { demoName = arg; });
            this.specification.commandLineArgs.RegisterEarlyValueArg("demospeed", arg => { demoSpeed = int.Parse(arg); });
            this.specification.commandLineArgs.RegisterEarlyValueArg("demo", arg =>
            {
                switch (arg)
                {
                case "record":
                    new DemoRecorderComponent(debugActor, new Demo.Recorder(gameCartridge, demoName));
                    break;

                case "playback":
                    DemoPlayback = demoPlaybackComponent.SetDemo(gameCartridge, Demo.FromDisk_Sync(demoName, MachinaClient.FileSystem), demoName, demoSpeed);
                    break;

                case "playback-nogui":
                    DemoPlayback = demoPlaybackComponent.SetDemo(gameCartridge, Demo.FromDisk_Sync(demoName, MachinaClient.FileSystem), demoName, demoSpeed);
                    demoPlaybackComponent.ShowGui = false;
                    break;

                default:
                    MachinaClient.Print("Unknown demo mode", arg);
                    break;
                }
            });

            this.specification.commandLineArgs.RegisterEarlyFlagArg("debug",
                                                                    () => { DebugLevel = DebugLevel.Active; });

#if DEBUG
            // PlayIntroAndLoadGame(gameCartridge);
            InsertGameCartridgeAndRun(gameCartridge);
#else
            if (SkipIntro)
            {
                InsertGameCartridgeAndRun(gameCartridge);
            }
            else
            {
                PlayIntroAndLoadGame(gameCartridge);
            }
#endif
            // Currently we go [SetupDebugScene] -> [LoadGame] -> [LateSetup], hopefully the cartridge system will mitigate the need for this.
            if (GamePlatform.IsDesktop)
            {
                // NOTE: If we play the intro in a debug build this flag will not be honored, tech debt.
                new SnapshotTaker(debugActor, shouldSkipSnapshot);
            }
        }