| 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 = piece_color(move->piece) == 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 unsigned ppiecetype = piece_type(move->promotion); |
| 39 if (!promopiece || promopiece == PAWN || promopiece == KING) { |
39 if (!ppiecetype || ppiecetype == PAWN || ppiecetype == KING) { |
| 40 return false; |
40 return false; |
| 41 } |
41 } |
| 42 } else { |
42 } else { |
| 43 return false; |
43 return false; |
| 44 } |
44 } |
| 51 if (move->capture) { |
51 if (move->capture) { |
| 52 if (move->fromrow == move->torow + d && ( |
52 if (move->fromrow == move->torow + d && ( |
| 53 move->fromfile == move->tofile + 1 || |
53 move->fromfile == move->tofile + 1 || |
| 54 move->fromfile == move->tofile - 1)) { |
54 move->fromfile == move->tofile - 1)) { |
| 55 |
55 |
| 56 return mdst(gamestate->board, move) || |
56 return piece_at(gamestate, mdst(move)) || |
| 57 (gamestate->board[move->fromrow][move->tofile] |
57 enpassant_threat_exists(gamestate, move->fromrow, move->tofile); |
| 58 & ENPASSANT_THREAT); |
|
| 59 } else { |
58 } else { |
| 60 return false; |
59 return false; |
| 61 } |
60 } |
| 62 } else { |
61 } else { |
| 63 if (move->fromfile == move->tofile) { |
62 if (move->fromfile == move->tofile) { |
| 70 } |
69 } |
| 71 } |
70 } |
| 72 |
71 |
| 73 bool pawn_isblocked(GameState *gamestate, Move *move) { |
72 bool pawn_isblocked(GameState *gamestate, Move *move) { |
| 74 if (move->torow == move->fromrow + 1 || move->torow == move->fromrow - 1) { |
73 if (move->torow == move->fromrow + 1 || move->torow == move->fromrow - 1) { |
| 75 return mdst(gamestate->board, move) && !move->capture; |
74 return piece_at(gamestate, mdst(move)) && !move->capture; |
| 76 } else { |
75 } else { |
| 77 return mdst(gamestate->board, move) || |
76 return piece_at(gamestate, mdst(move)) || |
| 78 gamestate->board[(move->fromrow+move->torow)/2][move->tofile]; |
77 gamestate->board[(move->fromrow+move->torow)/2][move->tofile]; |
| 79 } |
78 } |
| 80 } |
79 } |