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; } }
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; }
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; } }
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)); } } } }
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 }
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); } }
public virtual void Apply(Simulation Sim) { throw new NotImplementedException(); }
public override TaskStatus QueryStatus(Simulation Sim) { if (FailedToFindPath) return TaskStatus.Impossible; if (AssignedGnome.Location == Location) return TaskStatus.NotComplete; return TaskStatus.Complete; }
public Gnome(Simulation Sim, TileSheet Sheet) { Mind = new GnomeMind(this); Renderable = new GnomeNode(this, Sim, Sheet); }
public virtual void Apply(Simulation Sim, WorldSceneNode WorldNode) { }
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; }
public virtual bool QueryValidLocation(Simulation Sim, Coordinate GnomeLocation) { return false; }
public virtual TaskStatus QueryStatus(Simulation Sim) { return TaskStatus.NotComplete; }
public virtual Task Prerequisite(Simulation Sim) { return null; }
public virtual void ExecuteTask(Simulation Sim) { }
public override bool QueryValidLocation(Simulation Sim, Coordinate GnomeLocation) { return true; // This is the task that takes gnomes to valid locations. }