src/chess/pawn.c

changeset 160
f87832cba8b8
parent 80
b980a7192b5a
equal deleted inserted replaced
159:07c7be5661f4 160:f87832cba8b8
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 }

mercurial