Esempio n. 1
0
    /**
     * Renvoie un transporteur à son point d'origine.
     **/
    public void SendBack(ResourceCarrier carrier)
    {
        carrier.destination = carrier.origin;
        carrier.GetComponent <Collider2D>().enabled = false;

        freightAreaOut.EnqueueCarrierToSend(carrier);
    }
Esempio n. 2
0
    private IEnumerator SendWaitingCarriers()
    {
        while (true)
        {
            if (_waitingCarriers.Count > 0 && road.roadLock.IsFree(Orientation.SOUTH))//TODO orientation
            {
                ResourceCarrier candidate      = _waitingCarriers.Dequeue();
                ResourceCarrier firstCandidate = candidate;
                bool            firstOk        = true;

                while (RoadsPathfinding.RouteStar(road, candidate.destination.freightAreaData.freightAreaIn.road, 10, Orientation.SOUTH) == null && firstCandidate != candidate)//TODO orientation (et attention avec in/out :/)
                {
                    firstOk = false;
                    _waitingCarriers.Enqueue(candidate);
                    candidate = _waitingCarriers.Dequeue();

                    yield return(new WaitForSeconds(0.1f));
                }//TODO ATTENTION: la boucle ci-dessus veut dire que si le joueur fait n'importe quoi et coupe des chemins partout, la taille de la file va augmenter alors que des transporteurs y restent coincés!!!! Du coup, au moins mettre un genre de message d'erreur pourrait être sympa.==> TODO attention aussi au cas des destruction: que deviennent les carriers qui devaient aller à un bâtiment qui n'existe plus ? Comparer avec null pour vérifier que pas détruits ??? OK sur les children ?

                if (firstOk || firstCandidate != candidate)//Donc, on a trouvé un transporteur à envoyer
                {
                    candidate.transform.position = new Vector3(road.transform.position.x, road.transform.position.y, candidate.transform.position.z);
                    MoveManager candidateMoveManager = candidate.GetComponent <MoveManager>();
                    candidateMoveManager.orientation = Orientation.SOUTH;//TODO orientation
                    candidate.GetComponent <RoadRouteManager>().occupiedRoad = road;
                    road.roadLock.LockFor(candidateMoveManager.orientation, candidate.gameObject);
                    candidate.GetComponent <Collider2D>().enabled = true;
                    candidate.GetComponent <RoadRouteManager>().MoveTo(candidate.destination.freightAreaData.freightAreaIn.road);
                }
            }

            yield return(new WaitForSeconds(0.5f));
        }
    }
    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;
    }
Esempio n. 4
0
 public virtual void CancelKeptAside(ResourceCarrier carrier)
 {
     if (_keptAsideOrders.ContainsKey(carrier))
     {
         _keptAsideOrders.Remove(carrier);
     }
 }
Esempio n. 5
0
    /**
     * Envoie un transporteur (généré AVANT l'appel à la méthode) vers destination,
     * avec pour orientation de départ orientation et pour chargement shipment.
     **/
    public void SendCarrier(ResourceCarrier toSend, BuildingStock destination, string orientation, ResourceShipment shipment)
    {//TODO: la nouvelle version de ceci, qui enqueue sur la FreightAreaOut, permet de faire moins de vérifications avant l'appel de cette méthode=> il y a sans doute des trucs à simplifier ailleurs dans le code.
        toSend.shipment    = shipment;
        toSend.origin      = parentStock;
        toSend.destination = destination;
        toSend.GetComponent <MoveManager>().orientation = orientation;//TODO orientation: faire en sorte que les appels à cette méthode donnent bien tous la bonne orientation pour sortir de FAout

        freightAreaOut.EnqueueCarrierToSend(toSend);
    }
Esempio n. 6
0
    /**
     * Instantie un nouveau transporteur sur la freightAreaOut en désactivant
     * son collider, avec un chargement à null.
     **/
    public ResourceCarrier InstantiateCarrierWithoutCollider()
    {
        ResourceCarrier newCarrier = ((GameObject)Instantiate(carrierPrefab.gameObject, freightAreaOut.transform.position, Quaternion.identity)).GetComponent <ResourceCarrier>(); //TODO voir si changer la coordonnée z de l'objet n'est pas nécessaure pour qu'il n'apparaisse pas DERRIERE la rue ( à mon avis, si)

        newCarrier.GetComponent <Collider2D>().enabled = false;                                                                                                                    //On annule le collider pour l'instantiation uniquement (plus défensif), c'est la FreighAreaIn qui le réactivera
        _availableCarriers--;

        return(newCarrier);
    }
    protected override void OnFreightAreaEntered(Collider2D other)
    {
        ResourceCarrier carrier = other.GetComponent <ResourceCarrier>();

        if (carrier != null && carrier.collectingResources && carrier.destination == freightAreaData.parentStock)
        {
            StartCoroutine(DeliveryCoroutine(carrier));
        }
    }
