using System; using System.Collections.Generic; using System.Xml.Linq; namespace Barotrauma { class PriceInfo { public readonly int Price; public readonly bool CanBeBought; //minimum number of items available at a given store public readonly int MinAvailableAmount; //maximum number of items available at a given store public readonly int MaxAvailableAmount; /// /// Used when both and are set to 0. /// public const int DefaultAmount = 5; /// /// Can the item be a Daily Special or a Requested Good /// public readonly bool CanBeSpecial; /// /// The item isn't available in stores unless the level's difficulty is above this value /// public readonly int MinLevelDifficulty; /// /// The cost of item when sold by the store. Higher modifier means the item costs more to buy from the store. /// public readonly float BuyingPriceMultiplier = 1f; /// /// Support for the old style of determining item prices /// when there were individual Price elements for each location type /// where the item was for sale. /// public PriceInfo(XElement element) { Price = element.GetAttributeInt("buyprice", 0); MinLevelDifficulty = element.GetAttributeInt("minleveldifficulty", 0); BuyingPriceMultiplier = element.GetAttributeFloat("buyingpricemultiplier", 1f); CanBeBought = true; var minAmount = GetMinAmount(element); MinAvailableAmount = Math.Min(minAmount, CargoManager.MaxQuantity); var maxAmount = GetMaxAmount(element); maxAmount = Math.Min(maxAmount, CargoManager.MaxQuantity); MaxAvailableAmount = Math.Max(maxAmount, MinAvailableAmount); } public PriceInfo(int price, bool canBeBought, int minAmount = 0, int maxAmount = 0, bool canBeSpecial = true, int minLevelDifficulty = 0, float buyingPriceMultiplier = 1f) { Price = price; CanBeBought = canBeBought; MinAvailableAmount = Math.Min(minAmount, CargoManager.MaxQuantity); BuyingPriceMultiplier = buyingPriceMultiplier; maxAmount = Math.Min(maxAmount, CargoManager.MaxQuantity); MaxAvailableAmount = Math.Max(maxAmount, minAmount); MinLevelDifficulty = minLevelDifficulty; CanBeSpecial = canBeSpecial; } public static List> CreatePriceInfos(XElement element, out PriceInfo defaultPrice) { defaultPrice = null; var basePrice = element.GetAttributeInt("baseprice", 0); var soldByDefault = element.GetAttributeBool("soldbydefault", true); var minAmount = GetMinAmount(element); var maxAmount = GetMaxAmount(element); var minLevelDifficulty = element.GetAttributeInt("minleveldifficulty", 0); var canBeSpecial = element.GetAttributeBool("canbespecial", true); var buyingPriceMultiplier = element.GetAttributeFloat("buyingpricemultiplier", 1f); var priceInfos = new List>(); foreach (XElement childElement in element.GetChildElements("price")) { var priceMultiplier = childElement.GetAttributeFloat("multiplier", 1.0f); var sold = childElement.GetAttributeBool("sold", soldByDefault); priceInfos.Add(new Tuple(childElement.GetAttributeString("locationtype", "").ToLowerInvariant(), new PriceInfo(price: (int)(priceMultiplier * basePrice), canBeBought: sold, minAmount: sold ? GetMinAmount(childElement, minAmount) : 0, maxAmount: sold ? GetMaxAmount(childElement, maxAmount) : 0, canBeSpecial, childElement.GetAttributeInt("minleveldifficulty", minLevelDifficulty), childElement.GetAttributeFloat("buyingpricemultiplier", buyingPriceMultiplier)))); } var canBeBoughtAtOtherLocations = soldByDefault && element.GetAttributeBool("soldeverywhere", true); defaultPrice = new PriceInfo(basePrice, canBeBoughtAtOtherLocations, minAmount: canBeBoughtAtOtherLocations ? minAmount : 0, maxAmount: canBeBoughtAtOtherLocations ? maxAmount : 0, canBeSpecial, minLevelDifficulty, buyingPriceMultiplier); return priceInfos; } private static int GetMinAmount(XElement element, int defaultValue = 0) => element != null ? element.GetAttributeInt("minamount", element.GetAttributeInt("minavailable", defaultValue)) : defaultValue; private static int GetMaxAmount(XElement element, int defaultValue = 0) => element != null ? element.GetAttributeInt("maxamount", element.GetAttributeInt("maxavailable", defaultValue)) : defaultValue; } }