/** * Renvoie un transporteur à son point d'origine. **/ public void SendBack(ResourceCarrier carrier) { carrier.destination = carrier.origin; carrier.GetComponent <Collider2D>().enabled = false; freightAreaOut.EnqueueCarrierToSend(carrier); }
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; }
public virtual void CancelKeptAside(ResourceCarrier carrier) { if (_keptAsideOrders.ContainsKey(carrier)) { _keptAsideOrders.Remove(carrier); } }
/** * 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); }
/** * 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)); } }
/** * 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); }
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); }
public ResourceShipment DeliverKeptAside(ResourceCarrier carrier) { ResourceOrder order = null; if (_keptAsideOrders.TryGetValue(carrier, out order)) { _keptAsideOrders.Remove(carrier); return(order.shipment); } return(null); }
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); }
/** * 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++; }
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 ! } }
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); } } }
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); } }
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); }
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); } } }
public void CancelOrderToPick(ResourceCarrier deliveringCarrier) { _ordersToPick.Remove(deliveringCarrier); }
/** * Renvoie un transporteur en lui assignant un chargement. **/ public void SendBack(ResourceCarrier carrier, ResourceShipment shipment) { carrier.shipment = shipment; SendBack(carrier); }
private void RegisterOrderToPick(ResourceCarrier carrier, string resource, int amount) { _ordersToPick[carrier] = new ResourceShipment(resource, amount); }
/** * 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); }