public static string GetSortFieldValue(FlattenedTroopRosterElement element, CustomSortOrder customOrder, MBBindingList <PartyCharacterVM> partyVmUnits) { switch (customOrder) { case CustomSortOrder.TierAsc: case CustomSortOrder.TierDesc: return(element.Troop.Tier.ToString()); case CustomSortOrder.CultureAsc: case CustomSortOrder.CultureDesc: return(element.Troop.Culture.Name.ToString()); case CustomSortOrder.MountedAsc: case CustomSortOrder.MountedDesc: return(element.Troop.IsMounted ? "1" : "0"); case CustomSortOrder.MeleeAsc: case CustomSortOrder.MeleeDesc: return(element.Troop.IsArcher ? "1" : "0"); case CustomSortOrder.UnitNameAsc: case CustomSortOrder.UnitNameDesc: return(element.Troop.Name.ToString()); case CustomSortOrder.UnitCountAsc: case CustomSortOrder.UnitCountDesc: return(partyVmUnits?.Where(x => x.Character.Name == element.Troop.Name)?.Select(x => x.Number) ?.FirstOrDefault().ToString()); case CustomSortOrder.CustomUpgradesPathAsc: case CustomSortOrder.CustomUpgradesPathDesc: var unitHasUpgrade = PartyManagerSettings.Settings.SavedTroopUpgradePaths?.Exists(x => x.UnitName == element.Troop.Name.ToString()); if (unitHasUpgrade == true) { return("1"); } return("0"); case CustomSortOrder.FormationAsc: case CustomSortOrder.FormationDesc: var formation = element.Troop?.CurrentFormationClass; if (formation != null) { return(((int)formation).ToString()); } return(null); default: return(""); } }
//If performance is an issue let's memoize this, reason I haven't done that off the bat is //there is no readily safe identifier I can use to link the same troop types. //and honestly I think its over-optimising anyways to even consider it, memory is enough of a problem. private static double getTroopXpDivisor(TroopRoster roster, FlattenedTroopRosterElement item) { int indexOfTroop = roster.FindIndexOfTroop(item.Troop); if (indexOfTroop == -1) { return(1); } TroopRosterElement element = roster.GetElementCopyAtIndex(indexOfTroop); if (element.NumberReadyToUpgrade == 0 || element.Number == 0) { return(1); } return((double)element.Number / (double)element.NumberReadyToUpgrade); }