diff --git a/isometric-park-fna/Components/SelectedComponent.cs b/isometric-park-fna/Components/SelectedComponent.cs --- a/isometric-park-fna/Components/SelectedComponent.cs +++ b/isometric-park-fna/Components/SelectedComponent.cs @@ -6,7 +6,8 @@ public enum SelectionType { None, Window, //Selected in a window - ActiveTool + Area, //Selecting an area + Tool //Selecting a tool } public struct SelectedComponent : IComponent { diff --git a/isometric-park-fna/Components/ToggleToolComponents.cs b/isometric-park-fna/Components/ToggleToolComponents.cs new file mode 100644 --- /dev/null +++ b/isometric-park-fna/Components/ToggleToolComponents.cs @@ -0,0 +1,17 @@ +using Encompass; + +using isometricparkfna.Messages; + +namespace isometricparkfna.Components { + + public enum Tool + { + None, + Preserve + + } + + public struct ToolComponent : IComponent { + public Tool Tool; + } +} diff --git a/isometric-park-fna/Engines/BuildToolEngine.cs b/isometric-park-fna/Engines/BuildToolEngine.cs --- a/isometric-park-fna/Engines/BuildToolEngine.cs +++ b/isometric-park-fna/Engines/BuildToolEngine.cs @@ -74,14 +74,14 @@ var entity = CreateEntity(); AddComponent(entity, new AreaComponent { squares = new[] {message.Start} }); - AddComponent(entity, new SelectedComponent { selected = true, Type= SelectionType.ActiveTool}); + AddComponent(entity, new SelectedComponent { selected = true, Type= SelectionType.Area}); } } foreach (ref readonly var message in ReadMessages()) { foreach (ref readonly var entity in ReadEntities()) { var selection = GetComponent(entity); - if(selection.Type == SelectionType.ActiveTool + if(selection.Type == SelectionType.Area && selection.selected) { if(message.Type == AdjustmentType.Clear) { Destroy(entity); diff --git a/isometric-park-fna/Engines/ImGuiWindowBridgeEngine.cs b/isometric-park-fna/Engines/ImGuiWindowBridgeEngine.cs --- a/isometric-park-fna/Engines/ImGuiWindowBridgeEngine.cs +++ b/isometric-park-fna/Engines/ImGuiWindowBridgeEngine.cs @@ -27,14 +27,17 @@ typeof(SetDialogMessage), typeof(DialogChoiceMessage), typeof(SetOptionMessage), - typeof(QuitGameMessage))] + typeof(QuitGameMessage), + typeof(ToggleToolMessage))] [Reads(typeof(VisibilityComponent), typeof(WindowTypeComponent), typeof(TrespassingPolicyComponent), typeof(ContractStatusComponent), typeof(RelatedOrganizationComponent), typeof(NameAndDescriptionComponent), - typeof(OptionsComponent))] + typeof(OptionsComponent), + typeof(ToolComponent), + typeof(SelectedComponent))] [Writes(typeof(OptionsComponent))] public class ImGuiWindowBridgeEngine : Engine { @@ -54,6 +57,7 @@ public List setOptionMessages; public List gameRateMessages; public List quitGameMessages; + public List toggleToolMessages; bool showBudget { get; } bool showForest { get; } @@ -62,6 +66,7 @@ bool showTrees { get; } public Dictionary windowStatuses { get; } + public Dictionary toolStatuses { get; } public bool showContractIndicator; public List contracts; @@ -103,8 +108,10 @@ this.setOptionMessages = new List(); this.gameRateMessages = new List(); this.quitGameMessages = new List(); + this.toggleToolMessages = new List(); this.windowStatuses = new Dictionary(); + this.toolStatuses = new Dictionary(); this.showContractIndicator = false; this.showBudgetLow = false; @@ -124,6 +131,11 @@ { windowStatuses.Add((Window)type, false); } + + foreach (var type in System.Enum.GetValues(typeof(Tool))) + { + toolStatuses.Add((Tool)type, false); + } } public override void Update(double dt) @@ -209,6 +221,11 @@ SendMessage(message); } + foreach (var message in this.toggleToolMessages) + { + SendMessage(message); + } + foreach (var message in this.setOptionMessages) { foreach (var entity in ReadEntities()) @@ -229,6 +246,12 @@ windowStatuses[type] = visibility; } + foreach (var entity in ReadEntities()) { + var tool = GetComponent(entity).Tool; + var selected = HasComponent(entity) ? GetComponent(entity).selected : false; + toolStatuses[tool] = selected; + } + //reset this.showContractIndicator = false; this.contracts.Clear(); @@ -277,6 +300,7 @@ this.gameRateMessages.Clear(); this.setOptionMessages.Clear(); this.quitGameMessages.Clear(); + this.toggleToolMessages.Clear(); } } } diff --git a/isometric-park-fna/Engines/UIEngine.cs b/isometric-park-fna/Engines/UIEngine.cs --- a/isometric-park-fna/Engines/UIEngine.cs +++ b/isometric-park-fna/Engines/UIEngine.cs @@ -21,11 +21,13 @@ typeof(SelectMessage), typeof(SetDialogMessage), typeof(DialogChoiceMessage), - typeof(AdjustSelection))] + typeof(AdjustSelection), + typeof(ToggleToolMessage))] [Reads(typeof(DialogComponent), typeof(WindowTypeComponent), typeof(VisibilityComponent), - typeof(SelectedComponent))] + typeof(SelectedComponent), + typeof(ToolComponent))] [Writes(typeof(VisibilityComponent), typeof(SelectedComponent))] class UIEngine : Engine @@ -96,6 +98,22 @@ } } + foreach (ref readonly var toolMessage in ReadMessages()) + { + foreach (ref readonly var entity in ReadEntities()) + { + + var tool_type = GetComponent(entity).Tool; + if (tool_type == toolMessage.Tool) + { + var selectedComponent = GetComponent(entity); + selectedComponent.selected = !selectedComponent.selected; + SetComponent(entity, selectedComponent); + } + + } + } + foreach (ref readonly var selectedMessage in ReadMessages()) { SetComponent(selectedMessage.Entity, @@ -106,9 +124,9 @@ if(message.Type == AdjustmentType.Complete) { foreach (ref readonly var entity in ReadEntities()) { var selection = GetComponent(entity); - if(selection.Type == SelectionType.ActiveTool + if(selection.Type == SelectionType.Area && selection.selected) { - SetComponent(entity, new SelectedComponent {Type = SelectionType.ActiveTool, + SetComponent(entity, new SelectedComponent {Type = SelectionType.Area, selected = false }); } diff --git a/isometric-park-fna/FNAGame.cs b/isometric-park-fna/FNAGame.cs --- a/isometric-park-fna/FNAGame.cs +++ b/isometric-park-fna/FNAGame.cs @@ -326,6 +326,10 @@ WorldBuilder.SetComponent(graphWindow, new VisibilityComponent { visible = false }); WorldBuilder.SetComponent(graphWindow, new WindowTypeComponent { type = isometricparkfna.Messages.Window.Graph }); + var preserveTool = WorldBuilder.CreateEntity(); + WorldBuilder.SetComponent(preserveTool, new ToolComponent { Tool = Tool.Preserve }); + WorldBuilder.SetComponent(preserveTool, new SelectedComponent {Type = SelectionType.Tool, selected = true}); + var gameEntity = WorldBuilder.CreateEntity(); diff --git a/isometric-park-fna/Messages/ToggleToolMessage.cs b/isometric-park-fna/Messages/ToggleToolMessage.cs new file mode 100644 --- /dev/null +++ b/isometric-park-fna/Messages/ToggleToolMessage.cs @@ -0,0 +1,11 @@ +using isometricparkfna.Components; + +using Encompass; + +namespace isometricparkfna.Messages +{ + public struct ToggleToolMessage : IMessage + { + public Tool Tool; + } +} diff --git a/isometric-park-fna/Messages/ToggleWindowTypeMessage.cs b/isometric-park-fna/Messages/ToggleWindowTypeMessage.cs --- a/isometric-park-fna/Messages/ToggleWindowTypeMessage.cs +++ b/isometric-park-fna/Messages/ToggleWindowTypeMessage.cs @@ -1,4 +1,3 @@ - using Encompass; namespace isometricparkfna.Messages diff --git a/isometric-park-fna/UI/Menu.cs b/isometric-park-fna/UI/Menu.cs --- a/isometric-park-fna/UI/Menu.cs +++ b/isometric-park-fna/UI/Menu.cs @@ -6,6 +6,7 @@ using isometricparkfna.Engines; using isometricparkfna.Messages; +using isometricparkfna.Components; namespace isometricparkfna.UI { @@ -98,11 +99,20 @@ ImGui.Text(header); - var dimensions = ImGui.CalcTextSize("X Graph X Contracts $ Budget X Forest X News X | Pause 1 2 3 4 5") ; + var dimensions = ImGui.CalcTextSize("| X Graph X Contracts $ Budget X Forest X News X | Pause 1 2 3 4 5") ; // ImGui.SetCursorPosX(width - 520); // Add 12 pixels for each button, plus separator ImGui.SetCursorPosX(width - (dimensions.X + 11*12)); + + if (Menu.activeButton("X Preserve", bridgeEngine.toolStatuses[Tool.Preserve], StyleSets.selected, StyleSets.white)) + { + bridgeEngine.toggleToolMessages.Add(new ToggleToolMessage {Tool = Tool.Preserve}); + + } + + ImGui.Text("|"); + if (Menu.activeButton("\ue03e Graph", bridgeEngine.windowStatuses[Window.Graph], StyleSets.selected, StyleSets.white)) { bridgeEngine.typeMessages.Add(new ToggleWindowTypeMessage {Window = Window.Graph});