public T[] RandomItems <T>(int count, float sizeExponent, Predicate <T> filter = null) where T : EquippableItemData { return(ItemManager.ItemData.GetAll <T>() .Where(item => item.Price > 0 && item.Manufacturer != Guid.Empty && (Galaxy?.ContainsFaction(item.Manufacturer) ?? true) && (Faction == null || Faction.Allegiance.ContainsKey(item.Manufacturer)) && (filter?.Invoke(item) ?? true)) .WeightedRandomElements(ref Random, item => (Faction == null || item.Manufacturer == Faction.ID ? 1 : Faction.Allegiance[item.Manufacturer]) * // Prioritize items from allied manufacturers pow(item.Shape.Coordinates.Length, sizeExponent) / // Prioritize larger items (Zone?.Distance[Galaxy.HomeZones[ItemManager.ItemData.Get <Faction>(item.Manufacturer)]] ?? 1) / // Penalize distance to manufacturer headquarters pow(item.Price, PriceExponent), // Penalize item price to a controllable degree count )); }
public HullData RandomHull(HullType type, Predicate <HullData> hullFilter = null) { return(ItemManager.ItemData.GetAll <HullData>() .Where(item => item.Price > 0 && (hullFilter?.Invoke(item) ?? true) && item.HullType == type && item.Manufacturer != Guid.Empty && (Galaxy?.ContainsFaction(item.Manufacturer) ?? true) && (Faction == null || item.Manufacturer == Faction.ID || Faction.Allegiance.ContainsKey(item.Manufacturer))) .WeightedRandomElements(ref Random, item => (Faction == null || item.Manufacturer == Faction.ID ? 1 : Faction.Allegiance[item.Manufacturer]) / // Prioritize items from allied manufacturers (Zone?.Distance[Galaxy.HomeZones[ItemManager.ItemData.Get <Faction>(item.Manufacturer)]] ?? 1) / // Penalize distance to manufacturer headquarters pow(item.Price, PriceExponent), // Penalize item price to a controllable degree 1 ).FirstOrDefault()); }