private ResourceTradePanel CreateSingleResourceTrade(ResourceTrade <ResourceType> trade)
 {
     return(ResourceTradePanel.InstantiateOnObject(
                singleResourceTradePrefab,
                singleResourceTradeContainer,
                trade,
                (int)maxTradeAmount));
 }
        public static ResourceTradePanel InstantiateOnObject(
            GameObject selfPrefab,
            GameObject container,
            ResourceTrade <ResourceType> trade,
            int maxTradeAmount)
        {
            var newTradeNode = GameObject.Instantiate(selfPrefab, container.transform);
            var selfScript   = newTradeNode.GetComponent <ResourceTradePanel>();

            selfScript.trade          = trade;
            selfScript.maxTradeAmount = maxTradeAmount;

            return(selfScript);
        }
        public Task <TraderState> HandleState(TraderBehavior data)
        {
            TradeExecuteStateData myState = data.stateData[stateHandle];

            if (myState.remainingTrades.Count == 0)
            {
                return(Task.FromResult(TraderState.TradeTransit));
            }
            if ((myState.lastExchangeTime + timeDelay) < Time.time)
            {
                myState.lastExchangeTime = Time.time;

                var trade           = myState.remainingTrades[0];
                var targetInventory = data.currentTradeNodeTarget?.target.tradeInventory;
                if (targetInventory == null)
                {
                    //this is a bad state: we're trying to conduct some trade but our trade target has dissapeared
                    // this can happen if the trade routes are cleared through the UI in teh middle of our trading
                    // Abort!! we'll have to step back to the beginning and re-evaluate our opportunities
                    return(Task.FromResult(TraderState.Initial));
                }
                var option           = data.inventory.TransferResourceInto(trade.type, targetInventory, Mathf.Sign(trade.amount));
                var remainingToTrade = trade.amount - option.info;
                option.Execute();

                if (Mathf.Abs(option.info) <= 1E-05 || Mathf.Abs(remainingToTrade) <= 1E-05)
                {
                    myState.remainingTrades.RemoveAt(0);
                }
                else
                {
                    var newTrade = new ResourceTrade <ResourceType>
                    {
                        amount = remainingToTrade,
                        type   = trade.type
                    };
                    myState.remainingTrades[0] = newTrade;
                }
            }
            return(Task.FromResult(TraderState.TradeExecute));
        }