Square b8 = relative_square(us, (square_file(s) == FILE_A) ? SQ_B8 : SQ_G8);
if ( pos.piece_on(b6) == piece_of_color_and_type(opposite_color(us), PAWN)
- && pos.see(s, b6, false) < 0
- && pos.see(s, b8, false) < 0)
+ && pos.see(s, b6) < 0
+ && pos.see(s, b8) < 0)
{
ei.mgValue -= Sign[us] * TrappedBishopA7H7Penalty;
ei.egValue -= Sign[us] * TrappedBishopA7H7Penalty;
int Position::see(Square to) const {
assert(square_is_ok(to));
- return see(SQ_NONE, to, false);
+ return see(SQ_NONE, to);
}
int Position::see(Move m) const {
assert(move_is_ok(m));
- return see(move_from(m), move_to(m), false);
+ return see(move_from(m), move_to(m));
}
int Position::see_sign(Move m) const {
&& type_of_piece_on(from) != KING)
return 1;
- return see(from, to, true);
+ return see(from, to);
}
-int Position::see(Square from, Square to, bool shortcut) const {
+int Position::see(Square from, Square to) const {
// Material values
static const int seeValues[18] = {
};
Bitboard attackers, stmAttackers, b;
- int pieceDiff = 0;
assert(!shortcut || from != SQ_NONE);
assert(square_is_ok(from) || from == SQ_NONE);
if (type_of_piece(piece) == KING)
return seeValues[capture];
- // If captured piece is defended by enemy pawns or knights then SEE is negative
- // when captured piece value does not compensate the lost of capturing one.
- if (shortcut)
- {
- pieceDiff = seeValues[piece] - seeValues[capture];
-
- if ( pieceDiff > seeValues[PAWN]
- &&(attacks_from<PAWN>(to, us) & pieces(PAWN, them)))
- return -(pieceDiff - seeValues[PAWN] / 2);
-
- if ( pieceDiff > seeValues[KNIGHT]
- && pieces(KNIGHT, them)
- &&(pieces(KNIGHT, them) & attacks_from<KNIGHT>(to)))
- return -(pieceDiff - seeValues[KNIGHT] / 2);
- }
-
// Handle en passant moves
if (st->epSquare == to && type_of_piece_on(from) == PAWN)
{
for (pt = PAWN; !(stmAttackers & pieces(pt)); pt++)
assert(pt < KING);
- // If captured piece is defended by an enemy piece then SEE is negative
- // if captured piece value does not compensate the lost of capturing one.
- if (pieceDiff > seeValues[pt])
- {
- assert(shortcut);
- return -(pieceDiff - seeValues[pt] / 2);
- } else
- pieceDiff = 0; // Only first cycle
-
// Remove the attacker we just found from the 'attackers' bitboard,
// and scan for new X-ray attacks behind the attacker.
b = stmAttackers & pieces(pt);