Пример #1
0
        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);
                }
            }
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        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;
                }
            }
        }