|
1 /* |
|
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
|
3 * |
|
4 * Copyright 2014 Mike Becker. All rights reserved. |
|
5 * |
|
6 * Redistribution and use in source and binary forms, with or without |
|
7 * modification, are permitted provided that the following conditions are met: |
|
8 * |
|
9 * 1. Redistributions of source code must retain the above copyright |
|
10 * notice, this list of conditions and the following disclaimer. |
|
11 * |
|
12 * 2. Redistributions in binary form must reproduce the above copyright |
|
13 * notice, this list of conditions and the following disclaimer in the |
|
14 * documentation and/or other materials provided with the distribution. |
|
15 * |
|
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
|
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
|
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
|
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
|
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
|
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
|
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
|
26 * POSSIBILITY OF SUCH DAMAGE. |
|
27 * |
|
28 */ |
|
29 |
|
30 #ifndef RULES_H |
|
31 #define RULES_H |
|
32 |
|
33 #include <stdint.h> |
|
34 |
|
35 #define VALID_MOVE_SYNTAX 0 |
|
36 #define INVALID_MOVE_SYNTAX 1 |
|
37 #define INVALID_POSITION 2 |
|
38 #define AMBIGUOUS_MOVE 3 |
|
39 #define NEED_PROMOTION 4 |
|
40 |
|
41 |
|
42 #define PIECE_MASK 0x0F |
|
43 #define COLOR_MASK 0x30 |
|
44 #define ENPASSANT_THREAT 0x40 |
|
45 |
|
46 #define WHITE 0x10 |
|
47 #define BLACK 0x20 |
|
48 |
|
49 #define PAWN 0x01 |
|
50 #define ROOK 0x02 |
|
51 #define KNIGHT 0x03 |
|
52 #define BISHOP 0x04 |
|
53 #define QUEEN 0x05 |
|
54 #define KING 0x06 |
|
55 |
|
56 #define WPAWN (WHITE|PAWN) |
|
57 #define WROOK (WHITE|ROOK) |
|
58 #define WKNIGHT (WHITE|KNIGHT) |
|
59 #define WBISHOP (WHITE|BISHOP) |
|
60 #define WQUEEN (WHITE|QUEEN) |
|
61 #define WKING (WHITE|KING) |
|
62 #define BPAWN (BLACK|PAWN) |
|
63 #define BROOK (BLACK|ROOK) |
|
64 #define BKNIGHT (BLACK|KNIGHT) |
|
65 #define BBISHOP (BLACK|BISHOP) |
|
66 #define BQUEEN (BLACK|QUEEN) |
|
67 #define BKING (BLACK|KING) |
|
68 |
|
69 typedef uint8_t Board[8][8]; |
|
70 |
|
71 typedef struct { |
|
72 uint8_t piece; |
|
73 uint8_t fromfile; |
|
74 uint8_t fromrow; |
|
75 uint8_t tofile; |
|
76 uint8_t torow; |
|
77 uint8_t promotion; |
|
78 _Bool check; |
|
79 _Bool checkmate; |
|
80 _Bool capture; |
|
81 } Move; |
|
82 |
|
83 #define POS_UNSPECIFIED UINT8_MAX |
|
84 #define mdst(b,m) b[(m)->torow][(m)->tofile] |
|
85 #define msrc(b,m) b[(m)->fromrow][(m)->fromfile] |
|
86 |
|
87 #define isidx(idx) ((uint8_t)idx < 8) |
|
88 |
|
89 #define isfile(file) (file >= 'a' && file <= 'h') |
|
90 #define isrow(row) (row >= '1' && row <= '8') |
|
91 |
|
92 #define rowidx(row) (row-'1') |
|
93 #define fileidx(file) (file-'a') |
|
94 |
|
95 #define rowchr(row) (row+'1') |
|
96 #define filechr(file) (file+'a') |
|
97 |
|
98 #define chkidx(move) (isidx((move)->fromfile) && isidx((move)->fromrow) && \ |
|
99 isidx((move)->tofile) && isidx((move)->torow)) |
|
100 |
|
101 /* secure versions - use, if index is not checked with isidx() */ |
|
102 #define fileidx_s(c) (isfile(c)?fileidx(c):POS_UNSPECIFIED) |
|
103 #define rowidx_s(c) (isrow(c)?rowidx(c):POS_UNSPECIFIED) |
|
104 |
|
105 /** |
|
106 * Maps a character to a piece. |
|
107 * |
|
108 * Does not work for pawns, since they don't have a character. |
|
109 * |
|
110 * @param c one of R,N,B,Q,K |
|
111 * @return numeric value for the specified piece |
|
112 */ |
|
113 uint8_t getpiece(char c); |
|
114 |
|
115 /** |
|
116 * Maps a piece to a character. |
|
117 * |
|
118 * Does not work for pawns, scince they don't have a character. |
|
119 * |
|
120 * @param piece one of ROOK, KNIGHT, BISHOP, QUEEN, KING |
|
121 * @return character value for the specified piece |
|
122 */ |
|
123 char getpiecechr(uint8_t piece); |
|
124 |
|
125 /** |
|
126 * Evaluates a move syntactically and stores the move data in the specified |
|
127 * object. |
|
128 * |
|
129 * @param board the current state of the board |
|
130 * @param mycolor the color of the current player |
|
131 * @param mstr the input string to parse |
|
132 * @param move a pointer to object where the move data shall be stored |
|
133 * @return status code (see rules/rules.h for the list of codes) |
|
134 */ |
|
135 int eval_move(Board board, uint8_t mycolor, char *mstr, Move *move); |
|
136 |
|
137 /** |
|
138 * Validates move by applying chess rules. |
|
139 * @param board the current board state |
|
140 * @param move the move to validate |
|
141 * @return TRUE, if the move complies to chess rules, FALSE otherwise |
|
142 */ |
|
143 _Bool validate_move(Board board, Move *move); |
|
144 |
|
145 /** |
|
146 * Applies a move and deletes captured pieces. |
|
147 * |
|
148 * @param board the current board state |
|
149 * @param move the move to apply |
|
150 */ |
|
151 void apply_move(Board board, Move *move); |
|
152 |
|
153 #endif /* RULES_H */ |
|
154 |