using System; using System.Linq; namespace ProjectI.Runs { public static class CoreCategoryRules { public static readonly CoreCategory[] Categories = { CoreCategory.Weapons, CoreCategory.Abilities, CoreCategory.Survival, CoreCategory.Utility, CoreCategory.Mobility }; public static bool IsEligible(UpgradeDefinition definition, RunInventory inventory, UpgradeEligibility eligibility) { if (definition == null || inventory == null || eligibility == null) return false; var id = (UpgradeId)definition.Id; if (id == UpgradeId.ReserveCell) return eligibility.ActiveAbilities.Any(x => x > 0 && inventory.Rank(id, x) < long.MaxValue); if (inventory.Rank(id) == long.MaxValue) return false; if (id == UpgradeId.CrimsonCascade && inventory.Rank(UpgradeId.SerratedPayload) == 0) return false; if (id == UpgradeId.EchoCast && (eligibility.EchoEligibilitySpecified ? eligibility.EchoAbilities : eligibility.DamagingAbilities).Length == 0) return false; if (id == UpgradeId.AirReserve && !eligibility.ExtraJump) return false; if ((id == UpgradeId.DashWake || id == UpgradeId.BackstepGuard) && !eligibility.MovementAbility) return false; if (id == UpgradeId.ControlRelay && !eligibility.StatusAbility) return false; if (id == UpgradeId.MarkedRounds && !eligibility.MarkAbility) return false; if (id == UpgradeId.SharedShelter && !eligibility.SupportAbility) return false; if ((id == UpgradeId.RescueLink || id == UpgradeId.LinkedRecovery) && !eligibility.HasTeammates) return false; if ((id == UpgradeId.FieldBattery || id == UpgradeId.PulseEngine) && eligibility.DamagingAbilities.Length == 0) return false; return true; } public static int[] EligibleIds(CoreCategory category, UpgradeTier tier, RunInventory inventory, UpgradeEligibility eligibility) => UpgradeCatalog.All.Where(x => x.Tier == tier && (x.Categories & category) != 0 && IsEligible(x, inventory, eligibility)).Select(x => x.Id).Distinct().ToArray(); public static CoreCategory[] EligibleCategories(UpgradeTier tier, RunInventory inventory, UpgradeEligibility eligibility) => Categories.Where(x => EligibleIds(x, tier, inventory, eligibility).Length > 0).ToArray(); } }