Esempio n. 8
0
    /**
     * Ajoute au stock associé le chargement du transporteur passé en paramètre et
     * renvoie ensuite celui-ci à son point d'origine (en lui retirant bien entendu
     * son chargement).
     **/
    public void AddShipmentToStockAndSendBack(ResourceCarrier carrier)
    {
        if (carrier.shipment != null)
        {
            parentStock.AddToStock(carrier.shipment);
            carrier.shipment = null;
        }

        SendBack(carrier);
    }
Esempio n. 9
0
    public virtual int MakeKeepAsideOrder(string resourceName, int orderedAmount, ResourceCarrier recipient)
    {
        int availableStock = stock.StockFor(resourceName) - OrderedAmountFor(resourceName);
        int ordered        = Math.Min(availableStock, orderedAmount);

        if (ordered > 0)
        {
            _keptAsideOrders[recipient] = new ResourceOrder(new ResourceShipment(resourceName, ordered), recipient.origin);
        }

        return(ordered);
    }
Esempio n. 10
0
    public ResourceShipment DeliverKeptAside(ResourceCarrier carrier)
    {
        ResourceOrder order = null;

        if (_keptAsideOrders.TryGetValue(carrier, out order))
        {
            _keptAsideOrders.Remove(carrier);
            return(order.shipment);
        }

        return(null);
    }
Esempio n. 11
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);
        }
    }
    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);
    }
Esempio n. 13
0
    /**
     * Ajoute au stock associé le chargement du transporteur passé en paramètre
     * (qui se trouve dans la FreightAreaIn ) et
     * détruit ensuite celui-ci.
     **/
    public void AddShipmentToStockAndDestroy(ResourceCarrier carrier)
    {
        if (carrier.shipment != null)
        {
            parentStock.AddToStock(carrier.shipment);
        }

        freightAreaIn.road.roadLock.UnlockFor(carrier.GetComponent <MoveManager>().orientation, carrier.gameObject);

        GameManager.instance.DestroyGameObject(carrier.gameObject);
        treatedColliders.Remove(carrier.GetComponent <Collider2D>());
        _availableCarriers++;
    }
Esempio n. 14
0
    private IEnumerator AgoraReservationCoroutine()
    {
        while (true)
        {
            if (inhabitantsCount > 0)
            {
                Cell <PriorityQueue <float, KeepAsideOrderManager> > cell = new Cell <PriorityQueue <float, KeepAsideOrderManager> >();
                yield return(StartCoroutine(SortAvailableKeepAsideOrderManagersByDistance(cell)));

                HashSet <string> needExcludeSet = new HashSet <string>();
                while (freightAreaData.availableCarriers > 0)
                {
                    string toOrder = HighestResourceNeed(needExcludeSet);
                    if (toOrder == null)
                    {
                        break; //Fait avec un break pour alléger un peu le code et éviter d'avoir encore des acollades partout !
                    }
                    int amountToOrder = Math.Min(freightAreaData.carrierPrefab.capacity, buildingStock.FreeSpaceFor(toOrder) + TotalOrderToPick(toOrder));

                    bool ordered = false;

                    if (amountToOrder > 0)
                    {
                        foreach (KeepAsideOrderManager keepAsideManager in cell.value)
                        {
                            if (amountToOrder > 0 && keepAsideManager != null && keepAsideManager.CanMakeKeepAsideOrder(toOrder))
                            {
                                ResourceCarrier carrier = freightAreaData.InstantiateCarrierWithoutCollider();
                                carrier.collectingResources = true;
                                int orderedAmount = keepAsideManager.MakeKeepAsideOrder(toOrder, amountToOrder, carrier);
                                RegisterOrderToPick(carrier, toOrder, orderedAmount);
                                freightAreaData.SendCarrier(carrier, keepAsideManager.freightAreaData.parentStock, Orientation.SOUTH, null);//TODO orientation
                                ordered = true;
                                break;
                            }
                        }
                    }

                    if (!ordered) //S'il n'a pas été commandé, c'est que personne ne peut le fournir en ce moment ou que le stock est plein. On se concentre donc sur les autres besoins
                    {
                        needExcludeSet.Add(toOrder);
                    }

                    yield return(new WaitForSeconds(1.0f));
                }
            }

            yield return(new WaitForSeconds(1.0f));//TODO du random et un délais plus grand ici? Dépend de la déévolution et de sa vitesse !
        }
    }
