src/chess/pawn.c

changeset 80
b980a7192b5a
parent 55
54ea19938d57
equal deleted inserted replaced
79:ffd452cf05ff 80:b980a7192b5a
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];

mercurial