# HG changeset patch # User Alys Brooks # Date 2022-03-15 08:50:14 # Node ID 092dfa9d367c3a2447bef8eb57fc2a2e3b265947 # Parent b60c04fb0618b1ddcdfe0f61ed46f963abe65378 Add Dezone. diff --git a/isometric-park-fna/Components/ToggleToolComponents.cs b/isometric-park-fna/Components/ToggleToolComponents.cs --- a/isometric-park-fna/Components/ToggleToolComponents.cs +++ b/isometric-park-fna/Components/ToggleToolComponents.cs @@ -7,7 +7,8 @@ public enum Tool { None, - Preserve + Preserve, + Dezone } 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 @@ -24,6 +24,7 @@ typeof(PreserveComponent), typeof(SelectedComponent), typeof(ToolComponent))] + [Sends(typeof(ChangeContractStatusMessage))] public class BuildToolEngine : Engine { private CellMap Map; @@ -47,9 +48,37 @@ } } + private void clear(Vector2[] clear_squares) { + List entities = new List(); + foreach(ref readonly var entity in ReadEntities() ) { + var squares = GetComponent(entity).squares; + + foreach(var clear_square in clear_squares) { + + foreach(var square in squares) { + if(square == clear_square) { + entities.Add(entity); + break; + } + } + } + } + + foreach(var entity in entities) { + Logging.Debug("Deleting entity."); + + if (HasComponent(entity)) { + SendMessage(new ChangeContractStatusMessage {newStatus = ContractStatus.Broken, Entity = entity}); + } + else { + Destroy(entity); + } + } + + } + public override void Update(double dt) { var occupied = new List(); - Dictionary statuses = new Dictionary(); foreach (var entity in ReadEntities()) { @@ -78,8 +107,6 @@ occupied.AddRange(entitySquares); } - - foreach (ref readonly var message in ReadMessages()) { if (message.Start.X >= 0 && message.Start.X < this.Map.MapWidth @@ -114,19 +141,63 @@ foreach (var i in step_until(area.squares[0].X, end_x)) { foreach (var j in step_until(area.squares[0].Y, end_y)) { var newSquare = new Vector2(i, j); + newSquares.Add(newSquare); + } + } + + SetComponent(entity, new AreaComponent { squares = newSquares.ToArray() /*new[]{ area.squares[0], message.End}*/}); + } + } + } + } + } + else if (statuses.ContainsKey(Tool.Dezone) && statuses[Tool.Dezone]) { + + foreach (ref readonly var message in ReadMessages()) + { + if (message.Start.X >= 0 && message.Start.X < this.Map.MapWidth + && message.Start.Y >= 0 && message.Start.Y < this.Map.MapHeight) { + var entity = CreateEntity(); + + AddComponent(entity, new AreaComponent { squares = new[] {message.Start} }); + 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.Area + && selection.selected) { + if(message.Type == AdjustmentType.Clear) { + Destroy(entity); + } + else if(message.Type == AdjustmentType.Complete) { + var squares = GetComponent(entity).squares; + clear(squares); + } + else { + var area = GetComponent(entity); + + var newSquares = new List(); + + var end_x = MathUtils.Clamp(message.End.X, 0.0f, this.Map.MapWidth); + var end_y = MathUtils.Clamp(message.End.Y, 0.0f, this.Map.MapHeight); + + foreach (var i in step_until(area.squares[0].X, end_x)) { + foreach (var j in step_until(area.squares[0].Y, end_y)) { + var newSquare = new Vector2(i, j); if (!occupied.Contains(newSquare)) { newSquares.Add(newSquare); } } } - - SetComponent(entity, new AreaComponent { squares = newSquares.ToArray() /*( new[]{ area.squares[0], message.End}*/}); - } - } - } - - } - } + SetComponent(entity, new AreaComponent { squares = newSquares.ToArray() /*new[]{ area.squares[0], message.End}*/}); + } + } + } + } + } } } } 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 @@ -98,6 +98,8 @@ } } + + //Set tool foreach (ref readonly var toolMessage in ReadMessages()) { foreach (ref readonly var entity in ReadEntities()) @@ -106,7 +108,6 @@ var tool_type = GetComponent(entity).Tool; if (tool_type == toolMessage.Tool) { - //Clear selections foreach (ref readonly var inner_entity in ReadEntities()) { @@ -118,7 +119,6 @@ selectedComponent.selected = !selectedComponent.selected; SetComponent(entity, selectedComponent); } - } } 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 @@ -330,6 +330,10 @@ WorldBuilder.SetComponent(preserveTool, new ToolComponent { Tool = Tool.Preserve }); WorldBuilder.SetComponent(preserveTool, new SelectedComponent {Type = SelectionType.Tool, selected = true}); + var dezoneTool = WorldBuilder.CreateEntity(); + WorldBuilder.SetComponent(dezoneTool, new ToolComponent { Tool = Tool.Dezone }); + WorldBuilder.SetComponent(dezoneTool, new SelectedComponent {Type = SelectionType.Tool, selected = false}); + var gameEntity = WorldBuilder.CreateEntity(); diff --git a/isometric-park-fna/Simulation.cs b/isometric-park-fna/Simulation.cs --- a/isometric-park-fna/Simulation.cs +++ b/isometric-park-fna/Simulation.cs @@ -290,7 +290,7 @@ for(int j = 0; j < this.map.MapHeight; j++) { var cell = this.map.cells[i][j]; - var rate = interpolate((8 - (double)this.PreserveCounts[i, j] / 8.0d, PRESERVE_SPONTANEOUS_NEW_TREE_CHANCE, SPONTANEOUS_NEW_TREE_CHANCE); + var rate = interpolate(8 - (double)this.PreserveCounts[i, j] / 8.0d, PRESERVE_SPONTANEOUS_NEW_TREE_CHANCE, SPONTANEOUS_NEW_TREE_CHANCE); if (random.NextDouble() > rate) { var random_type = random.Next(0, 4); 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 @@ -99,7 +99,7 @@ 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 Preserve X Dezone | 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 @@ -108,7 +108,10 @@ if (Menu.activeButton("X Preserve", bridgeEngine.toolStatuses[Tool.Preserve], StyleSets.selected, StyleSets.white)) { bridgeEngine.toggleToolMessages.Add(new ToggleToolMessage {Tool = Tool.Preserve}); - + } + if (Menu.activeButton("X Dezone", bridgeEngine.toolStatuses[Tool.Dezone], StyleSets.selected, StyleSets.white)) + { + bridgeEngine.toggleToolMessages.Add(new ToggleToolMessage {Tool = Tool.Dezone}); } ImGui.Text("|");