private IEnumerable <Task> GetTasks(Order order) { yield return(new TaskLambda(game, "add handle", (work) => { if (activeWork != null) { return false; } activeWork = work; return true; })); while (order.hauls.HasAvailableHauls(out var haul)) { foreach (var task in haul.GetHaulTasks()) { yield return(task); } } if (order.hauls.HasAllMaterials()) { // TODO: clear bench of debris yield return(new TaskGoTo(game, $"Walking to {bench.def.name}.", PathCfg.Point(bench.workSpot))); yield return(new TaskTimedLambda( game, order.recipe.description, MinionAnim.Idle, Tool.None, order.progress, TaskTimed.FaceArea(bench.bounds), _ => 1, // TODO: workspeed (task, amt) => { if (order.amtOrdered <= 0) { return false; } order.progress = amt; return true; }, (task) => { BB.Assert(order.amtOrdered > 0); order.amtOrdered -= 1; order.progress = order.recipe.workAmt; order.hauls.RemoveStored(); game.DropItems(bench.tile, order.recipe.product); })); } yield return(new TaskLambda(game, "rem handle", (work) => { BB.Assert(activeWork == work); activeWork = null; return true; })); }
private IEnumerable <Task> GetClearDebrisTasks() { const string desc = "Hauling debris from build site."; while (HasDebris()) { foreach (var pos in building.bounds.allPositionsWithin) { var tile = game.Tile(pos); if (tile.hasItems) { yield return(Capture(game.ClaimItem(tile), out var claim)); yield return(new TaskGoTo(game, desc, PathCfg.Point(pos))); yield return(new TaskPickupItem(claim)); yield return(new TaskGoTo(game, desc, new PathCfg( pt => !area.Contains(pt) && !game.Tile(pt).hasItems, pt => Vec2.Distance(pt, area.center)))); yield return(new TaskLambda(game, "drop item", (work) => { BB.Assert(work.agent.carryingItem); Item item = work.agent.RemoveItem(); game.DropItems( game.Tile(work.agent.pos), item.info.Enumerate()); item.Destroy(); return true; })); } } } }
private IEnumerable <Task> WanderTasks(Vec2I pos) { yield return(new TaskGoTo(game, "Wandering.", PathCfg.Point(pos))); yield return(new TaskWaitDuration(game, "Wandering.", 1f)); }
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; })); }