Example #1
0
        void Start()
        {
            Debug.Log("\n--------------Testing Arithmetic Start--------------");
            Debug.Log(ArithmeticWrapper.addition(5.0f, 4.0f));
            Debug.Log(ArithmeticWrapper.substraction(10, 3));
            Debug.Log(ArithmeticWrapper.multiplication(2, 5));
            Debug.Log(ArithmeticWrapper.division(10, 2));
            Debug.Log("End");

            Debug.Log("\n--------------Testing Printer Start--------------");
            Debug.Log(PrinterWrapper.PrintANumber());
            Debug.Log(Marshal.PtrToStringAuto(PrinterWrapper.PrintHello()));
            Debug.Log(PrinterWrapper.AddTwoIntegers(2, 2));
            Debug.Log(PrinterWrapper.AddTwoFloats(2.5F, 4F));
            Debug.Log("End");

            Debug.Log("\n--------------Testing Bomb Start--------------");
            Debug.Log("bomb has been created");
            IntPtr oneBomb = BombWrapper.Bomb_Create();

            BombWrapper.Bomb_SetTime(oneBomb, 100.0f);
            float time = BombWrapper.Bomb_GetTime(oneBomb);

            Debug.Log("bomb time current is set to " + time);
            BombWrapper.Bomb_Delete(oneBomb);
            Debug.Log("bomb has been deleted");
            Debug.Log("End");
        }
Example #2
0
    public void LateUpdate()
    {
        if (currentBomb == null)
        {
            currentBomb = Tweaks.bombWrappers.Find(x => x.holdable.HoldState == FloatingHoldable.HoldStateEnum.Held);
            if (currentBomb != null)
            {
                UpdateSolves();
                UpdateStrikes();

                int needies = currentBomb.Bomb.BombComponents.Count(bombComponent => bombComponent.GetComponent <NeedyComponent>() != null);
                NeediesPrefab.gameObject.SetActive(needies > 0);
                NeediesPrefab.text = needies.ToString();

                if (Tweaks.settings.ShowEdgework && !Tweaks.TwitchPlaysActiveCache)
                {
                    SetupEdgeworkCameras();
                }
            }
            else
            {
                foreach (GameObject edgeworkCamera in edgeworkCameras)
                {
                    Destroy(edgeworkCamera);
                }
            }
        }

        bool enabled = currentBomb != null && (Tweaks.settings.BombHUD || BombWrapper.Alerts.Count != 0) && !Tweaks.TwitchPlaysActiveCache;

        CanvasGroup.alpha = Math.Min(Math.Max(CanvasGroup.alpha + (enabled ? 1 : -1) * 0.1f, 0), 1);
        if (!enabled)
        {
            return;
        }

        if (Tweaks.settings.BombHUD)
        {
            string formattedTime = currentBomb.GetFullFormattedTime;
            TimerPrefab.text       = formattedTime;
            TimerShadowPrefab.text = formattedTime.Select(character => character == ':' ? character : '8').Join("");
            UpdateConfidence();
        }

        float y = Tweaks.settings.BombHUD ? 173 : 0;

        foreach (RectTransform alert in BombWrapper.Alerts)
        {
            alert.anchoredPosition = new Vector3(0, -y);
            y += alert.rect.height;
        }
    }
Example #3
0
    void LateUpdate()
    {
        if (currentBomb == null)
        {
            WidgetResponses.Clear();

            currentBomb = Array.Find(Tweaks.bombWrappers, x => x.holdable.HoldState == FloatingHoldable.HoldStateEnum.Held);
            if (currentBomb != null)
            {
                UpdateSolves();
                UpdateStrikes();

                int needies = currentBomb.Bomb.BombComponents.Count(bombComponent => bombComponent.GetComponent <NeedyComponent>() != null);
                NeediesPrefab.gameObject.SetActive(needies > 0);
                NeediesPrefab.text = needies.ToString();
            }
        }

        bool enabled = currentBomb != null && !Tweaks.TwitchPlaysActive;

        CanvasGroup.alpha = Math.Min(Math.Max(CanvasGroup.alpha + (enabled ? 1 : -1) * 0.1f, 0), 1);
        if (!enabled)
        {
            return;
        }

        string formattedTime = currentBomb.GetFullFormattedTime;

        TimerPrefab.text       = formattedTime;
        TimerShadowPrefab.text = Regex.Replace(formattedTime, @"\d", "8");
        UpdateConfidence();
        if (Tweaks.settings.ShowEdgework)
        {
            UpdateWidgets();
        }
    }
