| 76 * |
76 * |
| 77 * @param board the current board state |
77 * @param board the current board state |
| 78 * @param move the move to apply |
78 * @param move the move to apply |
| 79 */ |
79 */ |
| 80 static void apply_move(Board board, Move *move) { |
80 static void apply_move(Board board, Move *move) { |
| |
81 uint8_t piece = move->piece & PIECE_MASK; |
| |
82 uint8_t color = move->piece & COLOR_MASK; |
| |
83 |
| |
84 /* en passant capture */ |
| |
85 if (move->capture && piece == PAWN && |
| |
86 mdst(board, move) == 0) { |
| |
87 board[move->fromrow][move->tofile] = 0; |
| |
88 } |
| |
89 |
| |
90 /* remove old en passant threats */ |
| |
91 for (uint8_t file = 0 ; file < 8 ; file++) { |
| |
92 board[3][file] &= ~ENPASSANT_THREAT; |
| |
93 board[4][file] &= ~ENPASSANT_THREAT; |
| |
94 } |
| |
95 |
| |
96 /* add new en passant threat */ |
| |
97 if (piece == PAWN && ( |
| |
98 (move->fromrow == 1 && move->torow == 3) || |
| |
99 (move->fromrow == 6 && move->torow == 4))) { |
| |
100 move->piece |= ENPASSANT_THREAT; |
| |
101 } |
| |
102 |
| |
103 /* move (and maybe capture) */ |
| 81 msrc(board, move) = 0; |
104 msrc(board, move) = 0; |
| 82 // TODO: care for en passant capture |
|
| 83 mdst(board, move) = move->piece; |
105 mdst(board, move) = move->piece; |
| 84 |
106 |
| 85 /* castling */ |
107 /* castling */ |
| 86 if ((move->piece & PIECE_MASK) == KING && |
108 if (piece == KING && |
| 87 move->fromfile == fileidx('e')) { |
109 move->fromfile == fileidx('e')) { |
| 88 uint8_t color = move->piece & COLOR_MASK; |
|
| 89 |
110 |
| 90 if (move->tofile == fileidx('g')) { |
111 if (move->tofile == fileidx('g')) { |
| 91 board[move->torow][fileidx('h')] = 0; |
112 board[move->torow][fileidx('h')] = 0; |
| 92 board[move->torow][fileidx('f')] = color|ROOK; |
113 board[move->torow][fileidx('f')] = color|ROOK; |
| 93 } else if (move->tofile == fileidx('c')) { |
114 } else if (move->tofile == fileidx('c')) { |
| 243 move->torow = rowidx(mstr[2]); |
264 move->torow = rowidx(mstr[2]); |
| 244 } |
265 } |
| 245 |
266 |
| 246 } else if (len == 4) { |
267 } else if (len == 4) { |
| 247 move->piece = getpiece(mstr[0]); |
268 move->piece = getpiece(mstr[0]); |
| |
269 if (!move->piece) { |
| |
270 move->piece = PAWN; |
| |
271 move->fromfile = fileidx(mstr[0]); |
| |
272 } |
| 248 if (mstr[1] == 'x') { |
273 if (mstr[1] == 'x') { |
| 249 /* capture (e.g. "Nxf3", "dxe5") */ |
274 /* capture (e.g. "Nxf3", "dxe5") */ |
| 250 move->capture = TRUE; |
275 move->capture = TRUE; |
| 251 if (!move->piece) { |
276 } else { |
| 252 move->piece = PAWN; |
277 /* move (e.g. "Ndf3", "N2c3", "e2e4") */ |
| 253 move->fromfile = fileidx(mstr[0]); |
278 if (isfile(mstr[1])) { |
| |
279 move->fromfile = fileidx(mstr[1]); |
| |
280 if (move->piece == PAWN) { |
| |
281 move->piece = 0; |
| |
282 } |
| |
283 } else { |
| |
284 move->fromrow = rowidx(mstr[1]); |
| 254 } |
285 } |
| 255 } else { |
|
| 256 /* move (e.g. "Ndf3", "N2c3") */ |
|
| 257 move->fromfile = isfile(mstr[1]) ? |
|
| 258 fileidx(mstr[1]) : rowidx(mstr[1]); |
|
| 259 } |
286 } |
| 260 move->tofile = fileidx(mstr[2]); |
287 move->tofile = fileidx(mstr[2]); |
| 261 move->torow = rowidx(mstr[3]); |
288 move->torow = rowidx(mstr[3]); |
| 262 } else if (len == 5) { |
289 } else if (len == 5) { |
| 263 if (strcmp(mstr, "O-O-O") == 0) { |
290 if (strcmp(mstr, "O-O-O") == 0) { |