aboutsummaryrefslogtreecommitdiff
path: root/src/board.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/board.cpp')
-rw-r--r--src/board.cpp53
1 files changed, 51 insertions, 2 deletions
diff --git a/src/board.cpp b/src/board.cpp
index ea0a39a..cbad8cb 100644
--- a/src/board.cpp
+++ b/src/board.cpp
@@ -82,13 +82,62 @@ UndoMove MakeMove(Move move, Game *g) {
// TODO parse the promote type from uci isntead of ignoreting it
piece.type = move.promotion == NONEPIECE ? QUEEN : move.promotion;
}
+ assert(g->castle != "");
+
+ // caslte
+ if (piece.type == KING && move.From.rank == (piece.color ? 0 : 7) &&
+ g->castle != "-" &&
+ (move.From.file + 2 == move.To.file ||
+ move.From.file - 2 == move.To.file)) {
+
+ bool caslteSide =
+ (move.From.file > move.To.file); // 0 queen side, 1 king side
+ char castleCharacter =
+ (caslteSide ? (piece.color ? 'K' : 'k') : (piece.color ? 'Q' : 'q'));
+ std::string newCastleString = "";
+ if (g->castle.contains('Q') && 'Q' != castleCharacter) {
+ newCastleString += 'Q';
+ };
+ if (g->castle.contains('K') && 'K' != castleCharacter) {
+ newCastleString += 'K';
+ };
+ if (g->castle.contains('q') && 'q' != castleCharacter) {
+ newCastleString += 'q';
+ };
+ if (g->castle.contains('k') && 'k' != castleCharacter) {
+ newCastleString += 'k';
+ };
+ if (newCastleString == "") {
+ newCastleString = "-";
+ };
+ g->castle = newCastleString;
+
+ if (move.From.file + 2 == move.To.file) {
+ Position rook_pos = move.To;
+ rook_pos.file += 1;
+ Piece rook = g->pieces[PositionToIndex(rook_pos)];
+ g->pieces[PositionToIndex(rook_pos)] = {false, NONEPIECE, false};
+ rook.moved = true;
+ rook_pos = move.From;
+ rook_pos.file -= 1;
+ g->pieces[PositionToIndex(rook_pos)] = rook;
+ }
+ if (move.From.file - 2 == move.To.file) {
+ Position rook_pos = move.To;
+ rook_pos.file -= 1;
+ Piece rook = g->pieces[PositionToIndex(rook_pos)];
+ g->pieces[PositionToIndex(rook_pos)] = {false, NONEPIECE, false};
+ rook.moved = true;
+ rook_pos = move.From;
+ rook_pos.file += 1;
+ g->pieces[PositionToIndex(rook_pos)] = rook;
+ }
+ };
// setting the moves
g->pieces[PositionToIndex(move.To)] = piece;
g->pieces[PositionToIndex(move.From)] = {false, NONEPIECE, false};
- // post move change
-
// changing who turn it is
g->turn = !g->turn;