28 */ |
28 */ |
29 |
29 |
30 #ifndef GAME_H |
30 #ifndef GAME_H |
31 #define GAME_H |
31 #define GAME_H |
32 |
32 |
|
33 #include "chess/chess.h" |
33 #include "terminal-chess.h" |
34 #include "terminal-chess.h" |
34 #include <stdint.h> |
|
35 |
35 |
36 #ifdef __cplusplus |
36 #ifdef __cplusplus |
37 extern "C" { |
37 extern "C" { |
38 #endif |
38 #endif |
39 |
|
40 #define PIECE_MASK 0x0F |
|
41 #define COLOR_MASK 0x30 |
|
42 #define ENPASSANT_THREAT 0x40 |
|
43 |
|
44 #define WHITE 0x10 |
|
45 #define BLACK 0x20 |
|
46 |
|
47 #define PAWN 0x01 |
|
48 #define ROOK 0x02 |
|
49 #define KNIGHT 0x03 |
|
50 #define BISHOP 0x04 |
|
51 #define QUEEN 0x05 |
|
52 #define KING 0x06 |
|
53 |
|
54 #define WPAWN (WHITE|PAWN) |
|
55 #define WROOK (WHITE|ROOK) |
|
56 #define WKNIGHT (WHITE|KNIGHT) |
|
57 #define WBISHOP (WHITE|BISHOP) |
|
58 #define WQUEEN (WHITE|QUEEN) |
|
59 #define WKING (WHITE|KING) |
|
60 #define BPAWN (BLACK|PAWN) |
|
61 #define BROOK (BLACK|ROOK) |
|
62 #define BKNIGHT (BLACK|KNIGHT) |
|
63 #define BBISHOP (BLACK|BISHOP) |
|
64 #define BQUEEN (BLACK|QUEEN) |
|
65 #define BKING (BLACK|KING) |
|
66 |
|
67 typedef uint8_t Board[8][8]; |
|
68 |
|
69 typedef struct { |
|
70 uint8_t piece; |
|
71 uint8_t fromfile; |
|
72 uint8_t fromrow; |
|
73 uint8_t tofile; |
|
74 uint8_t torow; |
|
75 uint8_t promotion; |
|
76 _Bool check; |
|
77 _Bool checkmate; |
|
78 _Bool capture; |
|
79 } Move; |
|
80 |
39 |
81 typedef struct MoveList MoveList; |
40 typedef struct MoveList MoveList; |
82 typedef struct MoveListRoot MoveListRoot; |
41 typedef struct MoveListRoot MoveListRoot; |
83 |
42 |
84 struct MoveListRoot { |
43 struct MoveListRoot { |
89 struct MoveList { |
48 struct MoveList { |
90 Move move; |
49 Move move; |
91 MoveList* next; |
50 MoveList* next; |
92 }; |
51 }; |
93 |
52 |
94 #define POS_UNSPECIFIED UINT8_MAX |
|
95 #define mdst(b,m) b[(m)->torow][(m)->tofile] |
|
96 #define msrc(b,m) b[(m)->fromrow][(m)->fromfile] |
|
97 |
|
98 #define isidx(idx) ((uint8_t)idx < 8) |
|
99 |
|
100 #define isfile(file) (file >= 'a' && file <= 'h') |
|
101 #define isrow(row) (row >= '1' && row <= '8') |
|
102 |
|
103 #define rowidx(row) (row-'1') |
|
104 #define fileidx(file) (file-'a') |
|
105 |
|
106 #define rowchr(row) (row+'1') |
|
107 #define filechr(file) (file+'a') |
|
108 |
|
109 #define chkidx(move) (isidx((move)->fromfile) && isidx((move)->fromrow) && \ |
|
110 isidx((move)->tofile) && isidx((move)->torow)) |
|
111 |
|
112 /* secure versions - use, if index is not checked with isidx() */ |
|
113 #define fileidx_s(c) (isfile(c)?fileidx(c):POS_UNSPECIFIED) |
|
114 #define rowidx_s(c) (isrow(c)?rowidx(c):POS_UNSPECIFIED) |
|
115 |
53 |
116 void game_start(Settings *settings, int opponent); |
54 void game_start(Settings *settings, int opponent); |
117 |
55 |
118 void freemovelist(MoveListRoot* list); |
56 void freemovelist(MoveListRoot* list); |
119 void addmove(MoveListRoot *movelist, Move *move); |
57 void addmove(MoveListRoot *movelist, Move *move); |