/**
     * Déclenche (via une coroutine) le mouvement du transporteur vers la maison la
     * plus proche (sur le réseau routier), où il sera détruit (utile pour se
     * débarrasser des transporteurs dont le bâtiment principal est détruit).
     * Le stock sera alors perdu. Si aucune maison n'est disponible, le
     * transporteur ne bouge pas, et la coroutine va continuer d'attendre une
     * maison vers laquelle se rendre.
     **/
    private IEnumerator GoHome()
    {
        RoadRouteManager roadRouteManager = GetComponent <RoadRouteManager>();

        while (true)
        {
            //TODO utiliser un findNearestObjectWithPath (Utils) pour être plus générique.
            GameObject[] homesArray = GameObject.FindGameObjectsWithTag("Home");

            float         minDistance   = 0.0f;
            FreightAreaIn nearestHomeIn = null;
            foreach (GameObject home in homesArray)
            {
                FreightAreaIn homeIn = home.GetComponent <BuildingStock>().freightAreaData.freightAreaIn;

                float distance = RoadsPathfinding.RealDistanceBetween(homeIn.road, roadRouteManager.occupiedRoad);
                if (distance > 0.0f && (nearestHomeIn == null || minDistance > distance))
                {
                    minDistance   = distance;
                    nearestHomeIn = homeIn;
                }
                yield return(null);
            }

            if (nearestHomeIn != null)//Sinon, c'est qu'il n'y a AUCUNE maison satisfaisante, et la boucle principale se charge de relancer la recherche
            {
                destination = nearestHomeIn.GetComponentInParent <BuildingStock>();
                roadRouteManager.MoveTo(destination.freightAreaData.freightAreaIn.road, Random.Range(0.5f, 3.0f), null);
                yield break;
            }

            yield return(null);
        }
    }
    private IEnumerator RedirectAfterShipmentRefusal(HashSet <FreightAreaIn> toIgnore)
    {
        FreightAreaIn bestWarehouse = null;

        for (int i = 0; i < 3 && bestWarehouse == null; i++) //TODO possibilité d'un peu de random sur ce 3, arbitraire
        {
            if (i > 0)
            {
                yield return(new WaitForSeconds(Random.Range(0.5f, 3.0f - i)));
            }
            Cell <FreightAreaIn> coroutineRslt = new Cell <FreightAreaIn>();
            RoadData             occupiedRoad  = GetComponent <RoadRouteManager>().occupiedRoad;

            yield return(StartCoroutine(occupiedRoad.FindNearestFreeWarehouseFor(shipment, coroutineRslt, toIgnore)));

            bestWarehouse = coroutineRslt.value;
        }

        RoadRouteManager routeManager = GetComponent <RoadRouteManager>();

        if (bestWarehouse != null)
        {
            routeManager.MoveTo(bestWarehouse.road);
            destination = bestWarehouse.GetComponentInParent <BuildingStock>();
        }
        else
        {
            destination = origin;
            routeManager.MoveTo(destination.freightAreaData.freightAreaIn.road);
        }

        yield return(null);
    }
Example #3
0
    protected void Awake()
    {
        _stock = GetComponent <BuildingStock>();

        foreach (string resourceRef in CityBuilderResources.ALL_RESOURCES)
        {
            resourcesStockLimit[resourceRef] = totalStockLimit;
        }
    }
Example #4
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);
    }
Example #5
0
    protected virtual void Awake()
    {
        _currentStock         = GetComponent <BuildingStock>();
        _consumptionCountDown = consumptionRate;

        foreach (ResourceShipment requirement in requirements)
        {
            int bufferSubSum = requirement.amount * requirementsBufferSize;
            _resourcesToOrder[requirement.resourceName] = bufferSubSum;
            _currentStock.stockLock.totalStockLimit    += bufferSubSum;
            _currentStock.stockLock.SetLimitFor(requirement.resourceName, bufferSubSum);
        }
    }
