Esempio n. 1
0
        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());
        }
Esempio n. 2
0
        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();
                }
            }
        }