예제 #1
0
    private IEnumerator SortAvailableKeepAsideOrderManagersByDistance(Cell <PriorityQueue <float, KeepAsideOrderManager> > rslt)
    {
        StockManager stockManager = GameManager.instance.cityBuilderData.stockManager;

        PriorityQueue <float, KeepAsideOrderManager> rsltQueue           = new PriorityQueue <float, KeepAsideOrderManager>();
        IEnumerator <KeepAsideOrderManager>          keepAsideEnumerator = stockManager.AllKeepAsideOrderManagers();

        while (keepAsideEnumerator.MoveNext())
        {
            KeepAsideOrderManager keepAsideManager = keepAsideEnumerator.Current;

            if (keepAsideManager != null)//On vérifie s'il n'a pas été détruit
            {
                float distance = Vector2.Distance(transform.position, keepAsideManager.transform.position);

                if (distance <= keepAsideManager.availabilityRange)//Pour éviter les calculs inutiles ; si ce n'est pas le cas, il est de toute façon trop loin
                {
                    FreightAreaIn  inArea  = keepAsideManager.freightAreaData.freightAreaIn;
                    FreightAreaOut outHome = freightAreaData.freightAreaOut;

                    float roadDistance = RoadsPathfinding.RealDistanceBetween(inArea.road, outHome.road);

                    if (roadDistance > 0.0f && roadDistance <= keepAsideManager.availabilityRange)
                    {
                        rsltQueue.Push(roadDistance, keepAsideManager);
                    }
                }
            }

            yield return(null);
        }

        rslt.value = rsltQueue;
    }
예제 #2
0
    public void DeliverKeptAsideOrderTo(ResourceCarrier recipient)
    {
        ResourceShipment            orderedShipment     = null;
        IEnumerator <AgoraMerchant> merchantsEnumerator = _agora.MerchantsEnumerator();

        while (merchantsEnumerator.MoveNext())
        {
            AgoraMerchant         merchant             = merchantsEnumerator.Current;
            KeepAsideOrderManager merchantOrderManager = merchant.GetComponent <KeepAsideOrderManager>();

            if (merchantOrderManager != null)
            {
                if (orderedShipment != null)
                {
                    orderedShipment.AddShipment(merchantOrderManager.DeliverKeptAside(recipient));
                }
                else
                {
                    orderedShipment = merchantOrderManager.DeliverKeptAside(recipient);
                }
            }
        }

        recipient.shipment = orderedShipment;
    }
    private IEnumerator DeliveryCoroutine(ResourceCarrier carrier)
    {
        KeepAsideOrderManager keepAsideOrderManager = freightAreaData.parentStock.GetComponent <KeepAsideOrderManager>();

        yield return(new WaitForSeconds(waterDeliveryTime));

        ResourceShipment order = keepAsideOrderManager.DeliverKeptAside(carrier);

        carrier.shipment    = order;
        carrier.destination = carrier.origin;
        carrier.GetComponent <RoadRouteManager>().MoveTo(carrier.destination.freightAreaData.freightAreaIn.road);
    }
예제 #4
0
    protected override void OnFreightAreaEntered(Collider2D other)
    {
        ResourceCarrier carrier = other.GetComponent <ResourceCarrier>();

        if (carrier != null && carrier.collectingResources && carrier.destination == freightAreaData.parentStock)
        {
            KeepAsideOrderManager keepAsideOrderManager = freightAreaData.parentStock.GetComponent <KeepAsideOrderManager>();

            carrier.shipment = keepAsideOrderManager.DeliverKeptAside(carrier);
            freightAreaData.SendBack(carrier);
        }
    }
예제 #5
0
    public override void CancelKeptAside(ResourceCarrier carrier)
    {
        IEnumerator <AgoraMerchant> merchantsEnumerator = _agora.MerchantsEnumerator();

        while (merchantsEnumerator.MoveNext())
        {
            AgoraMerchant         merchant          = merchantsEnumerator.Current;
            KeepAsideOrderManager merchantKeepAside = merchant.GetComponent <KeepAsideOrderManager>();

            if (merchantKeepAside != null)
            {
                merchantKeepAside.CancelKeptAside(carrier);
            }
        }
    }
예제 #6
0
    public override bool CanMakeKeepAsideOrder(string resourceName)
    {
        IEnumerator <AgoraMerchant> merchantsEnumerator = _agora.MerchantsEnumerator();

        while (merchantsEnumerator.MoveNext())
        {
            AgoraMerchant         merchant          = merchantsEnumerator.Current;
            KeepAsideOrderManager merchantKeepAside = merchant.GetComponent <KeepAsideOrderManager>();

            if (merchantKeepAside != null && merchantKeepAside.CanMakeKeepAsideOrder(resourceName))
            {
                return(true);
            }
        }

        return(false);
    }
예제 #7
0
    public override int MakeKeepAsideOrder(string resourceName, int orderedAmount, ResourceCarrier recipient)
    {
        int leftToOrder = orderedAmount;
        IEnumerator <AgoraMerchant> merchantsEnumerator = _agora.MerchantsEnumerator();

        while (merchantsEnumerator.MoveNext())
        {
            AgoraMerchant         merchant          = merchantsEnumerator.Current;
            KeepAsideOrderManager merchantKeepAside = merchant.GetComponent <KeepAsideOrderManager>();
            if (merchantKeepAside != null)
            {
                leftToOrder -= merchantKeepAside.MakeKeepAsideOrder(resourceName, leftToOrder, recipient);
            }

            if (leftToOrder == 0)
            {
                return(orderedAmount);
            }
        }

        return(orderedAmount - leftToOrder);
    }
예제 #8
0
 public void AddToKeepAsideOrderManagers(KeepAsideOrderManager toAdd)
 {
     _keepAsideOrderManagers.Add(toAdd);
 }