public override void Render(DwarfTime gameTime, ChunkManager chunks, Camera camera, SpriteBatch spriteBatch, GraphicsDevice graphicsDevice, Shader effect) { if (Debugger.Switches.DebugElevators) { foreach (var shaft in Shafts) { Drawer3D.DrawBox(shaft.BoundingBox, Color.Orange, 0.1f, false); } } }
public static bool CanPlace(WorldManager World, RailEntity PreviewEntity) { // Todo: Make sure this uses BuildObjectTool.IsValidPlacement to enforce building rules. var junctionPiece = PreviewEntity.GetPiece(); var actualPosition = PreviewEntity.GetContainingVoxel(); if (!actualPosition.IsValid) { return(false); } if (!actualPosition.IsEmpty) { return(false); } if (actualPosition.Coordinate.Y == 0) { return(false); // ??? } var voxelUnder = VoxelHelpers.GetVoxelBelow(actualPosition); if (voxelUnder.IsEmpty) { return(false); } var box = actualPosition.GetBoundingBox().Expand(-0.2f); foreach (var entity in World.EnumerateIntersectingObjects(box, CollisionType.Static)) { if ((entity as GameComponent).IsDead) { continue; } if (Object.ReferenceEquals(entity, PreviewEntity)) { continue; } if (Object.ReferenceEquals(entity.GetRoot(), PreviewEntity.GetRoot())) { continue; } if (entity is GenericVoxelListener) { continue; } if (entity is WorkPile) { continue; } if (entity is Health) { continue; } if (entity is CraftDetails) { continue; } if (entity is SimpleSprite) { continue; } if (FindPossibleCombination(junctionPiece, entity).HasValue(out var possibleCombination)) { var combinedPiece = new Rail.JunctionPiece { RailPiece = possibleCombination.Result, Orientation = Rail.OrientationHelper.Rotate((entity as RailEntity).GetPiece().Orientation, (int)possibleCombination.ResultRelativeOrientation), }; PreviewEntity.UpdatePiece(combinedPiece, PreviewEntity.GetContainingVoxel()); return(true); } if (Debugger.Switches.DrawToolDebugInfo) { Drawer3D.DrawBox(box, Color.Yellow, 0.2f, false); } World.UserInterface.ShowTooltip(String.Format("Can't place {0}. Entity in the way: {1}", junctionPiece.RailPiece, entity.ToString())); return(false); } return(true); }
/// <summary> /// Called when a frame is to be drawn to the screen /// </summary> /// <param name="gameTime">The current time</param> public override void Render(DwarfTime gameTime) { Game.Graphics.GraphicsDevice.SetRenderTarget(null); Game.Graphics.GraphicsDevice.Clear(Color.Black); EnableScreensaver = !World.ShowingWorld; if (World.ShowingWorld) { World.Renderer.ValidateShader(); if (!MinimapFrame.Hidden && !Gui.RootItem.Hidden) { MinimapRenderer.PreRender(DwarfGame.SpriteBatch); } World.Renderer.Render(gameTime); CurrentTool.Render3D(Game, gameTime); VoxSelector.Render(); foreach (var obj in SelectedObjects) { if (obj.IsVisible && !obj.IsDead) { Drawer3D.DrawBox(obj.GetBoundingBox(), Color.White, 0.01f, true); } } CurrentTool.Render2D(Game, gameTime); foreach (CreatureAI creature in World.PersistentData.SelectedMinions) { foreach (Task task in creature.Tasks) { if (task.IsFeasible(creature.Creature) == Feasibility.Feasible) { task.Render(gameTime); } } if (creature.CurrentTask.HasValue(out var currentTask)) { currentTask.Render(gameTime); } } DwarfGame.SpriteBatch.Begin(); BodySelector.Render(DwarfGame.SpriteBatch); DwarfGame.SpriteBatch.End(); if (Gui.RenderData.RealScreen.Width != Gui.RenderData.Device.Viewport.Width || Gui.RenderData.RealScreen.Height != Gui.RenderData.Device.Viewport.Height) { Gui.RenderData.CalculateScreenSize(); Gui.RootItem.Rect = Gui.RenderData.VirtualScreen; Gui.ResetGui(); CreateGUIComponents(); } if (!MinimapFrame.Hidden && !Gui.RootItem.Hidden) { Gui.Draw(new Point(0, 0), false); MinimapRenderer.Render(new Rectangle(MinimapFrame.Rect.X, MinimapFrame.Rect.Bottom - 192, 192, 192), Gui); Gui.DrawMesh(MinimapFrame.GetRenderMesh(Gui.RenderMeshInvalidation), Gui.SpriteAtlas.Texture); Gui.RedrawPopups(); Gui.DrawMouse(); } else { Gui.Draw(); } } base.Render(gameTime); }
public static bool CanPlace(GameMaster Player, RailEntity PreviewEntity) { // Todo: Make sure this uses BuildObjectTool.IsValidPlacement to enforce building rules. var junctionPiece = PreviewEntity.GetPiece(); var actualPosition = PreviewEntity.GetContainingVoxel(); if (!actualPosition.IsValid) { return(false); } if (!actualPosition.IsEmpty) { return(false); } if (actualPosition.Coordinate.Y == 0) { return(false); // ??? } var local = actualPosition.Coordinate.GetLocalVoxelCoordinate(); var voxelUnder = new VoxelHandle(actualPosition.Chunk, new LocalVoxelCoordinate(local.X, local.Y - 1, local.Z)); if (voxelUnder.IsEmpty) { return(false); } foreach (var entity in Player.World.EnumerateIntersectingObjects(actualPosition.GetBoundingBox().Expand(-0.2f), CollisionType.Static)) { if ((entity as GameComponent).IsDead) { continue; } if (Object.ReferenceEquals(entity, PreviewEntity)) { continue; } if (entity is GenericVoxelListener) { continue; } if (entity is WorkPile) { continue; } var possibleCombination = FindPossibleCombination(junctionPiece, entity); if (possibleCombination != null) { var combinedPiece = new Rail.JunctionPiece { RailPiece = possibleCombination.Result, Orientation = Rail.OrientationHelper.Rotate((entity as RailEntity).GetPiece().Orientation, (int)possibleCombination.ResultRelativeOrientation), }; PreviewEntity.UpdatePiece(combinedPiece, PreviewEntity.GetContainingVoxel()); return(true); } if (Debugger.Switches.DrawBoundingBoxes) { Drawer3D.DrawBox(entity.GetBoundingBox(), Color.Yellow, 0.1f, false); Player.World.ShowTooltip(String.Format("Can't place {0}. Entity in the way: {1}", junctionPiece.RailPiece, entity.ToString())); } return(false); } return(true); }
override public void Render(DwarfTime gameTime, ChunkManager chunks, Camera camera, SpriteBatch spriteBatch, GraphicsDevice graphicsDevice, Shader effect, bool renderingForWater) { base.Render(gameTime, chunks, camera, spriteBatch, graphicsDevice, effect, renderingForWater); if (Debugger.Switches.DrawPipeNetwork) { foreach (var neighborConnection in NeighborPipes) { var neighbor = Manager.FindComponent(neighborConnection); if (neighbor == null) { Drawer3D.DrawLine(Position, Position + Vector3.UnitY, Color.CornflowerBlue, 0.1f); } else { Drawer3D.DrawLine(Position + new Vector3(0.0f, 0.5f, 0.0f), (neighbor as GameComponent).Position + new Vector3(0.0f, 0.5f, 0.0f), new Color(SteamPressure, 0.0f, 0.0f, 1.0f), 0.1f); } } Drawer3D.DrawBox(GetBoundingBox(), Color.Red, 0.01f, false); Drawer3D.DrawLine(Position, Position + Vector3.Transform(new Vector3(1, 0, 0), Matrix.CreateRotationY((float)Math.PI / 2 * (float)Orientation)), new Color(0.0f, 1.0f, 1.0f), 0.03f); } if (!DrawPipes) { return; } if (Primitive == null) { var bounds = Vector4.Zero; var uvs = Sheet.GenerateTileUVs(new Point(0, 0), out bounds); Primitive = new RawPrimitive(); foreach (var connection in NeighborPipes) { var neighbor = Manager.FindComponent(connection) as GameComponent; if (neighbor == null) { continue; } var orientationToNeighbor = OrientationHelper.DetectOrientationFromVector(new Vector3(neighbor.Position.X - this.Position.X, 0.0f, neighbor.Position.Z - this.Position.Z)); var pipeAngle = Math.PI * 0.5f * ((float)Orientation - (float)orientationToNeighbor); Primitive.AddQuad( Matrix.CreateTranslation(0.5f, 0.0f, 0.0f) * Matrix.CreateScale(0.5f, 0.5f, 0.5f) * Matrix.CreateRotationX((float)Math.PI * 0.5f) //* Matrix.CreateTranslation(0.0f, 0.3f, -0.2f) * Matrix.CreateRotationY((float)pipeAngle), //* Matrix.CreateTranslation(bumperOffset + bumperGap), Color.White, Color.White, uvs, bounds); } } if (Primitive.VertexCount == 0) { return; } var under = new VoxelHandle(chunks, GlobalVoxelCoordinate.FromVector3(Position)); if (under.IsValid) { Color color = new Color(under.Sunlight ? 255 : 0, 255, 0); LightRamp = color; } else { LightRamp = new Color(200, 255, 0); } Color origTint = effect.VertexColorTint; if (!Active) { DoStipple(effect); } effect.VertexColorTint = VertexColor; effect.LightRamp = LightRamp; effect.World = GlobalTransform; effect.MainTexture = Sheet.GetTexture(); effect.EnableWind = false; foreach (EffectPass pass in effect.CurrentTechnique.Passes) { pass.Apply(); Primitive.Render(graphicsDevice); } effect.VertexColorTint = origTint; if (!Active) { EndDraw(effect); } }
public override void Construct() { Border = "border-fancy"; Font = "font10"; OnConstruct = (sender) => { sender.Root.RegisterForUpdate(sender); FilterBox = AddChild(new EditableTextField { AutoLayout = AutoLayout.DockTop, MinimumSize = new Point(0, 24), Text = "" }) as EditableTextField; ListView = AddChild(new WidgetListView { AutoLayout = AutoLayout.DockFill, SelectedItemForegroundColor = new Vector4(0, 0, 0, 1), ChangeColorOnSelected = false, Border = null, ItemHeight = 24 }) as WidgetListView; ListView.Border = null; // Can't make WidgetListView stop defaulting its border without breaking everywhere else its used. }; OnUpdate = (sender, time) => { if (sender.Hidden) { return; } var roomsToDisplay = World.EnumerateZones().Where(r => !String.IsNullOrEmpty(FilterBox.Text) ? r.ID.Contains(FilterBox.Text) : true); int i = 0; ListView.ClearItems(); foreach (var room in roomsToDisplay) { i++; var tag = room.GuiTag as Widget; var lambdaCopy = room; if (tag != null) { ListView.AddItem(tag); } else { #region Create gui row tag = Root.ConstructWidget(new Widget { Text = room.GetDescriptionString(), MinimumSize = new Point(0, 16), Padding = new Margin(0, 0, 4, 4), TextVerticalAlign = VerticalAlign.Center, Background = new TileReference("basic", 0), BackgroundColor = i % 2 == 0 ? new Vector4(0.0f, 0.0f, 0.0f, 0.1f) : new Vector4(0, 0, 0, 0.25f) }); tag.OnUpdate = (sender1, args) => { if (tag.IsAnyParentHidden()) { return; } if (sender1.ComputeBoundingChildRect().Contains(Root.MousePosition)) { Drawer3D.DrawBox(lambdaCopy.GetBoundingBox(), Color.White, 0.1f, true); } }; Root.RegisterForUpdate(tag); tag.AddChild(new Button { Text = "Destroy", AutoLayout = AutoLayout.DockRight, MinimumSize = new Point(16, 0), ChangeColorOnHover = true, TextVerticalAlign = VerticalAlign.Center, OnClick = (_sender, args) => { World.UserInterface.Gui.ShowModalPopup(new Gui.Widgets.Confirm { Text = "Do you want to destroy this " + lambdaCopy.Type.Name + "?", OnClose = (_sender2) => DestroyZoneTool.DestroyRoom((_sender2 as Gui.Widgets.Confirm).DialogResult, lambdaCopy, World) }); } }); tag.AddChild(new Widget { MinimumSize = new Point(4, 0), AutoLayout = AutoLayout.DockRight }); tag.AddChild(new Button { Text = "Go to", AutoLayout = AutoLayout.DockRight, ChangeColorOnHover = true, MinimumSize = new Point(16, 0), TextVerticalAlign = VerticalAlign.Center, OnClick = (_sender, args) => { World.Renderer.Camera.SetZoomTarget(lambdaCopy.GetBoundingBox().Center()); } }); if (lambdaCopy is Stockpile stock && stock.SupportsFilters) { tag.AddChild(new Button { Text = "Resources...", AutoLayout = AutoLayout.DockRight, ChangeColorOnHover = true, MinimumSize = new Point(16, 0), TextVerticalAlign = VerticalAlign.Center, OnClick = (_sender, args) => { var savePaused = World.Paused; World.Paused = true; Root.ShowModalPopup(new StockpilePropertiesDialog { Stockpile = lambdaCopy as Stockpile, OnClose = (_sen2) => World.Paused = savePaused }); } }); } #endregion room.GuiTag = tag; ListView.AddItem(tag); } tag.Text = room.GetDescriptionString(); } ListView.Invalidate(); }; base.Construct(); }
public override void Construct() { Border = "border-fancy"; Font = "font10"; OnConstruct = (sender) => { sender.Root.RegisterForUpdate(sender); FilterBox = AddChild(new EditableTextField { AutoLayout = AutoLayout.DockTop, MinimumSize = new Point(0, 24), Text = "" }) as EditableTextField; ListView = AddChild(new WidgetListView { AutoLayout = AutoLayout.DockFill, SelectedItemForegroundColor = new Vector4(0, 0, 0, 1), ChangeColorOnSelected = false, Border = null, ItemHeight = 24 }) as WidgetListView; ListView.Border = null; // Can't make WidgetListView stop defaulting its border without breaking everywhere else its used. }; OnUpdate = (sender, time) => { if (sender.Hidden) { return; } var roomsToDisplay = World.EnumerateZones().Where(r => !String.IsNullOrEmpty(FilterBox.Text) ? r.ID.Contains(FilterBox.Text) : true); int i = 0; ListView.ClearItems(); foreach (var room in roomsToDisplay) { i++; var tag = room.GuiTag as Widget; var lambdaCopy = room; if (tag != null) { ListView.AddItem(tag); } else { #region Create gui row tag = Root.ConstructWidget(new Widget { Text = room.GetDescriptionString(), MinimumSize = new Point(0, 16), Padding = new Margin(0, 0, 4, 4), TextVerticalAlign = VerticalAlign.Center, Background = new TileReference("basic", 0), BackgroundColor = i % 2 == 0 ? new Vector4(0.0f, 0.0f, 0.0f, 0.1f) : new Vector4(0, 0, 0, 0.25f) }); tag.OnUpdate = (sender1, args) => { if (tag.IsAnyParentHidden()) { return; } if (sender1.ComputeBoundingChildRect().Contains(Root.MousePosition)) { Drawer3D.DrawBox(lambdaCopy.GetBoundingBox(), Color.White, 0.1f, true); } }; Root.RegisterForUpdate(tag); tag.AddChild(new Button { Text = "Destroy", AutoLayout = AutoLayout.DockRight, MinimumSize = new Point(16, 0), ChangeColorOnHover = true, TextVerticalAlign = VerticalAlign.Center, OnClick = (_sender, args) => { World.UserInterface.Gui.ShowModalPopup(new Gui.Widgets.Confirm { Text = "Do you want to destroy this " + lambdaCopy.Type.Name + "?", OnClose = (_sender2) => DestroyZoneTool.DestroyRoom((_sender2 as Gui.Widgets.Confirm).DialogResult, lambdaCopy, World) }); } }); tag.AddChild(new Widget { MinimumSize = new Point(4, 0), AutoLayout = AutoLayout.DockRight }); tag.AddChild(new Button { Text = "Go to", AutoLayout = AutoLayout.DockRight, ChangeColorOnHover = true, MinimumSize = new Point(16, 0), TextVerticalAlign = VerticalAlign.Center, OnClick = (_sender, args) => { World.Renderer.Camera.ZoomTargets.Clear(); World.Renderer.Camera.ZoomTargets.Add(lambdaCopy.GetBoundingBox().Center()); } }); if (lambdaCopy is Stockpile && !(lambdaCopy is Graveyard)) { tag.AddChild(new Button { Text = "Resources...", AutoLayout = AutoLayout.DockRight, ChangeColorOnHover = true, MinimumSize = new Point(16, 0), TextVerticalAlign = VerticalAlign.Center, OnClick = (_sender, args) => { List <Resource.ResourceTags> blacklistableResources = new List <Resource.ResourceTags>() { Resource.ResourceTags.Alcohol, Resource.ResourceTags.Meat, Resource.ResourceTags.Metal, Resource.ResourceTags.Gem, Resource.ResourceTags.Magical, Resource.ResourceTags.Wood, Resource.ResourceTags.Soil, Resource.ResourceTags.Sand, Resource.ResourceTags.Fruit, Resource.ResourceTags.Gourd, Resource.ResourceTags.Grain, Resource.ResourceTags.Fungus, Resource.ResourceTags.Fuel, Resource.ResourceTags.Craft, Resource.ResourceTags.CraftItem, Resource.ResourceTags.Bone, Resource.ResourceTags.Potion, Resource.ResourceTags.PreparedFood, Resource.ResourceTags.Rail, Resource.ResourceTags.Seed }.OrderBy(t => t.ToString()).ToList(); int sqr = (int)Math.Sqrt(blacklistableResources.Count); int minWidth = Math.Min(sqr * 200 + 64, Root.RenderData.VirtualScreen.Width); int minHeight = Math.Min(sqr * 32 + 232, Root.RenderData.VirtualScreen.Height); var widget = Root.ConstructWidget(new Widget() { Border = "border-fancy", Font = "font10", Rect = new Rectangle(Root.RenderData.VirtualScreen.X + (Root.RenderData.VirtualScreen.Width - minWidth) / 2, Root.RenderData.VirtualScreen.Y + (Root.RenderData.VirtualScreen.Height - minHeight) / 2, minWidth, minHeight) }); widget.AddChild(new Widget() { MinimumSize = new Point(120, 32), Text = "Allowed Resources", Font = "font16", AutoLayout = AutoLayout.DockTop, }); var interiorWidget = widget.AddChild(new Widget() { Rect = new Rectangle(Root.RenderData.VirtualScreen.X + (Root.RenderData.VirtualScreen.Width - minWidth), Root.RenderData.VirtualScreen.Y + (Root.RenderData.VirtualScreen.Height - minHeight), minWidth, minHeight), AutoLayout = AutoLayout.DockTop }); var stockpile = lambdaCopy as Stockpile; var grid = interiorWidget.AddChild(new GridPanel() { AutoLayout = AutoLayout.DockFill, ItemSize = new Point(200, 32), ItemSpacing = new Point(2, 2) }) as GridPanel; List <CheckBox> boxes = new List <CheckBox>(); foreach (Resource.ResourceTags tagType in blacklistableResources) { var resource = Library.FindMedianResourceTypeWithTag(tagType); var resources = Library.EnumerateResourceTypesWithTag(tagType); Resource.ResourceTags lambdaType = tagType; var entry = grid.AddChild(new Widget()); if (resource != null) { entry.AddChild(new ResourceIcon() { MinimumSize = new Point(32, 32), MaximumSize = new Point(32, 32), Layers = resource.GuiLayers, AutoLayout = AutoLayout.DockLeft }); } var numResourcesInGroup = resources.Count(); var extraTooltip = numResourcesInGroup > 0 ? "\ne.g " + TextGenerator.GetListString(resources.Select(s => (string)s.Name).Take(Math.Min(numResourcesInGroup, 4)).ToList()) : ""; boxes.Add(entry.AddChild(new CheckBox() { Text = SplitCamelCase(tagType.ToString()), Tooltip = "Check to allow this stockpile to store " + tagType.ToString() + " resources." + extraTooltip, CheckState = !stockpile.BlacklistResources.Contains(tagType), OnCheckStateChange = (checkSender) => { var checkbox = checkSender as CheckBox; if (checkbox.CheckState && stockpile.BlacklistResources.Contains(lambdaType)) { stockpile.BlacklistResources.Remove(lambdaType); } else if (!stockpile.BlacklistResources.Contains(lambdaType)) { stockpile.BlacklistResources.Add(lambdaType); } }, AutoLayout = AutoLayout.DockLeft } ) as CheckBox); } widget.AddChild(new CheckBox() { Text = "Toggle All", CheckState = boxes.All(b => b.CheckState), OnCheckStateChange = (checkSender) => { foreach (var box in boxes) { box.CheckState = (checkSender as CheckBox).CheckState; } }, AutoLayout = AutoLayout.FloatBottomLeft }); widget.AddChild(new Button() { Text = "OK", AutoLayout = AutoLayout.FloatBottomRight, OnClick = (sender1, args1) => { widget.Close(); } }); widget.Layout(); Root.ShowModalPopup(widget); } }); } #endregion room.GuiTag = tag; ListView.AddItem(tag); } tag.Text = room.GetDescriptionString(); } ListView.Invalidate(); }; base.Construct(); }
public override void Update(DwarfTime gameTime) { // If this playstate is not supposed to be running, just exit. if (!IsActiveState || IsShuttingDown) { return; } if (QuitOnNextUpdate) { QuitGame(); IsShuttingDown = true; QuitOnNextUpdate = false; return; } Debugger.SetConsoleCommandContext(World); InfoTray.ClearTopMessage(); // Hide tutorial while menu is up if (PausePanel == null || PausePanel.Hidden) { World.TutorialManager.ShowTutorial(); } else { World.TutorialManager.HideTutorial(); } #if !DEBUG try { #endif if (IsMouseOverGui) { ShowInfo(InfoTray.TopEntry, "MOUSE OVER GUI"); } else { BottomToolBar.RefreshVisibleTray(); } #region Handle keyboard input DwarfGame.GumInput.FireActions(Gui, (@event, args) => { if (DwarfGame.IsConsoleVisible) { return; } // Mouse down but not handled by GUI? Collapse menu. if (@event == DwarfCorp.Gui.InputEvents.MouseClick) { GodMenu.CollapseTrays(); if (ContextMenu != null) { ContextMenu.Close(); ContextMenu = null; } // double click logic. if (args.MouseButton == 0) { var now = (float)gameTime.TotalRealTime.TotalSeconds; if (now - timeOnLastClick < doubleClickThreshold) { World.Renderer.Camera.ZoomTo(World.Renderer.CursorLightPos); World.Renderer.Camera.ZoomTo(World.Renderer.CursorLightPos); } timeOnLastClick = now; } if (args.MouseButton == 1) // Right mouse click. { var bodiesClicked = World.ComponentManager.FindRootBodiesInsideScreenRectangle( new Rectangle(args.X, args.Y, 1, 1), World.Renderer.Camera); if (bodiesClicked.Count > 0) { var contextBody = bodiesClicked[0]; var availableCommands = ContextCommands.Where(c => c.CanBeAppliedTo(contextBody, World)); if (availableCommands.Count() > 0) { // Show context menu. ContextMenu = Gui.ConstructWidget(new ContextMenu { Commands = availableCommands.ToList(), Body = contextBody, World = World }); Gui.ShowDialog(ContextMenu); args.Handled = true; } } } } else if (@event == InputEvents.KeyUp) { // Camera position hotkeys if (args.KeyValue >= '0' && args.KeyValue <= '9' && (args.Control || args.Shift)) { var savedPositionSlot = args.KeyValue - '0'; if (args.Control) { if (World.Renderer.PersistentSettings.SavedCameraPositions.ContainsKey(savedPositionSlot)) { var saved = World.Renderer.PersistentSettings.SavedCameraPositions[savedPositionSlot]; World.Renderer.Camera.Target = saved.Target; World.Renderer.Camera.ViewMatrix = saved.ViewMatrix; World.Renderer.Camera.Position = saved.Position; World.Renderer.SetMaxViewingLevel(saved.SliceLevel); } } else if (args.Shift) { World.Renderer.PersistentSettings.SavedCameraPositions[savedPositionSlot] = new CameraPositiionSnapshot { Position = World.Renderer.Camera.Position, Target = World.Renderer.Camera.Target, ViewMatrix = World.Renderer.Camera.ViewMatrix, SliceLevel = World.Renderer.PersistentSettings.MaxViewingLevel }; } } // Main Toolbar Hotkeys else if (FlatToolTray.Tray.Hotkeys.Contains((Keys)args.KeyValue)) { if (PausePanel == null || PausePanel.Hidden) { (BottomToolBar.Children.First(w => w.Hidden == false) as FlatToolTray.Tray).Hotkey((Keys)args.KeyValue); } } else if ((Keys)args.KeyValue == Keys.Escape) { BrushTray.Select(0); CameraTray.Select(0); if (World.TutorialManager.HasCurrentTutorial()) { World.TutorialManager.DismissCurrentTutorial(); } else if (TogglePanels.Any(p => p.Hidden == false)) { HideTogglePanels(); } else if (MainMenu.Hidden && PausePanel == null) { (BottomToolBar.Children.First(w => w.Hidden == false) as FlatToolTray.Tray).Hotkey(FlatToolTray.Tray.Hotkeys[0]); } else if (CurrentToolMode != "SelectUnits" && PausePanel == null) { ChangeTool("SelectUnits"); } else if (PausePanel != null) { PausePanel.Close(); } else { OpenPauseMenu(); } } else if ((Keys)args.KeyValue == ControlSettings.Mappings.SelectAllDwarves && (PausePanel == null || PausePanel.Hidden)) { World.PersistentData.SelectedMinions.AddRange(World.PlayerFaction.Minions); World.Tutorial("dwarf selected"); } else if ((Keys)args.KeyValue == ControlSettings.Mappings.SelectNextEmployee && (PausePanel == null || PausePanel.Hidden)) { if (World.PlayerFaction.Minions.Count > 0) { if (World.PersistentData.SelectedMinions.Count == 0) { World.PersistentData.SelectedMinions.Clear(); World.PersistentData.SelectedMinions.Add(World.PlayerFaction.Minions[0]); } else { var index = World.PlayerFaction.Minions.IndexOf(World.PersistentData.SelectedMinions[0]); index += 1; if (index >= World.PlayerFaction.Minions.Count) { index = 0; } World.PersistentData.SelectedMinions.Clear(); World.PersistentData.SelectedMinions.Add(World.PlayerFaction.Minions[index]); } World.Tutorial("dwarf selected"); } } else if ((Keys)args.KeyValue == ControlSettings.Mappings.SelectPreviousEmployee && (PausePanel == null || PausePanel.Hidden)) { if (World.PlayerFaction.Minions.Count > 0) { if (World.PersistentData.SelectedMinions.Count == 0) { World.PersistentData.SelectedMinions.Clear(); World.PersistentData.SelectedMinions.Add(World.PlayerFaction.Minions[0]); } else { var index = World.PlayerFaction.Minions.IndexOf(World.PersistentData.SelectedMinions[0]); index -= 1; if (index < 0) { index = World.PlayerFaction.Minions.Count - 1; } World.PersistentData.SelectedMinions.Clear(); World.PersistentData.SelectedMinions.Add(World.PlayerFaction.Minions[index]); } World.Tutorial("dwarf selected"); } } else if ((Keys)args.KeyValue == ControlSettings.Mappings.Pause) { if (PausePanel == null || PausePanel.Hidden) { World.Paused = !World.Paused; if (World.Paused) { GameSpeedControls.Pause(); } else { GameSpeedControls.Resume(); } } } else if ((Keys)args.KeyValue == ControlSettings.Mappings.TimeForward) { if (PausePanel == null || PausePanel.Hidden) { GameSpeedControls.CurrentSpeed += 1; } } else if ((Keys)args.KeyValue == ControlSettings.Mappings.TimeBackward) { if (PausePanel == null || PausePanel.Hidden) { GameSpeedControls.CurrentSpeed -= 1; } } else if ((Keys)args.KeyValue == ControlSettings.Mappings.ToggleGUI) { Gui.RootItem.Hidden = !Gui.RootItem.Hidden; Gui.RootItem.Invalidate(); } else if ((Keys)args.KeyValue == ControlSettings.Mappings.Map && (PausePanel == null || PausePanel.Hidden)) { Gui.SafeCall(MinimapIcon.OnClick, MinimapIcon, new InputEventArgs()); } else if ((Keys)args.KeyValue == ControlSettings.Mappings.Employees && (PausePanel == null || PausePanel.Hidden)) { Gui.SafeCall(EmployeesIcon.OnClick, EmployeesIcon, new InputEventArgs()); } else if ((Keys)args.KeyValue == ControlSettings.Mappings.Tasks && (PausePanel == null || PausePanel.Hidden)) { Gui.SafeCall(TasksIcon.OnClick, TasksIcon, new InputEventArgs()); } else if ((Keys)args.KeyValue == ControlSettings.Mappings.Zones && (PausePanel == null || PausePanel.Hidden)) { Gui.SafeCall(ZonesIcon.OnClick, ZonesIcon, new InputEventArgs()); } else if ((Keys)args.KeyValue == ControlSettings.Mappings.Marks && (PausePanel == null || PausePanel.Hidden)) { Gui.SafeCall(MarksIcon.OnClick, MarksIcon, new InputEventArgs()); } else if ((Keys)args.KeyValue == ControlSettings.Mappings.Xray) { Xray.CheckState = !Xray.CheckState; } else if ((Keys)args.KeyValue == ControlSettings.Mappings.GodMode) { if (PausePanel == null || PausePanel.Hidden) { if (!GodMenu.Hidden) { ChangeTool("SelectUnits"); } GodMenu.Hidden = !GodMenu.Hidden; GodMenu.Invalidate(); } } else if ((Keys)args.KeyValue == ControlSettings.Mappings.SliceUp) { sliceUpheld = false; args.Handled = true; } else if ((Keys)args.KeyValue == ControlSettings.Mappings.SliceDown) { sliceDownheld = false; args.Handled = true; } else if ((Keys)args.KeyValue == ControlSettings.Mappings.SliceSelected) { if (args.Control) { World.Renderer.SetMaxViewingLevel(rememberedViewValue); args.Handled = true; } else if (VoxSelector.VoxelUnderMouse.IsValid) { World.Tutorial("unslice"); World.Renderer.SetMaxViewingLevel(VoxSelector.VoxelUnderMouse.Coordinate.Y + 1); Drawer3D.DrawBox(VoxSelector.VoxelUnderMouse.GetBoundingBox(), Color.White, 0.15f, true); args.Handled = true; } } else if ((Keys)args.KeyValue == ControlSettings.Mappings.Unslice) { rememberedViewValue = World.Renderer.PersistentSettings.MaxViewingLevel; World.Renderer.SetMaxViewingLevel(World.WorldSizeInVoxels.Y); args.Handled = true; } } else if (@event == DwarfCorp.Gui.InputEvents.KeyDown) { if ((Keys)args.KeyValue == ControlSettings.Mappings.SliceUp) { if (!sliceUpheld) { sliceUpheld = true; World.Tutorial("unslice"); sliceUpTimer.Reset(0.5f); World.Renderer.SetMaxViewingLevel(World.Renderer.PersistentSettings.MaxViewingLevel + 1); args.Handled = true; } } else if ((Keys)args.KeyValue == ControlSettings.Mappings.SliceDown) { if (!sliceDownheld) { World.Tutorial("unslice"); sliceDownheld = true; sliceDownTimer.Reset(0.5f); World.Renderer.SetMaxViewingLevel(World.Renderer.PersistentSettings.MaxViewingLevel - 1); args.Handled = true; } } } }); #endregion // Close the bottom menu if the only icon is the return icon. if (BottomToolBar.Children.First(w => w.Hidden == false).Children.Count(c => c.Hidden == false) == 1) { (BottomToolBar.Children.First(w => w.Hidden == false) as FlatToolTray.Tray).Hotkey(FlatToolTray.Tray.Hotkeys[0]); } #region Handle slice hotkeys being held down if (sliceDownheld) { sliceDownTimer.Update(gameTime); if (sliceDownTimer.HasTriggered) { World.Renderer.SetMaxViewingLevel(World.Renderer.PersistentSettings.MaxViewingLevel - 1); sliceDownTimer.Reset(sliceDownTimer.TargetTimeSeconds * 0.6f); } } else if (sliceUpheld) { sliceUpTimer.Update(gameTime); if (sliceUpTimer.HasTriggered) { World.Renderer.SetMaxViewingLevel(World.Renderer.PersistentSettings.MaxViewingLevel + 1); sliceUpTimer.Reset(sliceUpTimer.TargetTimeSeconds * 0.6f); } } #endregion World.Update(gameTime); #region Vox and Body selectors if (!IsMouseOverGui) { if (KeyManager.RotationEnabled(World.Renderer.Camera)) { SetMouse(null); } VoxSelector.Update(); BodySelector.Update(); } #endregion World.Renderer.Update(gameTime); Input.Update(); CurrentTool.Update(Game, gameTime); UpdateGui(gameTime); AutoSaveTimer.Update(gameTime); if (GameSettings.Current.AutoSave && AutoSaveTimer.HasTriggered) { AutoSave(); } #region select employee World.PersistentData.SelectedMinions.RemoveAll(minion => minion.IsDead); if (World.PersistentData.SelectedMinions.Count == 1) { // Lol this is evil just trying to reduce the update rate for speed if (MathFunctions.RandEvent(0.1f)) { SelectedEmployeeInfo.Employee = World.PersistentData.SelectedMinions[0]; } } else { bool update = MathFunctions.RandEvent(0.1f); if ((SelectedEmployeeInfo.Employee == null || SelectedEmployeeInfo.Employee.IsDead || !SelectedEmployeeInfo.Employee.Active) && World.PlayerFaction.Minions.Count > 0) { SelectedEmployeeInfo.Employee = World.PlayerFaction.Minions[0]; } else if (update) { SelectedEmployeeInfo.Employee = SelectedEmployeeInfo.Employee; } } #endregion #region Console if (DwarfGame.IsConsoleVisible) { World.DisplaySpeciesCountsInMetrics(); // Todo: Employee AI debug display var scheduleDisplay = DwarfGame.GetConsoleTile("FORECAST"); scheduleDisplay.TextSize = 1; scheduleDisplay.Lines.Clear(); scheduleDisplay.Lines.Add(String.Format("Diff:{0:+00;-00;+00} Forecast:{1:+00;-00;+00}", World.EventScheduler.CurrentDifficulty, World.EventScheduler.ForecastDifficulty(World.Time.CurrentDate))); foreach (var scheduledEvent in World.EventScheduler.Forecast) { scheduleDisplay.Lines.Add(String.Format("{2:+00;-00;+00} {1} {0}", scheduledEvent.Event.Name, (scheduledEvent.Date - World.Time.CurrentDate).ToString(@"hh\:mm"), scheduledEvent.Event.Difficulty)); } scheduleDisplay.Invalidate(); } #endregion #if !DEBUG } catch (Exception e) { Program.CaptureException(e); if (Program.ShowErrorDialog(e.Message)) { throw new HandledException(e); } } #endif }