示例#1
0
    public void ConnectFreightTo(Agora agora)
    {
        FreightAreaData      agoraFreight          = agora.GetComponent <FreightAreaData>();
        FreightAreaIn        agoraAreaIn           = agoraFreight.freightAreaIn;
        FreightAreaOut       agoraAreaOut          = agoraFreight.freightAreaOut;
        HashSet <Collider2D> agoraTreatedColliders = agoraFreight.treatedColliders;

        FreightAreaData freightData = GetComponent <FreightAreaData>();

        freightData.freightAreaIn    = agoraAreaIn;
        freightData.freightAreaOut   = agoraAreaOut;
        freightData.treatedColliders = agoraTreatedColliders;
    }
示例#2
0
    private IEnumerator ManageWarehouseDispatching()
    {
        FreightAreaData freightData    = _currentStock.freightAreaData;
        RoadLock        freightOutLock = freightData.freightAreaOut.road.roadLock;

        while (true)
        {
            if (!orderManager.SendOrderIfPossible() && _warehouseOrders.Count <= WAREHOUSE_ORDERS_LIMIT) //L'appel à la méthode envoie une commande si elle retourne true, d'où l'aspect un peu étrange de la condition
            {
                foreach (ResourceShipment productionShipment in production)                              //TODO: si on produit plusieurs ressources et qu'on veut définir l'ordre dans lequel elles partent, c'est ici
                {
                    int resourceStock = _currentStock.StockFor(productionShipment.resourceName);

                    for (int i = 0; i < freightData.availableCarriers && resourceStock > 0; i++)
                    {
                        int amountToShip            = Math.Min(freightData.carrierPrefab.capacity, resourceStock);
                        ResourceShipment     toShip = new ResourceShipment(productionShipment.resourceName, amountToShip);
                        Cell <FreightAreaIn> nestedCoroutineReturnHelper = new Cell <FreightAreaIn>();

                        yield return(StartCoroutine(freightData.freightAreaOut.road.FindNearestFreeWarehouseFor(toShip, nestedCoroutineReturnHelper, new HashSet <FreightAreaIn>())));

                        FreightAreaIn nearestFreeWarehouse = nestedCoroutineReturnHelper.value;

                        if (nearestFreeWarehouse != null)
                        {
                            while (!freightOutLock.IsFree(Orientation.SOUTH))//TODO orientation
                            {
                                yield return(new WaitForSeconds(0.2f));
                            }

                            _warehouseOrders.Enqueue(new ResourceOrder(new ResourceShipment(productionShipment.resourceName, amountToShip), nearestFreeWarehouse.GetComponentInParent <BuildingStock>()));
                        }

                        resourceStock = _currentStock.StockFor(productionShipment.resourceName);
                    }
                }
            }

            yield return(new WaitForSeconds(0.5f));
        }
    }
示例#3
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));
        }
    }
示例#4
0
    protected override bool RequirementsMet()
    {
        if (!base.RequirementsMet())
        {
            return(false);
        }

        foreach (ResourceShipment shipment in production)
        {
            if (!_currentStock.stockLock.AvailableFor(shipment))
            {
                return(false);
            }
        }

        FreightAreaData freightData     = _currentStock.freightAreaData;
        int             carrierCapacity = freightData.carrierCapacity;

        return((_currentStock.totalStock
                + (freightData.carriersNber) * carrierCapacity
                - (freightData.availableCarriers) * carrierCapacity)
               <= _currentStock.stockLock.totalStockLimit);
    }
示例#5
0
 protected void Awake()
 {
     stockLock       = GetComponent <StockLock>();
     freightAreaData = GetComponent <FreightAreaData>();
 }
 protected void Awake()
 {
     freightAreaData = GetComponent <FreightAreaData>();
 }
示例#7
0
 protected void Awake()
 {
     placementData   = GetComponent <PlacementData>();
     buildingStock   = GetComponent <BuildingStock>();
     freightAreaData = GetComponent <FreightAreaData>();
 }