private void GetPotentialQueenMoves(Board board, Bitboard allowedFrom, Bitboard allowedTo, Move[] moves, ref int moveCount)
        {
            var piece         = (Piece)(ChessPiece.Queen | board.ColorToMove);
            var piecesBitmask = board.BitBoard[piece] & allowedFrom;
            var ownPieces     = board.WhiteToMove ? board.WhitePieces : board.BlackPieces;

            while (piecesBitmask != 0)
            {
                var      position = piecesBitmask.BitScanForward();
                Bitboard slide    = _slideMoveGenerator.AllSlide(board.AllPieces, position);
                slide &= ~ownPieces;
                slide &= allowedTo;
                BitmaskToMoves(board, slide, position, piece, moves, ref moveCount);
                piecesBitmask &= piecesBitmask - 1;
            }
        }
        void EvalQueen(Board b, EvaluationScores v, Position sq, Piece side, ulong pinned)
        {
            int att = 0;
            int mob = 0;

            //var sqCol = sq & 7;
            var sqRow = sq >> 3;

            var seventh = EvaluationData.seventh[side];
            var eighth  = EvaluationData.eighth[side];

            if
            (
                sqRow == seventh &&
                (
                    (b.BitBoard[ChessPiece.Pawn + side ^ 1] & BitboardConstants.Ranks[seventh]) != 0 ||
                    (b.BitBoard[ChessPiece.King + side ^ 1] & BitboardConstants.Ranks[eighth]) != 0
                )
            )
            {
                v.mgMob[side] += 5;
                v.egMob[side] += 10;
            }

            /**************************************************************************
            *  A queen should not be developed too early                              *
            **************************************************************************/

            if ((side == ChessPiece.White && sqRow > 1) || (side == ChessPiece.Black && sqRow < 6))
            {
                if (isPiece(b, side, ChessPiece.Knight, REL_SQ(side, ChessPosition.B1)))
                {
                    v.positionalThemes[side] -= 2;
                }
                if (isPiece(b, side, ChessPiece.Bishop, REL_SQ(side, ChessPosition.C1)))
                {
                    v.positionalThemes[side] -= 2;
                }
                if (isPiece(b, side, ChessPiece.Bishop, REL_SQ(side, ChessPosition.F1)))
                {
                    v.positionalThemes[side] -= 2;
                }
                if (isPiece(b, side, ChessPiece.Knight, REL_SQ(side, ChessPosition.G1)))
                {
                    v.positionalThemes[side] -= 2;
                }
            }

            /**************************************************************************
            *  Collect data about mobility and king attacks                           *
            **************************************************************************/

            var slide           = _slideGenerator.AllSlide(b.AllPieces, sq);
            var opponent        = side == ChessPiece.White ? b.BlackPieces : b.WhitePieces;
            var emptyOrOpponent = (b.EmptySquares | opponent) & slide;

            var bitboard = 1UL << sq;

            if ((bitboard & pinned) == 0)
            {
                mob += emptyOrOpponent.PopCount();
            }

            var emptyOrOpponentNearKing = emptyOrOpponent & BitboardConstants.KingExtendedJumps[side ^ 1][b.KingPositions[side ^ 1]];

            att += emptyOrOpponentNearKing.PopCount();

            v.mgMob[side] += 1 * (mob - 14);
            v.egMob[side] += 2 * (mob - 14);

            if (att > 0)
            {
                v.attCnt[side]++;
                v.attWeight[side] += 4 * att;
            }

            int tropism = getTropism(sq, b.KingPositions[side ^ 1]);

            v.mgTropism[side] += 2 * tropism;
            v.egTropism[side] += 4 * tropism;
        }