Пример #1
0
    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));
    }
Пример #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));
        }
    }
Пример #3
0
    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);
    }
Пример #4
0
    /**
     * 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));
        }
    }