Esempio n. 15
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);
            }
        }
    }
Esempio n. 16
0
    public void EnqueueCarrierToSend(ResourceCarrier carrier)//pré= le carrier ne doit PAS être en cours de mouvement.
    {
        MoveManager moveManager = carrier.GetComponent <MoveManager>();

        RoadData occupiedRoad = carrier.GetComponent <RoadRouteManager>().occupiedRoad;

        if (occupiedRoad != null) //Elle vaudra null si c'est un nouveau carrier qui démarre seulement
        {
            occupiedRoad.roadLock.UnlockFor(moveManager.orientation, carrier.gameObject);
        }

        if (carrier.destination != null)//Si la destination vaut null, c'est qu'elle a été détruite
        {
            carrier.GetComponent <Collider2D>().enabled = false;
            _waitingCarriers.Enqueue(carrier);
        }
        else
        {
            GameManager.instance.DestroyGameObject(carrier.gameObject);
        }
    }
Esempio n. 17
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);
    }
Esempio n. 18
0
    protected override void OnFreightAreaEntered(Collider2D other)
    {
        ResourceCarrier carrier = other.GetComponent <ResourceCarrier>();

        if (carrier != null && carrier.destination == freightAreaData.parentStock)
        {
            if (carrier.collectingResources)
            {
                if (carrier.shipment != null)
                {
                    freightAreaData.GetComponent <Home>().CancelOrderToPick(carrier);
                }

                freightAreaData.AddShipmentToStockAndDestroy(carrier);
            }
            else
            {
                freightAreaData.treatedColliders.Remove(other);
                freightAreaIn.road.roadLock.UnlockFor(carrier.GetComponent <MoveManager>().orientation, carrier.gameObject);
                GameManager.instance.DestroyGameObject(other.gameObject);
            }
        }
    }
    protected override void OnFreightAreaEntered(Collider2D other)
    {
        ResourceCarrier carrier = other.GetComponent <ResourceCarrier>();

        if (carrier != null && !carrier.collectingResources && carrier.destination == freightAreaData.parentStock)
        {
            if (carrier.origin != freightAreaData.parentStock)
            {
                if (freightAreaData.parentStock.stockLock.AvailableFor(carrier.shipment))
                {
                    freightAreaData.AddShipmentToStockAndSendBack(carrier);
                }
                else
                {
                    carrier.OnShipmentRefused();
                }
            }
            else
            {
                freightAreaData.AddShipmentToStockAndDestroy(carrier);
            }
        }
    }
Esempio n. 20
0
 public void CancelOrderToPick(ResourceCarrier deliveringCarrier)
 {
     _ordersToPick.Remove(deliveringCarrier);
 }
Esempio n. 21
0
    /**
     * Renvoie un transporteur en lui assignant un chargement.
     **/
    public void SendBack(ResourceCarrier carrier, ResourceShipment shipment)
    {
        carrier.shipment = shipment;

        SendBack(carrier);
    }
Esempio n. 22
0
 private void RegisterOrderToPick(ResourceCarrier carrier, string resource, int amount)
 {
     _ordersToPick[carrier] = new ResourceShipment(resource, amount);
 }
Esempio n. 23
0
    /**
     * Envoie un nouveau transporteur vers destination, avec pour orientation de
     * départ orientation et pour chargement shipment.
     **/
    public void SendCarrier(BuildingStock destination, string orientation, ResourceShipment shipment)
    {//TODO: la nouvelle version de ceci, qui enqueue sur la FreightAreaOut, permet de faire moins de vérifications avant l'appel de cette méthode=> il y a sans doute des trucs à simplifier ailleurs dans le code.
        ResourceCarrier newCarrier = InstantiateCarrierWithoutCollider();

        SendCarrier(newCarrier, destination, orientation, shipment);
    }