/** * 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); }
protected void Awake() { _stock = GetComponent <BuildingStock>(); foreach (string resourceRef in CityBuilderResources.ALL_RESOURCES) { resourcesStockLimit[resourceRef] = totalStockLimit; } }
/** * 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); }
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); } }
/** * 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); } }
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>(); }
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()); } }
protected void Awake() { stock = GetComponent <BuildingStock>(); freightAreaData = GetComponent <FreightAreaData>(); }
/** * 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); }
public ResourceOrder(ResourceShipment shipment, BuildingStock deliveryPlace) { this.shipment = shipment; this.deliveryPlace = deliveryPlace; }
protected void Awake() { placementData = GetComponent <PlacementData>(); buildingStock = GetComponent <BuildingStock>(); freightAreaData = GetComponent <FreightAreaData>(); }