public static void Stockpile_UpdateAction(InstalledObject obj, float deltaTime)
    {
        if (obj.Tile.LooseObject != null && obj.Tile.LooseObject.StackSize >= obj.Tile.LooseObject.MaxStackSize)
        {
            obj.ClearJobs();
            return;
        }


        if (obj.JobCount() > 0)
        {
            return;
        }

        if (obj.Tile.LooseObject != null && obj.Tile.LooseObject.StackSize == 0)
        {
            Debug.LogError("Stockpile has a zero-size stack!");
            obj.ClearJobs();
            return;
        }

        LooseObject[] requiredItems;

        if (obj.Tile.LooseObject == null)
        {
            requiredItems = Stockpile_GetItemsFromFilter();
        }
        else
        {
            LooseObject desiredLooseObject = obj.Tile.LooseObject.Clone();
            desiredLooseObject.MaxStackSize -= desiredLooseObject.StackSize;
            desiredLooseObject.StackSize     = 0;

            requiredItems = new LooseObject[] { desiredLooseObject };
        }

        Job job = new Job(obj.Tile, null, null, 0, requiredItems);

        job.CanFetchFromStockpile = false;

        job.RegisterJobProgressedCallback(Stockpile_JobProgressed);
        obj.AddJob(job);
    }
Beispiel #2
0
    public static void Stockpile_UpdateAction(InstalledObject installedObject, float deltaTime)
    {
        /// Ensure that there is a job in the queue asking for either:
        ///     (if this.stockpile empty): That ANY material/items/looseObjects can be brought to us.
        ///     (if this.stockpile contains something already): If there is still room for more, bring it to this.stockpile

        // TODO: This function doesn't need to run each update.
        // Instead it only needs to run when:
        //      - It gets created
        //      - A good get delivered (at which point we reset the job)
        //      - A good gets picked up (at which point we reset the job)
        //      - The UI's filter of allowed items gets changed/updated

        // Stockpile is full
        if (installedObject.Tile.LooseObject != null && installedObject.Tile.LooseObject.StackSize >= installedObject.Tile.LooseObject.maxStackSize)
        {
            installedObject.ClearJobs();
            return;
        }

        // Maybe we already have a job queued up? In which case we're good to go
        if (installedObject.JobCount() > 0)
        {
            return;
        }

        // We're not full, but we don't have a job either
        /// Two possibilities: Either we have SOME inventory OR we have NO inventory

        // Check if there is an empty stockpile => should NOT happen
        if (installedObject.Tile.LooseObject != null && installedObject.Tile.LooseObject.StackSize == 0)
        {
            Debug.LogError("Stockpile has a 0 sized stack!");
            installedObject.ClearJobs();
            return;
        }

        // TODO: In the future stockpiles => rather than being a bunch of individual 1x1 tiles, should create one large single object.

        // Temp array of items that are required for the new job
        LooseObject[] requiredItems;

        // Stockpile is empty => ask/accept ANYTHING
        if (installedObject.Tile.LooseObject == null)
        {
            requiredItems = Stockpile_GetItemsFromFilter();
        }

        // There is already a stack that isn't full yet => add more stuff
        else
        {
            // Is there already a job => if so return
            if (installedObject.JobCount() > 0)
            {
                return;
            }

            LooseObject desiredLooseObject = installedObject.Tile.LooseObject.Clone();
            desiredLooseObject.maxStackSize -= desiredLooseObject.StackSize;
            desiredLooseObject.StackSize     = 0;

            requiredItems = new LooseObject[] { desiredLooseObject };
        }

        // Create the new job with requiredItems
        Job job = new Job(
            installedObject.Tile,
            null,
            null,
            0,
            requiredItems
            );

        // TODO: Later on, add stockpile priorities, so that we can take from a lower priority for a higher one.
        job.canTakeFromStockpile = false;

        // Register callback and add job
        job.RegisterJobProgressedCallback(Stockpile_JobProgressed);
        installedObject.AddJob(job);
    }