/* * East Sout SoEa SoWe * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * . . . R 1 1 1 1 . . . R . . . . . . . B . . . . . . . B . . . . * . . . . . . . . . . . 1 . . . . . . . . 1 . . . . . 1 . . . . . * . . . . . . . . . . . 1 . . . . . . . . . 1 . . . 1 . . . . . . * . . . . . . . . . . . 1 . . . . . . . . . . 1 . 1 . . . . . . . */ private static UInt64 getPositiveRayAttacks(UInt64 occupied, int rayDir, byte square) { UInt64 attacks = rayAttacks[rayDir, square]; UInt64 blocker = attacks & occupied; if (blocker != 0UL) { square = BitOps.bitScanForward(blocker); attacks ^= rayAttacks[rayDir, square]; } return(attacks); }
internal static UInt64 GetAllTargets(UInt64 king, bool pieceColor, Board board) { UInt64 kingMoves = KingAttacks[(BitOps.bitScanForward(king))]; //Cannot castle if already castled or is in check UInt64 empty; if (pieceColor && !board.playerHasCastled && !board.isCheck) { empty = board.GetEmptySquares(); //Right castle if (BitOps.IsBitSet(empty, 61) && BitOps.IsBitSet(empty, 62) && BitOps.IsBitSet(board.WR, 63)) { kingMoves |= (1UL << 62); } //Left castle else if (BitOps.IsBitSet(empty, 59) && BitOps.IsBitSet(empty, 58) && BitOps.IsBitSet(empty, 57) && BitOps.IsBitSet(board.WR, 56)) { kingMoves |= (1UL << 58); } } else if (!pieceColor && !board.computerHasCastled && !board.isCheck) { empty = board.GetEmptySquares(); //Right castle if (BitOps.IsBitSet(empty, 5) && BitOps.IsBitSet(empty, 6) && BitOps.IsBitSet(board.BR, 7)) { kingMoves |= (1UL << 6); } //Left castle else if (BitOps.IsBitSet(empty, 3) && BitOps.IsBitSet(empty, 2) && BitOps.IsBitSet(empty, 1) && BitOps.IsBitSet(board.BR, 0)) { kingMoves |= (1UL << 2); } } return(kingMoves & ~board.GetColorPieces(pieceColor)); }