// 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); });
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; })); }
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; })); }