Example #4
0
    public IEnumerator CheckForBombs()
    {
        yield return(new WaitUntil(() => (SceneManager.Instance.GameplayState.Bombs?.Count > 0)));

        yield return(null);

        List <Bomb> bombs = SceneManager.Instance.GameplayState.Bombs;

        if (settings.SkipGameplayDelay)
        {
            StartCoroutine(SkipGameplayDelay());
        }

        LogJSON("LFAEvent", new Dictionary <string, object>()
        {
            { "type", "ROUND_START" },
            { "mission", Localization.GetLocalizedString(SceneManager.Instance.GameplayState.Mission.DisplayNameTerm) },
        });

        var snoozeButton = FindObjectOfType <AlarmClock>()?.SnoozeButton;

        if (snoozeButton != null)
        {
            FixKeypadButtons(snoozeButton);
        }

        void wrapInitialBombs()
        {
            for (int i = 0; i < bombs.Count; i++)
            {
                Bomb        bomb        = bombs[i];
                BombWrapper bombWrapper = bomb.gameObject.AddComponent <BombWrapper>();
                bombWrappers.Add(bombWrapper);

                if (CurrentMode == Mode.Time)
                {
                    bombWrapper.CurrentTimer = Modes.settings.TimeModeStartingTime * 60;
                }
                else if (CurrentMode == Mode.Zen)
                {
                    bombWrapper.CurrentTimer = 0.001f;
                }
            }
        }

        if (CurrentModeCache == Mode.Zen)
        {
            GameplayMusicController gameplayMusic = MusicManager.Instance.GameplayMusicController;
            gameplayMusic.StopMusic();
            var controller = gameplayMusic.GetComponent <DarkTonic.MasterAudio.PlaylistController>();
            controller.ClearQueue();
            controller.QueuePlaylistClip(controller.CurrentPlaylist.MusicSettings[0].songName, true);
        }

        if (ReflectedTypes.FactoryRoomType != null && ReflectedTypes.StaticModeType != null)
        {
            UnityEngine.Object factoryRoom = FindObjectOfType(ReflectedTypes.FactoryRoomType);
            if (factoryRoom)
            {
                if (ReflectedTypes.FactoryRoomDataType != null && ReflectedTypes.WarningTimeField != null)
                {
                    var roomData = FindObjectOfType(ReflectedTypes.FactoryRoomDataType);
                    if (roomData != null)
                    {
                        ReflectedTypes.WarningTimeField.SetValue(roomData, CurrentMode == Mode.Zen ? 0 : 60);
                    }
                }

                object gameMode = ReflectedTypes.GameModeProperty.GetValue(factoryRoom, null);
                if (ReflectedTypes.StaticModeType != gameMode.GetType())
                {
                    IEnumerable <object> adaptations = ((IEnumerable)ReflectedTypes.AdaptationsProperty.GetValue(gameMode, null)).Cast <object>();
                    bool globalTimerDisabled         = !adaptations.Any(adaptation => ReflectedTypes.GlobalTimerAdaptationType.IsAssignableFrom(adaptation.GetType()));

                    Component getBomb() => (Component)ReflectedTypes._CurrentBombField.GetValue(gameMode);

                    yield return(new WaitUntil(() => getBomb() != null || factoryRoom == null));

                    Component currentBomb = getBomb();
                    bool      firstBomb   = true;

                    while (currentBomb != null && factoryRoom != null)
                    {
                        BombWrapper bombWrapper = currentBomb.gameObject.AddComponent <BombWrapper>();
                        bombWrappers.Add(bombWrapper);

                        if (globalTimerDisabled || firstBomb)
                        {
                            firstBomb = false;

                            if (CurrentMode == Mode.Time)
                            {
                                bombWrapper.CurrentTimer = Modes.settings.TimeModeStartingTime * 60;
                            }
                            else if (CurrentMode == Mode.Zen)
                            {
                                bombWrapper.CurrentTimer = 0.001f;
                            }
                        }

                        yield return(new WaitUntil(() => currentBomb != getBomb() || factoryRoom == null));

                        bombWrappers.Remove(bombWrapper);
                        currentBomb = getBomb();

                        if (currentBomb == null || factoryRoom == null)
                        {
                            break;
                        }
                    }
                }
                else
                {
                    wrapInitialBombs();
                }

                yield break;
            }
        }

        // This code only runs if we aren't in the Factory room.
        wrapInitialBombs();

        // If TP is enabled, let it handle managing the emergency lights.
        if (TwitchPlaysActiveCache)
        {
            yield break;
        }

        SceneManager.Instance.GameplayState.Room.PacingActions.RemoveAll(pacingAction => pacingAction.EventType == Assets.Scripts.Pacing.PaceEvent.OneMinuteLeft);
        UnityEngine.Object portalRoom = null;
        if (ReflectedTypes.PortalRoomType != null && ReflectedTypes.RedLightsMethod != null && ReflectedTypes.RoomLightField != null)
        {
            portalRoom = FindObjectOfType(ReflectedTypes.PortalRoomType);
        }

        bool        lastState = false;
        IEnumerator portalEmergencyRoutine = null;

        while (CurrentState == KMGameInfo.State.Gameplay)
        {
            bool targetState = CurrentModeCache != Mode.Zen;
            targetState &= bombWrappers.Any((BombWrapper bombWrapper) => bombWrapper.CurrentTimer < 60f && !bombWrapper.Bomb.IsSolved());
            if (targetState != lastState)
            {
                foreach (EmergencyLight emergencyLight in FindObjectsOfType <EmergencyLight>())
                {
                    if (targetState)
                    {
                        emergencyLight.Activate();
                    }
                    else
                    {
                        emergencyLight.Deactivate();
                    }
                }
                if (portalRoom != null)
                {
                    if (targetState)
                    {
                        portalEmergencyRoutine = (IEnumerator)ReflectedTypes.RedLightsMethod.Invoke(portalRoom, null);
                        StartCoroutine(portalEmergencyRoutine);
                    }
                    else
                    {
                        StopCoroutine(portalEmergencyRoutine);
                        portalEmergencyRoutine = null;
                        ((GameObject)ReflectedTypes.RoomLightField.GetValue(portalRoom)).GetComponent <Light>().color = new Color(0.5f, 0.5f, 0.5f);
                    }
                }
                lastState = targetState;
            }
            yield return(null);
        }
    }
    public IEnumerator CheckForBombs()
    {
        yield return(new WaitUntil(() => (SceneManager.Instance.GameplayState.Bombs?.Count > 0)));

        yield return(null);

        List <Bomb> bombs = SceneManager.Instance.GameplayState.Bombs;

        void wrapInitialBombs()
        {
            Array.Resize(ref bombWrappers, bombs.Count);

            for (int i = 0; i < bombs.Count; i++)
            {
                Bomb        bomb        = bombs[i];
                BombWrapper bombWrapper = new BombWrapper(bomb);
                bombWrappers[i] = bombWrapper;
                bombWrapper.holdable.OnLetGo += () => BombStatus.Instance.currentBomb = null;

                if (CurrentMode == Mode.Time)
                {
                    bombWrapper.CurrentTimer = Modes.settings.TimeModeStartingTime * 60;
                }
                else if (CurrentMode == Mode.Zen)
                {
                    bombWrapper.CurrentTimer = 0.001f;
                }
            }
        }

        if (CurrentMode == Mode.Zen)
        {
            GameplayMusicController gameplayMusic = MusicManager.Instance.GameplayMusicController;
            gameplayMusic.StopMusic();
            var controller = gameplayMusic.GetComponent <DarkTonic.MasterAudio.PlaylistController>();
            controller.ClearQueue();
            controller.QueuePlaylistClip(controller.CurrentPlaylist.MusicSettings[0].songName, true);
        }

        if (ReflectedTypes.FactoryRoomType != null && ReflectedTypes.StaticModeType != null)
        {
            UnityEngine.Object factoryRoom = FindObjectOfType(ReflectedTypes.FactoryRoomType);
            if (factoryRoom)
            {
                if (ReflectedTypes.FactoryRoomDataType != null && ReflectedTypes.WarningTimeField != null)
                {
                    var roomData = FindObjectOfType(ReflectedTypes.FactoryRoomDataType);
                    if (roomData != null)
                    {
                        ReflectedTypes.WarningTimeField.SetValue(roomData, CurrentMode == Mode.Zen ? 0 : 60);
                    }
                }

                object gameMode = ReflectedTypes.GameModeProperty.GetValue(factoryRoom, null);
                if (ReflectedTypes.StaticModeType != gameMode.GetType())
                {
                    IEnumerable <object> adaptations = ((IEnumerable)ReflectedTypes.AdaptationsProperty.GetValue(gameMode, null)).Cast <object>();
                    bool globalTimerDisabled         = !adaptations.Any(adaptation => ReflectedTypes.GlobalTimerAdaptationType.IsAssignableFrom(adaptation.GetType()));

                    Component getBomb() => (Component)ReflectedTypes._CurrentBombField.GetValue(gameMode);

                    yield return(new WaitUntil(() => getBomb() != null || factoryRoom == null));

                    Component currentBomb = getBomb();
                    bool      firstBomb   = true;

                    Array.Resize(ref bombWrappers, 1);

                    while (currentBomb != null && factoryRoom != null)
                    {
                        BombWrapper bombWrapper = new BombWrapper(currentBomb.GetComponent <Bomb>());
                        bombWrappers[0] = bombWrapper;
                        bombWrapper.holdable.OnLetGo += () => BombStatus.Instance.currentBomb = null;

                        if (globalTimerDisabled || firstBomb)
                        {
                            firstBomb = false;

                            if (CurrentMode == Mode.Time)
                            {
                                bombWrapper.CurrentTimer = Modes.settings.TimeModeStartingTime * 60;
                            }
                            else if (CurrentMode == Mode.Zen)
                            {
                                bombWrapper.CurrentTimer = 0.001f;
                            }
                        }

                        yield return(new WaitUntil(() => currentBomb != getBomb() || factoryRoom == null));

                        currentBomb = getBomb();

                        if (currentBomb == null || factoryRoom == null)
                        {
                            break;
                        }
                    }
                }
                else
                {
                    wrapInitialBombs();
                }

                yield break;
            }
        }

        // This code only runs if we aren't in the Factory room.
        wrapInitialBombs();

        SceneManager.Instance.GameplayState.Room.PacingActions.RemoveAll(pacingAction => pacingAction.EventType == Assets.Scripts.Pacing.PaceEvent.OneMinuteLeft);
        UnityEngine.Object portalRoom = null;
        if (ReflectedTypes.PortalRoomType != null && ReflectedTypes.RedLightsMethod != null && ReflectedTypes.RoomLightField != null)
        {
            portalRoom = FindObjectOfType(ReflectedTypes.PortalRoomType);
        }
        bool        lastState = false;
        IEnumerator portalEmergencyRoutine = null;

        while (CurrentState == KMGameInfo.State.Gameplay)
        {
            bool targetState = CurrentMode != Mode.Zen && bombWrappers.Any((BombWrapper bombWrapper) => !bombWrapper.Bomb.IsSolved() && bombWrapper.CurrentTimer < 60f);
            if (targetState != lastState)
            {
                foreach (Assets.Scripts.Props.EmergencyLight emergencyLight in FindObjectsOfType <Assets.Scripts.Props.EmergencyLight>())
                {
                    if (targetState)
                    {
                        emergencyLight.Activate();
                    }
                    else
                    {
                        emergencyLight.Deactivate();
                    }
                }
                if (portalRoom != null)
                {
                    if (targetState)
                    {
                        portalEmergencyRoutine = (IEnumerator)ReflectedTypes.RedLightsMethod.Invoke(portalRoom, null);
                        StartCoroutine(portalEmergencyRoutine);
                    }
                    else
                    {
                        StopCoroutine(portalEmergencyRoutine);
                        portalEmergencyRoutine = null;
                        ((GameObject)ReflectedTypes.RoomLightField.GetValue(portalRoom)).GetComponent <Light>().color = new Color(0.5f, 0.5f, 0.5f);
                    }
                }
                lastState = targetState;
            }
            yield return(null);
        }
    }
    public void Awake()
    {
        MainThreadQueue.Initialize();

        GameInfo       = GetComponent <KMGameInfo>();
        SettingWarning = transform.Find("UI").Find("SettingWarning").gameObject;
        BetterCasePicker.BombCaseGenerator = GetComponentInChildren <BombCaseGenerator>();

        modConfig = new ModConfig <TweakSettings>("TweakSettings");
        UpdateSettings();

        bool changeFadeTime = settings.FadeTime >= 0;

        FreeplayDevice.MAX_SECONDS_TO_SOLVE = float.MaxValue;
        FreeplayDevice.MIN_MODULE_COUNT     = 1;

        if (settings.EnableModsOnlyKey)
        {
            var lastFreeplaySettings = FreeplaySettings.CreateDefaultFreeplaySettings();
            lastFreeplaySettings.OnlyMods = true;
            ProgressionManager.Instance.RecordLastFreeplaySettings(lastFreeplaySettings);
        }

        UpdateSettingWarning();

        // Setup API/properties other mods to interact with
        GameObject infoObject = new GameObject("Tweaks_Info", typeof(TweaksProperties));

        infoObject.transform.parent = gameObject.transform;

        // Watch the TweakSettings file for Time Mode state being changed in the office.
        FileSystemWatcher watcher = new FileSystemWatcher(Path.Combine(Application.persistentDataPath, "Modsettings"), "TweakSettings.json")
        {
            NotifyFilter = NotifyFilters.LastWrite
        };

        watcher.Changed += (object source, FileSystemEventArgs e) =>
        {
            if (modConfig.SerializeSettings(settings) == modConfig.SerializeSettings(modConfig.Settings))
            {
                return;
            }

            UpdateSettings();
            UpdateSettingWarning();

            MainThreadQueue.Enqueue(() => StartCoroutine(ModifyFreeplayDevice(false)));
        };

        // Setup our "service" to block the leaderboard submission requests
        ReflectedTypes.InstanceField.SetValue(null, new SteamFilterService());

        // Create a fake case with a bunch of anchors to trick the game when using CaseGenerator.
        TweaksCaseGeneratorCase = new GameObject("TweaksCaseGenerator");
        TweaksCaseGeneratorCase.transform.SetParent(transform);
        var kmBomb = TweaksCaseGeneratorCase.AddComponent <KMBomb>();

        kmBomb.IsHoldable      = false;
        kmBomb.WidgetAreas     = new List <GameObject>();
        kmBomb.visualTransform = transform;
        kmBomb.Faces           = new List <KMBombFace>();

        TweaksCaseGeneratorCase.AddComponent <ModBomb>();

        var kmBombFace = TweaksCaseGeneratorCase.AddComponent <KMBombFace>();

        kmBombFace.Anchors = new List <Transform>();
        kmBomb.Faces.Add(kmBombFace);

        for (int i = 0; i <= 9001; i++)
        {
            kmBombFace.Anchors.Add(transform);
        }

        // Handle scene changes
        UnityEngine.SceneManagement.SceneManager.sceneLoaded += (Scene scene, LoadSceneMode _) =>
        {
            UpdateSettings();
            UpdateSettingWarning();

            Modes.settings           = Modes.modConfig.Settings;
            Modes.modConfig.Settings = Modes.settings;

            if ((scene.name == "mainScene" || scene.name == "gameplayScene") && changeFadeTime)
            {
                SceneManager.Instance.RapidFadeInTime = settings.FadeTime;
            }

            switch (scene.name)
            {
            case "mainScene":
                if (changeFadeTime)
                {
                    SceneManager.Instance.SetupState.FadeInTime          =
                        SceneManager.Instance.SetupState.FadeOutTime     =
                            SceneManager.Instance.UnlockState.FadeInTime = settings.FadeTime;
                }

                break;

            case "gameplayLoadingScene":
                var gameplayLoadingManager = FindObjectOfType <GameplayLoadingManager>();
                if (settings.InstantSkip)
                {
                    gameplayLoadingManager.MinTotalLoadTime = 0;
                }
                if (changeFadeTime)
                {
                    gameplayLoadingManager.FadeInTime      =
                        gameplayLoadingManager.FadeOutTime = settings.FadeTime;
                }

                ReflectedTypes.UpdateTypes();

                ReflectedTypes.CurrencyAPIEndpointField?.SetValue(null, settings.FixFER ? "http://api.exchangeratesapi.io" : "http://api.fixer.io");

                break;

            case "gameplayScene":
                if (changeFadeTime)
                {
                    SceneManager.Instance.GameplayState.FadeInTime      =
                        SceneManager.Instance.GameplayState.FadeOutTime = settings.FadeTime;
                }

                break;
            }
        };

        // Handle state changes
        GameInfo.OnStateChange += (KMGameInfo.State state) =>
        {
            CurrentState = state;
            watcher.EnableRaisingEvents = state == KMGameInfo.State.Setup;

            if (state == KMGameInfo.State.Gameplay)
            {
                bool disableRecords = settings.BombHUD || settings.ShowEdgework || CurrentMode != Mode.Normal || settings.MissionSeed != -1;

                Assets.Scripts.Stats.StatsManager.Instance.DisableStatChanges        =
                    Assets.Scripts.Records.RecordManager.Instance.DisableBestRecords = disableRecords;
                if (disableRecords)
                {
                    SteamFilterService.TargetMissionID = GameplayState.MissionToLoad;
                }

                BetterCasePicker.HandleCaseGeneration();

                BombStatus.Instance.widgetsActivated = false;
                BombStatus.Instance.HUD.SetActive(settings.BombHUD);
                BombStatus.Instance.Edgework.SetActive(settings.ShowEdgework);
                BombStatus.Instance.ConfidencePrefab.gameObject.SetActive(CurrentMode != Mode.Zen);
                BombStatus.Instance.StrikesPrefab.color = CurrentMode == Mode.Time ? Color.yellow : Color.red;

                Modes.Multiplier = Modes.settings.TimeModeStartingMultiplier;
                BombStatus.Instance.UpdateMultiplier();
                bombWrappers = new BombWrapper[] { };
                StartCoroutine(CheckForBombs());
                if (settings.SkipGameplayDelay)
                {
                    StartCoroutine(SkipGameplayDelay());
                }

                if (GameplayState.BombSeedToUse == -1)
                {
                    GameplayState.BombSeedToUse = settings.MissionSeed;
                }
            }
            else if (state == KMGameInfo.State.Setup)
            {
                if (ReflectedTypes.LoadedModsField.GetValue(ModManager.Instance) is Dictionary <string, Mod> loadedMods)
                {
                    Mod tweaksMod = loadedMods.Values.FirstOrDefault(mod => mod.ModID == "Tweaks");
                    if (tweaksMod != null)
                    {
                        if (CaseGeneratorSettingCache != settings.CaseGenerator)
                        {
                            if (settings.CaseGenerator)
                            {
                                tweaksMod.ModObjects.Add(TweaksCaseGeneratorCase);
                            }
                            else
                            {
                                tweaksMod.ModObjects.Remove(TweaksCaseGeneratorCase);
                            }

                            CaseGeneratorSettingCache = settings.CaseGenerator;
                            UpdateSettingWarning();
                        }
                    }
                }

                StartCoroutine(ModifyFreeplayDevice(true));
                GetComponentInChildren <ModSelectorExtension>().FindAPI();

                GameplayState.BombSeedToUse = -1;
            }
            else if (state == KMGameInfo.State.Transitioning)
            {
                // Because the settings are checked on a scene change and there is no scene change from exiting the gameplay room,
                // we need to update the settings here in case the user changed their HideTOC settings.
                UpdateSettings();

                bool modified       = false;
                var  ModMissionToCs = ModManager.Instance.ModMissionToCs;
                foreach (var metaData in ModMissionToCs)
                {
                    modified |= ModToCMetaData.Add(metaData);
                }

                var unloadedMods = (Dictionary <string, Mod>)ReflectedTypes.UnloadedModsField.GetValue(ModManager.Instance);
                if (unloadedMods != null)
                {
                    foreach (var unloadedMod in unloadedMods.Values)
                    {
                        var tocs = (List <ModTableOfContentsMetaData>)ReflectedTypes.TocsField.GetValue(unloadedMod);
                        if (tocs != null)
                        {
                            foreach (var metaData in tocs)
                            {
                                modified |= ModToCMetaData.Remove(metaData);
                            }
                        }
                    }
                }

                var newToCs = ModToCMetaData.Where(metaData => !settings.HideTOC.Any(pattern => Localization.GetLocalizedString(metaData.DisplayNameTerm).Like(pattern)));
                modified |= (newToCs.Count() != ModMissionToCs.Count || !newToCs.All(ModMissionToCs.Contains));
                ModMissionToCs.Clear();
                ModMissionToCs.AddRange(newToCs);

                if (modified)
                {
                    SetupState.LastBombBinderTOCIndex = 0;
                    SetupState.LastBombBinderTOCPage  = 0;
                }
            }
        };
    }