Beispiel #1
0
        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)
                                );
        }
Beispiel #2
0
        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;
 }
Beispiel #7
0
 public bool IsRoomBuildOrder(BuildZoneOrder buildRooom)
 {
     return(Agent.World.IsActiveBuildZoneOrder(BuildRoom));
 }
Beispiel #8
0
 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));
 }
Beispiel #11
0
 public BuildVoxelOrder(BuildZoneOrder Order, Zone ToBuild, VoxelHandle Voxel)
 {
     this.Order   = Order;
     this.ToBuild = ToBuild;
     this.Voxel   = Voxel;
 }