private Coordinate[] GetNeighbours(Coordinate coordinate) { var result = new List <Coordinate>(6); var coord1 = new Coordinate(coordinate.Q, coordinate.R - 1); if (Hexes.ContainsKey(coord1)) { result.Add(coord1); } var coord2 = new Coordinate(coordinate.Q + 1, coordinate.R - 1); if (Hexes.ContainsKey(coord2)) { result.Add(coord2); } var coord3 = new Coordinate(coordinate.Q - 1, coordinate.R); if (Hexes.ContainsKey(coord3)) { result.Add(coord3); } var coord4 = new Coordinate(coordinate.Q + 1, coordinate.R); if (Hexes.ContainsKey(coord4)) { result.Add(coord4); } var coord5 = new Coordinate(coordinate.Q - 1, coordinate.R + 1); if (Hexes.ContainsKey(coord5)) { result.Add(coord5); } var coord6 = new Coordinate(coordinate.Q, coordinate.R + 1); if (Hexes.ContainsKey(coord6)) { result.Add(coord6); } return(result.ToArray()); }
public override void Update(GameManager gameManager, int deltaTime) { var realPoint = gameManager.Input.PointerPosition.ToVector2() + gameManager.Camera.Offset; Coordinate = GetCoordinate(realPoint); if (gameManager.Input.IsLeftButtonPressed) { if (!Hexes.ContainsKey(Coordinate)) { return; } var pawn = Hexes[Coordinate].Pawn; if (pawn == null) { if (_selectedPawn != null) { _selectedPawn.Selected = false; _selectedPawn = null; PossibleMoves.Clear(); } return; } pawn.Selected = true; _selectedPawn = pawn; var moveQueue = new Queue <Move>(); var openingMoves = GetNeighbours(Coordinate); foreach (var openingMove in openingMoves) { var hex = Hexes[openingMove]; if (!hex.Passable) { continue; } moveQueue.Enqueue(new Move(hex)); } var possibleMoves = new List <Coordinate>(); var visitedCoordinates = new HashSet <Coordinate>(); while (moveQueue.Count > 0) { var move = moveQueue.Dequeue(); if (visitedCoordinates.Contains(move.Hex.Coordinate)) { continue; } visitedCoordinates.Add(move.Hex.Coordinate); if (move.TotalMoveCost > pawn.MoveSpeed) { continue; } possibleMoves.Add(move.Hex.Coordinate); var newMoves = GetNeighbours(move.Hex.Coordinate); foreach (var newMove in newMoves) { if (visitedCoordinates.Contains(newMove)) { continue; } var hex = Hexes[newMove]; if (!hex.Passable) { continue; } moveQueue.Enqueue(new Move(move, hex)); } } PossibleMoves = possibleMoves; } if (gameManager.Input.IsRightButtonPressed && _selectedPawn != null) { if (PossibleMoves.Contains(Coordinate)) { _selectedPawn.Hex.Pawn = null; _selectedPawn.Hex = Hexes[Coordinate]; _selectedPawn.Hex.Pawn = _selectedPawn; _selectedPawn.Selected = false; PossibleMoves.Clear(); } } }