public BuildRoomAct(CreatureAI agent, BuildZoneOrder buildRoom) : base(agent) { Name = "Build BuildRoom " + buildRoom.ToString(); Resources = buildRoom.ListRequiredResources(); BuildRoom = buildRoom; if (BuildRoom.ResourcesReservedFor != null && BuildRoom.ResourcesReservedFor.IsDead) { BuildRoom.ResourcesReservedFor = null; } Tree = new Sequence(new Select(new Domain(buildRoom.MeetsBuildRequirements() || buildRoom.ResourcesReservedFor != null, true), new Domain(!buildRoom.MeetsBuildRequirements() && (buildRoom.ResourcesReservedFor == null || buildRoom.ResourcesReservedFor == Agent), new Sequence(new Wrap(Reserve), new GetResourcesAct(Agent, Resources))), new Domain(buildRoom.MeetsBuildRequirements() || buildRoom.ResourcesReservedFor != null, true)), new Domain(() => IsRoomBuildOrder(buildRoom) && !buildRoom.IsBuilt && !buildRoom.IsDestroyed && ValidResourceState(), new Sequence( SetTargetVoxelFromRoomAct(buildRoom, "ActionVoxel"), new GoToNamedVoxelAct("ActionVoxel", PlanAct.PlanType.Adjacent, Agent), new Wrap(PutResources), new Wrap(WaitForResources) { Name = "Wait for resources..." }, new Wrap(() => Creature.HitAndWait(true, () => 1.0f, () => buildRoom.BuildProgress, () => buildRoom.BuildProgress += agent.Stats.BuildSpeed / buildRoom.VoxelOrders.Count * 0.5f, () => MathFunctions.RandVector3Box(buildRoom.GetBoundingBox()), ContentPaths.Audio.Oscar.sfx_ic_dwarf_craft, () => !buildRoom.IsBuilt && !buildRoom.IsDestroyed)) { Name = "Build room.." }, new CreateRoomAct(Agent, buildRoom) , new Wrap(OnFailOrCancel))) | new Wrap(OnFailOrCancel) ); }
public IEnumerable <Status> SetTargetVoxelFromRoom(BuildZoneOrder buildRoom, string target) { if (buildRoom.VoxelOrders.Count == 0) { yield return(Status.Fail); } else { var closestVoxel = VoxelHandle.InvalidHandle; float closestDist = float.MaxValue; foreach (var order in buildRoom.VoxelOrders) { float dist = (order.Voxel.WorldPosition - Agent.Position).LengthSquared(); if (dist < closestDist) { closestDist = dist; closestVoxel = order.Voxel; } } Agent.Blackboard.SetData(target, closestVoxel); yield return(Status.Success); } }
public BuildZoneTask(BuildZoneOrder zone) { Category = TaskCategory.BuildZone; MaxAssignable = 3; Name = "Build Room " + zone.ToBuild.Type.Name + zone.ToBuild.ID; Zone = zone; Priority = TaskPriority.Medium; BoredomIncrease = GameSettings.Default.Boredom_NormalTask; EnergyDecrease = GameSettings.Default.Energy_Tiring; }
private DestroyZoneTool DestroyZoneTool; // I should probably be fired for this. public override void OnVoxelsSelected(List <VoxelHandle> voxels, InputManager.MouseButton button) { if (button == InputManager.MouseButton.Left) { foreach (BuildZoneOrder order in World.PersistentData.BuildDesignations) { order.SetTint(Color.White); } foreach (var room in World.EnumerateZones()) { room.SetTint(Color.White); } if (CurrentZoneType == null) { return; } if (button == InputManager.MouseButton.Left) { if (CurrentZoneType.CanBuildHere(voxels, World)) { if (Library.CreateZone(CurrentZoneType.Name, World).HasValue(out var toBuild)) { var order = new BuildZoneOrder(toBuild, World); World.PersistentData.BuildDesignations.Add(order); World.PersistentData.Zones.Add(toBuild); foreach (var v in voxels.Where(v => v.IsValid && !v.IsEmpty)) { order.VoxelOrders.Add(new BuildVoxelOrder(order, order.ToBuild, v)); } order.WorkObjects.AddRange(Fence.CreateFences(World.ComponentManager, ContentPaths.Entities.DwarfObjects.constructiontape, order.VoxelOrders.Select(o => o.Voxel), true)); foreach (var obj in order.WorkObjects) { obj.Manager.RootComponent.AddChild(obj); } World.TaskManager.AddTask(new BuildZoneTask(order)); } } } } else { DestroyZoneTool.OnVoxelsSelected(voxels, button); } }
public void DestroyZone(Zone Z) { PersistentData.Zones.Remove(Z); var existingDesignations = GetDesignationsAssociatedWithZone(Z); BuildZoneOrder buildRoomDes = null; foreach (var des in existingDesignations) { des.Order.VoxelOrders.Remove(des); buildRoomDes = des.Order; } if (buildRoomDes != null && buildRoomDes.DisplayWidget != null) { UserInterface.Gui.DestroyWidget(buildRoomDes.DisplayWidget); } PersistentData.BuildDesignations.Remove(buildRoomDes); Z.Destroy(); }
public CreateRoomAct(CreatureAI agent, BuildZoneOrder buildRoom) : base(agent) { Name = "Build room."; BuildRoom = buildRoom; }
public bool IsRoomBuildOrder(BuildZoneOrder buildRooom) { return(Agent.World.IsActiveBuildZoneOrder(BuildRoom)); }
public Act SetTargetVoxelFromRoomAct(BuildZoneOrder buildRoom, string target) { return(new Wrap(() => SetTargetVoxelFromRoom(buildRoom, target))); }
public bool IsActiveBuildZoneOrder(BuildZoneOrder buildRooom) { return(PersistentData.BuildDesignations.Contains(buildRooom)); }
private bool IsZoneBuildOrder(WorldManager World, BuildZoneOrder buildRooom) { return(World.IsActiveBuildZoneOrder(buildRooom)); }
public BuildVoxelOrder(BuildZoneOrder Order, Zone ToBuild, VoxelHandle Voxel) { this.Order = Order; this.ToBuild = ToBuild; this.Voxel = Voxel; }