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 } |