27 * |
27 * |
28 */ |
28 */ |
29 |
29 |
30 #include "rules.h" |
30 #include "rules.h" |
31 #include "king.h" |
31 #include "king.h" |
|
32 #include <stdlib.h> |
32 |
33 |
33 _Bool king_chkrules(GameState *gamestate, Move* move) { |
34 static _Bool king_castling_chkmoved(GameState *gamestate, |
34 // TODO: implement |
35 uint8_t row, uint8_t file) { |
|
36 |
|
37 MoveList *ml = gamestate->movelist; |
|
38 while (ml) { |
|
39 if (ml->move.fromfile == file && ml->move.fromrow == row) { |
|
40 return 1; |
|
41 } |
|
42 ml = ml->next; |
|
43 } |
|
44 |
35 return 0; |
45 return 0; |
36 } |
46 } |
37 |
47 |
|
48 _Bool king_chkrules(GameState *gamestate, Move* move) { |
|
49 if (abs(move->torow - move->fromrow) <= 1 && |
|
50 abs(move->tofile - move->fromfile) <= 1) { |
|
51 return 1; |
|
52 } else { |
|
53 /* castling */ |
|
54 if (move->fromrow == move->torow && |
|
55 move->fromrow == ((move->piece&COLOR_MASK) == WHITE ? 0 : 7) && |
|
56 move->fromfile == fileidx('e') && |
|
57 (move->tofile == fileidx('c') || move->tofile == fileidx('g'))) { |
|
58 |
|
59 return !king_castling_chkmoved(gamestate, |
|
60 move->fromrow, move->fromfile) && |
|
61 !king_castling_chkmoved(gamestate, move->fromrow, |
|
62 move->tofile == fileidx('c') ? 0 : 7); |
|
63 } else { |
|
64 return 0; |
|
65 } |
|
66 } |
|
67 } |
|
68 |
38 _Bool king_isblocked(GameState *gamestate, Move *move) { |
69 _Bool king_isblocked(GameState *gamestate, Move *move) { |
39 // TODO: implement |
70 |
40 return 1; |
71 uint8_t opponent_color = opponent_color(move->piece&COLOR_MASK); |
|
72 _Bool blocked = is_covered(gamestate, move->torow, move->tofile, |
|
73 opponent_color); |
|
74 |
|
75 if (abs(move->tofile - move->fromfile) == 2) { |
|
76 if (move->tofile == fileidx('c')) { |
|
77 blocked |= gamestate->board[move->torow][fileidx('b')]; |
|
78 } |
|
79 uint8_t midfile = (move->tofile+move->fromfile)/2; |
|
80 blocked |= gamestate->lastmove->move.check || |
|
81 gamestate->board[move->torow][midfile] || |
|
82 is_covered(gamestate, move->torow, midfile, opponent_color); |
|
83 } |
|
84 |
|
85 return blocked; |
41 } |
86 } |
42 |
87 |
43 int king_getlocation(GameState *gamestate, Move *move) { |
88 int king_getlocation(GameState *gamestate, Move *move) { |
44 // TODO: implement |
89 |
45 return INVALID_MOVE_SYNTAX; |
90 uint8_t file, row; |
|
91 |
|
92 for (int f = -1 ; f <= 1 ; f++) { |
|
93 for (int r = -1 ; r <= 1 ; r++) { |
|
94 if (f == 0 && r == 0) { |
|
95 continue; |
|
96 } |
|
97 file = move->tofile + f; |
|
98 row = move->torow + r; |
|
99 if (isidx(file) && isidx(row)) { |
|
100 if (gamestate->board[row][file] == move->piece) { |
|
101 if ((move->fromfile != POS_UNSPECIFIED |
|
102 && move->fromfile != file) || |
|
103 (move->fromrow != POS_UNSPECIFIED |
|
104 && move->fromrow != row)) { |
|
105 return INVALID_POSITION; |
|
106 } |
|
107 move->fromfile = file; |
|
108 move->fromrow = row; |
|
109 return VALID_MOVE_SYNTAX; |
|
110 } |
|
111 } |
|
112 } |
|
113 } |
|
114 |
|
115 return INVALID_POSITION; |
46 } |
116 } |