private IEnumerator MoveToWithMultipleTries(RoadData destination, float delay, RetryData retryData) { if (delay > 0.0f) { yield return(new WaitForSeconds(delay)); } string currentOrientation = _moveManager.orientation; Stack <RoadData> moveKeyPoints = null; int tries = 0; while (moveKeyPoints == null) { if (tries > 0) { yield return(new WaitForSeconds(UnityEngine.Random.Range(0.5f, 3.0f))); } moveKeyPoints = RoadsPathfinding.RouteStar(destination, occupiedRoad, _keyPointsModulo, currentOrientation); tries++; } _moveManager.Move(FollowMoveKeyPoints(moveKeyPoints, destination, retryData)); }
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 bool SendOrderIfPossible() { FreightAreaOut freightOut = freightAreaData.freightAreaOut; if (freightAreaData.availableCarriers > 0 && OrdersToTreat() && freightOut.road.roadLock.IsFree(Orientation.SOUTH))//TODO orientation (opposée à celle du bâtiment) { ResourceOrder toTreat = NextOrder(); FreightAreaIn destinationIn = toTreat.deliveryPlace.freightAreaData.freightAreaIn; if (RoadsPathfinding.RouteStar(destinationIn.road, freightOut.road, 10, Orientation.SOUTH) != null)//TODO orientation { MarkAsTreated(toTreat); freightAreaData.SendCarrier(toTreat.deliveryPlace, Orientation.SOUTH, toTreat.shipment);//TODO orientation (opposée à celle du bâtiment) return(true); } else //Si la destination n'est pas raccordée au réseau routier, on annule sa commande et on l'en notifie { toTreat.deliveryPlace.freightAreaData.parentStock.GetComponent <ResourceConsumer>().CancelResourceOrder(toTreat.shipment); } } return(false); }
/** * Coroutine se chargeant d'envoyer tout ce qui a été produit par le bâtiment * et se trouve contenu dans son stock à l'entrepôt le plus proche capable * de l'accueillir ou à un bâtiment l'ayant commandé. Tout cela se voit bien * entendu diviser entre les transporteurs * disponibles pour le bâtiment. **/ private IEnumerator ManageProductionStorage() { FreightAreaData freightData = orderManager.freightAreaData; while (true) { if (!orderManager.SendOrderIfPossible() && !orderManager.OrdersToTreat() && _warehouseOrders.Count > 0)//L'appel à la méthode envoie une commande si elle retourne true, d'où l'aspect un peu étrange de la condition { ResourceOrder warehouseOrder = _warehouseOrders.Dequeue(); ResourceShipment orderShipment = warehouseOrder.shipment; FreightAreaIn destinationIn = warehouseOrder.deliveryPlace.freightAreaData.freightAreaIn; if (orderManager.stock.StockFor(orderShipment.resourceName) >= orderShipment.amount && RoadsPathfinding.RouteStar(destinationIn.road, freightData.freightAreaOut.road, 10, Orientation.SOUTH) != null)//TODO orientation { _currentStock.RemoveFromStock(orderShipment.resourceName, orderShipment.amount); freightData.SendCarrier(warehouseOrder.deliveryPlace, Orientation.SOUTH, orderShipment);//TODO orientation } } yield return(new WaitForSeconds(0.5f)); } }