Example #1
0
        // TODO: this is a bit awkward since it might prioritize bigger
        // than necessary stacks farther away when amt < cfg.amt
        public TaskClaimItem TaskClaim(int amt)
        => new TaskClaimItem(game,
                             (work) =>
        {
            if (queue.Count == 0)
            {
                return(null);
            }

            TileItem item = queue.First;
            if (item.amtAvailable > 0)
            {
                return(ItemClaim.MakeClaim(game, item, HaulAmt(item, amt)));
            }

            return(null);
        });
Example #2
0
        public TaskClaimItem ClaimItem(Tile tile)
        {
            BB.AssertNotNull(tile);
            return(new TaskClaimItem(this,
                                     (work) =>
            {
                if (!tile.hasItems)
                {
                    return null;
                }

                TileItem item = map.GetItem(tile);
                if (item.amtAvailable > 0)     // TODO: account for carrying capacity
                {
                    return ItemClaim.MakeClaim(this, item, item.amtAvailable);
                }

                return null;
            }));
        }
Example #3
0
        public IEnumerable <Task> GetHaulTasks()
        {
            var itemClaim = query.TaskClaim(haulRemaining);

            yield return(itemClaim);

            var haulClaim = new TaskClaim(game,
                                          (work) => {
                BB.AssertNotNull(itemClaim.claim);
                ItemClaim item = itemClaim.claim;
                if (item.amt > haulRemaining)
                {
                    return(null);
                }

                amtClaimed += item.amt;
                return(new ClaimLambda(() => amtClaimed -= item.amt));
            });

            yield return(haulClaim);

            yield return(new TaskGoTo(game, taskDesc, PathCfg.Point(itemClaim.claim.pos)));

            yield return(new TaskPickupItem(itemClaim));

            yield return(new TaskGoTo(game, taskDesc, dst));

            yield return(new TaskLambda(game, "dropoff item",
                                        (work) =>
            {
                if (!work.agent.carryingItem)
                {
                    return false;
                }

                work.Unclaim(haulClaim);

                Item item = work.agent.RemoveItem();

                // Should never happen
                int haulAmt = itemClaim.claim.amt;
                if (haulAmt > haulRemaining)
                {
                    haulAmt = haulRemaining;
                }

                if (item.info.amt > haulAmt)
                {
                    game.DropItems(
                        game.Tile(work.agent.pos),
                        item.info.WithAmount(item.info.amt - haulAmt).Enumerate());
                }
                // Also should never happen
                else if (item.info.amt < haulAmt)
                {
                    haulAmt = item.info.amt;
                }

                item.Destroy();

                amtStored += haulAmt;
                return true;
            }));
        }