Beispiel #1
0
 private static void Postfix()
 {
     Mod.Debug("Player_OnAreaLoaded_Patch");
     Settings.ClearCachedPerSave();
     MultipleClasses.SyncAllGestaltState();
 }
Beispiel #2
0
        public static void MigrationOptions(float indent)
        {
            if (!Main.IsInGame)
            {
                return;
            }
            var hasMulticlassMigration = settings.multiclassSettings.Count > 0 &&
                                         (settings.toggleAlwaysShowMigration || settings.perSave.multiclassSettings.Count == 0);
            var hasGestaltMigration = settings.excludeClassesFromCharLevelSets.Count > 0 &&
                                      (settings.toggleAlwaysShowMigration || settings.perSave.excludeClassesFromCharLevelSets.Count == 0);
            var hasLevelAsLegendMigration = settings.perSave.charIsLegendaryHero.Count > 0 &&
                                            (settings.toggleAlwaysShowMigration || settings.perSave.charIsLegendaryHero.Count == 0);
            var hasAvailableMigrations = hasMulticlassMigration || hasGestaltMigration || hasLevelAsLegendMigration;
            var migrationCount         = settings.multiclassSettings.Count + settings.excludeClassesFromCharLevelSets.Count + settings.charIsLegendaryHero.Count;

            if (migrationCount > 0)
            {
                using (UI.HorizontalScope()) {
                    UI.Space(indent);
                    UI.Toggle("Show Migrations", ref settings.toggleAlwaysShowMigration);
                    UI.Space(25);
                    UI.Label("toggle this if you want show older ToyBox settings for ".green() + "Multi-class selections, Gestalt Flags and Allow Levels Past 20 ".cyan());
                }
            }
            if (migrationCount > 0)
            {
                UI.Div(indent);
                if (hasAvailableMigrations)
                {
                    using (UI.HorizontalScope()) {
                        UI.Space(indent);
                        using (UI.VerticalScope()) {
                            UI.Label("the following options allow you to migrate previous settings that were stored in toybox to the new per setting save mechanism for ".green() + "Multi-class selections, Gestalt Flags and Allow Levels Past 20 ".cyan() + "\nNote:".orange() + "you may have configured this for a different save so use care in doing this migration".green());
                            if (hasMulticlassMigration)
                            {
                                using (UI.HorizontalScope()) {
                                    UI.Label("Multi-class settings", UI.Width(300));
                                    UI.Space(25);
                                    UI.Label($"{settings.multiclassSettings.Count}".cyan());
                                    UI.Space(25);
                                    UI.ActionButton("Migrate", () => { settings.perSave.multiclassSettings = settings.multiclassSettings; Settings.SavePerSaveSettings(); });
                                    UI.Space(25);
                                    UI.DangerousActionButton("Remove", "this will remove your old multiclass settings from ToyBox settings but does not affect any other saves that have already migrated them", ref areYouSure1, () => settings.multiclassSettings.Clear());
                                }
                            }
                            if (hasGestaltMigration)
                            {
                                using (UI.HorizontalScope()) {
                                    UI.Label("Gestalt Flags", UI.Width(300));
                                    UI.Space(25);
                                    UI.Label($"{settings.excludeClassesFromCharLevelSets.Count}".cyan());
                                    UI.Space(25);
                                    UI.ActionButton("Migrate", () => {
                                        settings.perSave.excludeClassesFromCharLevelSets = settings.excludeClassesFromCharLevelSets; Settings.SavePerSaveSettings();
                                        MultipleClasses.SyncAllGestaltState();
                                    });
                                    UI.Space(25);
                                    UI.DangerousActionButton("Remove", "this will remove your old gestalt flags from ToyBox settings but does not affect any other saves that have already migrated them", ref areYouSure2, () => settings.excludeClassesFromCharLevelSets.Clear());
                                }
                            }
                            if (hasLevelAsLegendMigration)
                            {
                                using (UI.HorizontalScope()) {
                                    UI.Label("Chars Able To Exceed Level 20", UI.Width(300));
                                    UI.Space(25);
                                    UI.Label($"{settings.charIsLegendaryHero.Count}".cyan());
                                    UI.Space(25);
                                    UI.ActionButton("Migrate", () => { settings.perSave.charIsLegendaryHero = settings.charIsLegendaryHero; Settings.SavePerSaveSettings(); });
                                    UI.Space(25);
                                    UI.DangerousActionButton("Remove", "this will remove your old Allow Level Past 20 flags from ToyBox settings but does not affect any other saves that have already migrated them", ref areYouSure3, () => settings.charIsLegendaryHero.Clear());
                                }
                            }
                        }
                    }
                    UI.Div(indent);
                }
            }
        }
