public Caravan(int numTraders, CaravanTypeEnum caravanType, List <TileManager.Tile> spawnTiles, TileManager.Tile targetTile) { this.numTraders = numTraders; this.caravanType = caravanType; this.targetTile = targetTile; location = GameManager.caravanM.CreateLocation(); for (int i = 0; i < numTraders && spawnTiles.Count > 0; i++) { TileManager.Tile spawnTile = spawnTiles[UnityEngine.Random.Range(0, spawnTiles.Count)]; SpawnTrader(spawnTile); spawnTiles.Remove(spawnTile); } inventory = new ResourceManager.Inventory(this, int.MaxValue, int.MaxValue); resourceGroup = GameManager.resourceM.GetRandomResourceGroup(); foreach (ResourceManager.Resource resource in resourceGroup.resources.OrderBy(r => UnityEngine.Random.Range(0f, 1f))) // Randomize resource group list { int resourceGroupResourceCount = Mathf.Clamp(resourceGroup.resources.Count, minDistinctResources + 1, int.MaxValue); // Ensure minimum count of (minimumDistinctResources + 1) if (UnityEngine.Random.Range(0f, 1f) < Mathf.Clamp(((resourceGroupResourceCount - inventory.resources.Count) - minDistinctResources) / (float)(resourceGroupResourceCount - minDistinctResources), minDistinctResourceChance, 1f)) // Decrease chance of additional distinct resources on caravan as distinct resources on caravan increase { int resourceAvailableAmount = resource.GetAvailableAmount(); int caravanAmount = Mathf.RoundToInt(Mathf.Clamp(UnityEngine.Random.Range(resourceAvailableAmount * minAvailableAmountModifier, resourceAvailableAmount * maxAvailableAmountModifier), UnityEngine.Random.Range(minMinimumCaravanAmount, maxMinimumCaravanAmount), int.MaxValue)); // Ensure a minimum number of the resource on the caravan inventory.ChangeResourceAmount(resource, caravanAmount, false); } } }
public virtual void ChangeClothing(Appearance appearance, ResourceManager.Clothing clothing) { if (clothes[appearance] != clothing) { if (clothing != null) { humanObj.transform.Find(appearance.ToString()).GetComponent <SpriteRenderer>().sprite = clothing.image; inventory.ChangeResourceAmount(clothing, -1, false); } if (clothes[appearance] != null) { humanObj.transform.Find(appearance.ToString()).GetComponent <SpriteRenderer>().sprite = GameManager.resourceM.clearSquareSprite; inventory.ChangeResourceAmount(clothes[appearance], 1, false); } clothes[appearance] = clothing; SetColour(overTile.sr.color); GameManager.uiM.SetSelectedColonistInformation(true); } }
public void ConfirmTrade() { if (leaving) { leaving = false; leaveTimer = 0; foreach (Trader trader in traders) { trader.MoveToTile(trader.overTile, false); } } foreach (ResourceManager.TradeResourceAmount tradeResourceAmount in resourcesToTrade) { ResourceManager.ConfirmedTradeResourceAmount existingConfirmedTradeResourceAmount = confirmedResourcesToTrade.Find(crtt => crtt.resource == tradeResourceAmount.resource); if (existingConfirmedTradeResourceAmount != null) { existingConfirmedTradeResourceAmount.tradeAmount += tradeResourceAmount.GetTradeAmount(); existingConfirmedTradeResourceAmount.amountRemaining += tradeResourceAmount.GetTradeAmount(); } else { confirmedResourcesToTrade.Add(new ResourceManager.ConfirmedTradeResourceAmount(tradeResourceAmount.resource, tradeResourceAmount.GetTradeAmount())); } } List <ResourceManager.ResourceAmount> resourcesToReserve = new List <ResourceManager.ResourceAmount>(); foreach (ResourceManager.TradeResourceAmount tradeResourceAmount in resourcesToTrade) { if (tradeResourceAmount.GetTradeAmount() < 0) { resourcesToReserve.Add(new ResourceManager.ResourceAmount(tradeResourceAmount.resource, Mathf.Abs(tradeResourceAmount.GetTradeAmount()))); } } foreach (ResourceManager.TradeResourceAmount tradeResourceAmount in resourcesToTrade) { if (tradeResourceAmount.GetTradeAmount() > 0) { inventory.ChangeResourceAmount(tradeResourceAmount.resource, -tradeResourceAmount.GetTradeAmount(), false); } } resourcesToTrade.Clear(); List <ResourceManager.TradingPost> tradingPostsWithReservedResources = new List <ResourceManager.TradingPost>(); Trader primaryTrader = traders[0]; if (primaryTrader != null) { foreach (ResourceManager.TradingPost tradingPost in GameManager.resourceM.GetTradingPostsInRegion(primaryTrader.overTile.region).OrderBy(tp => PathManager.RegionBlockDistance(primaryTrader.overTile.regionBlock, tp.zeroPointTile.regionBlock, true, true, false))) { List <ResourceManager.ResourceAmount> resourcesToReserveAtThisTradingPost = new List <ResourceManager.ResourceAmount>(); List <ResourceManager.ResourceAmount> resourcesToReserveToRemove = new List <ResourceManager.ResourceAmount>(); foreach (ResourceManager.ResourceAmount resourceToReserve in resourcesToReserve) { ResourceManager.ResourceAmount resourceAmount = tradingPost.GetInventory().resources.Find(r => r.resource == resourceToReserve.resource); if (resourceAmount != null) { int amountToReserve = resourceToReserve.amount < resourceAmount.amount ? resourceToReserve.amount : resourceAmount.amount; resourcesToReserveAtThisTradingPost.Add(new ResourceManager.ResourceAmount(resourceToReserve.resource, amountToReserve)); resourceToReserve.amount -= amountToReserve; if (resourceToReserve.amount == 0) { resourcesToReserveToRemove.Add(resourceToReserve); } } } if (resourcesToReserveAtThisTradingPost.Count > 0) { tradingPost.GetInventory().ReserveResources(resourcesToReserveAtThisTradingPost, primaryTrader); tradingPostsWithReservedResources.Add(tradingPost); } foreach (ResourceManager.ResourceAmount resourceToReserveToRemove in resourcesToReserveToRemove) { resourcesToReserve.Remove(resourceToReserveToRemove); } resourcesToReserveToRemove.Clear(); } if (tradingPostsWithReservedResources.Count > 0) { primaryTrader.tradingPosts = tradingPostsWithReservedResources; } } }