public static void CLOSE_GAME(bool loadDefault = false)
        {
            try
            {
                if (disableRTC)
                {
                    return;
                }

                if (CLOSE_GAME_loop_flag == true)
                {
                    return;
                }

                CLOSE_GAME_loop_flag = true;

                //RTC_Core.AutoCorrupt = false;

                StepActions.ClearStepBlastUnits();

                MemoryDomains.Clear();

                VanguardCore.OpenRomFilename = null;

                if (loadDefault)
                {
                    VanguardCore.LoadDefaultRom();
                }

                //RTC_RPC.SendToKillSwitch("UNFREEZE");

                CLOSE_GAME_loop_flag = false;
            }
            catch (Exception ex)
            {
                if (VanguardCore.ShowErrorDialog(ex) == DialogResult.Abort)
                {
                    throw new RTCV.NetCore.AbortEverythingException();
                }
            }
        }
        private static void OnMessageReceived(object sender, NetCoreEventArgs e)
        {
            try
            {
                // This is where you implement interaction.
                // Warning: Any error thrown in here will be caught by NetCore and handled by being displayed in the console.

                var message         = e.message;
                var simpleMessage   = message as NetCoreSimpleMessage;
                var advancedMessage = message as NetCoreAdvancedMessage;

                ConsoleEx.WriteLine(message.Type);
                switch (message.Type)                 //Handle received messages here
                {
                case "INFINITELOOP":
                    SyncObjectSingleton.FormExecute((o, ea) =>
                    {
                        while (true)
                        {
                            Thread.Sleep(10);
                        }
                    });
                    break;


                case REMOTE_ALLSPECSSENT:
                    SyncObjectSingleton.FormExecute((o, ea) =>
                    {
                        VanguardCore.LoadDefaultRom();
                        Program.SpecsSent = true;
                    });
                    break;

                case SAVESAVESTATE:
                    SyncObjectSingleton.FormExecute((o, ea) =>
                    {
                        e.setReturnValue(VanguardCore.SaveSavestate_NET(advancedMessage.objectValue as string));
                    });
                    break;

                case LOADSAVESTATE:
                {
                    var cmd      = advancedMessage.objectValue as object[];
                    var path     = cmd[0] as string;
                    var location = (StashKeySavestateLocation)cmd[1];
                    SyncObjectSingleton.FormExecute((o, ea) =>
                        {
                            e.setReturnValue(VanguardCore.LoadSavestate_NET(path, location));
                        });
                    break;
                }

                case REMOTE_LOADROM:
                {
                    var fileName = advancedMessage.objectValue as String;
                    SyncObjectSingleton.FormExecute((o, ea) =>
                        {
                            VanguardCore.LoadRom_NET(fileName);
                        });
                }
                break;

                case REMOTE_DOMAIN_GETDOMAINS:
                    SyncObjectSingleton.FormExecute((o, ea) =>
                    {
                        e.setReturnValue(Hooks.GetInterfaces());
                    });
                    break;

                case REMOTE_KEY_SETSYNCSETTINGS:
                    SyncObjectSingleton.FormExecute((o, ea) =>
                    {
                        Hooks.EMU_GETSET_SYNCSETTINGS = (string)advancedMessage.objectValue;
                    });
                    break;

                case REMOTE_KEY_SETSYSTEMCORE:
                {
                    var cmd        = advancedMessage.objectValue as object[];
                    var systemName = (string)cmd[0];
                    var systemCore = (string)cmd[1];
                    SyncObjectSingleton.FormExecute((o, ea) =>
                        {
                            Hooks.EMU_SET_SYSTEMCORE(systemName, systemCore);
                        });
                }
                break;

                case EMU_OPEN_HEXEDITOR_ADDRESS:
                {
                    var    temp    = advancedMessage.objectValue as object[];
                    string domain  = (string)temp[0];
                    long   address = (long)temp[1];

                    MemoryDomainProxy mdp = MemoryDomains.GetProxy(domain, address);
                    long realAddress      = MemoryDomains.GetRealAddress(domain, address);

                    SyncObjectSingleton.FormExecute((o, ea) =>
                        {
                            Hooks.EMU_OPEN_HEXEDITOR_ADDRESS(mdp, realAddress);
                        });

                    break;
                }

                case REMOTE_EVENT_EMU_MAINFORM_CLOSE:
                    SyncObjectSingleton.FormExecute((o, ea) =>
                    {
                        Hooks.EMU_MAINFORM_CLOSE();
                    });
                    break;

                case REMOTE_EVENT_SAVEBIZHAWKCONFIG:
                    SyncObjectSingleton.FormExecute((o, ea) =>
                    {
                        Hooks.EMU_MAINFORM_SAVECONFIG();
                    });
                    break;


                case REMOTE_IMPORTKEYBINDS:
                    SyncObjectSingleton.FormExecute((o, ea) =>
                    {
                        Hooks.EMU_IMPORTCONFIGINI(CorruptCore.bizhawkDir + Path.DirectorySeparatorChar + "import_config.ini", CorruptCore.bizhawkDir + Path.DirectorySeparatorChar + "stockpile_config.ini");
                    });
                    break;

                case REMOTE_MERGECONFIG:
                    SyncObjectSingleton.FormExecute((o, ea) =>
                    {
                        Hooks.EMU_MERGECONFIGINI(CorruptCore.bizhawkDir + Path.DirectorySeparatorChar + "backup_config.ini", CorruptCore.bizhawkDir + Path.DirectorySeparatorChar + "stockpile_config.ini");
                    });
                    break;

                case REMOTE_RESTOREBIZHAWKCONFIG:
                    SyncObjectSingleton.FormExecute((o, ea) =>
                    {
                        Process.Start(CorruptCore.bizhawkDir + Path.DirectorySeparatorChar + $"RestoreConfigDETACHED.bat");
                    });
                    break;

                case REMOTE_ISNORMALADVANCE:
                    e.setReturnValue(Hooks.isNormalAdvance);
                    break;
                }
            }
            catch (Exception ex)
            {
                if (VanguardCore.ShowErrorDialog(ex, true) == DialogResult.Abort)
                {
                    throw new RTCV.NetCore.AbortEverythingException();
                }
            }
        }