Пример #1
0
        public SettingSortingOrderScreenVM(SettingScreenVM parent, PartySort sorter)
        {
            _settingScreen = parent;
            _sorter        = sorter;
            _sortingOrder  = new MBBindingList <SettingSortingOrderVM>();
            Name           = sorter.GetName();

            InitializeList();
        }
Пример #2
0
        public new void OnFinalize()
        {
            base.OnFinalize();
            SaveList();
            PartyScreenConfig.Save();

            _sortingOrder  = null;
            _settingScreen = null;
            _sorter        = null;
        }
        public SettingSorterPaneVM(SettingScreenVM parent, string name, PartySort sorter, Action <PartySort> newSorterCallback)
        {
            _sorter             = sorter;
            _parent             = parent;
            _newSorterCallBack  = newSorterCallback;
            PossibleSettingList = new MBBindingList <SettingSortVM>();
            SettingList         = new MBBindingList <SettingSortVM>();
            Name = name;

            InitialiseSettingLists();
        }
        private PartySort GetFullPartySorter(int n)
        {
            if (n == _settingList.Count - 1)
            {
                return(_settingList[n].SortingComparer);
            }

            PartySort toReturn = _settingList[n].SortingComparer;

            toReturn.EqualSorter = GetFullPartySorter(n + 1);
            return(toReturn);
        }
        public SettingSortVM(PartySort sortingComparer, Action <SettingSortVM, SettingSide> transferCallBack, SettingSide side, Action <SettingSortVM> openSubSetting)
        {
            SortingComparer = sortingComparer;
            SettingHint     = new HintViewModel(new TextObject(SortingComparer.GetHintText()));
            _transferHint   = new HintViewModel(new TextObject($"Click to transfer to the {side.GetOtherSide().ToString().ToLower()} side!"));
            AscDescHint     = new HintViewModel(new TextObject($"Current Mode: {(IsDescending ? "Descending" : "Ascending")}"));

            IsTransferable = true;
            IsDescending   = SortingComparer.Descending;

            _transferCallBack = transferCallBack;
            _openSubSetting   = openSubSetting;
            _side             = side;
        }
        public void SortTroops()
        {
            var settings = PartyScreenConfig.ExtraSettings;

            try
            {
                SortAnyParty(_mainPartyList, _partyLogic.RightOwnerParty, _partyLogic.MemberRosters[_rightSide],
                             settings.PartySorter);

                if (!Utilities.IsControlDown())
                {
                    SortAnyParty(_mainPartyPrisoners,
                                 null,
                                 _partyLogic.PrisonerRosters[_rightSide],
                                 settings.SeparateSortingProfiles ? settings.PrisonerSorter : settings.PartySorter);

                    SortAnyParty(_partyVM.OtherPartyPrisoners,
                                 null,
                                 _partyLogic.PrisonerRosters[_leftSide],
                                 settings.SeparateSortingProfiles ? settings.PrisonerSorter : settings.PartySorter);

                    if (_partyLogic.LeftOwnerParty?.MobileParty != null)
                    {
                        bool      useGarrisonSorter = settings.SeparateSortingProfiles;
                        PartySort sorterToUse       = useGarrisonSorter
                            ? settings.GarrisonAndAlliedPartySorter
                            : settings.PartySorter;

                        SortAnyParty(_partyVM.OtherPartyTroops, _partyLogic.LeftOwnerParty,
                                     _partyLogic.MemberRosters[_leftSide], sorterToUse);
                    }
                }

                if (!_mainPartyList.IsEmpty() && (!_mainPartyList[0]?.Troop.Character?.IsPlayerCharacter ?? false))
                {
                    InformationManager.DisplayMessage(new InformationMessage(
                                                          "Your player character is no longer at the top of the list due to sorting, do NOT save your game and notify the mod manager"));
                }
            }
            catch (Exception e)
            {
                Logging.Log(Logging.Levels.ERROR, $"Sorting: {e}");
                Utilities.DisplayMessage($"PSE Sorting Unit Exception: {e}");
            }
        }
        private static void SortAnyParty(MBBindingList <PartyCharacterVM> toSort, PartyBase party,
                                         TroopRoster rosterToSort, PartySort sorter)
        {
            if (rosterToSort == null || rosterToSort.Count == 0 || toSort == null || toSort.IsEmpty())
            {
                return;
            }

            CharacterObject leaderOfParty = party?.LeaderHero?.CharacterObject;

            // Sort the list, this is done for the visual unit cards to be properly positioned after the sort
            // This is not yet persisted to the actual roster, that is done after this.
            toSort.StableSort(sorter);

            // Sanity check to ensure the leader is *always* at the top of the party.
            if (leaderOfParty != null)
            {
                var index = toSort.FindIndex((character) => character.Character.Equals(leaderOfParty));
                PartyCharacterVM leaderVm = toSort[index];
                toSort.RemoveAt(index);
                toSort.Insert(0, leaderVm);
            }

            // Here we manually clear the roster while ignoring the party leader.
            // Don't use `rosterToSort.Clear()` as that seems to cause the party leader to get unset permanently afterward, which stops upgrades from working.
            rosterToSort.RemoveIf((item) => item.Character != leaderOfParty);

            // Re-add the correctly sorted troops to the roster. We need to do it in this janky way due to the fact that we can't easily sort
            // the underlying roster array.
            foreach (PartyCharacterVM character in toSort)
            {
                if (character.Character != leaderOfParty)
                {
                    rosterToSort.AddToCounts(
                        character.Troop.Character, character.Troop.Number, false, character.Troop.WoundedNumber,
                        character.Troop.Xp);
                }
            }
        }
        private void InitialiseSettingList()
        {
            for (PartySort currentSort = _sorter; currentSort != null; currentSort = currentSort.EqualSorter)
            {
                PartySort freshSorter;
                if (currentSort.HasCustomSettings())
                {
                    freshSorter =
                        currentSort.GetType()
                        .GetConstructor(new[] { typeof(PartySort), typeof(bool), typeof(List <string>) })
                        ?.Invoke(new object[]
                                 { null, currentSort.Descending, currentSort.CustomSettingsList }) as PartySort;
                }
                else
                {
                    freshSorter = currentSort.GetType().GetConstructor(new[] { typeof(PartySort), typeof(bool) })
                                  ?.Invoke(new object[] { null, currentSort.Descending }) as PartySort;
                }

                var settingSortVM = new SettingSortVM(freshSorter, TransferSorter, SettingSide.RIGHT, _parent.OpenSubSetting);

                _settingList.Add(settingSortVM);
            }
        }