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 @@ -9,7 +9,8 @@ None, Preserve, Dezone, - Tower + Tower, + Bulldozer } 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 @@ -52,7 +52,7 @@ } } - private void clear(Vector2[] clear_squares) { + private void clear_areas(Vector2[] clear_squares) { List entities = new List(); foreach(ref readonly var entity in ReadEntities() ) { var squares = GetComponent(entity).squares; @@ -80,6 +80,24 @@ } } + private void clear_structures(Vector2[] clear_squares) { + List entities = new List(); + foreach(ref readonly var entity in ReadEntities() ) { + var square = GetComponent(entity).Square; + + foreach(var clear_square in clear_squares) { + if(square == clear_square) { + entities.Add(entity); + } + } + } + + foreach(var entity in entities) { + Logging.Debug("Deleting entity."); + Destroy(entity); + } + } + public List GetOccupied() { List occupied = new List(); @@ -165,7 +183,6 @@ } } 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 @@ -188,7 +205,7 @@ } else if(message.Type == AdjustmentType.Complete) { var squares = GetComponent(entity).squares; - clear(squares); + clear_areas(squares); } else { var area = GetComponent(entity); @@ -233,7 +250,7 @@ } foreach (ref readonly var message in ReadMessages()) { - foreach (ref readonly var entity in ReadEntities()) { + foreach (ref readonly var entity in ReadEntities()) { var selection = GetComponent(entity); if (selection.Type == SelectionType.Area @@ -241,7 +258,7 @@ if(message.Type == AdjustmentType.Clear) { Destroy(entity); } - else if(message.Type == AdjustmentType.Complete) { + else if (message.Type == AdjustmentType.Complete) { var point = GetComponent(entity); var structure_entity = CreateEntity(); var cell = this.Map.cells[(int)point.Square.X][(int)point.Square.Y]; @@ -251,7 +268,7 @@ AddComponent(structure_entity, new PointComponent {Square = point.Square, Tool = point.Tool} ); - AddComponent(structure_entity, + AddComponent(structure_entity, new StructureComponent { Structure = Structure.Tower}); Destroy(entity); SendMessage(new PlaySoundMessage { SoundName = "ConstructionShort" }); @@ -270,6 +287,53 @@ } } } + + else if ((statuses.ContainsKey(Tool.Bulldozer) && statuses[Tool.Bulldozer])) { + 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}, + Tool = Tool.Bulldozer }); + 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_structures(squares); + Destroy(entity); //Dezone destroys itself, so it doesn't need this command. + } + 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); + newSquares.Add(newSquare); + } + } + SetComponent(entity, new AreaComponent { squares = newSquares.ToArray(), Tool = area.Tool}); + } + } + } + } + } } } } 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 Tower X Preserve X Dezone | X Graph X Contracts $ Budget X Forest X News X | Pause 1 2 3 4 5") ; + var dimensions = ImGui.CalcTextSize("X Tower X Preserve X Dezone X Bulldozer | 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 @@ -117,7 +117,10 @@ { bridgeEngine.toggleToolMessages.Add(new ToggleToolMessage {Tool = Tool.Dezone}); } - + if (Menu.activeButton("\ue122 Bulldozer", bridgeEngine.toolStatuses[Tool.Bulldozer], StyleSets.selected, StyleSets.white)) + { + bridgeEngine.toggleToolMessages.Add(new ToggleToolMessage {Tool = Tool.Bulldozer}); + } ImGui.Text("|"); if (Menu.activeButton("\ue03e Graph", bridgeEngine.windowStatuses[Window.Graph], StyleSets.selected, StyleSets.white))