28 */ |
28 */ |
29 |
29 |
30 #include "pawn.h" |
30 #include "pawn.h" |
31 #include "rules.h" |
31 #include "rules.h" |
32 |
32 |
33 _Bool pawn_chkrules(GameState *gamestate, Move *move) { |
33 bool pawn_chkrules(GameState *gamestate, Move *move) { |
34 int8_t d = ((move->piece & COLOR_MASK) == WHITE ? -1 : 1); |
34 int8_t d = ((move->piece & COLOR_MASK) == WHITE ? -1 : 1); |
35 |
35 |
36 if (move->torow == (d < 0 ? 7 : 0)) { |
36 if (move->torow == (d < 0 ? 7 : 0)) { |
37 if (move->promotion) { |
37 if (move->promotion) { |
38 uint8_t promopiece = move->promotion & PIECE_MASK; |
38 uint8_t promopiece = move->promotion & PIECE_MASK; |
39 if (!promopiece || promopiece == PAWN || promopiece == KING) { |
39 if (!promopiece || promopiece == PAWN || promopiece == KING) { |
40 return 0; |
40 return false; |
41 } |
41 } |
42 } else { |
42 } else { |
43 return 0; |
43 return false; |
44 } |
44 } |
45 } else { |
45 } else { |
46 if (move->promotion) { |
46 if (move->promotion) { |
47 return 0; |
47 return false; |
48 } |
48 } |
49 } |
49 } |
50 |
50 |
51 if (move->capture) { |
51 if (move->capture) { |
52 if (move->fromrow == move->torow + d && ( |
52 if (move->fromrow == move->torow + d && ( |
55 |
55 |
56 return mdst(gamestate->board, move) || |
56 return mdst(gamestate->board, move) || |
57 (gamestate->board[move->fromrow][move->tofile] |
57 (gamestate->board[move->fromrow][move->tofile] |
58 & ENPASSANT_THREAT); |
58 & ENPASSANT_THREAT); |
59 } else { |
59 } else { |
60 return 0; |
60 return false; |
61 } |
61 } |
62 } else { |
62 } else { |
63 if (move->fromfile == move->tofile) { |
63 if (move->fromfile == move->tofile) { |
64 return (move->fromrow == move->torow + d) || |
64 return (move->fromrow == move->torow + d) || |
65 (move->fromrow == (d < 0 ? 1 : 6) && /* advanced first move */ |
65 (move->fromrow == (d < 0 ? 1 : 6) && /* advanced first move */ |
66 move->fromrow == move->torow + d*2); |
66 move->fromrow == move->torow + d*2); |
67 } else { |
67 } else { |
68 return 0; |
68 return false; |
69 } |
69 } |
70 } |
70 } |
71 } |
71 } |
72 |
72 |
73 _Bool pawn_isblocked(GameState *gamestate, Move *move) { |
73 bool pawn_isblocked(GameState *gamestate, Move *move) { |
74 if (move->torow == move->fromrow + 1 || move->torow == move->fromrow - 1) { |
74 if (move->torow == move->fromrow + 1 || move->torow == move->fromrow - 1) { |
75 return mdst(gamestate->board, move) && !move->capture; |
75 return mdst(gamestate->board, move) && !move->capture; |
76 } else { |
76 } else { |
77 return mdst(gamestate->board, move) || |
77 return mdst(gamestate->board, move) || |
78 gamestate->board[(move->fromrow+move->torow)/2][move->tofile]; |
78 gamestate->board[(move->fromrow+move->torow)/2][move->tofile]; |