src/chess/rules.h

Thu, 06 Aug 2026 16:11:37 +0200

author
Mike Becker <universe@uap-core.de>
date
Thu, 06 Aug 2026 16:11:37 +0200
changeset 170
bde99d803caf
parent 169
9962f5d98764
permissions
-rw-r--r--

implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API

resolves #947
relates to #952

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
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
46 #define MISSING_CHECK 8
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
47 #define MISSING_CHECKMATE 9
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
48 #define INVALID_CHECK 10
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
49 #define INVALID_CHECKMATE 11
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
50 #define RULES_VIOLATED 32
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
51
160
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
52 #define ENPASSANT_THREAT 0x40u
19
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
53
160
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
54 #define WHITE 0x10u
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
55 #define BLACK 0x20u
129
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
56 #define opponent_color(color) ((color)==WHITE?BLACK:WHITE)
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
57
160
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
58 #define PIECE_MASK 0x0Fu
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
59 #define COLOR_MASK 0x30u
129
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
60
160
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
61 #define PAWN 0x01u
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
62 #define ROOK 0x02u
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
63 #define KNIGHT 0x03u
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
64 #define BISHOP 0x04u
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
65 #define QUEEN 0x05u
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
66 #define KING 0x06u
129
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
67
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
68 #define WPAWN (WHITE|PAWN)
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
69 #define WROOK (WHITE|ROOK)
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
70 #define WKNIGHT (WHITE|KNIGHT)
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
71 #define WBISHOP (WHITE|BISHOP)
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
72 #define WQUEEN (WHITE|QUEEN)
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
73 #define WKING (WHITE|KING)
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
74 #define BPAWN (BLACK|PAWN)
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
75 #define BROOK (BLACK|ROOK)
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
76 #define BKNIGHT (BLACK|KNIGHT)
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
77 #define BBISHOP (BLACK|BISHOP)
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
78 #define BQUEEN (BLACK|QUEEN)
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
79 #define BKING (BLACK|KING)
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
80
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
81 typedef uint8_t Board[8][8];
160
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
82 typedef uint8_t BoardIndex;
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
83 typedef BoardIndex Row;
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
84 typedef BoardIndex File;
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
85 typedef uint8_t Piece;
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
86 typedef uint8_t Color;
129
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
87
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
88 struct movetimeval {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
89 uint64_t tv_sec;
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
90 int32_t tv_usec; /* important that this is signed b/c potential carry */
129
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
91 };
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
92
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
93 typedef struct {
160
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
94 Piece piece;
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
95 File fromfile;
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
96 Row fromrow;
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
97 File tofile;
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
98 Row torow;
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
99 Piece promotion;
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
100 uint8_t check; /* must always be set if checkmate is set */
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
101 uint8_t checkmate;
129
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
102 uint8_t capture;
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
103 uint8_t padding[7]; /* necessary for stable ABI across networks */
129
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
104 struct movetimeval timestamp;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
105 struct movetimeval movetime;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
106 char string[8];
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
107 } Move;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
108
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
109 typedef struct {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
110 uint8_t servercolor;
130
3fc6b1d6cbe9 implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents: 129
diff changeset
111 /** 1: play with timecontrol, 0: play without time control */
129
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
112 uint8_t timecontrol;
130
3fc6b1d6cbe9 implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents: 129
diff changeset
113 /** If timecontrol is 1, initial clock time in seconds */
129
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
114 uint16_t time;
130
3fc6b1d6cbe9 implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents: 129
diff changeset
115 /** If timecontrol is 1, time added per move in seconds */
129
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
116 uint16_t addtime;
130
3fc6b1d6cbe9 implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents: 129
diff changeset
117 /** 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
118 uint16_t delay;
129
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
119 } GameInfo;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
120
130
3fc6b1d6cbe9 implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents: 129
diff changeset
121 /** The buffer length for player names in GameState structures. */
129
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
122 #define PLAYER_NAME_BUFLEN 32
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
123
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
124 typedef struct {
157
07cbfc477b22 add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents: 154
diff changeset
125 /** 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
126 char wname[PLAYER_NAME_BUFLEN];
07cbfc477b22 add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents: 154
diff changeset
127 /** 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
128 char bname[PLAYER_NAME_BUFLEN];
130
3fc6b1d6cbe9 implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents: 129
diff changeset
129 GameInfo info;
129
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
130 Board board;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
131 Move* moves;
157
07cbfc477b22 add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents: 154
diff changeset
132 /** starting position in FEN notation */
07cbfc477b22 add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents: 154
diff changeset
133 char *fen_start;
07cbfc477b22 add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents: 154
diff changeset
134 /** 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
135 * 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
136 */
07cbfc477b22 add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents: 154
diff changeset
137 char **fen;
129
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
138 /** capacity of the move array */
157
07cbfc477b22 add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents: 154
diff changeset
139 unsigned int movecapacity;
129
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
140 /** number of (half-)moves (counting BOTH colors) */
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
141 unsigned int movecount;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
142 /** a premove that shall be evaluated next time it's our turn */
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
143 char premove[8];
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
144 bool checkmate;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
145 bool stalemate;
131
c33567d61ba7 prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
146 bool threefold;
129
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
147 bool remis;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
148 bool wresign;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
149 bool bresign;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
150 /** this flag is only supposed to be set when the opponent disconnects */
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
151 bool ragequit;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
152 bool review;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
153 } GameState;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
154
160
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
155 #define piece_type(piece) ((piece)&PIECE_MASK)
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
156 #define piece_color(piece) ((piece)&COLOR_MASK)
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
157 #define mkpiece(type,color) ((type)|(color))
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
158
19
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
159 #define POS_UNSPECIFIED UINT8_MAX
160
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
160 #define mdst(m) (m)->torow, (m)->tofile
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
161 #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
162
153
bad2d6d4b861 fix wrong error message when move indices are invalid
Mike Becker <universe@uap-core.de>
parents: 147
diff changeset
163 /** 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
164 #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
165 /** 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
166 #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
167
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
168 #define isfile(file) (file >= 'a' && file <= 'h')
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
169 #define isrow(row) (row >= '1' && row <= '8')
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
170
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
171 #define rowidx(row) (row-'1')
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
172 #define fileidx(file) (file-'a')
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
173
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
174 #define rowchr(row) (row+'1')
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
175 #define filechr(file) (file+'a')
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
176
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
177 /* 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
178 #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
179 #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
180
161
3ff96fec144a convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents: 160
diff changeset
181
3ff96fec144a convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents: 160
diff changeset
182 static inline void enpassant_threat_add(GameState *gamestate,
3ff96fec144a convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents: 160
diff changeset
183 Row row, File file) {
3ff96fec144a convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents: 160
diff changeset
184 gamestate->board[row][file] |= ENPASSANT_THREAT;
3ff96fec144a convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents: 160
diff changeset
185 }
3ff96fec144a convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents: 160
diff changeset
186
3ff96fec144a convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents: 160
diff changeset
187 static inline void enpassant_threat_remove(GameState *gamestate,
3ff96fec144a convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents: 160
diff changeset
188 Row row, File file) {
3ff96fec144a convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents: 160
diff changeset
189 gamestate->board[row][file] &= ~ENPASSANT_THREAT;
3ff96fec144a convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents: 160
diff changeset
190 }
3ff96fec144a convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents: 160
diff changeset
191
3ff96fec144a convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents: 160
diff changeset
192 static inline bool enpassant_threat_exists(const GameState *gamestate,
3ff96fec144a convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents: 160
diff changeset
193 Row row, File file) {
3ff96fec144a convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents: 160
diff changeset
194 return gamestate->board[row][file] & ENPASSANT_THREAT;
3ff96fec144a convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents: 160
diff changeset
195 }
3ff96fec144a convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents: 160
diff changeset
196
3ff96fec144a convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents: 160
diff changeset
197 static inline bool is_game_running(const GameState *gamestate) {
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
198 return !(gamestate->checkmate || gamestate->wresign || gamestate->bresign
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
199 || gamestate->threefold || gamestate->stalemate || gamestate->remis
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
200 || gamestate->review);
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
201 }
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
202
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
203 static inline bool is_check_position(const GameState *gamestate) {
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
204 return gamestate->moves[gamestate->movecount - 1].check;
161
3ff96fec144a convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents: 160
diff changeset
205 }
3ff96fec144a convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents: 160
diff changeset
206
129
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
207 /**
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
208 * Initializes a game state and prepares the chess board.
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
209 * @param gamestate the game state to initialize
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
210 */
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
211 void gamestate_init(GameState *gamestate);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
212
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
213 /**
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
214 * Cleans up a game state and frees the memory for the movement list.
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
215 * @param gamestate the game state to clean up
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
216 */
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
217 void gamestate_cleanup(GameState *gamestate);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
218
19
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
219 /**
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
220 * Maps a character to a piece.
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 * 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
223 *
19
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
224 * @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
225 * @param color the piece color
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
226 * @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
227 */
160
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
228 Piece getpiece(char c, Color color);
19
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
229
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
230 /**
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
231 * Maps a piece to a character.
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
232 *
160
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
233 * 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
234 *
69
c8f2c280cff7 adds unicode support
Mike Becker <universe@uap-core.de>
parents: 63
diff changeset
235 * @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
236 * @return character value for the specified piece
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
237 */
160
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
238 char getpiecechr(Piece piece);
19
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
239
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
240 /**
69
c8f2c280cff7 adds unicode support
Mike Becker <universe@uap-core.de>
parents: 63
diff changeset
241 * Maps a piece to a unicode character sequence.
c8f2c280cff7 adds unicode support
Mike Becker <universe@uap-core.de>
parents: 63
diff changeset
242 *
c8f2c280cff7 adds unicode support
Mike Becker <universe@uap-core.de>
parents: 63
diff changeset
243 * The returned unicode is for black pieces.
c8f2c280cff7 adds unicode support
Mike Becker <universe@uap-core.de>
parents: 63
diff changeset
244 * You may colorize the output by setting the terminal foreground color.
c8f2c280cff7 adds unicode support
Mike Becker <universe@uap-core.de>
parents: 63
diff changeset
245 *
160
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
246 * @param piece the piece to display
69
c8f2c280cff7 adds unicode support
Mike Becker <universe@uap-core.de>
parents: 63
diff changeset
247 * @return unicode character sequence for the specified piece
c8f2c280cff7 adds unicode support
Mike Becker <universe@uap-core.de>
parents: 63
diff changeset
248 */
160
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
249 char* getpieceunicode(Piece piece);
69
c8f2c280cff7 adds unicode support
Mike Becker <universe@uap-core.de>
parents: 63
diff changeset
250
c8f2c280cff7 adds unicode support
Mike Becker <universe@uap-core.de>
parents: 63
diff changeset
251 /**
133
c58ae152733e simplify FEN generation and add current_color() function to rules
Mike Becker <universe@uap-core.de>
parents: 131
diff changeset
252 * 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
253 *
c58ae152733e simplify FEN generation and add current_color() function to rules
Mike Becker <universe@uap-core.de>
parents: 131
diff changeset
254 * @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
255 * @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
256 */
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
257 Color current_color(const GameState *gamestate);
160
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 /**
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
260 * Returns the piece at the specified position.
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 * @param gamestate the current game state
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
263 * @param row the row
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
264 * @param file the file
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
265 * @return the piece at the specified position
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
266 */
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
267 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
268
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
269 /**
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
270 * 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
271 *
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
272 * @param gamestate the current game state
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
273 * @param row the row
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
274 * @param file the file
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
275 * @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
276 */
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
277 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
278
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
279 /**
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
280 * 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
281 *
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
282 * @param gamestate the current game state
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
283 * @param row the row
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
284 * @param file the file
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
285 */
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
286 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
287 piece_set(gamestate, row, file, 0);
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
288 }
133
c58ae152733e simplify FEN generation and add current_color() function to rules
Mike Becker <universe@uap-core.de>
parents: 131
diff changeset
289
170
bde99d803caf implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents: 169
diff changeset
290 typedef size_t(*moves_generator_func)(const GameState *gamestate,
169
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 168
diff changeset
291 Color c, Row r, File f, Move *moves);
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 168
diff changeset
292
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 168
diff changeset
293 /**
170
bde99d803caf implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents: 169
diff changeset
294 * Calculates all allowed moves for a specific piece.
bde99d803caf implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents: 169
diff changeset
295 *
bde99d803caf implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents: 169
diff changeset
296 * Use the macros for the specific pieces instead.
bde99d803caf implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents: 169
diff changeset
297 *
bde99d803caf implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents: 169
diff changeset
298 * @param gamestate the current gamestate
bde99d803caf implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents: 169
diff changeset
299 * @param r the row of the piece
bde99d803caf implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents: 169
diff changeset
300 * @param f the file of the piece
bde99d803caf implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents: 169
diff changeset
301 * @param moves target array for the list of moves
bde99d803caf implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents: 169
diff changeset
302 * @return the number of moves stored in the @p moves array
bde99d803caf implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents: 169
diff changeset
303 */
bde99d803caf implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents: 169
diff changeset
304 size_t piece_moves_allowed(const GameState *gamestate,
bde99d803caf implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents: 169
diff changeset
305 Row r, File f, Move *moves);
bde99d803caf implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents: 169
diff changeset
306
bde99d803caf implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents: 169
diff changeset
307 /**
169
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 168
diff changeset
308 * Internal function used to filter out illegal moves.
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 168
diff changeset
309 *
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 168
diff changeset
310 * Use the macros for the specific pieces instead.
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 168
diff changeset
311 *
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 168
diff changeset
312 * @param gamestate the current gamestate
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 168
diff changeset
313 * @param c color of the piece
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 168
diff changeset
314 * @param r the row of the piece
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 168
diff changeset
315 * @param f the file of the piece
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 168
diff changeset
316 * @param moves target array for the list of moves
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 168
diff changeset
317 * @param func a function that unconditionally generates the moves
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 168
diff changeset
318 * @return the number of moves stored in the @p moves array
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 168
diff changeset
319 */
170
bde99d803caf implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents: 169
diff changeset
320 size_t filter_moves_allowed(const GameState *gamestate,
169
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 168
diff changeset
321 Color c, Row r, File f, Move *moves, moves_generator_func func);
9962f5d98764 add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents: 168
diff changeset
322
133
c58ae152733e simplify FEN generation and add current_color() function to rules
Mike Becker <universe@uap-core.de>
parents: 131
diff changeset
323 /**
167
fd1d3f0a7a73 fix regression: pieces could not threaten fields when pinned
Mike Becker <universe@uap-core.de>
parents: 166
diff changeset
324 * Determines a list of theoretically possible moves to the specified field.
fd1d3f0a7a73 fix regression: pieces could not threaten fields when pinned
Mike Becker <universe@uap-core.de>
parents: 166
diff changeset
325 *
fd1d3f0a7a73 fix regression: pieces could not threaten fields when pinned
Mike Becker <universe@uap-core.de>
parents: 166
diff changeset
326 * This will also list moves for pieces that are actually pinned.
168
663676cfef6e fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
327 * Use get_real_candidates() to get only moves for pieces that are not pinned.
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
328 *
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
329 * The out-parameters may both be NULL, but if any of them is set, the other
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
330 * must be set, too.
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
331 *
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
332 * @param gamestate the current game state
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
333 * @param row row of the field to check
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
334 * @param file file of the field to check
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
335 * @param color the color of the piece that should move to the field
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
336 * @param moves the array where to store the moves
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
337 * (must be large enough, 16 is always enough)
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
338 * @param movecount a pointer where the number of moves is stored
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
339 * @return true, if any piece of the specified color can move to the specified
167
fd1d3f0a7a73 fix regression: pieces could not threaten fields when pinned
Mike Becker <universe@uap-core.de>
parents: 166
diff changeset
340 * field regardless of being pinned
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
341 */
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
342 bool get_candidates(const GameState *gamestate, Row row, File file,
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
343 Color color, Move* moves, size_t* movecount);
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
344
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
345 /**
168
663676cfef6e fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
346 * Determines a list of possible moves to the specified field.
663676cfef6e fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
347 *
663676cfef6e fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
348 * This cannot be used to check if a piece covers / threatens a field because
663676cfef6e fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
349 * this is also possible when the piece is pinned. Use get_candidates() for a
663676cfef6e fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
350 * list of possible moves regardless of pins.
663676cfef6e fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
351 *
663676cfef6e fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
352 * The out-parameters may both be NULL, but if any of them is set, the other
663676cfef6e fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
353 * must be set, too.
663676cfef6e fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
354 *
663676cfef6e fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
355 * @param gamestate the current game state
663676cfef6e fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
356 * @param row row of the field to check
663676cfef6e fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
357 * @param file file of the field to check
663676cfef6e fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
358 * @param color the color of the piece that should move to the field
663676cfef6e fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
359 * @param moves the array where to store the moves
663676cfef6e fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
360 * (must be large enough, 16 is always enough)
663676cfef6e fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
361 * @param movecount a pointer where the number of moves is stored
663676cfef6e fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
362 * @return true, if any piece of the specified color can move to the specified
663676cfef6e fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
363 * field and is not pinned
663676cfef6e fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
364 */
663676cfef6e fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
365 bool get_real_candidates(const GameState *gamestate, Row row, File file,
663676cfef6e fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
366 Color color, Move* moves, size_t* movecount);
663676cfef6e fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
367
663676cfef6e fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
368 /**
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
369 * Checks, if a specified field is threatened by a piece of a certain color.
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
370 *
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
371 * A field is threatened, if there is a piece of the specified color that could
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
372 * capture an opponent piece on this field, regardless of being pinned.
25
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
373 *
29
c6a1ad6cf749 fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents: 28
diff changeset
374 * 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
375 * 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
376 *
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
377 * @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
378 * @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
379 * @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
380 * @param color the color of the piece that should threaten the field
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
381 * @param threats the array where to store the threats
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
382 * (must be large enough, 16 is always enough)
160
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
383 * @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
384 * @return true, if any piece of the specified color threatens the specified
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
385 * field
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
386 */
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
387 bool get_threats(const GameState *gamestate, Row row, File file,
160
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
388 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
389
c6a1ad6cf749 fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents: 28
diff changeset
390 /**
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
391 * Checks, if a specified field is threatened by a piece of a certain color AND
29
c6a1ad6cf749 fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents: 28
diff changeset
392 * 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
393 *
c6a1ad6cf749 fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents: 28
diff changeset
394 * 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
395 * 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
396 *
c6a1ad6cf749 fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents: 28
diff changeset
397 * @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
398 * @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
399 * @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
400 * @param color the color of the piece that should threaten the field
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
401 * @param threats the array where to store the threats
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
402 * (must be large enough, 16 is always enough)
160
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
403 * @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
404 * @return true, if any piece of the specified color threatens the specified
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
405 * field and is not pinned
29
c6a1ad6cf749 fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents: 28
diff changeset
406 */
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
407 bool get_real_threats(const GameState *gamestate, Row row, File file,
160
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
408 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
409
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
410 /**
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
411 * Checks, if a specified field is threatened by a piece of a certain color.
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
412 *
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
413 * A field is threatened, if there is a piece of the specified color that could
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
414 * capture an opponent piece on this field, regardless of being pinned.
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
415 *
25
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
416 * @param gamestate the current game state
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
417 * @param row row of the field to check
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
418 * @param file file of the field to check
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
419 * @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
420 * @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
421 * field
25
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
422 */
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
423 #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
424 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
425
c6a1ad6cf749 fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents: 28
diff changeset
426 /**
c6a1ad6cf749 fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents: 28
diff changeset
427 * 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
428 *
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
429 * I.e. the field is threatened by a piece AND this piece is not pinned and
29
c6a1ad6cf749 fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents: 28
diff changeset
430 * 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
431 *
c6a1ad6cf749 fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents: 28
diff changeset
432 * @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
433 * @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
434 * @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
435 * @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
436 * @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
437 * 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
438 */
c6a1ad6cf749 fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents: 28
diff changeset
439 #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
440 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
441
c6a1ad6cf749 fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents: 28
diff changeset
442 /**
c6a1ad6cf749 fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents: 28
diff changeset
443 * 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
444 *
166
1a9b662bc201 fix regression: pawns cannot block check threats
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
445 * A field is protected, if any piece except the king can either capture on
1a9b662bc201 fix regression: pawns cannot block check threats
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
446 * that field or move to that field (and is not pinned).
29
c6a1ad6cf749 fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents: 28
diff changeset
447 *
c6a1ad6cf749 fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents: 28
diff changeset
448 * @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
449 * @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
450 * @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
451 * @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
452 * @return true, if any piece (excluding the king) of the specified color
166
1a9b662bc201 fix regression: pawns cannot block check threats
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
453 * can move to the specified field (including capturing moves)
29
c6a1ad6cf749 fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents: 28
diff changeset
454 */
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
455 bool is_protected(const GameState *gamestate, Row row, File file, Color color);
25
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
456
3ab0c2e1a4e2 implemented king
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
457 /**
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
458 * 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
459 * 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
460 *
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
461 * 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
462 * 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
463 * 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
464 * 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
465 *
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
466 * @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
467 * @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
468 * @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
469 * 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
470 */
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
471 bool is_pinned(const GameState *gamestate, const 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
472
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
473 /**
19
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
474 * 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
475 * object.
115
206201d544be relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents: 107
diff changeset
476 *
206201d544be relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents: 107
diff changeset
477 * When short algebraic notation is used, the source position is determined by
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
478 * evaluating the allowed moves according to the current game state.
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
479 *
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
480 * This function expects correct notation of check and checkmate indicators.
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
481 * For a more lazy evaluation, use eval_move_lazy().
115
206201d544be relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents: 107
diff changeset
482 *
206201d544be relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents: 107
diff changeset
483 * 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
484 * 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
485 *
23
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 19
diff changeset
486 * @param gamestate the current game state
19
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
487 * @param mstr the input string to parse
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
488 * @param color the color of the player to evaluate the move for
19
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
489 * @param move a pointer to object where the move data shall be stored
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
490 * @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
491 */
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
492 int eval_move(const GameState *gamestate,
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
493 const char *mstr, Color color, Move *move);
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
494
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
495 /**
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
496 * Evaluates a move syntactically and stores the move data in the specified
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
497 * object.
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
498 *
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
499 * When short algebraic notation is used, the source position is determined by
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
500 * evaluating the allowed moves according to the current game state.
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
501 *
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
502 * This function automatically corrects missing or incorrect check/checkmate
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
503 * indicators. Use eval_move() if you want to keep the original notation.
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
504 *
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
505 * For a purely syntactic check, regardless of whether a piece exists that is
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
506 * allowed to move that way, use check_move().
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
507 *
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
508 * @param gamestate the current game state
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
509 * @param mstr the input string to parse
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
510 * @param color the color of the player to evaluate the move for
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
511 * @param move a pointer to object where the move data shall be stored
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
512 * @return status code (see macros in this file for the list of codes)
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
513 */
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
514 int eval_move_lazy(const GameState *gamestate,
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
515 const char *mstr, Color color, Move *move);
19
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
516
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
517 /**
115
206201d544be relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents: 107
diff changeset
518 * 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
519 * allowed to move that way.
206201d544be relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents: 107
diff changeset
520 *
206201d544be relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents: 107
diff changeset
521 * @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
522 * @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
523 * @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
524 */
160
f87832cba8b8 refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents: 157
diff changeset
525 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
526
206201d544be relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents: 107
diff changeset
527 /**
19
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
528 * Validates move by applying chess rules.
23
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 19
diff changeset
529 * @param gamestate the current game state
19
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
530 * @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
531 * @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
532 */
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
533 int validate_move(const GameState *gamestate, const Move *move);
19
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
534
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
535 /**
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
536 * Applies a move and deletes captured pieces.
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
537 *
23
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 19
diff changeset
538 * @param gamestate the current game state
19
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
539 * @param move the move to apply
6a26114297a1 moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents: 18
diff changeset
540 */
23
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 19
diff changeset
541 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
542
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
543 /**
122
e65d9b5e9324 implement interactive game review
Mike Becker <universe@uap-core.de>
parents: 115
diff changeset
544 * 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
545 *
e65d9b5e9324 implement interactive game review
Mike Becker <universe@uap-core.de>
parents: 115
diff changeset
546 * 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
547 *
e65d9b5e9324 implement interactive game review
Mike Becker <universe@uap-core.de>
parents: 115
diff changeset
548 * @param gamestate the current game state
e65d9b5e9324 implement interactive game review
Mike Becker <universe@uap-core.de>
parents: 115
diff changeset
549 * @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
550 * @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
551 */
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
552 void gamestate_at_move(const GameState *gamestate,
122
e65d9b5e9324 implement interactive game review
Mike Becker <universe@uap-core.de>
parents: 115
diff changeset
553 unsigned move_number, GameState *replay);
e65d9b5e9324 implement interactive game review
Mike Becker <universe@uap-core.de>
parents: 115
diff changeset
554
e65d9b5e9324 implement interactive game review
Mike Becker <universe@uap-core.de>
parents: 115
diff changeset
555 /**
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
556 * 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
557 * 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
558 *
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
559 * @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
560 * @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
561 * @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
562 * 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
563 */
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
564 uint16_t remaining_movetime2(const GameState *gamestate, unsigned move_number);
33
866025982aa9 implemented time control
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
565
866025982aa9 implemented time control
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
566 /**
866025982aa9 implemented time control
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
567 * Returns the remaining time on the clock for the specified player.
866025982aa9 implemented time control
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
568 *
866025982aa9 implemented time control
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
569 * @param gamestate the current game state
866025982aa9 implemented time control
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
570 * @param color either BLACK or WHITE
866025982aa9 implemented time control
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
571 * @return the remaining time - if time control is disabled, this function
866025982aa9 implemented time control
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
572 * always returns zero
866025982aa9 implemented time control
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
573 */
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
574 uint16_t remaining_movetime(const GameState *gamestate, Color color);
33
866025982aa9 implemented time control
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
575
100
685af47592b5 add API for formatting clocks
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
576 /**
685af47592b5 add API for formatting clocks
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
577 * Converts clock time to string.
685af47592b5 add API for formatting clocks
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
578 *
685af47592b5 add API for formatting clocks
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
579 * @param time the time to format
685af47592b5 add API for formatting clocks
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
580 * @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
581 * @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
582 */
107
36dd94278142 fix that PGN (with comments) can exceed 80 chars
Mike Becker <universe@uap-core.de>
parents: 100
diff changeset
583 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
584
131
c33567d61ba7 prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
585 /**
c33567d61ba7 prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
586 * 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
587 *
c33567d61ba7 prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
588 * 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
589 * 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
590 *
c33567d61ba7 prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
591 * 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
592 * 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
593 *
c33567d61ba7 prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
594 * @param gamestate the current game state
c33567d61ba7 prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
595 * @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
596 */
163
2a6d83f4677e major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
597 bool check_threefold_repetition(const GameState *gamestate);
131
c33567d61ba7 prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
598
10
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
599 #endif /* RULES_H */
1347e4dabac0 prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff changeset
600

mercurial