示例#1
0
        public static List <Vector2Int> GetMovementOptions(Level level, ChessIndex pieceType, Vector2Int position)
        {
            switch (pieceType)
            {
            case ChessIndex.BLACK_KING:
            case ChessIndex.WHITE_KING:
                return(GetKingMovements(level, position));

            case ChessIndex.BLACK_QUEEN:
            case ChessIndex.WHITE_QUEEN:
                return(GetQueenMovements(level, position));

            case ChessIndex.BLACK_TOWER:
            case ChessIndex.WHITE_TOWER:
                return(GetTowerMovements(level, position));

            case ChessIndex.BLACK_KNIGHT:
            case ChessIndex.WHITE_KNIGHT:
                return(GetKnightMovements(level, position));

            case ChessIndex.BLACK_BISHOP:
            case ChessIndex.WHITE_BISHOP:
                return(GetBishopMovements(level, position));

            case ChessIndex.BLACK_PAWN:
            case ChessIndex.WHITE_PAWN:
                return(GetPawnMovements(level, position));
            }

            return(null);
        }
示例#2
0
        private static List <Vector2Int> GetPawnMovements(Level level, Vector2Int pawnPosition)
        {
            List <Vector2Int> result = new List <Vector2Int>();

            ChessIndex pawnType         = (ChessIndex)level.data.GetItem(pawnPosition).x;
            Vector2Int destination      = pawnType.IsWhite() ? new Vector2Int(0, -1) : new Vector2Int(0, 1);
            Vector2Int extraDestination = pawnType.IsWhite() ? new Vector2Int(0, -2) : new Vector2Int(0, 2);

            destination      += pawnPosition;
            extraDestination += pawnPosition;

            if (level.data.IsItemInBounds(destination))
            {
                int destinationType = level.data.GetItem(destination).x;
                if ((ChessIndex)destinationType == ChessIndex.EMPTY)
                {
                    result.Add(destination);

                    if (level.data.IsItemInBounds(extraDestination) && (pawnType.IsWhite() && pawnPosition.y == 6) || (pawnType.IsBlack() && pawnPosition.y == 1))
                    {
                        int extraDestinationType = level.data.GetItem(extraDestination).x;
                        if (CanMove((int)pawnType, extraDestinationType))
                        {
                            result.Add(extraDestination);
                        }
                    }
                }
            }

            Vector2Int attackOne = pawnType.IsWhite() ? new Vector2Int(1, -1) : new Vector2Int(1, 1);
            Vector2Int attackTwo = pawnType.IsWhite() ? new Vector2Int(-1, -1) : new Vector2Int(-1, 1);

            attackOne += pawnPosition;
            attackTwo += pawnPosition;
            if (level.data.IsItemInBounds(attackOne))
            {
                int destinationType = level.data.GetItem(attackOne).x;
                if (CanEat((int)pawnType, destinationType))
                {
                    result.Add(attackOne);
                }
            }

            if (level.data.IsItemInBounds(attackTwo))
            {
                int destinationType = level.data.GetItem(attackTwo).x;
                if (CanEat((int)pawnType, destinationType))
                {
                    result.Add(attackTwo);
                }
            }

            return(result);
        }
示例#3
0
        private static bool CanEat(ChessIndex pieceType, ChessIndex destinationType)
        {
            if (pieceType.IsWhite() && destinationType.IsBlack())
            {
                return(true);
            }

            if (pieceType.IsBlack() && destinationType.IsWhite())
            {
                return(true);
            }

            return(false);
        }
示例#4
0
        private void Start()
        {
            if (instances == null)
            {
                instances = new List <ChessPieceSelector>();
            }

            if (highlightedFloorTiles == null)
            {
                highlightedFloorTiles = new List <Vector2Int>();
            }

            instances.Add(this);
            isoTransform = GetComponent <IsometricTransform>();
            level        = isoTransform.GetLevel();
            pieceType    = (ChessIndex)level.data.GetItem(isoTransform.coords.x, isoTransform.coords.y).x;
        }
示例#5
0
        public static bool IsSameColor(this ChessIndex ci1, ChessIndex ci2)
        {
            if (ci1.IsBlack() && ci2.IsBlack())
            {
                return(true);
            }

            if (ci1.IsWhite() && ci2.IsWhite())
            {
                return(true);
            }

            if (ci1.IsEmpty() && ci2.IsEmpty())
            {
                return(true);
            }

            return(false);
        }
示例#6
0
 public static bool IsBlack(this ChessIndex ci)
 {
     return((int)ci < 7 && (int)ci != 0);
 }
示例#7
0
 public static bool IsWhite(this ChessIndex ci)
 {
     return((int)ci > 6);
 }
示例#8
0
 public static bool IsEmpty(this ChessIndex ci)
 {
     return(ci == ChessIndex.EMPTY);
 }