Example #6
0
    /**
     * Effectue une tentative de commande dans ce bâtiment pour la ressource resourceName,
     * dans la quantité orderedAmount, à livrer à deliveryPlace.
     *
     * Cette méthode retoune la quantité qui a pu être commandée au bâtiment, qui
     * vaudra donc 0 si rien n'a été commandé.
     * On a donc 0 <= orderedAmmount <= valeur de retour.
     **/
    public virtual int Order(string resourceName, int orderedAmount, BuildingStock deliveryPlace)
    {
        int ordered         = 0;
        int availableStock  = stock.StockFor(resourceName) - OrderedAmountFor(resourceName);
        int carrierCapacity = freightAreaData.carrierCapacity;

        while (!unOrderableResources.Contains(resourceName) && maxOrderedAmount >= _totalOrderedAmount && availableStock > 0 && ordered != orderedAmount)
        {
            int newOrder = Math.Min(Math.Min(availableStock, carrierCapacity), orderedAmount - ordered);
            ordered             += newOrder;
            availableStock      -= newOrder;
            _totalOrderedAmount += newOrder;
            _orders.Enqueue(new ResourceOrder(new ResourceShipment(resourceName, newOrder), deliveryPlace));
        }

        return(ordered);
    }
    public override int Order(string resourceName, int orderedAmount, BuildingStock deliveryPlace)
    {
        int leftToOrder = orderedAmount;
        IEnumerator <AgoraMerchant> merchantsEnumerator = _agora.MerchantsEnumerator();

        while (merchantsEnumerator.MoveNext())
        {
            AgoraMerchant merchant = merchantsEnumerator.Current;
            leftToOrder -= merchant.orderManager.Order(resourceName, leftToOrder, deliveryPlace);

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

        return(orderedAmount - leftToOrder);
    }
    public void CollectingResourceCarrierStuck(RetryData retryData)//ATTENTION: RetryData peut valoir null (si on essaie de se rendre à qqch de détruit)
    {
        RoadRouteManager routeManager = GetComponent <RoadRouteManager>();

        if (destination == null && origin == null) //bâtiment de destination détruit, et l'origine est détruite
        {
            collectingResources = false;           //Pour être sûr de ne pas refiler les ressources à l'autre maison et faire ainsi confusion avec son/ses transporteur(s)
            StartCoroutine(GoHome());              //On part se faire éliminer dans la maison la plus proche.
        }
        else//Dans tous les autre cas, on retourne à l'origine (soit on s'obstine, soit on fait demi-tour)
        {
            if (destination != origin && destination != null)
            {
                destination.GetComponent <KeepAsideOrderManager>().CancelKeptAside(this);
            }

            destination = origin;
            routeManager.MoveTo(destination.freightAreaData.freightAreaIn.road);
        }
    }
Example #9
0
    protected void Awake()
    {
        /*
         * Les conditions sur l'assignation des freightArea permet de les setter à des
         * objets définis dans un autre Awake s'exécutant avant celui-ci (ce qui peut
         * être très utile pour les marchands d'agora, afin d'éviter les problèmes si,
         * comme dans le test, ils sont déjà présents dans le préfab instancié).
         */
        if (freightAreaIn == null)
        {
            freightAreaIn = GetComponentInChildren <FreightAreaIn>();
        }

        if (freightAreaOut == null)
        {
            freightAreaOut = GetComponentInChildren <FreightAreaOut>();
        }

        _availableCarriers = carriersNber;
        parentStock        = GetComponent <BuildingStock>();
    }
Example #10
0
    public void DeliveringResourceCarrierStuck(RetryData retryData)//ATTENTION: RetryData peut valoir null (si on essaie de se rendre à qqch de détruit)
    {
        RoadRouteManager roadRouteManager = GetComponent <RoadRouteManager>();

        if (destination != null)//destination peut valoir null si le bâtiment a été détruit
        {
            ResourceConsumer consumer = destination.freightAreaData.parentStock.GetComponent <ResourceConsumer>();

            if (shipment != null && consumer != null && origin.freightAreaData.freightAreaIn != destination)//Donc: si le transporteur est en livraison vers un ResourceConsumer et qu'il n'est pas déjà en cours de mouvement d'annulation de livraison
            {
                consumer.CancelResourceOrder(shipment);
            }
        }

        if (origin != null)
        {
            destination = origin;
            roadRouteManager.MoveTo(destination.freightAreaData.freightAreaIn.road, Random.Range(0.5f, 3.0f), null);
        }
        else
        {
            StartCoroutine(GoHome());
        }
    }
Example #11
0
 protected void Awake()
 {
     stock           = GetComponent <BuildingStock>();
     freightAreaData = GetComponent <FreightAreaData>();
 }
Example #12
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);
    }
Example #13
0
 public ResourceOrder(ResourceShipment shipment, BuildingStock deliveryPlace)
 {
     this.shipment      = shipment;
     this.deliveryPlace = deliveryPlace;
 }
Example #14
0
 protected void Awake()
 {
     placementData   = GetComponent <PlacementData>();
     buildingStock   = GetComponent <BuildingStock>();
     freightAreaData = GetComponent <FreightAreaData>();
 }