public virtual Task ActOnIdle() { if (GatherManager.VoxelOrders.Count == 0 && (GatherManager.StockOrders.Count == 0 || !Faction.HasFreeStockpile())) { // This is what to do when the unit has not been given any explicit orders. List <Room> rooms = Faction.GetRooms(); // Find a room to train in if (Stats.CurrentClass.HasAction(GameMaster.ToolMode.Attack) && MathFunctions.RandEvent(0.01f)) { Body closestTraining = Faction.FindNearestItemWithTags("Train", Position, true); if (closestTraining != null) { return(new ActWrapperTask(new GoTrainAct(this))); } } // Otherwise, try to find a chair to sit in if (IdleTimer.HasTriggered && MathFunctions.RandEvent(0.25f)) { return(new ActWrapperTask(new GoToChairAndSitAct(this)) { Priority = Task.PriorityType.Eventually, AutoRetry = false }); } return(new ActWrapperTask(new WanderAct(this, 2, 1.0f + MathFunctions.Rand(-0.5f, 0.5f), 1.0f)) { Priority = Task.PriorityType.Eventually }); } // If we have no more build orders, look for gather orders else if (GatherManager.VoxelOrders.Count == 0) { GatherManager.StockOrder order = GatherManager.StockOrders[0]; GatherManager.StockOrders.RemoveAt(0); return(new ActWrapperTask(new StockResourceAct(this, order.Resource)) { Priority = Task.PriorityType.Low }); } // Otherwise handle build orders. else { List <Voxel> voxels = new List <Voxel>(); List <VoxelType> types = new List <VoxelType>(); foreach (GatherManager.BuildVoxelOrder order in GatherManager.VoxelOrders) { voxels.Add(order.Voxel); types.Add(order.Type); } GatherManager.VoxelOrders.Clear(); return(new ActWrapperTask(new BuildVoxelsAct(this, voxels, types)) { Priority = Task.PriorityType.Low, AutoRetry = true }); } }
public bool IsValid(CraftDesignation designation) { if (!designation.Valid) { return(false); } if (IsDesignation(designation.Location)) { World.ShowToolPopup("Something is already being built there!"); return(false); } if (!String.IsNullOrEmpty(designation.ItemType.CraftLocation) && Faction.FindNearestItemWithTags(designation.ItemType.CraftLocation, designation.Location.WorldPosition, false) == null) { World.ShowToolPopup("Can't build, need " + designation.ItemType.CraftLocation); return(false); } if (!Faction.HasResources(designation.ItemType.RequiredResources)) { string neededResources = ""; foreach (Quantitiy <Resource.ResourceTags> amount in designation.ItemType.RequiredResources) { neededResources += "" + amount.NumResources + " " + amount.ResourceType.ToString() + " "; } World.ShowToolPopup("Not enough resources! Need " + neededResources + "."); return(false); } foreach (var req in designation.ItemType.Prerequisites) { switch (req) { case CraftItem.CraftPrereq.NearWall: { var neighborFound = VoxelHelpers.EnumerateManhattanNeighbors2D(designation.Location.Coordinate) .Select(c => new VoxelHandle(World.ChunkManager.ChunkData, c)) .Any(v => v.IsValid && !v.IsEmpty); if (!neighborFound) { World.ShowToolPopup("Must be built next to wall!"); return(false); } break; } case CraftItem.CraftPrereq.OnGround: { var below = VoxelHelpers.GetNeighbor(designation.Location, new GlobalVoxelOffset(0, -1, 0)); if (!below.IsValid || below.IsEmpty) { World.ShowToolPopup("Must be built on solid ground!"); return(false); } break; } } } if (CurrentCraftBody != null) { var intersectsAnyOther = Faction.OwnedObjects.FirstOrDefault( o => o != null && o != CurrentCraftBody && o.GetRotatedBoundingBox().Intersects(CurrentCraftBody.GetRotatedBoundingBox().Expand(-0.1f))); var intersectsBuildObjects = Faction.Designations.EnumerateEntityDesignations(DesignationType.Craft) .Any(d => d.Body != CurrentCraftBody && d.Body.GetRotatedBoundingBox().Intersects( CurrentCraftBody.GetRotatedBoundingBox().Expand(-0.1f))); bool intersectsWall = VoxelHelpers.EnumerateCoordinatesInBoundingBox (CurrentCraftBody.GetRotatedBoundingBox().Expand(-0.1f)).Any( v => { var tvh = new VoxelHandle(World.ChunkManager.ChunkData, v); return(tvh.IsValid && !tvh.IsEmpty); }); if (intersectsAnyOther != null) { World.ShowToolPopup("Can't build here: intersects " + intersectsAnyOther.Name); } else if (intersectsBuildObjects) { World.ShowToolPopup("Can't build here: intersects something else being built"); } else if (intersectsWall && !designation.ItemType.Prerequisites.Contains(CraftItem.CraftPrereq.NearWall)) { World.ShowToolPopup("Can't build here: intersects wall."); } return(intersectsAnyOther == null && !intersectsBuildObjects && (!intersectsWall || designation.ItemType.Prerequisites.Contains(CraftItem.CraftPrereq.NearWall))); } return(true); }