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 @@ -21,7 +21,9 @@ [Reads(typeof(SelectedComponent), typeof(ContractStatusComponent), typeof(AreaComponent), - typeof(PreserveComponent))] + typeof(PreserveComponent), + typeof(SelectedComponent), + typeof(ToolComponent))] public class BuildToolEngine : Engine { private CellMap Map; @@ -47,72 +49,84 @@ public override void Update(double dt) { var occupied = new List(); - foreach (var (entity, status) in ReadEntities() - .WhereF((e) => HasComponent(e)) - .SelectWhereF((e) => (e, GetComponent(e)), - (e) => ((e.Item2.status != ContractStatus.Broken) - && (e.Item2.status != ContractStatus.Rejected) - && (e.Item2.status != ContractStatus.Expired) - && (e.Item2.status != ContractStatus.Completed) - && (e.Item2.status != ContractStatus.Proposed)) - )) { - var entitySquares = GetComponent(entity).squares; - occupied.AddRange(entitySquares); + + Dictionary statuses = new Dictionary(); + + foreach (var entity in ReadEntities()) { + var tool = GetComponent(entity); + var selected = GetComponent(entity); + + statuses.Add(tool.Tool, selected.selected); } - foreach (var entity in ReadEntities() - .WhereF((e) => HasComponent(e))) { - var entitySquares = GetComponent(entity).squares; - occupied.AddRange(entitySquares); - } + + if (statuses.ContainsKey(Tool.Preserve) && statuses[Tool.Preserve]) { + foreach (var (entity, status) in ReadEntities() + .WhereF((e) => HasComponent(e)) + .SelectWhereF((e) => (e, GetComponent(e)), + (e) => ((e.Item2.status != ContractStatus.Broken) + && (e.Item2.status != ContractStatus.Rejected) + && (e.Item2.status != ContractStatus.Expired) + && (e.Item2.status != ContractStatus.Completed) + && (e.Item2.status != ContractStatus.Proposed)) + )) { + var entitySquares = GetComponent(entity).squares; + occupied.AddRange(entitySquares); + } + foreach (var entity in ReadEntities() + .WhereF((e) => HasComponent(e))) { + var entitySquares = GetComponent(entity).squares; + occupied.AddRange(entitySquares); + } - 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()) + { + if (message.Start.X >= 0 && message.Start.X < this.Map.MapWidth + && message.Start.Y >= 0 && message.Start.Y < this.Map.MapHeight) { + var entity = CreateEntity(); - 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) { - SetComponent(entity, new PreserveComponent {}); - // SetComponent(entity, new SelectedComponent {selected = false }); - } - 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}*/}); - } + 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) { + SetComponent(entity, new PreserveComponent {}); + // SetComponent(entity, new SelectedComponent {selected = false }); + } + 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}*/}); + } + } + } + + } + } } } } diff --git a/isometric-park-fna/Engines/InputEngine.cs b/isometric-park-fna/Engines/InputEngine.cs --- a/isometric-park-fna/Engines/InputEngine.cs +++ b/isometric-park-fna/Engines/InputEngine.cs @@ -241,7 +241,7 @@ } if (mouseCur.LeftButton == ButtonState.Pressed && mousePrev.LeftButton == ButtonState.Released - && keyboardCur.IsKeyDown(Keys.LeftShift) + // && keyboardCur.IsKeyDown(Keys.LeftShift) ) { SendMessage(new SpawnSelection {Start = CellMap.calculateMousegrid(original_point)}); diff --git a/isometric-park-fna/Renderers/AreaRenderer.cs b/isometric-park-fna/Renderers/AreaRenderer.cs --- a/isometric-park-fna/Renderers/AreaRenderer.cs +++ b/isometric-park-fna/Renderers/AreaRenderer.cs @@ -36,8 +36,8 @@ if (!HasComponent(entity) ) { - Quad.FillSquares(batch, areaComponent.squares, Color.Red, 0.5f, 0.79f); - Tile.DrawOutlinedSquares(batch, areaComponent.squares, Color.Red); + Quad.FillSquares(batch, areaComponent.squares, Color.Blue, 0.5f, 0.79f); + Tile.DrawOutlinedSquares(batch, areaComponent.squares, Color.Blue); } else if ((!HasComponent(entity) || GetComponent(entity).status == ContractStatus.Accepted)