mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 00:33:09 +00:00
Various cleanups in Position's ancillary functions
No functional change. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
97a6e1559e
commit
0da461f23b
2 changed files with 76 additions and 106 deletions
156
src/position.cpp
156
src/position.cpp
|
@ -312,7 +312,7 @@ bool Position::set_castling_rights(char token) {
|
||||||
for (Square sq = sqH; sq >= sqA; sq--)
|
for (Square sq = sqH; sq >= sqA; sq--)
|
||||||
if (piece_on(sq) == rook)
|
if (piece_on(sq) == rook)
|
||||||
{
|
{
|
||||||
allow_oo(c);
|
do_allow_oo(c);
|
||||||
initialKRFile = square_file(sq);
|
initialKRFile = square_file(sq);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -322,7 +322,7 @@ bool Position::set_castling_rights(char token) {
|
||||||
for (Square sq = sqA; sq <= sqH; sq++)
|
for (Square sq = sqA; sq <= sqH; sq++)
|
||||||
if (piece_on(sq) == rook)
|
if (piece_on(sq) == rook)
|
||||||
{
|
{
|
||||||
allow_ooo(c);
|
do_allow_ooo(c);
|
||||||
initialQRFile = square_file(sq);
|
initialQRFile = square_file(sq);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -332,12 +332,12 @@ bool Position::set_castling_rights(char token) {
|
||||||
File rookFile = File(token - 'A') + FILE_A;
|
File rookFile = File(token - 'A') + FILE_A;
|
||||||
if (rookFile < initialKFile)
|
if (rookFile < initialKFile)
|
||||||
{
|
{
|
||||||
allow_ooo(c);
|
do_allow_ooo(c);
|
||||||
initialQRFile = rookFile;
|
initialQRFile = rookFile;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
allow_oo(c);
|
do_allow_oo(c);
|
||||||
initialKRFile = rookFile;
|
initialKRFile = rookFile;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1393,7 +1393,7 @@ int Position::see_sign(Move m) const {
|
||||||
|
|
||||||
int Position::see(Square from, Square to) const {
|
int Position::see(Square from, Square to) const {
|
||||||
|
|
||||||
Bitboard occ, attackers, stmAttackers, b;
|
Bitboard occupied, attackers, stmAttackers, b;
|
||||||
int swapList[32], slIndex = 1;
|
int swapList[32], slIndex = 1;
|
||||||
PieceType capturedType, pt;
|
PieceType capturedType, pt;
|
||||||
Color stm;
|
Color stm;
|
||||||
|
@ -1407,26 +1407,26 @@ int Position::see(Square from, Square to) const {
|
||||||
if (capturedType == KING)
|
if (capturedType == KING)
|
||||||
return seeValues[capturedType];
|
return seeValues[capturedType];
|
||||||
|
|
||||||
occ = occupied_squares();
|
occupied = occupied_squares();
|
||||||
|
|
||||||
// Handle en passant moves
|
// Handle en passant moves
|
||||||
if (st->epSquare == to && type_of_piece_on(from) == PAWN)
|
if (st->epSquare == to && type_of_piece_on(from) == PAWN)
|
||||||
{
|
{
|
||||||
Square capQq = (side_to_move() == WHITE) ? (to - DELTA_N) : (to - DELTA_S);
|
Square capQq = (side_to_move() == WHITE ? to - DELTA_N : to - DELTA_S);
|
||||||
|
|
||||||
assert(capturedType == PIECE_TYPE_NONE);
|
assert(capturedType == PIECE_TYPE_NONE);
|
||||||
assert(type_of_piece_on(capQq) == PAWN);
|
assert(type_of_piece_on(capQq) == PAWN);
|
||||||
|
|
||||||
// Remove the captured pawn
|
// Remove the captured pawn
|
||||||
clear_bit(&occ, capQq);
|
clear_bit(&occupied, capQq);
|
||||||
capturedType = PAWN;
|
capturedType = PAWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find all attackers to the destination square, with the moving piece
|
// Find all attackers to the destination square, with the moving piece
|
||||||
// removed, but possibly an X-ray attacker added behind it.
|
// removed, but possibly an X-ray attacker added behind it.
|
||||||
clear_bit(&occ, from);
|
clear_bit(&occupied, from);
|
||||||
attackers = (rook_attacks_bb(to, occ) & pieces(ROOK, QUEEN))
|
attackers = (rook_attacks_bb(to, occupied) & pieces(ROOK, QUEEN))
|
||||||
| (bishop_attacks_bb(to, occ) & pieces(BISHOP, QUEEN))
|
| (bishop_attacks_bb(to, occupied)& pieces(BISHOP, QUEEN))
|
||||||
| (attacks_from<KNIGHT>(to) & pieces(KNIGHT))
|
| (attacks_from<KNIGHT>(to) & pieces(KNIGHT))
|
||||||
| (attacks_from<KING>(to) & pieces(KING))
|
| (attacks_from<KING>(to) & pieces(KING))
|
||||||
| (attacks_from<PAWN>(to, WHITE) & pieces(PAWN, BLACK))
|
| (attacks_from<PAWN>(to, WHITE) & pieces(PAWN, BLACK))
|
||||||
|
@ -1454,28 +1454,28 @@ int Position::see(Square from, Square to) const {
|
||||||
for (pt = PAWN; !(stmAttackers & pieces(pt)); pt++)
|
for (pt = PAWN; !(stmAttackers & pieces(pt)); pt++)
|
||||||
assert(pt < KING);
|
assert(pt < KING);
|
||||||
|
|
||||||
// Remove the attacker we just found from the 'attackers' bitboard,
|
// Remove the attacker we just found from the 'occupied' bitboard,
|
||||||
// and scan for new X-ray attacks behind the attacker.
|
// and scan for new X-ray attacks behind the attacker.
|
||||||
b = stmAttackers & pieces(pt);
|
b = stmAttackers & pieces(pt);
|
||||||
occ ^= (b & (~b + 1));
|
occupied ^= (b & (~b + 1));
|
||||||
attackers |= (rook_attacks_bb(to, occ) & pieces(ROOK, QUEEN))
|
attackers |= (rook_attacks_bb(to, occupied) & pieces(ROOK, QUEEN))
|
||||||
| (bishop_attacks_bb(to, occ) & pieces(BISHOP, QUEEN));
|
| (bishop_attacks_bb(to, occupied) & pieces(BISHOP, QUEEN));
|
||||||
|
|
||||||
attackers &= occ; // Cut out pieces we've already done
|
attackers &= occupied; // Cut out pieces we've already done
|
||||||
|
|
||||||
// Add the new entry to the swap list
|
// Add the new entry to the swap list
|
||||||
assert(slIndex < 32);
|
assert(slIndex < 32);
|
||||||
swapList[slIndex] = -swapList[slIndex - 1] + seeValues[capturedType];
|
swapList[slIndex] = -swapList[slIndex - 1] + seeValues[capturedType];
|
||||||
slIndex++;
|
slIndex++;
|
||||||
|
|
||||||
// Remember the value of the capturing piece, and change the side to move
|
// Remember the value of the capturing piece, and change the side to
|
||||||
// before beginning the next iteration
|
// move before beginning the next iteration.
|
||||||
capturedType = pt;
|
capturedType = pt;
|
||||||
stm = opposite_color(stm);
|
stm = opposite_color(stm);
|
||||||
stmAttackers = attackers & pieces_of_color(stm);
|
stmAttackers = attackers & pieces_of_color(stm);
|
||||||
|
|
||||||
// Stop after a king capture
|
// Stop before processing a king capture
|
||||||
if (pt == KING && stmAttackers)
|
if (capturedType == KING && stmAttackers)
|
||||||
{
|
{
|
||||||
assert(slIndex < 32);
|
assert(slIndex < 32);
|
||||||
swapList[slIndex++] = QueenValueMidgame*10;
|
swapList[slIndex++] = QueenValueMidgame*10;
|
||||||
|
@ -1484,7 +1484,7 @@ int Position::see(Square from, Square to) const {
|
||||||
} while (stmAttackers);
|
} while (stmAttackers);
|
||||||
|
|
||||||
// Having built the swap list, we negamax through it to find the best
|
// Having built the swap list, we negamax through it to find the best
|
||||||
// achievable score from the point of view of the side to move
|
// achievable score from the point of view of the side to move.
|
||||||
while (--slIndex)
|
while (--slIndex)
|
||||||
swapList[slIndex-1] = Min(-swapList[slIndex], swapList[slIndex-1]);
|
swapList[slIndex-1] = Min(-swapList[slIndex], swapList[slIndex-1]);
|
||||||
|
|
||||||
|
@ -1542,7 +1542,7 @@ void Position::inc_startpos_ply_counter() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Position::put_piece() puts a piece on the given square of the board,
|
/// Position::put_piece() puts a piece on the given square of the board,
|
||||||
/// updating the board array, bitboards, and piece counts.
|
/// updating the board array, pieces list, bitboards, and piece counts.
|
||||||
|
|
||||||
void Position::put_piece(Piece p, Square s) {
|
void Position::put_piece(Piece p, Square s) {
|
||||||
|
|
||||||
|
@ -1550,32 +1550,12 @@ void Position::put_piece(Piece p, Square s) {
|
||||||
PieceType pt = type_of_piece(p);
|
PieceType pt = type_of_piece(p);
|
||||||
|
|
||||||
board[s] = p;
|
board[s] = p;
|
||||||
index[s] = pieceCount[c][pt];
|
index[s] = pieceCount[c][pt]++;
|
||||||
pieceList[c][pt][index[s]] = s;
|
pieceList[c][pt][index[s]] = s;
|
||||||
|
|
||||||
set_bit(&(byTypeBB[pt]), s);
|
set_bit(&(byTypeBB[pt]), s);
|
||||||
set_bit(&(byColorBB[c]), s);
|
set_bit(&(byColorBB[c]), s);
|
||||||
set_bit(&byTypeBB[0], s); // HACK: byTypeBB[0] contains all occupied squares.
|
set_bit(&(byTypeBB[0]), s); // HACK: byTypeBB[0] contains all occupied squares.
|
||||||
|
|
||||||
pieceCount[c][pt]++;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// Position::allow_oo() gives the given side the right to castle kingside.
|
|
||||||
/// Used when setting castling rights during parsing of FEN strings.
|
|
||||||
|
|
||||||
void Position::allow_oo(Color c) {
|
|
||||||
|
|
||||||
st->castleRights |= (1 + int(c));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// Position::allow_ooo() gives the given side the right to castle queenside.
|
|
||||||
/// Used when setting castling rights during parsing of FEN strings.
|
|
||||||
|
|
||||||
void Position::allow_ooo(Color c) {
|
|
||||||
|
|
||||||
st->castleRights |= (4 + 4*int(c));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1586,7 +1566,7 @@ void Position::allow_ooo(Color c) {
|
||||||
|
|
||||||
Key Position::compute_key() const {
|
Key Position::compute_key() const {
|
||||||
|
|
||||||
Key result = 0;
|
Key result = zobCastle[st->castleRights];
|
||||||
|
|
||||||
for (Square s = SQ_A1; s <= SQ_H8; s++)
|
for (Square s = SQ_A1; s <= SQ_H8; s++)
|
||||||
if (square_is_occupied(s))
|
if (square_is_occupied(s))
|
||||||
|
@ -1595,7 +1575,6 @@ Key Position::compute_key() const {
|
||||||
if (ep_square() != SQ_NONE)
|
if (ep_square() != SQ_NONE)
|
||||||
result ^= zobEp[ep_square()];
|
result ^= zobEp[ep_square()];
|
||||||
|
|
||||||
result ^= zobCastle[st->castleRights];
|
|
||||||
if (side_to_move() == BLACK)
|
if (side_to_move() == BLACK)
|
||||||
result ^= zobSideToMove;
|
result ^= zobSideToMove;
|
||||||
|
|
||||||
|
@ -1611,18 +1590,14 @@ Key Position::compute_key() const {
|
||||||
|
|
||||||
Key Position::compute_pawn_key() const {
|
Key Position::compute_pawn_key() const {
|
||||||
|
|
||||||
Key result = 0;
|
|
||||||
Bitboard b;
|
Bitboard b;
|
||||||
Square s;
|
Key result = 0;
|
||||||
|
|
||||||
for (Color c = WHITE; c <= BLACK; c++)
|
for (Color c = WHITE; c <= BLACK; c++)
|
||||||
{
|
{
|
||||||
b = pieces(PAWN, c);
|
b = pieces(PAWN, c);
|
||||||
while (b)
|
while (b)
|
||||||
{
|
result ^= zobrist[c][PAWN][pop_1st_bit(&b)];
|
||||||
s = pop_1st_bit(&b);
|
|
||||||
result ^= zobrist[c][PAWN][s];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -1636,11 +1611,13 @@ Key Position::compute_pawn_key() const {
|
||||||
|
|
||||||
Key Position::compute_material_key() const {
|
Key Position::compute_material_key() const {
|
||||||
|
|
||||||
|
int count;
|
||||||
Key result = 0;
|
Key result = 0;
|
||||||
|
|
||||||
for (Color c = WHITE; c <= BLACK; c++)
|
for (Color c = WHITE; c <= BLACK; c++)
|
||||||
for (PieceType pt = PAWN; pt <= QUEEN; pt++)
|
for (PieceType pt = PAWN; pt <= QUEEN; pt++)
|
||||||
{
|
{
|
||||||
int count = piece_count(c, pt);
|
count = piece_count(c, pt);
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = 0; i < count; i++)
|
||||||
result ^= zobrist[c][pt][i];
|
result ^= zobrist[c][pt][i];
|
||||||
}
|
}
|
||||||
|
@ -1654,20 +1631,15 @@ Key Position::compute_material_key() const {
|
||||||
/// updated by do_move and undo_move when the program is running in debug mode.
|
/// updated by do_move and undo_move when the program is running in debug mode.
|
||||||
Score Position::compute_value() const {
|
Score Position::compute_value() const {
|
||||||
|
|
||||||
Score result = SCORE_ZERO;
|
|
||||||
Bitboard b;
|
Bitboard b;
|
||||||
Square s;
|
Score result = SCORE_ZERO;
|
||||||
|
|
||||||
for (Color c = WHITE; c <= BLACK; c++)
|
for (Color c = WHITE; c <= BLACK; c++)
|
||||||
for (PieceType pt = PAWN; pt <= KING; pt++)
|
for (PieceType pt = PAWN; pt <= KING; pt++)
|
||||||
{
|
{
|
||||||
b = pieces(pt, c);
|
b = pieces(pt, c);
|
||||||
while (b)
|
while (b)
|
||||||
{
|
result += pst(c, pt, pop_1st_bit(&b));
|
||||||
s = pop_1st_bit(&b);
|
|
||||||
assert(piece_on(s) == piece_of_color_and_type(c, pt));
|
|
||||||
result += pst(c, pt, s);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
result += (side_to_move() == WHITE ? TempoValue / 2 : -TempoValue / 2);
|
result += (side_to_move() == WHITE ? TempoValue / 2 : -TempoValue / 2);
|
||||||
|
@ -1676,7 +1648,7 @@ Score Position::compute_value() const {
|
||||||
|
|
||||||
|
|
||||||
/// Position::compute_non_pawn_material() computes the total non-pawn middle
|
/// Position::compute_non_pawn_material() computes the total non-pawn middle
|
||||||
/// game material score for the given side. Material scores are updated
|
/// game material value for the given side. Material values are updated
|
||||||
/// incrementally during the search, this function is only used while
|
/// incrementally during the search, this function is only used while
|
||||||
/// initializing a new Position object.
|
/// initializing a new Position object.
|
||||||
|
|
||||||
|
@ -1685,16 +1657,8 @@ Value Position::compute_non_pawn_material(Color c) const {
|
||||||
Value result = VALUE_ZERO;
|
Value result = VALUE_ZERO;
|
||||||
|
|
||||||
for (PieceType pt = KNIGHT; pt <= QUEEN; pt++)
|
for (PieceType pt = KNIGHT; pt <= QUEEN; pt++)
|
||||||
{
|
result += piece_count(c, pt) * PieceValueMidgame[pt];
|
||||||
Bitboard b = pieces(pt, c);
|
|
||||||
while (b)
|
|
||||||
{
|
|
||||||
assert(piece_on(first_1(b)) == piece_of_color_and_type(c, pt));
|
|
||||||
|
|
||||||
pop_1st_bit(&b);
|
|
||||||
result += PieceValueMidgame[pt];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1729,7 +1693,7 @@ bool Position::is_draw() const {
|
||||||
bool Position::is_mate() const {
|
bool Position::is_mate() const {
|
||||||
|
|
||||||
MoveStack moves[MOVES_MAX];
|
MoveStack moves[MOVES_MAX];
|
||||||
return is_check() && (generate_moves(*this, moves) == moves);
|
return is_check() && generate_moves(*this, moves) == moves;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1749,7 +1713,7 @@ bool Position::has_mate_threat() {
|
||||||
// First pass the move to our opponent doing a null move
|
// First pass the move to our opponent doing a null move
|
||||||
do_null_move(st1);
|
do_null_move(st1);
|
||||||
|
|
||||||
// Then generate pseudo-legal moves that give check
|
// Then generate pseudo-legal moves that could give check
|
||||||
last = generate_non_capture_checks(*this, mlist);
|
last = generate_non_capture_checks(*this, mlist);
|
||||||
last = generate_captures(*this, last);
|
last = generate_captures(*this, last);
|
||||||
|
|
||||||
|
@ -1781,20 +1745,20 @@ bool Position::has_mate_threat() {
|
||||||
|
|
||||||
void Position::init_zobrist() {
|
void Position::init_zobrist() {
|
||||||
|
|
||||||
RKISS RKiss;
|
|
||||||
int i,j, k;
|
int i,j, k;
|
||||||
|
RKISS rk;
|
||||||
|
|
||||||
for (i = 0; i < 2; i++) for (j = 0; j < 8; j++) for (k = 0; k < 64; k++)
|
for (i = 0; i < 2; i++) for (j = 0; j < 8; j++) for (k = 0; k < 64; k++)
|
||||||
zobrist[i][j][k] = RKiss.rand<Key>();
|
zobrist[i][j][k] = rk.rand<Key>();
|
||||||
|
|
||||||
for (i = 0; i < 64; i++)
|
for (i = 0; i < 64; i++)
|
||||||
zobEp[i] = RKiss.rand<Key>();
|
zobEp[i] = rk.rand<Key>();
|
||||||
|
|
||||||
for (i = 0; i < 16; i++)
|
for (i = 0; i < 16; i++)
|
||||||
zobCastle[i] = RKiss.rand<Key>();
|
zobCastle[i] = rk.rand<Key>();
|
||||||
|
|
||||||
zobSideToMove = RKiss.rand<Key>();
|
zobSideToMove = rk.rand<Key>();
|
||||||
zobExclusion = RKiss.rand<Key>();
|
zobExclusion = rk.rand<Key>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1830,16 +1794,16 @@ void Position::flipped_copy(const Position& pos) {
|
||||||
// Board
|
// Board
|
||||||
for (Square s = SQ_A1; s <= SQ_H8; s++)
|
for (Square s = SQ_A1; s <= SQ_H8; s++)
|
||||||
if (!pos.square_is_empty(s))
|
if (!pos.square_is_empty(s))
|
||||||
put_piece(Piece(int(pos.piece_on(s)) ^ 8), flip_square(s));
|
put_piece(Piece(pos.piece_on(s) ^ 8), flip_square(s));
|
||||||
|
|
||||||
// Side to move
|
// Side to move
|
||||||
sideToMove = opposite_color(pos.side_to_move());
|
sideToMove = opposite_color(pos.side_to_move());
|
||||||
|
|
||||||
// Castling rights
|
// Castling rights
|
||||||
if (pos.can_castle_kingside(WHITE)) allow_oo(BLACK);
|
if (pos.can_castle_kingside(WHITE)) do_allow_oo(BLACK);
|
||||||
if (pos.can_castle_queenside(WHITE)) allow_ooo(BLACK);
|
if (pos.can_castle_queenside(WHITE)) do_allow_ooo(BLACK);
|
||||||
if (pos.can_castle_kingside(BLACK)) allow_oo(WHITE);
|
if (pos.can_castle_kingside(BLACK)) do_allow_oo(WHITE);
|
||||||
if (pos.can_castle_queenside(BLACK)) allow_ooo(WHITE);
|
if (pos.can_castle_queenside(BLACK)) do_allow_ooo(WHITE);
|
||||||
|
|
||||||
initialKFile = pos.initialKFile;
|
initialKFile = pos.initialKFile;
|
||||||
initialKRFile = pos.initialKRFile;
|
initialKRFile = pos.initialKRFile;
|
||||||
|
@ -1881,18 +1845,20 @@ void Position::flipped_copy(const Position& pos) {
|
||||||
bool Position::is_ok(int* failedStep) const {
|
bool Position::is_ok(int* failedStep) const {
|
||||||
|
|
||||||
// What features of the position should be verified?
|
// What features of the position should be verified?
|
||||||
static const bool debugBitboards = false;
|
const bool debugAll = false;
|
||||||
static const bool debugKingCount = false;
|
|
||||||
static const bool debugKingCapture = false;
|
const bool debugBitboards = debugAll || false;
|
||||||
static const bool debugCheckerCount = false;
|
const bool debugKingCount = debugAll || false;
|
||||||
static const bool debugKey = false;
|
const bool debugKingCapture = debugAll || false;
|
||||||
static const bool debugMaterialKey = false;
|
const bool debugCheckerCount = debugAll || false;
|
||||||
static const bool debugPawnKey = false;
|
const bool debugKey = debugAll || false;
|
||||||
static const bool debugIncrementalEval = false;
|
const bool debugMaterialKey = debugAll || false;
|
||||||
static const bool debugNonPawnMaterial = false;
|
const bool debugPawnKey = debugAll || false;
|
||||||
static const bool debugPieceCounts = false;
|
const bool debugIncrementalEval = debugAll || false;
|
||||||
static const bool debugPieceList = false;
|
const bool debugNonPawnMaterial = debugAll || false;
|
||||||
static const bool debugCastleSquares = false;
|
const bool debugPieceCounts = debugAll || false;
|
||||||
|
const bool debugPieceList = debugAll || false;
|
||||||
|
const bool debugCastleSquares = debugAll || false;
|
||||||
|
|
||||||
if (failedStep) *failedStep = 1;
|
if (failedStep) *failedStep = 1;
|
||||||
|
|
||||||
|
|
|
@ -281,8 +281,8 @@ private:
|
||||||
// Initialization helper functions (used while setting up a position)
|
// Initialization helper functions (used while setting up a position)
|
||||||
void clear();
|
void clear();
|
||||||
void put_piece(Piece p, Square s);
|
void put_piece(Piece p, Square s);
|
||||||
void allow_oo(Color c);
|
void do_allow_oo(Color c);
|
||||||
void allow_ooo(Color c);
|
void do_allow_ooo(Color c);
|
||||||
bool set_castling_rights(char token);
|
bool set_castling_rights(char token);
|
||||||
|
|
||||||
// Helper functions for doing and undoing moves
|
// Helper functions for doing and undoing moves
|
||||||
|
@ -391,7 +391,7 @@ inline Bitboard Position::occupied_squares() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Bitboard Position::empty_squares() const {
|
inline Bitboard Position::empty_squares() const {
|
||||||
return ~(occupied_squares());
|
return ~occupied_squares();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Bitboard Position::pieces_of_color(Color c) const {
|
inline Bitboard Position::pieces_of_color(Color c) const {
|
||||||
|
@ -535,12 +535,10 @@ inline bool Position::move_is_passed_pawn_push(Move m) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
inline int Position::rule_50_counter() const {
|
inline int Position::rule_50_counter() const {
|
||||||
|
|
||||||
return st->rule50;
|
return st->rule50;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline int Position::startpos_ply_counter() const {
|
inline int Position::startpos_ply_counter() const {
|
||||||
|
|
||||||
return startPosPlyCounter;
|
return startPosPlyCounter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -552,12 +550,10 @@ inline bool Position::opposite_colored_bishops() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool Position::has_pawn_on_7th(Color c) const {
|
inline bool Position::has_pawn_on_7th(Color c) const {
|
||||||
|
|
||||||
return pieces(PAWN, c) & relative_rank_bb(c, RANK_7);
|
return pieces(PAWN, c) & relative_rank_bb(c, RANK_7);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool Position::is_chess960() const {
|
inline bool Position::is_chess960() const {
|
||||||
|
|
||||||
return isChess960;
|
return isChess960;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -581,4 +577,12 @@ inline int Position::thread() const {
|
||||||
return threadID;
|
return threadID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void Position::do_allow_oo(Color c) {
|
||||||
|
st->castleRights |= (1 + int(c));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Position::do_allow_ooo(Color c) {
|
||||||
|
st->castleRights |= (4 + 4*int(c));
|
||||||
|
}
|
||||||
|
|
||||||
#endif // !defined(POSITION_H_INCLUDED)
|
#endif // !defined(POSITION_H_INCLUDED)
|
||||||
|
|
Loading…
Add table
Reference in a new issue