示例#1
0
        public override void ExecuteTask(Simulation Sim)
        {
            var pathfindingResult = Pathfinding.Flood(Sim.World.CellAt(AssignedGnome.Location),
                            c => GoalTask.QueryValidLocation(Sim, c.Location),
                            c => 1.0f);

            if (pathfindingResult.GoalFound)
            {
                var path = pathfindingResult.FinalNode.ExtractPath();
                if (path.Count > 1)
                {
                    var blockingGnome = path[1].PresentActor as Gnome;
                    if (blockingGnome != null)
                    {
                        blockingGnome.Mind.PushTask(new NudgedTask(AssignedGnome, path[1].Location));
                    }
                    else
                    {
                        MoveMutation = new WorldMutations.ActorMoveMutation(AssignedGnome.Location, path[1], AssignedGnome);
                        Sim.AddWorldMutation(MoveMutation);
                    }
                }
            }
            else
            {
                FailedToFindPath = true;
            }
        }
示例#2
0
        public override bool QueryValidLocation(Simulation Sim, Coordinate GnomeLocation)
        {
            return true;

            // Any spot that ISN'T the place we started is a good spot.
            //if (GnomeLocation == Location) return false;
            //if (GnomeLocation == Nudger.Location) return false; // Avoid nudging back
            //return true;
        }
示例#3
0
 public void UpdatePosition(Simulation Sim)
 {
     Orientation.Position = Location.AsVector3() + PositionOffset;
     if (Sim.World.check(Location.X, Location.Y, Location.Z))
     {
         var cell = Sim.World.CellAt(Location.X, Location.Y, Location.Z);
         if (cell.Block == null)
             Location.Z -= 1;
         else if (cell.Navigatable)
             Orientation.Position = cell.CenterPoint + PositionOffset;
     }
 }
示例#4
0
        public void Update(Game Game, Simulation Sim)
        {
            if (TaskStack.Count == 0)
            {
                // Find a new task.
                var newTask = Sim.FindTask(Owner);
                if (newTask != null)
                    PushTask(newTask);
                else
                    if (Owner.CarryingResource) PushTask(new Tasks.Deposit());
            }

            var spins = 0;
            while (spins < 10)
            {
                ++spins;
                if (TaskStack.Count == 0) return;

                var currentTask = TaskStack.Peek();

                var status = currentTask.QueryStatus(Sim);
                if (status == TaskStatus.Complete)
                    TaskStack.Pop();
                else if (status == TaskStatus.Impossible)
                {
                    // The task, or a prerequisite, is revealed to be impossible. Abandon the task stack entirely.
                    while (TaskStack.Count != 0)
                        Sim.AbandonTask(TaskStack.Pop());
                }
                else
                {
                    var prerequisite = currentTask.Prerequisite(Sim);
                    if (prerequisite != null)
                        PushTask(prerequisite);
                    else
                    {
                        // All prerequisites met.
                        if (currentTask.QueryValidLocation(Sim, Owner.Location))
                        {
                            currentTask.ExecuteTask(Sim);
                            break;
                        }
                        else
                            PushTask(new WalkTask(currentTask));
                    }
                }
            }
        }