Beispiel #3
0
        public void OnGUI(UnityModManager.ModEntry modEntry)
        {
            if (Core == null || !Core.Enabled)
            {
                return;
            }

            GUIStyle style = new GUIStyle(GUI.skin.button)
            {
                alignment = TextAnchor.MiddleLeft
            };

            MultipleClasses.Enabled = GUIHelper.ToggleButton(MultipleClasses.Enabled, "Multiple Classes", style);

            if (MultipleClasses.Enabled)
            {
                string[]         companionNames        = default;
                HashSet <string> selectedMulticlassSet = default;

                GUILayout.Space(10);

                // selections
                using (new GUILayout.HorizontalScope())
                {
                    // character selections
                    using (new GUILayout.VerticalScope(GUILayout.ExpandWidth(false)))
                    {
                        string playerName  = default;
                        string activeScene = Core.Mod.ActiveScene.name;
                        if (activeScene != "MainMenu" && activeScene != "Start" && Core.Mod.Player != null)
                        {
                            playerName     = Core.Mod.Player.MainCharacter.Value.CharacterName;
                            companionNames = Core.Mod.Player.AllCharacters
                                             .Where(c => c.IsPlayerFaction && !c.IsMainCharacter && !c.Descriptor.IsPet)
                                             .Select(c => c.CharacterName)
                                             .ToArray();
                        }
                        else
                        {
                            playerName     = "[Player]";
                            companionNames = new string[0];
                        }

                        int selectedCharacterIndex =
                            _selectedCharacterType == SelectedCharacterType.MainCharacter ? 0 :
                            _selectedCharacterType == SelectedCharacterType.CharGenCustom ? companionNames.Length + 1 :
                            Array.FindIndex(companionNames, name => name == _selectedCharacterName) + 1;

                        GUIHelper.SelectionGrid(ref selectedCharacterIndex,
                                                new[] { playerName }.Concat(companionNames).Concat(new[] { "[Custom]".Color(RGBA.silver) }).ToArray(),
                                                1, null, GUILayout.ExpandWidth(false));

                        if (selectedCharacterIndex <= 0)
                        {
                            _selectedCharacterType = SelectedCharacterType.MainCharacter;
                            selectedMulticlassSet  = MultipleClasses.MainCharSet;
                        }
                        else if (selectedCharacterIndex > companionNames.Length)
                        {
                            _selectedCharacterType = SelectedCharacterType.CharGenCustom;
                            selectedMulticlassSet  = MultipleClasses.CharGenSet;
                        }
                        else
                        {
                            _selectedCharacterType = SelectedCharacterType.Companion;
                            _selectedCharacterName = companionNames[selectedCharacterIndex - 1];
                            selectedMulticlassSet  = MultipleClasses.DemandCompanionSet(_selectedCharacterName);
                        }
                    }

                    // multiclass selections
                    using (new GUILayout.VerticalScope(GUILayout.ExpandWidth(false)))
                    {
                        foreach (BlueprintCharacterClass characterClass in Core.Mod.CharacterClasses)
                        {
                            using (new GUILayout.HorizontalScope())
                            {
                                // class
                                bool selected = selectedMulticlassSet.Contains(characterClass.AssetGuid);
                                GUIHelper.ToggleButton(ref selected, characterClass.Name, ref _classNameButtonWidth,
                                                       () => selectedMulticlassSet.Add(characterClass.AssetGuid),
                                                       () => selectedMulticlassSet.Remove(characterClass.AssetGuid),
                                                       style);

                                // archetypes
                                if (selected && characterClass.Archetypes.Any())
                                {
                                    int originalArchetype;
                                    int selectedArchetype = originalArchetype = Array.FindIndex(characterClass.Archetypes,
                                                                                                archetype => selectedMulticlassSet.Contains(archetype.AssetGuid)) + 1;
                                    GUIHelper.Toolbar(ref selectedArchetype,
                                                      new string[] { characterClass.Name }.Concat(characterClass.Archetypes.Select(item => item.Name)).ToArray());
                                    if (selectedArchetype != originalArchetype)
                                    {
                                        if (originalArchetype > 0)
                                        {
                                            selectedMulticlassSet.Remove(characterClass.Archetypes[originalArchetype - 1].AssetGuid);
                                        }
                                        if (selectedArchetype > 0)
                                        {
                                            selectedMulticlassSet.Add(characterClass.Archetypes[selectedArchetype - 1].AssetGuid);
                                        }
                                    }
                                }
                                else
                                {
                                    GUILayout.FlexibleSpace();
                                }
                            }
                        }
                    }

                    if (_selectedCharacterType == SelectedCharacterType.Companion && selectedMulticlassSet.Count == 0)
                    {
                        MultipleClasses.CompanionSets.Remove(_selectedCharacterName);
                    }
                }

                GUILayout.Space(10);

                // clear
                if (GUILayout.Button("Clear Settings For Unavailable Characters", style))
                {
                    foreach (string key in MultipleClasses.CompanionSets.Keys.Except(companionNames).ToList())
                    {
                        MultipleClasses.CompanionSets.Remove(key);
                    }
                }
                if (GUILayout.Button("Clear Settings For All Companions", style))
                {
                    MultipleClasses.CompanionSets.Clear();
                }
                if (GUILayout.Button("Clear Settings For All Characters", style))
                {
                    MultipleClasses.MainCharSet.Clear();
                    MultipleClasses.CharGenSet.Clear();
                    MultipleClasses.CompanionSets.Clear();
                }
            }
        }