diff options
| author | Adam <adammegarules1@gmail.com> | 2026-07-29 15:37:16 +0200 |
|---|---|---|
| committer | Adam <adammegarules1@gmail.com> | 2026-07-29 15:37:16 +0200 |
| commit | 42c1050af70447e935ad1914e57ccecd9f278e7f (patch) | |
| tree | dac534cacdf4063462b0faee676f07fb2da8e58a /src/board.cpp | |
| parent | dee861a68211a811948cc4effa130fc4ee8b5851 (diff) | |
trying to make castling work
Diffstat (limited to 'src/board.cpp')
| -rw-r--r-- | src/board.cpp | 53 |
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; |
