void Position::backup(UndoInfo& u) const {
- u.castleRights = castleRights;
- u.epSquare = epSquare;
+ for (Color c = WHITE; c <= BLACK; c++)
+ {
+ u.pinners[c] = pinners[c];
+ u.pinned[c] = pinned[c];
+ u.dcCandidates[c] = dcCandidates[c];
+ }
u.checkersBB = checkersBB;
u.key = key;
u.pawnKey = pawnKey;
u.materialKey = materialKey;
+ u.castleRights = castleRights;
u.rule50 = rule50;
+ u.epSquare = epSquare;
u.lastMove = lastMove;
u.mgValue = mgValue;
u.egValue = egValue;
u.capture = NO_PIECE_TYPE;
-
- for (Color c = WHITE; c <= BLACK; c++)
- {
- u.pinners[c] = pinners[c];
- u.pinned[c] = pinned[c];
- u.dcCandidates[c] = dcCandidates[c];
- }
}
void Position::restore(const UndoInfo& u) {
- castleRights = u.castleRights;
- epSquare = u.epSquare;
+ for (Color c = WHITE; c <= BLACK; c++)
+ {
+ pinners[c] = u.pinners[c];
+ pinned[c] = u.pinned[c];
+ dcCandidates[c] = u.dcCandidates[c];
+ }
checkersBB = u.checkersBB;
key = u.key;
pawnKey = u.pawnKey;
materialKey = u.materialKey;
+ castleRights = u.castleRights;
rule50 = u.rule50;
+ epSquare = u.epSquare;
lastMove = u.lastMove;
mgValue = u.mgValue;
egValue = u.egValue;
// u.capture is restored in undo_move()
-
- for (Color c = WHITE; c <= BLACK; c++)
- {
- pinners[c] = u.pinners[c];
- pinned[c] = u.pinned[c];
- dcCandidates[c] = u.dcCandidates[c];
- }
}
/// The UndoInfo struct stores information we need to restore a Position
-/// object to its previous state when we retract a move. Whenever a move
+/// object to its previous state when we retract a move. Whenever a move
/// is made on the board (by calling Position::do_move), an UndoInfo object
-/// must be passed as a parameter. When the move is unmade (by calling
+/// must be passed as a parameter. When the move is unmade (by calling
/// Position::undo_move), the same UndoInfo object must be passed again.
struct UndoInfo {
- int castleRights;
- Square epSquare;
- Bitboard checkersBB, pinners[2], pinned[2], dcCandidates[2];
+ Bitboard pinners[2], pinned[2], dcCandidates[2], checkersBB;
Key key, pawnKey, materialKey;
- int rule50;
+ int castleRights, rule50;
+ Square epSquare;
Move lastMove;
Value mgValue, egValue;
PieceType capture;
// Bitboards
Bitboard byColorBB[2], byTypeBB[8];
- Bitboard checkersBB;
- mutable Bitboard pinners[2], pinned[2], dcCandidates[2];
// Board
Piece board[64];
int index[64];
// Other info
+ Square kingSquare[2];
Color sideToMove;
- int castleRights;
+ int gamePly;
+ Key history[MaxGameLength];
+ Value npMaterial[2];
File initialKFile, initialKRFile, initialQRFile;
+
+ // Info backed up in do_move()
+ mutable Bitboard pinners[2], pinned[2], dcCandidates[2];
+ Bitboard checkersBB;
+ Key key, pawnKey, materialKey;
+ int castleRights, rule50;
Square epSquare;
- Square kingSquare[2];
Move lastMove;
- Key key, pawnKey, materialKey, history[MaxGameLength];
- int rule50, gamePly;
Value mgValue, egValue;
- Value npMaterial[2];
// Static variables
static int castleRightsMask[64];