src/chess/rules.h

Wed, 29 Jul 2026 13:45:51 +0200

author
Mike Becker <universe@uap-core.de>
date
Wed, 29 Jul 2026 13:45:51 +0200
changeset 160
f87832cba8b8
parent 157
07cbfc477b22
permissions
-rw-r--r--

refactor rules.h / rules.c

- add meaningful type aliases
- add more useful functions and macros
- increase safety when working with flags and nibbles

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

mercurial