X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmovegen.cpp;h=ed09d44b7a82c7b63d93c49fb1af9068e7b35a06;hb=84d6fe0f31069bc612f856ab7cd54d9aad7907ca;hp=c7f729e51f397554cfb1dae589fa95ec66216302;hpb=0e0adfe2e1a01ca5f46af495e14c41e23ffaa4d0;p=stockfish diff --git a/src/movegen.cpp b/src/movegen.cpp index c7f729e5..ed09d44b 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -253,13 +253,14 @@ MoveStack* generate_evasions(const Position& pos, MoveStack* mlist, Bitboard pin } // Generate evasions for king - Bitboard b1 = pos.piece_attacks(ksq) & ~pos.pieces_of_color(us) & ~checkersAttacks; + Bitboard b1 = pos.piece_attacks_from(ksq) & ~pos.pieces_of_color(us) & ~checkersAttacks; + Bitboard enemy = pos.pieces_of_color(them); while (b1) { to = pop_1st_bit(&b1); // Note that we can use attackers_to() only because we // have already removed slider checkers. - if (!pos.attackers_to(to, them)) + if (!(pos.attackers_to(to) & enemy)) (*mlist++).move = make_move(ksq, to); } @@ -275,7 +276,7 @@ MoveStack* generate_evasions(const Position& pos, MoveStack* mlist, Bitboard pin // Generate captures of the checking piece // Pawn captures - b1 = pos.pawn_attacks(checksq, them) & pos.pieces(PAWN, us) & ~pinned; + b1 = pos.pawn_attacks_from(checksq, them) & pos.pieces(PAWN, us) & ~pinned; while (b1) { from = pop_1st_bit(&b1); @@ -290,9 +291,9 @@ MoveStack* generate_evasions(const Position& pos, MoveStack* mlist, Bitboard pin } // Pieces captures - b1 = ( (pos.piece_attacks(checksq) & pos.pieces(KNIGHT, us)) - | (pos.piece_attacks(checksq) & pos.pieces(BISHOP, QUEEN, us)) - | (pos.piece_attacks(checksq) & pos.pieces(ROOK, QUEEN, us)) ) & ~pinned; + b1 = ( (pos.piece_attacks_from(checksq) & pos.pieces(KNIGHT, us)) + | (pos.piece_attacks_from(checksq) & pos.pieces(BISHOP, QUEEN, us)) + | (pos.piece_attacks_from(checksq) & pos.pieces(ROOK, QUEEN, us)) ) & ~pinned; while (b1) { @@ -326,7 +327,7 @@ MoveStack* generate_evasions(const Position& pos, MoveStack* mlist, Bitboard pin if (pos.ep_square() != SQ_NONE && (checkers & pos.pieces(PAWN, them))) { to = pos.ep_square(); - b1 = pos.pawn_attacks(to, them) & pos.pieces(PAWN, us); + b1 = pos.pawn_attacks_from(to, them) & pos.pieces(PAWN, us); // The checking pawn cannot be a discovered (bishop) check candidate // otherwise we were in check also before last double push move. @@ -441,7 +442,7 @@ bool move_is_legal(const Position& pos, const Move m, Bitboard pinned) { // is occupied or under attack. for (s = Min(from, g1); s <= Max(from, g1); s++) if ( (s != from && s != to && !pos.square_is_empty(s)) - || pos.attackers_to(s, them)) + ||(pos.attackers_to(s) & pos.pieces_of_color(them))) illegal = true; // Check if any of the squares between king and rook @@ -472,7 +473,7 @@ bool move_is_legal(const Position& pos, const Move m, Bitboard pinned) { for (s = Min(from, c1); s <= Max(from, c1); s++) if( (s != from && s != to && !pos.square_is_empty(s)) - || pos.attackers_to(s, them)) + ||(pos.attackers_to(s) & pos.pieces_of_color(them))) illegal = true; for (s = Min(to, d1); s <= Max(to, d1); s++) @@ -557,7 +558,7 @@ bool move_is_legal(const Position& pos, const Move m, Bitboard pinned) { } // Luckly we can handle all the other pieces in one go - return ( pos.piece_attacks_square(pos.piece_on(from), from, to) + return ( bit_is_set(pos.piece_attacks_from(pc, from), to) && pos.pl_move_is_legal(m, pinned) && !move_is_promotion(m)); } @@ -598,7 +599,7 @@ namespace { for (int i = 0, e = pos.piece_count(us, Piece); i < e; i++) { from = pos.piece_list(us, Piece, i); - b = pos.piece_attacks(from) & target; + b = pos.piece_attacks_from(from) & target; SERIALIZE_MOVES(b); } return mlist; @@ -616,7 +617,7 @@ namespace { if (pinned && bit_is_set(pinned, from)) continue; - b = pos.piece_attacks(from) & target; + b = pos.piece_attacks_from(from) & target; SERIALIZE_MOVES(b); } return mlist; @@ -628,7 +629,7 @@ namespace { Bitboard b; Square from = pos.king_square(us); - b = pos.piece_attacks(from) & target; + b = pos.piece_attacks_from(from) & target; SERIALIZE_MOVES(b); return mlist; } @@ -700,7 +701,7 @@ namespace { assert(Us != WHITE || square_rank(pos.ep_square()) == RANK_6); assert(Us != BLACK || square_rank(pos.ep_square()) == RANK_3); - Bitboard b1 = pawns & pos.pawn_attacks(pos.ep_square(), Them); + Bitboard b1 = pawns & pos.pawn_attacks_from(pos.ep_square(), Them); assert(b1 != EmptyBoardBB); while (b1) @@ -819,11 +820,11 @@ namespace { // Direct checks, single pawn pushes Bitboard empty = pos.empty_squares(); b2 = move_pawns(b1) & empty; - b3 = b2 & pos.pawn_attacks(ksq, Them); + b3 = b2 & pos.pawn_attacks_from(ksq, Them); SERIALIZE_MOVES_D(b3, -TDELTA_N); // Direct checks, double pawn pushes - b3 = move_pawns(b2 & TRank3BB) & empty & pos.pawn_attacks(ksq, Them); + b3 = move_pawns(b2 & TRank3BB) & empty & pos.pawn_attacks_from(ksq, Them); SERIALIZE_MOVES_D(b3, -TDELTA_N -TDELTA_N); return mlist; } @@ -839,7 +840,7 @@ namespace { while (b) { Square from = pop_1st_bit(&b); - Bitboard bb = pos.piece_attacks(from) & pos.empty_squares(); + Bitboard bb = pos.piece_attacks_from(from) & pos.empty_squares(); if (Piece == KING) bb &= ~QueenPseudoAttacks[ksq]; @@ -850,7 +851,7 @@ namespace { b = target & ~dc; if (Piece != KING || b) { - Bitboard checkSqs = pos.piece_attacks(ksq) & pos.empty_squares(); + Bitboard checkSqs = pos.piece_attacks_from(ksq) & pos.empty_squares(); if (!checkSqs) return mlist; @@ -862,7 +863,7 @@ namespace { || (Piece == BISHOP && !(BishopPseudoAttacks[from] & checkSqs))) continue; - Bitboard bb = pos.piece_attacks(from) & checkSqs; + Bitboard bb = pos.piece_attacks_from(from) & checkSqs; SERIALIZE_MOVES(bb); } } @@ -942,7 +943,7 @@ namespace { // It is a bit complicated to correctly handle Chess960 for (s = Min(ksq, s1); s <= Max(ksq, s1); s++) if ( (s != ksq && s != rsq && pos.square_is_occupied(s)) - || pos.attackers_to(s, them)) + ||(pos.attackers_to(s) & pos.pieces_of_color(them))) illegal = true; for (s = Min(rsq, s2); s <= Max(rsq, s2); s++)