|
@@ -165,8 +165,16 @@ UndoInfo ChessGame::doMove(const MoveInfo& mi)
|
|
|
ui.before = b;
|
|
|
|
|
|
Bitboard target = Bitboard::fromIndex(mi.move.destination);
|
|
|
- b &= ~Bitboard::fromIndex(mi.move.origin);
|
|
|
- b |= target;
|
|
|
+ b ^= Bitboard::fromIndex(mi.move.origin);
|
|
|
+ if (mi.move.promotion == PAWN) {
|
|
|
+ b |= target;
|
|
|
+ ui.promotion = PAWN;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ ui.promotion = mi.move.promotion;
|
|
|
+ ui.promotionBefore = board.getBitboards(turn)[ui.promotion];
|
|
|
+ board.getBitboards(turn)[ui.promotion] |= target;
|
|
|
+ }
|
|
|
|
|
|
ui.captured = PieceType::EMPTY;
|
|
|
for (int i = 0; i < 6; i++) {
|
|
@@ -198,6 +206,8 @@ void ChessGame::undoMove(const UndoInfo& ui)
|
|
|
b = ui.before;
|
|
|
if (ui.captured != PieceType::EMPTY)
|
|
|
board.getBitboards(otherSide(turn))[ui.captured] = ui.beforeCaptured;
|
|
|
+ if (ui.promotion != PieceType::PAWN)
|
|
|
+ board.getBitboards(turn)[ui.promotion] = ui.promotionBefore;
|
|
|
moveCount--;
|
|
|
reversibleHalfMoves = ui.reversibleHalfMoves;
|
|
|
castlingRights = ui.castlingRights;
|