private void CheckTeleporter(Split split)
        {
            SplitTeleporter teleporter = Utility.GetEnumValue <SplitTeleporter>(split.Value);

            switch (teleporter)
            {
            case SplitTeleporter.HowlsDenActivated: CheckUberBoolValue(UberStateDefaults.savePedestalHowlsDen); break;

            case SplitTeleporter.HowlsDenTeleported: CheckScene(true, "howlsDenSaveRoom"); break;

            case SplitTeleporter.InkwaterMarshActivated: CheckUberBoolValue(UberStateDefaults.savePedestalInkwaterMarsh); break;

            case SplitTeleporter.InkwaterMarshTeleported: CheckScene(true, "swampIntroTop"); break;

            case SplitTeleporter.KwoloksHollowActivated: CheckUberBoolValue(UberStateDefaults.savePedestalKwoloksHollow); break;

            case SplitTeleporter.KwoloksHollowTeleported: CheckScene(true, "kwoloksCavernSaveRoomA"); break;

            case SplitTeleporter.LumaPoolsAActivated: CheckUberBoolValue(UberStateDefaults.savePedestalLumaPoolsA); break;

            case SplitTeleporter.LumaPoolsATeleported: CheckScene(true, "lumaPoolsSaveRoom"); break;

            case SplitTeleporter.LumaPoolsBActivated: CheckUberBoolValue(UberStateDefaults.savePedestalLumaPoolsB); break;

            case SplitTeleporter.LumaPoolsBTeleported: CheckScene(true, "lumaPoolsSaveRoomB"); break;

            case SplitTeleporter.MidnightBurrowsActivated: CheckUberBoolValue(UberStateDefaults.savePedestalMidnightBurrows); break;

            case SplitTeleporter.MidnightBurrowsTeleported: CheckScene(true, "howlsOriginA"); break;

            case SplitTeleporter.MouldwoodDepthsActivated: CheckUberBoolValue(UberStateDefaults.savePedestalMouldwood); break;

            case SplitTeleporter.MouldwoodDepthsTeleported: CheckScene(true, "mouldwoodDepthsF"); break;

            case SplitTeleporter.SilentWoodsAActivated: CheckUberBoolValue(UberStateDefaults.savePedestalSilentWoodsA); break;

            case SplitTeleporter.SilentWoodsATeleported: CheckScene(true, "petrifiedForestTarBubbleChallenge"); break;

            case SplitTeleporter.SilentWoodsBActivated: CheckUberBoolValue(UberStateDefaults.savePedestalSilentWoodsB); break;

            case SplitTeleporter.SilentWoodsBTeleported: CheckScene(true, "petrifiedForestTandemWindChaseA"); break;

            case SplitTeleporter.WellspringActivated: CheckUberBoolValue(UberStateDefaults.savePedestalWellspring); break;

            case SplitTeleporter.WellspringTeleported: CheckScene(true, "waterMillCEntrance"); break;

            case SplitTeleporter.WellspringGladesActivated: CheckUberIntValue(UberStateDefaults.builderProjectSpiritWell, 3); break;

            case SplitTeleporter.WellspringGladesTeleported: CheckScene(true, "wellspringGladesHub"); break;

            case SplitTeleporter.WillowsEndActivated: CheckUberBoolValue(UberStateDefaults.savePedestalWillowsEnd); break;

            case SplitTeleporter.WillowsEndTeleported: CheckScene(true, "willowsEndSaveRoom"); break;

            case SplitTeleporter.WillowsEndShriekActivated: CheckUberBoolValue(UberStateDefaults.savePedestalWillowsEndShriek); break;

            case SplitTeleporter.WillowsEndShreikTeleported: CheckScene(true, "willowCeremonyIntro"); break;

            case SplitTeleporter.WindsweptWastesAActivated: CheckUberBoolValue(UberStateDefaults.savePedestalWindsweptWastesA); break;

            case SplitTeleporter.WindsweptWastesATeleported: CheckScene(true, "petrifiedOwlFeedingGroundsRevised"); break;

            case SplitTeleporter.WindsweptWastesBActivated: CheckUberBoolValue(UberStateDefaults.savePedestalWindsweptWastesB); break;

            case SplitTeleporter.WindsweptWastesBTeleported: CheckScene(true, "e3DesertI__clone0"); break;

            case SplitTeleporter.WindtornRuinsEntranceActivated: CheckUberBoolValue(UberStateDefaults.savePedestalWindtornRuinsA); break;

            case SplitTeleporter.WindtornRuinsEntranceTeleported: CheckScene(true, "desertRuinsTowerSaveRoom"); break;

            case SplitTeleporter.WindtornRuinsBossActivated: CheckUberBoolValue(UberStateDefaults.savePedestalWindtornRuinsB); break;

            case SplitTeleporter.WindtornRuinsBossTeleported: CheckScene(true, "windtornRuinsC"); break;
            }
        }
        private void FixSplits()
        {
            int  index   = 1;
            bool changed = false;

            if (Settings.Autosplits.Count == 0)
            {
                Settings.Autosplits.Add(new Split()
                {
                    Name = "Auto Start", Type = SplitType.GameStart
                });
                changed = true;
            }
            else
            {
                Settings.Autosplits[0].Name = "Auto Start";
            }

            foreach (ISegment segment in State.Run)
            {
                if (index < Settings.Autosplits.Count)
                {
                    Split split = Settings.Autosplits[index++];
                    if (split.Name != segment.Name)
                    {
                        split.Name = segment.Name;
                        changed    = true;
                    }
                }
                else
                {
                    index++;
                    Settings.Autosplits.Add(new Split()
                    {
                        Name = segment.Name, Type = SplitType.ManualSplit
                    });
                    changed = true;
                }
            }

            while (index < Settings.Autosplits.Count)
            {
                Settings.Autosplits.RemoveAt(Settings.Autosplits.Count - 1);
                changed = true;
            }

            if (changed)
            {
                flowMain.SuspendLayout();
                flowMain.Controls.Clear();

                foreach (Split split in Settings.Autosplits)
                {
                    UserSplitSettings setting = new UserSplitSettings();
                    setting.UserSplit = split;
                    setting.UpdateControls(true);
                    flowMain.Controls.Add(setting);
                }

                flowMain.ResumeLayout(true);
            }
        }
        private void CheckSplit(Split split, bool updateValues)
        {
            GameState state = Memory.GameState();

            ShouldSplit = false;
            Paused      = Memory.IsLoadingGame(state);

            if (split.Type == SplitType.GameStart)
            {
                Screen screen     = Memory.TitleScreen();
                int    difficulty = Memory.Difficulty();
                bool   isStarted  = difficulty != 4 && lastIntValue == 4 && screen == Screen.ProfileSelected;
                if (screen == Screen.ProfileSelected && lastScreen == Screen.SaveSlots)
                {
                    Memory.SetDifficulty(4);
                }
                ShouldSplit   = !lastBoolValue && isStarted;
                lastBoolValue = isStarted;
                lastIntValue  = difficulty;
                lastScreen    = screen;
            }
            else
            {
                if (!updateValues && ((state != GameState.Game && split.Type != SplitType.Hitbox) || Memory.Dead() || (Paused && state != GameState.Game)))
                {
                    return;
                }

                switch (split.Type)
                {
                case SplitType.ManualSplit:
                    break;

                case SplitType.Ability:
                    SplitAbility ability = Utility.GetEnumValue <SplitAbility>(split.Value);
                    if (ability == SplitAbility.FastTravel)
                    {
                        CheckUberIntValue(UberStateDefaults.fastTravel, 1);
                    }
                    else
                    {
                        CheckAbility(Utility.GetEnumValue <AbilityType>(split.Value));
                    }
                    break;

                case SplitType.Shard:
                    ShardType shardType = ShardType.Overcharge;
                    bool      hasShard  = false;
                    if (Enum.TryParse <ShardType>(split.Value, out shardType))
                    {
                        hasShard = Memory.HasShard(shardType, 0);
                    }
                    else if (Enum.TryParse <ShardType>(split.Value.Substring(0, split.Value.Length - 1), out shardType))
                    {
                        hasShard = Memory.HasShard(shardType, int.Parse(split.Value.Substring(split.Value.Length - 1)));
                    }
                    ShouldSplit   = !lastBoolValue && hasShard;
                    lastBoolValue = hasShard;
                    break;

                case SplitType.AreaEnter:
                    CheckArea(split, true);
                    break;

                case SplitType.AreaLeave:
                    CheckArea(split, false);
                    break;

                case SplitType.WorldEvent:
                    CheckWorldEvent(split);
                    break;

                case SplitType.Wisp:
                    CheckWisp(split);
                    break;

                case SplitType.Boss:
                    CheckBoss(split);
                    break;

                case SplitType.Map:
                    CheckMap(split);
                    break;

                case SplitType.SpiritTrial:
                    CheckSpiritTrial(split);
                    break;

                case SplitType.Teleporter:
                    CheckTeleporter(split);
                    break;

                case SplitType.Hitbox:
                    Vector4 hitbox = new Vector4(split.Value);
                    CheckHitbox(hitbox);
                    break;

                case SplitType.UberState:
                    CheckBoolUberState(split);
                    break;

                case SplitType.GameEnd:
                    CheckHitbox(new Vector4("-4628.05,-6756,10,10"));
                    break;

                case SplitType.Seed:
                    CheckSeed(split);
                    break;

                case SplitType.CreepHeart:
                    Memory.UpdateUberState(UberStateDefaults.vineAClear);
                    Memory.UpdateUberState(UberStateDefaults.vineBClear);
                    Memory.UpdateUberState(UberStateDefaults.vineCClear);
                    Memory.UpdateUberState(UberStateDefaults.vineDClear);
                    Memory.UpdateUberState(UberStateDefaults.vineEClear);
                    Memory.UpdateUberState(UberStateDefaults.vineFClear);
                    Memory.UpdateUberState(UberStateDefaults.vineGClear);
                    Memory.UpdateUberState(UberStateDefaults.vineHClear);
                    int creepCount = UberStateDefaults.vineAClear.Value.Int + UberStateDefaults.vineBClear.Value.Int;
                    creepCount += UberStateDefaults.vineCClear.Value.Int + UberStateDefaults.vineDClear.Value.Int;
                    creepCount += UberStateDefaults.vineEClear.Value.Int + UberStateDefaults.vineFClear.Value.Int;
                    creepCount += UberStateDefaults.vineGClear.Value.Int + UberStateDefaults.vineHClear.Value.Int;

                    int splitCreeps = -1;
                    int.TryParse(split.Value, out splitCreeps);
                    ShouldSplit  = lastIntValue != creepCount && creepCount == splitCreeps;
                    lastIntValue = creepCount;
                    break;

                case SplitType.Keystone:
                    int keystones      = Memory.Keystones();
                    int splitKeystones = -1;
                    int.TryParse(split.Value, out splitKeystones);
                    ShouldSplit  = lastIntValue != keystones && keystones == splitKeystones;
                    lastIntValue = keystones;
                    break;

                case SplitType.Ore:
                    int ore      = Memory.Ore();
                    int splitOre = -1;
                    int.TryParse(split.Value, out splitOre);
                    ShouldSplit  = lastIntValue != ore && ore == splitOre;
                    lastIntValue = ore;
                    break;

                case SplitType.HealthCell:
                    Memory.UpdateUberState(UberStateDefaults.healthContainersCounter);
                    Memory.UpdateUberState(UberStateDefaults.wispRewardPickupKwolok);
                    Memory.UpdateUberState(UberStateDefaults.wispRewardPickupMouldwood);
                    Memory.UpdateUberState(UberStateDefaults.wispRewardPickupWindtorn);
                    Memory.UpdateUberState(UberStateDefaults.wispRewardPickupBaur);
                    Memory.UpdateUberState(UberStateDefaults.wispRewardPickupLagoon);
                    int health = UberStateDefaults.healthContainersCounter.Value.Int - (UberStateDefaults.wispRewardPickupKwolok.Value.Bool ? 2 : 0);
                    health -= (UberStateDefaults.wispRewardPickupMouldwood.Value.Bool ? 2 : 0) + (UberStateDefaults.wispRewardPickupWindtorn.Value.Bool ? 2 : 0);
                    health -= (UberStateDefaults.wispRewardPickupBaur.Value.Bool ? 2 : 0) + (UberStateDefaults.wispRewardPickupLagoon.Value.Bool ? 2 : 0);
                    int splitHealth = -1;
                    int.TryParse(split.Value, out splitHealth);
                    ShouldSplit  = lastIntValue != health && health == splitHealth;
                    lastIntValue = health;
                    break;

                case SplitType.EnergyCell:
                    Memory.UpdateUberState(UberStateDefaults.energyContainersCounter);
                    Memory.UpdateUberState(UberStateDefaults.wispRewardPickupKwolok);
                    Memory.UpdateUberState(UberStateDefaults.wispRewardPickupMouldwood);
                    Memory.UpdateUberState(UberStateDefaults.wispRewardPickupWindtorn);
                    Memory.UpdateUberState(UberStateDefaults.wispRewardPickupBaur);
                    Memory.UpdateUberState(UberStateDefaults.wispRewardPickupLagoon);
                    int energy = UberStateDefaults.energyContainersCounter.Value.Int - (UberStateDefaults.wispRewardPickupKwolok.Value.Bool ? 2 : 0);
                    energy -= (UberStateDefaults.wispRewardPickupMouldwood.Value.Bool ? 2 : 0) + (UberStateDefaults.wispRewardPickupWindtorn.Value.Bool ? 2 : 0);
                    energy -= (UberStateDefaults.wispRewardPickupBaur.Value.Bool ? 2 : 0) + (UberStateDefaults.wispRewardPickupLagoon.Value.Bool ? 2 : 0);
                    int splitEnergy = -1;
                    int.TryParse(split.Value, out splitEnergy);
                    ShouldSplit  = lastIntValue != energy && energy == splitEnergy;
                    lastIntValue = energy;
                    break;
                }

                if ((state != GameState.Game && split.Type != SplitType.Hitbox) || Memory.Dead() || (Paused && state != GameState.Game))
                {
                    ShouldSplit = false;
                }
                else if (DateTime.Now > splitLate)
                {
                    ShouldSplit = true;
                    splitLate   = DateTime.MaxValue;
                }
            }
        }