Wed, 29 Jul 2026 13:45:51 +0200
refactor rules.h / rules.c
- add meaningful type aliases
- add more useful functions and macros
- increase safety when working with flags and nibbles
|
10
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1 | /* |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
3 | * |
|
55
54ea19938d57
updated copyright and version info
Mike Becker <universe@uap-core.de>
parents:
50
diff
changeset
|
4 | * Copyright 2016 Mike Becker. All rights reserved. |
|
10
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
5 | * |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
6 | * Redistribution and use in source and binary forms, with or without |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
7 | * modification, are permitted provided that the following conditions are met: |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
8 | * |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
9 | * 1. Redistributions of source code must retain the above copyright |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
10 | * notice, this list of conditions and the following disclaimer. |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
11 | * |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
12 | * 2. Redistributions in binary form must reproduce the above copyright |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
13 | * notice, this list of conditions and the following disclaimer in the |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
14 | * documentation and/or other materials provided with the distribution. |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
15 | * |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
26 | * POSSIBILITY OF SUCH DAMAGE. |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
27 | * |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
28 | */ |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
29 | |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
30 | #ifndef RULES_H |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
31 | #define RULES_H |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
32 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
33 | #include <stdlib.h> |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
34 | #include <stdint.h> |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
78
diff
changeset
|
35 | #include <stdbool.h> |
|
10
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
36 | |
|
48
0cedda2544da
added return code to move validation (for more informative messages) + fixed a bug where simulations added movelist items to the original gamestate
Mike Becker <universe@uap-core.de>
parents:
47
diff
changeset
|
37 | #define VALID_MOVE_SYNTAX 0 |
|
0cedda2544da
added return code to move validation (for more informative messages) + fixed a bug where simulations added movelist items to the original gamestate
Mike Becker <universe@uap-core.de>
parents:
47
diff
changeset
|
38 | #define VALID_MOVE_SEMANTICS 0 /* use same code for a success */ |
|
0cedda2544da
added return code to move validation (for more informative messages) + fixed a bug where simulations added movelist items to the original gamestate
Mike Becker <universe@uap-core.de>
parents:
47
diff
changeset
|
39 | #define INVALID_MOVE_SYNTAX 1 |
|
154
5336e985bd69
rename INVALID_POSITION to PIECE_NOT_FOUND
Mike Becker <universe@uap-core.de>
parents:
153
diff
changeset
|
40 | #define PIECE_NOT_FOUND 2 |
|
48
0cedda2544da
added return code to move validation (for more informative messages) + fixed a bug where simulations added movelist items to the original gamestate
Mike Becker <universe@uap-core.de>
parents:
47
diff
changeset
|
41 | #define AMBIGUOUS_MOVE 3 |
|
0cedda2544da
added return code to move validation (for more informative messages) + fixed a bug where simulations added movelist items to the original gamestate
Mike Becker <universe@uap-core.de>
parents:
47
diff
changeset
|
42 | #define NEED_PROMOTION 4 |
|
0cedda2544da
added return code to move validation (for more informative messages) + fixed a bug where simulations added movelist items to the original gamestate
Mike Becker <universe@uap-core.de>
parents:
47
diff
changeset
|
43 | #define PIECE_PINNED 5 |
|
0cedda2544da
added return code to move validation (for more informative messages) + fixed a bug where simulations added movelist items to the original gamestate
Mike Becker <universe@uap-core.de>
parents:
47
diff
changeset
|
44 | #define KING_IN_CHECK 6 |
|
0cedda2544da
added return code to move validation (for more informative messages) + fixed a bug where simulations added movelist items to the original gamestate
Mike Becker <universe@uap-core.de>
parents:
47
diff
changeset
|
45 | #define KING_MOVES_INTO_CHECK 7 |
|
0cedda2544da
added return code to move validation (for more informative messages) + fixed a bug where simulations added movelist items to the original gamestate
Mike Becker <universe@uap-core.de>
parents:
47
diff
changeset
|
46 | #define RULES_VIOLATED 10 |
|
16
a298c6637c30
introduced status codes for get_location to produce detailed error messages + added knight rules
Mike Becker <universe@uap-core.de>
parents:
10
diff
changeset
|
47 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
48 | #define ENPASSANT_THREAT 0x40u |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
49 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
50 | #define WHITE 0x10u |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
51 | #define BLACK 0x20u |
| 129 | 52 | #define opponent_color(color) ((color)==WHITE?BLACK:WHITE) |
| 53 | ||
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
54 | #define PIECE_MASK 0x0Fu |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
55 | #define COLOR_MASK 0x30u |
| 129 | 56 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
57 | #define PAWN 0x01u |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
58 | #define ROOK 0x02u |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
59 | #define KNIGHT 0x03u |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
60 | #define BISHOP 0x04u |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
61 | #define QUEEN 0x05u |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
62 | #define KING 0x06u |
| 129 | 63 | |
| 64 | #define WPAWN (WHITE|PAWN) | |
| 65 | #define WROOK (WHITE|ROOK) | |
| 66 | #define WKNIGHT (WHITE|KNIGHT) | |
| 67 | #define WBISHOP (WHITE|BISHOP) | |
| 68 | #define WQUEEN (WHITE|QUEEN) | |
| 69 | #define WKING (WHITE|KING) | |
| 70 | #define BPAWN (BLACK|PAWN) | |
| 71 | #define BROOK (BLACK|ROOK) | |
| 72 | #define BKNIGHT (BLACK|KNIGHT) | |
| 73 | #define BBISHOP (BLACK|BISHOP) | |
| 74 | #define BQUEEN (BLACK|QUEEN) | |
| 75 | #define BKING (BLACK|KING) | |
| 76 | ||
| 77 | typedef uint8_t Board[8][8]; | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
78 | typedef uint8_t BoardIndex; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
79 | typedef BoardIndex Row; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
80 | typedef BoardIndex File; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
81 | typedef uint8_t Piece; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
82 | typedef uint8_t Color; |
| 129 | 83 | |
| 84 | struct movetimeval { | |
| 85 | uint64_t tv_sec; | |
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
86 | int32_t tv_usec; // important that this is signed b/c potential carry |
| 129 | 87 | }; |
| 88 | ||
| 89 | typedef struct { | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
90 | Piece piece; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
91 | File fromfile; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
92 | Row fromrow; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
93 | File tofile; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
94 | Row torow; |
| 129 | 95 | uint8_t promotion; |
| 96 | uint8_t check; | |
| 97 | uint8_t capture; | |
| 98 | struct movetimeval timestamp; | |
| 99 | struct movetimeval movetime; | |
| 100 | char string[8]; | |
| 101 | } Move; | |
| 102 | ||
| 103 | typedef struct { | |
| 104 | uint8_t servercolor; | |
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
105 | /** 1: play with timecontrol, 0: play without time control */ |
| 129 | 106 | uint8_t timecontrol; |
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
107 | /** If timecontrol is 1, initial clock time in seconds */ |
| 129 | 108 | uint16_t time; |
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
109 | /** If timecontrol is 1, time added per move in seconds */ |
| 129 | 110 | uint16_t addtime; |
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
111 | /** If timecontrol is 1, delay before the clock starts ticking down */ |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
112 | uint16_t delay; |
| 129 | 113 | } GameInfo; |
| 114 | ||
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
115 | /** The buffer length for player names in GameState structures. */ |
| 129 | 116 | #define PLAYER_NAME_BUFLEN 32 |
| 117 | ||
| 118 | typedef struct { | |
|
157
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
119 | /** optional name of the white player - only used for PGN exports */ |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
120 | char wname[PLAYER_NAME_BUFLEN]; |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
121 | /** optional name of the black player - only used for PGN exports */ |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
122 | char bname[PLAYER_NAME_BUFLEN]; |
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
123 | GameInfo info; |
| 129 | 124 | Board board; |
| 125 | Move* moves; | |
|
157
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
126 | /** starting position in FEN notation */ |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
127 | char *fen_start; |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
128 | /** array of subsequent positions in FEN notation. |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
129 | * The capacity and element count are identical to the moves array. |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
130 | */ |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
131 | char **fen; |
| 129 | 132 | /** capacity of the move array */ |
|
157
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
133 | unsigned int movecapacity; |
| 129 | 134 | /** number of (half-)moves (counting BOTH colors) */ |
| 135 | unsigned int movecount; | |
| 136 | /** a premove that shall be evaluated next time it's our turn */ | |
| 137 | char premove[8]; | |
| 138 | bool checkmate; | |
| 139 | bool stalemate; | |
|
131
c33567d61ba7
prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
140 | bool threefold; |
| 129 | 141 | bool remis; |
| 142 | bool wresign; | |
| 143 | bool bresign; | |
| 144 | /** this flag is only supposed to be set when the opponent disconnects */ | |
| 145 | bool ragequit; | |
| 146 | bool review; | |
| 147 | } GameState; | |
| 148 | ||
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
149 | #define piece_type(piece) ((piece)&PIECE_MASK) |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
150 | #define piece_color(piece) ((piece)&COLOR_MASK) |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
151 | #define mkpiece(type,color) ((type)|(color)) |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
152 | |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
153 | #define enpassant_threat_add(gamestate, row, file) \ |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
154 | (gamestate->board[row][file] |= ENPASSANT_THREAT) |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
155 | #define enpassant_threat_remove(gamestate, row, file) \ |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
156 | (gamestate->board[row][file] &= ~ENPASSANT_THREAT) |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
157 | #define enpassant_threat_exists(gamestate, row, file) \ |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
158 | (gamestate->board[row][file] & ENPASSANT_THREAT) |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
159 | |
| 129 | 160 | #define is_game_running(gamestate) !((gamestate)->checkmate || \ |
|
131
c33567d61ba7
prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
161 | (gamestate)->wresign || (gamestate)->bresign || (gamestate)->threefold || \ |
| 129 | 162 | (gamestate)->stalemate || (gamestate)->remis || (gamestate)->review) |
| 163 | ||
| 164 | #define last_move(gamestate) \ | |
| 165 | ((gamestate)->moves[(gamestate)->movecount-1]) | |
| 166 | ||
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
167 | #define POS_UNSPECIFIED UINT8_MAX |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
168 | #define mdst(m) (m)->torow, (m)->tofile |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
169 | #define msrc(m) (m)->fromrow, (m)->fromfile |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
170 | |
|
153
bad2d6d4b861
fix wrong error message when move indices are invalid
Mike Becker <universe@uap-core.de>
parents:
147
diff
changeset
|
171 | /** Checks if the index is specified and valid. */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
172 | #define isidx(idx) ((BoardIndex)(idx) < 8) |
|
153
bad2d6d4b861
fix wrong error message when move indices are invalid
Mike Becker <universe@uap-core.de>
parents:
147
diff
changeset
|
173 | /** Checks if the index is unspecified or valid. */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
174 | #define isidxr(idx) ((idx) == POS_UNSPECIFIED || (BoardIndex)(idx) < 8) |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
175 | |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
176 | #define isfile(file) (file >= 'a' && file <= 'h') |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
177 | #define isrow(row) (row >= '1' && row <= '8') |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
178 | |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
179 | #define rowidx(row) (row-'1') |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
180 | #define fileidx(file) (file-'a') |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
181 | |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
182 | #define rowchr(row) (row+'1') |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
183 | #define filechr(file) (file+'a') |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
184 | |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
185 | /* secure versions - use, if index is not checked with isidx() */ |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
186 | #define fileidx_s(c) (isfile(c)?fileidx(c):POS_UNSPECIFIED) |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
187 | #define rowidx_s(c) (isrow(c)?rowidx(c):POS_UNSPECIFIED) |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
188 | |
| 129 | 189 | /** |
| 190 | * Initializes a game state and prepares the chess board. | |
| 191 | * @param gamestate the game state to initialize | |
| 192 | */ | |
| 193 | void gamestate_init(GameState *gamestate); | |
| 194 | ||
| 195 | /** | |
| 196 | * Cleans up a game state and frees the memory for the movement list. | |
| 197 | * @param gamestate the game state to clean up | |
| 198 | */ | |
| 199 | void gamestate_cleanup(GameState *gamestate); | |
| 200 | ||
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
201 | /** |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
202 | * Maps a character to a piece. |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
203 | * |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
204 | * Does not work for pawns, since they don't have a character. |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
205 | * |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
206 | * @param c one of R,N,B,Q,K |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
207 | * @param color the piece color |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
208 | * @return the specified piece or zero when the character is invalid |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
209 | */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
210 | Piece getpiece(char c, Color color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
211 | |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
212 | /** |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
213 | * Maps a piece to a character. |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
214 | * |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
215 | * Does not work for pawns, since they don't have a character. |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
216 | * |
| 69 | 217 | * @param piece may have color or additional flags |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
218 | * @return character value for the specified piece |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
219 | */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
220 | char getpiecechr(Piece piece); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
221 | |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
222 | /** |
| 69 | 223 | * Maps a piece to a unicode character sequence. |
| 224 | * | |
| 225 | * The returned unicode is for black pieces. | |
| 226 | * You may colorize the output by setting the terminal foreground color. | |
| 227 | * | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
228 | * @param piece the piece to display |
| 69 | 229 | * @return unicode character sequence for the specified piece |
| 230 | */ | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
231 | char* getpieceunicode(Piece piece); |
| 69 | 232 | |
| 233 | /** | |
|
133
c58ae152733e
simplify FEN generation and add current_color() function to rules
Mike Becker <universe@uap-core.de>
parents:
131
diff
changeset
|
234 | * Returns the color of the player who is next to move. |
|
c58ae152733e
simplify FEN generation and add current_color() function to rules
Mike Becker <universe@uap-core.de>
parents:
131
diff
changeset
|
235 | * |
|
c58ae152733e
simplify FEN generation and add current_color() function to rules
Mike Becker <universe@uap-core.de>
parents:
131
diff
changeset
|
236 | * @param gamestate the current game state |
|
c58ae152733e
simplify FEN generation and add current_color() function to rules
Mike Becker <universe@uap-core.de>
parents:
131
diff
changeset
|
237 | * @return the color of the player who is next to move |
|
c58ae152733e
simplify FEN generation and add current_color() function to rules
Mike Becker <universe@uap-core.de>
parents:
131
diff
changeset
|
238 | */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
239 | Color current_color(GameState *gamestate); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
240 | |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
241 | /** |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
242 | * Returns the piece at the specified position. |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
243 | * |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
244 | * @param gamestate the current game state |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
245 | * @param row the row |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
246 | * @param file the file |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
247 | * @return the piece at the specified position |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
248 | */ |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
249 | Piece piece_at(const GameState *gamestate, Row row, File file); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
250 | |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
251 | /** |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
252 | * Places a piece at the specified position in the current game state. |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
253 | * |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
254 | * @param gamestate the current game state |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
255 | * @param row the row |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
256 | * @param file the file |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
257 | * @param piece the piece to place at the specified position |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
258 | */ |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
259 | void piece_set(GameState *gamestate, Row row, File file, Piece piece); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
260 | |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
261 | /** |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
262 | * Removes the piece at the specified position in the current game state. |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
263 | * |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
264 | * @param gamestate the current game state |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
265 | * @param row the row |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
266 | * @param file the file |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
267 | */ |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
268 | static inline void piece_remove(GameState *gamestate, Row row, File file) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
269 | piece_set(gamestate, row, file, 0); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
270 | } |
|
133
c58ae152733e
simplify FEN generation and add current_color() function to rules
Mike Becker <universe@uap-core.de>
parents:
131
diff
changeset
|
271 | |
|
c58ae152733e
simplify FEN generation and add current_color() function to rules
Mike Becker <universe@uap-core.de>
parents:
131
diff
changeset
|
272 | /** |
| 25 | 273 | * Checks, if a specified field is covered by a piece of a certain color. |
| 274 | * | |
|
29
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
275 | * The out-parameters may both be NULL, but if any of them is set, the other |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
276 | * must be set, too. |
|
28
0c1371488d87
NEED TESTING: implemented check and checkmate - TODO: avoid checkmate by moving another piece in between
Mike Becker <universe@uap-core.de>
parents:
27
diff
changeset
|
277 | * |
|
0c1371488d87
NEED TESTING: implemented check and checkmate - TODO: avoid checkmate by moving another piece in between
Mike Becker <universe@uap-core.de>
parents:
27
diff
changeset
|
278 | * @param gamestate the current game state |
|
0c1371488d87
NEED TESTING: implemented check and checkmate - TODO: avoid checkmate by moving another piece in between
Mike Becker <universe@uap-core.de>
parents:
27
diff
changeset
|
279 | * @param row row of the field to check |
|
0c1371488d87
NEED TESTING: implemented check and checkmate - TODO: avoid checkmate by moving another piece in between
Mike Becker <universe@uap-core.de>
parents:
27
diff
changeset
|
280 | * @param file file of the field to check |
|
0c1371488d87
NEED TESTING: implemented check and checkmate - TODO: avoid checkmate by moving another piece in between
Mike Becker <universe@uap-core.de>
parents:
27
diff
changeset
|
281 | * @param color the color of the piece that should threaten the field |
|
47
d726e4b46c33
refactoring of getlocation mechanism for better short algebraic notation support (does now respect pinned pieces) + fixed a bug where a pawn could advance through a piece (e.g. e2e4 could jump over a piece on e3)
Mike Becker <universe@uap-core.de>
parents:
41
diff
changeset
|
282 | * @param threats the array where to store the threats (should be able to hold |
|
d726e4b46c33
refactoring of getlocation mechanism for better short algebraic notation support (does now respect pinned pieces) + fixed a bug where a pawn could advance through a piece (e.g. e2e4 could jump over a piece on e3)
Mike Becker <universe@uap-core.de>
parents:
41
diff
changeset
|
283 | * the rare maximum of 16 elements) |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
284 | * @param threatcount a pointer where the count of threats is stored |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
78
diff
changeset
|
285 | * @return true, if any piece of the specified color threatens the specified |
|
28
0c1371488d87
NEED TESTING: implemented check and checkmate - TODO: avoid checkmate by moving another piece in between
Mike Becker <universe@uap-core.de>
parents:
27
diff
changeset
|
286 | * field (i.e. could capture an opponent piece) |
|
0c1371488d87
NEED TESTING: implemented check and checkmate - TODO: avoid checkmate by moving another piece in between
Mike Becker <universe@uap-core.de>
parents:
27
diff
changeset
|
287 | */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
288 | bool get_threats(GameState *gamestate, Row row, File file, |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
289 | Color color, Move* threats, size_t* threatcount); |
|
29
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
290 | |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
291 | /** |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
292 | * Checks, if a specified field is covered by a piece of a certain color AND |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
293 | * if this piece is not pinned and therefore able to perform the move. |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
294 | * |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
295 | * The out-parameters may both be NULL, but if any of them is set, the other |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
296 | * must be set, too. |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
297 | * |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
298 | * @param gamestate the current game state |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
299 | * @param row row of the field to check |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
300 | * @param file file of the field to check |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
301 | * @param color the color of the piece that should threaten the field |
|
47
d726e4b46c33
refactoring of getlocation mechanism for better short algebraic notation support (does now respect pinned pieces) + fixed a bug where a pawn could advance through a piece (e.g. e2e4 could jump over a piece on e3)
Mike Becker <universe@uap-core.de>
parents:
41
diff
changeset
|
302 | * @param threats the array where to store the threats (should be able to hold |
|
d726e4b46c33
refactoring of getlocation mechanism for better short algebraic notation support (does now respect pinned pieces) + fixed a bug where a pawn could advance through a piece (e.g. e2e4 could jump over a piece on e3)
Mike Becker <universe@uap-core.de>
parents:
41
diff
changeset
|
303 | * the rare maximum of 16 elements) |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
304 | * @param threatcount a pointer where the count of threats is stored |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
78
diff
changeset
|
305 | * @return true, if any piece of the specified color threatens the specified |
|
29
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
306 | * field (i.e. could capture an opponent piece) |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
307 | */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
308 | bool get_real_threats(GameState *gamestate, Row row, File file, |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
309 | Color color, Move* threats, size_t* threatcount); |
|
28
0c1371488d87
NEED TESTING: implemented check and checkmate - TODO: avoid checkmate by moving another piece in between
Mike Becker <universe@uap-core.de>
parents:
27
diff
changeset
|
310 | |
|
0c1371488d87
NEED TESTING: implemented check and checkmate - TODO: avoid checkmate by moving another piece in between
Mike Becker <universe@uap-core.de>
parents:
27
diff
changeset
|
311 | /** |
|
0c1371488d87
NEED TESTING: implemented check and checkmate - TODO: avoid checkmate by moving another piece in between
Mike Becker <universe@uap-core.de>
parents:
27
diff
changeset
|
312 | * Checks, if a specified field is covered by a piece of a certain color. |
|
0c1371488d87
NEED TESTING: implemented check and checkmate - TODO: avoid checkmate by moving another piece in between
Mike Becker <universe@uap-core.de>
parents:
27
diff
changeset
|
313 | * |
| 25 | 314 | * @param gamestate the current game state |
| 315 | * @param row row of the field to check | |
| 316 | * @param file file of the field to check | |
| 317 | * @param color the color of the piece that should cover the field | |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
78
diff
changeset
|
318 | * @return true, if any piece of the specified color threatens the specified |
|
29
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
319 | * field |
| 25 | 320 | */ |
|
28
0c1371488d87
NEED TESTING: implemented check and checkmate - TODO: avoid checkmate by moving another piece in between
Mike Becker <universe@uap-core.de>
parents:
27
diff
changeset
|
321 | #define is_covered(gamestate, row, file, color) \ |
|
29
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
322 | get_threats(gamestate, row, file, color, NULL, NULL) |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
323 | |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
324 | /** |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
325 | * Checks, if a specified field is attacked by a piece of a certain color. |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
326 | * |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
327 | * I.e. the field is covered by a piece AND this piece is not pinned and |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
328 | * therefore able to perform the move. |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
329 | * |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
330 | * @param gamestate the current game state |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
331 | * @param row row of the field to check |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
332 | * @param file file of the field to check |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
333 | * @param color the color of the piece that should cover the field |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
78
diff
changeset
|
334 | * @return true, if any piece of the specified color threatens the specified |
|
29
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
335 | * field and could capture an opponent piece |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
336 | */ |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
337 | #define is_attacked(gamestate, row, file, color) \ |
|
61
e3a1a794351e
fixes wrong macro expansion for is_attacked()
Mike Becker <universe@uap-core.de>
parents:
55
diff
changeset
|
338 | get_real_threats(gamestate, row, file, color, NULL, NULL) |
|
29
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
339 | |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
340 | /** |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
341 | * Checks, if a specified field is protected by a piece of a certain color. |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
342 | * |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
343 | * I.e. the field is covered by a piece that is NOT the king AND this piece is |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
344 | * not pinned and therefore able to perform the move. |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
345 | * |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
346 | * @param gamestate the current game state |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
347 | * @param row row of the field to check |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
348 | * @param file file of the field to check |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
349 | * @param color the color of the piece that should cover the field |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
78
diff
changeset
|
350 | * @return true, if any piece (excluding the king) of the specified color |
|
29
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
351 | * threatens the specified field and could capture an opponent piece |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
352 | */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
353 | bool is_protected(GameState *gamestate, Row row, File file, Color color); |
| 25 | 354 | |
| 355 | /** | |
|
47
d726e4b46c33
refactoring of getlocation mechanism for better short algebraic notation support (does now respect pinned pieces) + fixed a bug where a pawn could advance through a piece (e.g. e2e4 could jump over a piece on e3)
Mike Becker <universe@uap-core.de>
parents:
41
diff
changeset
|
356 | * Checks, if the specified move cannot be performed, because the piece is |
|
d726e4b46c33
refactoring of getlocation mechanism for better short algebraic notation support (does now respect pinned pieces) + fixed a bug where a pawn could advance through a piece (e.g. e2e4 could jump over a piece on e3)
Mike Becker <universe@uap-core.de>
parents:
41
diff
changeset
|
357 | * either pinned or cannot remove the check. |
|
d726e4b46c33
refactoring of getlocation mechanism for better short algebraic notation support (does now respect pinned pieces) + fixed a bug where a pawn could advance through a piece (e.g. e2e4 could jump over a piece on e3)
Mike Becker <universe@uap-core.de>
parents:
41
diff
changeset
|
358 | * |
|
d726e4b46c33
refactoring of getlocation mechanism for better short algebraic notation support (does now respect pinned pieces) + fixed a bug where a pawn could advance through a piece (e.g. e2e4 could jump over a piece on e3)
Mike Becker <universe@uap-core.de>
parents:
41
diff
changeset
|
359 | * Note: in chess a piece is pinned, when it can't be moved because the move |
|
d726e4b46c33
refactoring of getlocation mechanism for better short algebraic notation support (does now respect pinned pieces) + fixed a bug where a pawn could advance through a piece (e.g. e2e4 could jump over a piece on e3)
Mike Becker <universe@uap-core.de>
parents:
41
diff
changeset
|
360 | * would result in a check position. But this function <u>also</u> returns true, |
|
d726e4b46c33
refactoring of getlocation mechanism for better short algebraic notation support (does now respect pinned pieces) + fixed a bug where a pawn could advance through a piece (e.g. e2e4 could jump over a piece on e3)
Mike Becker <universe@uap-core.de>
parents:
41
diff
changeset
|
361 | * if the king is already in check position and the specified move does not |
|
d726e4b46c33
refactoring of getlocation mechanism for better short algebraic notation support (does now respect pinned pieces) + fixed a bug where a pawn could advance through a piece (e.g. e2e4 could jump over a piece on e3)
Mike Becker <universe@uap-core.de>
parents:
41
diff
changeset
|
362 | * protect the king. |
|
d726e4b46c33
refactoring of getlocation mechanism for better short algebraic notation support (does now respect pinned pieces) + fixed a bug where a pawn could advance through a piece (e.g. e2e4 could jump over a piece on e3)
Mike Becker <universe@uap-core.de>
parents:
41
diff
changeset
|
363 | * |
|
d726e4b46c33
refactoring of getlocation mechanism for better short algebraic notation support (does now respect pinned pieces) + fixed a bug where a pawn could advance through a piece (e.g. e2e4 could jump over a piece on e3)
Mike Becker <universe@uap-core.de>
parents:
41
diff
changeset
|
364 | * @param gamestate the current game state |
|
d726e4b46c33
refactoring of getlocation mechanism for better short algebraic notation support (does now respect pinned pieces) + fixed a bug where a pawn could advance through a piece (e.g. e2e4 could jump over a piece on e3)
Mike Becker <universe@uap-core.de>
parents:
41
diff
changeset
|
365 | * @param move the move to check |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
78
diff
changeset
|
366 | * @return true, if the move cannot be performed because the king would be in |
|
47
d726e4b46c33
refactoring of getlocation mechanism for better short algebraic notation support (does now respect pinned pieces) + fixed a bug where a pawn could advance through a piece (e.g. e2e4 could jump over a piece on e3)
Mike Becker <universe@uap-core.de>
parents:
41
diff
changeset
|
367 | * check after the move |
|
d726e4b46c33
refactoring of getlocation mechanism for better short algebraic notation support (does now respect pinned pieces) + fixed a bug where a pawn could advance through a piece (e.g. e2e4 could jump over a piece on e3)
Mike Becker <universe@uap-core.de>
parents:
41
diff
changeset
|
368 | */ |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
78
diff
changeset
|
369 | bool is_pinned(GameState *gamestate, Move *move); |
|
47
d726e4b46c33
refactoring of getlocation mechanism for better short algebraic notation support (does now respect pinned pieces) + fixed a bug where a pawn could advance through a piece (e.g. e2e4 could jump over a piece on e3)
Mike Becker <universe@uap-core.de>
parents:
41
diff
changeset
|
370 | |
|
d726e4b46c33
refactoring of getlocation mechanism for better short algebraic notation support (does now respect pinned pieces) + fixed a bug where a pawn could advance through a piece (e.g. e2e4 could jump over a piece on e3)
Mike Becker <universe@uap-core.de>
parents:
41
diff
changeset
|
371 | /** |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
372 | * Evaluates a move syntactically and stores the move data in the specified |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
373 | * object. |
|
115
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
374 | * |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
375 | * When short algebraic notation is used, the source position is determined by |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
376 | * the evaluating the allowed moves according to the current game state. |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
377 | * |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
378 | * For a purely syntactic check, regardless of whether a piece exists that is |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
379 | * allowed to move that way, use check_move(). |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
380 | * |
|
23
824c9522ce66
introduced game state structure
Mike Becker <universe@uap-core.de>
parents:
19
diff
changeset
|
381 | * @param gamestate the current game state |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
382 | * @param mstr the input string to parse |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
383 | * @param move a pointer to object where the move data shall be stored |
|
50
41017d0a72c5
added pgn parser and writer (without comment support yet) + minor refactorings
Mike Becker <universe@uap-core.de>
parents:
49
diff
changeset
|
384 | * @param color the color of the player to evaluate the move for |
|
48
0cedda2544da
added return code to move validation (for more informative messages) + fixed a bug where simulations added movelist items to the original gamestate
Mike Becker <universe@uap-core.de>
parents:
47
diff
changeset
|
385 | * @return status code (see macros in this file for the list of codes) |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
386 | */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
387 | int eval_move(GameState *gamestate, const char *mstr, Move *move, Color color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
388 | |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
389 | /** |
|
115
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
390 | * Syntactically checks a move without verifying that a piece exists that is |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
391 | * allowed to move that way. |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
392 | * |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
393 | * @param mstr the input string to parse |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
394 | * @param color the color of the player to evaluate the move for |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
395 | * @return status code (see macros in this file for the list of codes) |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
396 | */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
397 | int check_move(const char *mstr, Color color); |
|
115
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
398 | |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
399 | /** |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
400 | * Validates move by applying chess rules. |
|
23
824c9522ce66
introduced game state structure
Mike Becker <universe@uap-core.de>
parents:
19
diff
changeset
|
401 | * @param gamestate the current game state |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
402 | * @param move the move to validate |
|
48
0cedda2544da
added return code to move validation (for more informative messages) + fixed a bug where simulations added movelist items to the original gamestate
Mike Becker <universe@uap-core.de>
parents:
47
diff
changeset
|
403 | * @return status code (see macros in this file for the list of codes) |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
404 | */ |
|
48
0cedda2544da
added return code to move validation (for more informative messages) + fixed a bug where simulations added movelist items to the original gamestate
Mike Becker <universe@uap-core.de>
parents:
47
diff
changeset
|
405 | int validate_move(GameState *gamestate, Move *move); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
406 | |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
407 | /** |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
408 | * Applies a move and deletes captured pieces. |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
409 | * |
|
23
824c9522ce66
introduced game state structure
Mike Becker <universe@uap-core.de>
parents:
19
diff
changeset
|
410 | * @param gamestate the current game state |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
411 | * @param move the move to apply |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
412 | */ |
|
23
824c9522ce66
introduced game state structure
Mike Becker <universe@uap-core.de>
parents:
19
diff
changeset
|
413 | void apply_move(GameState *gamestate, Move *move); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
18
diff
changeset
|
414 | |
|
99
231a79d93c0c
add API for calculating the clock for a specific move + fixes wrong handling of move time and increment in move 1
Mike Becker <universe@uap-core.de>
parents:
87
diff
changeset
|
415 | /** |
|
122
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
416 | * Copies the state of the game at the specified move number. |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
417 | * |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
418 | * This function is helpful to generate a game state for reviewing past moves. |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
419 | * |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
420 | * @param gamestate the current game state |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
421 | * @param move_number the half-move that would now be played |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
422 | * @param replay the struct to populate with the state at the specified move |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
423 | */ |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
424 | void gamestate_at_move(GameState *gamestate, |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
425 | unsigned move_number, GameState *replay); |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
426 | |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
427 | /** |
|
99
231a79d93c0c
add API for calculating the clock for a specific move + fixes wrong handling of move time and increment in move 1
Mike Becker <universe@uap-core.de>
parents:
87
diff
changeset
|
428 | * Returns the remaining time on the clock for the specified |
|
231a79d93c0c
add API for calculating the clock for a specific move + fixes wrong handling of move time and increment in move 1
Mike Becker <universe@uap-core.de>
parents:
87
diff
changeset
|
429 | * half-move number. |
|
231a79d93c0c
add API for calculating the clock for a specific move + fixes wrong handling of move time and increment in move 1
Mike Becker <universe@uap-core.de>
parents:
87
diff
changeset
|
430 | * |
|
231a79d93c0c
add API for calculating the clock for a specific move + fixes wrong handling of move time and increment in move 1
Mike Becker <universe@uap-core.de>
parents:
87
diff
changeset
|
431 | * @param gamestate the current game state |
|
231a79d93c0c
add API for calculating the clock for a specific move + fixes wrong handling of move time and increment in move 1
Mike Becker <universe@uap-core.de>
parents:
87
diff
changeset
|
432 | * @param move_number the half-move that is now going to be played |
|
231a79d93c0c
add API for calculating the clock for a specific move + fixes wrong handling of move time and increment in move 1
Mike Becker <universe@uap-core.de>
parents:
87
diff
changeset
|
433 | * @return the remaining time - if time control is disabled, this function |
|
231a79d93c0c
add API for calculating the clock for a specific move + fixes wrong handling of move time and increment in move 1
Mike Becker <universe@uap-core.de>
parents:
87
diff
changeset
|
434 | * always returns zero |
|
231a79d93c0c
add API for calculating the clock for a specific move + fixes wrong handling of move time and increment in move 1
Mike Becker <universe@uap-core.de>
parents:
87
diff
changeset
|
435 | */ |
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
436 | uint16_t remaining_movetime2(GameState *gamestate, unsigned move_number); |
| 33 | 437 | |
| 438 | /** | |
| 439 | * Returns the remaining time on the clock for the specified player. | |
| 440 | * | |
| 441 | * @param gamestate the current game state | |
| 442 | * @param color either BLACK or WHITE | |
| 443 | * @return the remaining time - if time control is disabled, this function | |
| 444 | * always returns zero | |
| 445 | */ | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
446 | uint16_t remaining_movetime(GameState *gamestate, Color color); |
| 33 | 447 | |
|
100
685af47592b5
add API for formatting clocks
Mike Becker <universe@uap-core.de>
parents:
99
diff
changeset
|
448 | /** |
|
685af47592b5
add API for formatting clocks
Mike Becker <universe@uap-core.de>
parents:
99
diff
changeset
|
449 | * Converts clock time to string. |
|
685af47592b5
add API for formatting clocks
Mike Becker <universe@uap-core.de>
parents:
99
diff
changeset
|
450 | * |
|
685af47592b5
add API for formatting clocks
Mike Becker <universe@uap-core.de>
parents:
99
diff
changeset
|
451 | * @param time the time to format |
|
685af47592b5
add API for formatting clocks
Mike Becker <universe@uap-core.de>
parents:
99
diff
changeset
|
452 | * @param str the target buffer (should be at least 10 chars large) |
|
685af47592b5
add API for formatting clocks
Mike Becker <universe@uap-core.de>
parents:
99
diff
changeset
|
453 | * @param always_hours if hours should always be printed |
|
685af47592b5
add API for formatting clocks
Mike Becker <universe@uap-core.de>
parents:
99
diff
changeset
|
454 | */ |
|
107
36dd94278142
fix that PGN (with comments) can exceed 80 chars
Mike Becker <universe@uap-core.de>
parents:
100
diff
changeset
|
455 | int print_clk(uint16_t time, char *str, bool always_hours); |
|
100
685af47592b5
add API for formatting clocks
Mike Becker <universe@uap-core.de>
parents:
99
diff
changeset
|
456 | |
|
131
c33567d61ba7
prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
457 | /** |
|
c33567d61ba7
prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
458 | * Checks if the current position already appeared two times before. |
|
c33567d61ba7
prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
459 | * |
|
c33567d61ba7
prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
460 | * This does not set the threefold flag in the game state as this flag is |
|
c33567d61ba7
prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
461 | * intended to be set only when the game ends after actually claiming a draw. |
|
c33567d61ba7
prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
462 | * |
|
c33567d61ba7
prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
463 | * By standard chess rules this is not automatically a draw. |
|
c33567d61ba7
prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
464 | * But implementation may choose to automatically draw the game anyway. |
|
c33567d61ba7
prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
465 | * |
|
c33567d61ba7
prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
466 | * @param gamestate the current game state |
|
c33567d61ba7
prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
467 | * @return true if the game is in a threefold repetition position |
|
c33567d61ba7
prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
468 | */ |
|
c33567d61ba7
prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
469 | bool check_threefold_repetition(GameState *gamestate); |
|
c33567d61ba7
prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
470 | |
|
10
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
471 | #endif /* RULES_H */ |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
472 |