示例#5
0
        public void Begin()
        {
            Content = new EpisodeContentManager(Main.EpisodeContent.ServiceProvider, "Content");
            Sim = new Simulation(Content, 1.0f);

            RenderContext = new RenderContext(Content.Load<Effect>("draw"), Main.GraphicsDevice);

            RenderTrees.Add(new RenderTree
            {
                Camera = new Gem.Render.FreeCamera(new Vector3(0, 0, 0), Vector3.UnitY, Vector3.UnitZ, Main.GraphicsDevice.Viewport),
                SceneGraph = Sim.CreateSceneNode()
            });

            (RenderTrees[0].Camera as FreeCamera).Position = CameraFocus + new Vector3(0, -4, 3);

            #region Prepare Input

            Main.Input.ClearBindings();
            Main.Input.AddAxis("MAIN-AXIS", new MouseAxisBinding());
            Main.Input.AddBinding("RIGHT", new KeyboardBinding(Keys.Right, KeyBindingType.Held));
            Main.Input.AddBinding("LEFT", new KeyboardBinding(Keys.Left, KeyBindingType.Held));
            Main.Input.AddBinding("UP", new KeyboardBinding(Keys.Up, KeyBindingType.Held));
            Main.Input.AddBinding("DOWN", new KeyboardBinding(Keys.Down, KeyBindingType.Held));
            Main.Input.AddBinding("PAN-LEFT", new KeyboardBinding(Keys.A, KeyBindingType.Held));
            Main.Input.AddBinding("PAN-FORWARD", new KeyboardBinding(Keys.W, KeyBindingType.Held));
            Main.Input.AddBinding("PAN-RIGHT", new KeyboardBinding(Keys.D, KeyBindingType.Held));
            Main.Input.AddBinding("PAN-BACK", new KeyboardBinding(Keys.S, KeyBindingType.Held));
            Main.Input.AddBinding("LEFT-CLICK", new MouseButtonBinding("LeftButton", KeyBindingType.Pressed));
            Main.Input.AddBinding("RIGHT-CLICK", new MouseButtonBinding("RightButton", KeyBindingType.Pressed));

            Main.Input.AddBinding("CAMERA-DISTANCE-TOGGLE", new KeyboardBinding(Keys.R, KeyBindingType.Held));

            Main.ScriptBuilder.DeriveScriptsFrom("Gnome.ScriptBase");

            var guiTools = new List<GuiTool>();
            guiTools.Add(new GuiTools.Build());
            guiTools.Add(new GuiTools.Mine());
            guiTools.Add(new GuiTools.MarkStorehouse());

            PushInputState(new HoverTest(Sim.Blocks, guiTools));

            #endregion
        }
示例#6
0
        public override void ExecuteTask(Simulation Sim)
        {
            var cell = Sim.World.CellAt(Location);
            if (cell.Links.Count == 0)
            {
                FailedToFindPath = true;
                return;
            }

            var retreatLinks = cell.Links.OrderBy(l => l.Neighbor.PresentActor == null ? 0 : 1);
            var link = retreatLinks.First();

            var blockingGnome = link.Neighbor.PresentActor as Gnome;
            if (blockingGnome != null)
                blockingGnome.Mind.PushTask(new NudgedTask(AssignedGnome, link.Neighbor.Location));
            else
            {
                MoveMutation = new WorldMutations.ActorMoveMutation(AssignedGnome.Location, link.Neighbor, AssignedGnome);
                Sim.AddWorldMutation(MoveMutation);
            }
        }
示例#7
0
 public virtual void Apply(Simulation Sim)
 {
     throw new NotImplementedException();
 }
示例#8
0
 public override TaskStatus QueryStatus(Simulation Sim)
 {
     if (FailedToFindPath) return TaskStatus.Impossible;
     if (AssignedGnome.Location == Location) return TaskStatus.NotComplete;
     return TaskStatus.Complete;
 }
示例#9
0
 public Gnome(Simulation Sim, TileSheet Sheet)
 {
     Mind = new GnomeMind(this);
     Renderable = new GnomeNode(this, Sim, Sheet);
 }
示例#10
0
 public virtual void Apply(Simulation Sim, WorldSceneNode WorldNode)
 {
 }
示例#11
0
 public static bool NoGnomesInArea(Simulation Sim, Coordinate Location)
 {
     for (var z = Location.Z - 1; z <= Location.Z + 3; ++z)
         if (Sim.World.check(Location.X, Location.Y, z) && Sim.World.CellAt(Location.X, Location.Y, z).PresentActor != null) return false;
     return true;
 }
示例#12
0
 public virtual bool QueryValidLocation(Simulation Sim, Coordinate GnomeLocation)
 {
     return false;
 }
示例#13
0
 public virtual TaskStatus QueryStatus(Simulation Sim)
 {
     return TaskStatus.NotComplete;
 }
示例#14
0
 public virtual Task Prerequisite(Simulation Sim)
 {
     return null;
 }
示例#15
0
 public virtual void ExecuteTask(Simulation Sim)
 {
 }
示例#16
0
 public override bool QueryValidLocation(Simulation Sim, Coordinate GnomeLocation)
 {
     return true; // This is the task that takes gnomes to valid locations.
 }