src/rules/pawn.c

changeset 14
970748b9a73b
parent 12
84880c7e1ea6
child 15
7ffd66591afe
equal deleted inserted replaced
13:faec61c4901f 14:970748b9a73b
28 */ 28 */
29 29
30 #include "pawn.h" 30 #include "pawn.h"
31 31
32 _Bool pawn_chkrules(Board board, Move *move) { 32 _Bool pawn_chkrules(Board board, Move *move) {
33 // TODO: implement 33 int8_t d = ((move->piece & COLOR_MASK) == WHITE ? -1 : 1);
34 return TRUE; 34 if (move->capture) {
35 if (move->fromrow == move->torow + d && (
36 move->fromfile == move->tofile + 1 ||
37 move->fromfile == move->tofile - 1)) {
38 // TODO: en passant
39 return mdst(board,move) != 0; /* color has been checked */
40 } else {
41 return FALSE;
42 }
43 } else {
44 if (move->fromfile == move->tofile) {
45 return (move->fromrow == move->torow + d) ||
46 (move->fromrow == (d < 0 ? 1 : 6) && /* advanced first move */
47 move->fromrow == move->torow + d*2);
48 } else {
49 return FALSE;
50 }
51 }
35 } 52 }
36 53
37 _Bool pawn_isblocked(Board board, Move *move) { 54 _Bool pawn_isblocked(Board board, Move *move) {
38 // TODO: implement 55 return mdst(board,move) && !move->capture;
39 return FALSE;
40 } 56 }
41 57
42 _Bool pawn_getlocation(Board board, Move *move) { 58 _Bool pawn_getlocation(Board board, Move *move) {
43 int8_t d = ((move->piece & COLOR_MASK) == WHITE ? -1 : 1); 59 int8_t d = ((move->piece & COLOR_MASK) == WHITE ? -1 : 1);
44 60
45 // TODO: battle moves 61 if (move->fromfile == POS_UNSPECIFIED) {
46 62 move->fromfile = move->tofile;
47 move->fromfile = move->tofile; 63 }
48 move->fromrow = move->torow + d; 64 move->fromrow = move->torow + d;
49 if (move->fromrow > 6) { 65 if (move->fromrow > 6) {
50 return FALSE; 66 return FALSE;
51 } else { 67 } else {
52 /* advanced first move */ 68 /* advanced first move */
53 if (move->fromrow == (d < 0 ? 2 : 5) && 69 if (move->fromrow == (d < 0 ? 2 : 5) &&
54 board[move->fromrow][move->fromfile] != move->piece) { 70 msrc(board,move) != move->piece) {
55 71
56 move->fromrow += d; 72 move->fromrow += d;
57 if (move->fromrow > 6) { 73 if (move->fromrow > 6) {
58 return FALSE; 74 return FALSE;
59 } 75 }

mercurial