Show More
Commit Description:
Add tool selection button.
Commit Description:
Add tool selection button.
References:
File last commit:
Show/Diff file:
Action:
isometric-park-fna/Engines/BuildToolEngine.cs
119 lines | 4.9 KiB | text/x-csharp | CSharpLexer
119 lines | 4.9 KiB | text/x-csharp | CSharpLexer
r536 | using System; | |||
r537 | using System.Linq; | |||
using System.Collections.Generic; | ||||
r536 | using Microsoft.Xna.Framework; | |||
using Microsoft.Xna.Framework.Graphics; | ||||
using Microsoft.Xna.Framework.Input; | ||||
using Encompass; | ||||
r540 | using JM.LinqFaster; | |||
r536 | ||||
using isometricparkfna.Messages; | ||||
using isometricparkfna.Components; | ||||
namespace isometricparkfna.Engines { | ||||
[Receives(typeof(SpawnSelection), | ||||
r538 | typeof(AdjustSelection))] | |||
r539 | [Writes(typeof(AreaComponent), | |||
// typeof(SelectedComponent), | ||||
typeof(PreserveComponent))] | ||||
r537 | [Reads(typeof(SelectedComponent), | |||
r542 | typeof(ContractStatusComponent), | |||
r540 | typeof(AreaComponent), | |||
typeof(PreserveComponent))] | ||||
r536 | public class BuildToolEngine : Engine { | |||
r537 | ||||
r538 | private CellMap Map; | |||
public BuildToolEngine(CellMap map) { | ||||
this.Map = map; | ||||
} | ||||
r537 | private System.Collections.Generic.IEnumerable<float> step_until(float start, float stop) { | |||
if (stop >= start) { | ||||
for(float i = start; i <= stop; i++) | ||||
{ | ||||
yield return i; | ||||
} | ||||
} | ||||
else { | ||||
for(float i = start; i >= stop; i--) | ||||
{ | ||||
yield return i; | ||||
} | ||||
} | ||||
} | ||||
r536 | public override void Update(double dt) { | |||
r540 | var occupied = new List<Vector2>(); | |||
foreach (var (entity, status) in ReadEntities<AreaComponent>() | ||||
r542 | .WhereF((e) => HasComponent<ContractStatusComponent>(e)) | |||
.SelectWhereF((e) => (e, GetComponent<ContractStatusComponent>(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)) | ||||
)) { | ||||
r540 | var entitySquares = GetComponent<AreaComponent>(entity).squares; | |||
occupied.AddRange(entitySquares); | ||||
} | ||||
foreach (var entity in ReadEntities<AreaComponent>() | ||||
r542 | .WhereF((e) => HasComponent<PreserveComponent>(e))) { | |||
r540 | var entitySquares = GetComponent<AreaComponent>(entity).squares; | |||
occupied.AddRange(entitySquares); | ||||
} | ||||
r536 | ||||
foreach (ref readonly var message in ReadMessages<SpawnSelection>()) | ||||
{ | ||||
r539 | if (message.Start.X >= 0 && message.Start.X < this.Map.MapWidth | |||
&& message.Start.Y >= 0 && message.Start.Y < this.Map.MapHeight) { | ||||
r542 | var entity = CreateEntity(); | |||
r536 | ||||
r542 | AddComponent(entity, new AreaComponent { squares = new[] {message.Start} }); | |||
r543 | AddComponent(entity, new SelectedComponent { selected = true, Type= SelectionType.Area}); | |||
r539 | } | |||
r536 | } | |||
r537 | ||||
r539 | foreach (ref readonly var message in ReadMessages<AdjustSelection>()) { | |||
foreach (ref readonly var entity in ReadEntities<SelectedComponent>()) { | ||||
r537 | var selection = GetComponent<SelectedComponent>(entity); | |||
r543 | if(selection.Type == SelectionType.Area | |||
r539 | && selection.selected) { | |||
if(message.Type == AdjustmentType.Clear) { | ||||
r537 | Destroy(entity); | |||
} | ||||
r539 | else if(message.Type == AdjustmentType.Complete) { | |||
SetComponent(entity, new PreserveComponent {}); | ||||
// SetComponent(entity, new SelectedComponent {selected = false }); | ||||
} | ||||
r537 | else { | |||
var area = GetComponent<AreaComponent>(entity); | ||||
var newSquares = new List<Vector2>(); | ||||
r538 | 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); | ||||
r536 | ||||
r538 | foreach (var i in step_until(area.squares[0].X, end_x)) { | |||
foreach (var j in step_until(area.squares[0].Y, end_y)) { | ||||
r540 | var newSquare = new Vector2(i, j); | |||
if (!occupied.Contains(newSquare)) { | ||||
newSquares.Add(newSquare); | ||||
} | ||||
r537 | } | |||
} | ||||
SetComponent(entity, new AreaComponent { squares = newSquares.ToArray() /*( new[]{ area.squares[0], message.End}*/}); | ||||
r538 | } | |||
} | ||||
} | ||||
r537 | ||||
r538 | } | |||
} | ||||
} | ||||
} | ||||
r537 | ||||