X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmovegen.cpp;h=ed204672378fa81edeaacf417494982c1ac36b6a;hb=e56342ed002b2d567fbecd2e4432b881f1b244bc;hp=0301e90648c8314ab6db53b3e9a47bfbfefa2215;hpb=34178205fc762638e633a61ecc45360e1662bdee;p=stockfish diff --git a/src/movegen.cpp b/src/movegen.cpp index 0301e906..ed204672 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -32,27 +32,22 @@ (*mlist++).move = make_move(to - (d), to); } namespace { - enum CastlingSide { KING_SIDE, QUEEN_SIDE }; - template MoveStack* generate_castle(const Position& pos, MoveStack* mlist, Color us) { - const CastleRight CR[] = { Side ? WHITE_OOO : WHITE_OO, - Side ? BLACK_OOO : BLACK_OO }; + CastleRight cr = CastleRight((Side == KING_SIDE ? WHITE_OO : WHITE_OOO) << us); - if (pos.castle_impeded(CR[us]) || !pos.can_castle(CR[us])) + if (pos.castle_impeded(us, Side) || !pos.can_castle(cr)) return mlist; // After castling, the rook and king final positions are the same in Chess960 // as they would be in standard chess. Square kfrom = pos.king_square(us); - Square rfrom = pos.castle_rook_square(CR[us]); Square kto = relative_square(us, Side == KING_SIDE ? SQ_G1 : SQ_C1); + Square rfrom = pos.castle_rook_square(us, Side); Bitboard enemies = pos.pieces(~us); assert(!pos.in_check()); - assert(pos.piece_on(kfrom) == make_piece(us, KING)); - assert(pos.piece_on(rfrom) == make_piece(us, ROOK)); for (Square s = std::min(kfrom, kto), e = std::max(kfrom, kto); s <= e; s++) if ( s != kfrom // We are not in check @@ -63,7 +58,7 @@ namespace { // when moving the castling rook we do not discover some hidden checker. // For instance an enemy queen in SQ_A1 when castling rook is in SQ_B1. if ( pos.is_chess960() - && (pos.attackers_to(kto, pos.occupied_squares() ^ rfrom) & enemies)) + && (pos.attackers_to(kto, pos.pieces() ^ rfrom) & enemies)) return mlist; (*mlist++).move = make_castle(kfrom, rfrom); @@ -142,7 +137,7 @@ namespace { // Single and double pawn pushes, no promotions if (Type != MV_CAPTURE) { - emptySquares = (Type == MV_QUIET ? target : ~pos.occupied_squares()); + emptySquares = (Type == MV_QUIET ? target : ~pos.pieces()); b1 = move_pawns(pawnsNotOn7) & emptySquares; b2 = move_pawns(b1 & TRank3BB) & emptySquares; @@ -180,7 +175,7 @@ namespace { if (pawnsOn7 && (Type != MV_EVASION || (target & TRank8BB))) { if (Type == MV_CAPTURE) - emptySquares = ~pos.occupied_squares(); + emptySquares = ~pos.pieces(); if (Type == MV_EVASION) emptySquares &= target; @@ -233,7 +228,7 @@ namespace { if (*pl != SQ_NONE) { - target = ci.checkSq[Pt] & ~pos.occupied_squares(); // Non capture checks only + target = ci.checkSq[Pt] & ~pos.pieces(); // Non capture checks only do { from = *pl; @@ -308,10 +303,10 @@ MoveStack* generate(const Position& pos, MoveStack* mlist) { target = pos.pieces(~us); else if (Type == MV_QUIET) - target = ~pos.occupied_squares(); + target = ~pos.pieces(); else if (Type == MV_NON_EVASION) - target = pos.pieces(~us) | ~pos.occupied_squares(); + target = ~pos.pieces(us); mlist = (us == WHITE ? generate_pawn_moves(pos, mlist, target) : generate_pawn_moves(pos, mlist, target)); @@ -356,7 +351,7 @@ MoveStack* generate(const Position& pos, MoveStack* mlist) { if (pt == PAWN) continue; // Will be generated togheter with direct checks - Bitboard b = pos.attacks_from(Piece(pt), from) & ~pos.occupied_squares(); + Bitboard b = pos.attacks_from(Piece(pt), from) & ~pos.pieces(); if (pt == KING) b &= ~PseudoAttacks[QUEEN][ci.ksq];