Tue, 25 Aug 2026 18:59:18 +0200
rename Row to Rank
+ fix increase type safety where we overlooked it before
relates to #956
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1 | /* |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
3 | * |
|
55
54ea19938d57
updated copyright and version info
Mike Becker <universe@uap-core.de>
parents:
51
diff
changeset
|
4 | * Copyright 2016 Mike Becker. All rights reserved. |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
5 | * |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
6 | * Redistribution and use in source and binary forms, with or without |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
7 | * modification, are permitted provided that the following conditions are met: |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
8 | * |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
9 | * 1. Redistributions of source code must retain the above copyright |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
10 | * notice, this list of conditions and the following disclaimer. |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
11 | * |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
12 | * 2. Redistributions in binary form must reproduce the above copyright |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
13 | * notice, this list of conditions and the following disclaimer in the |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
14 | * documentation and/or other materials provided with the distribution. |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
15 | * |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|
6a26114297a1
moved chess rules to separate lib
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 |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
26 | * POSSIBILITY OF SUCH DAMAGE. |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
27 | * |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
28 | */ |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
29 | |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
30 | #include "rules.h" |
| 78 | 31 | #include "pawn.h" |
| 32 | #include "rook.h" | |
| 33 | #include "knight.h" | |
| 34 | #include "bishop.h" | |
| 35 | #include "queen.h" | |
| 36 | #include "king.h" | |
|
157
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
37 | #include "fen.h" |
| 78 | 38 | |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
39 | #include <string.h> |
|
100
685af47592b5
add API for formatting clocks
Mike Becker <universe@uap-core.de>
parents:
99
diff
changeset
|
40 | #include <stdio.h> |
|
23
824c9522ce66
introduced game state structure
Mike Becker <universe@uap-core.de>
parents:
21
diff
changeset
|
41 | #include <stdlib.h> |
|
36
ebe0c961e9a6
reduced awesome great nanosecond precision so we can compile on OS X
Mike Becker <universe@uap-core.de>
parents:
33
diff
changeset
|
42 | #include <sys/time.h> |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
43 | #include <assert.h> |
|
23
824c9522ce66
introduced game state structure
Mike Becker <universe@uap-core.de>
parents:
21
diff
changeset
|
44 | |
| 129 | 45 | void gamestate_init(GameState *gamestate) { |
| 46 | memset(gamestate, 0, sizeof(GameState)); | |
| 47 | ||
|
157
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
48 | // TODO: implement feature - game can be started from arbitrary position |
| 129 | 49 | Board initboard = { |
| 50 | {WROOK, WKNIGHT, WBISHOP, WQUEEN, WKING, WBISHOP, WKNIGHT, WROOK}, | |
| 51 | {WPAWN, WPAWN, WPAWN, WPAWN, WPAWN, WPAWN, WPAWN, WPAWN}, | |
| 52 | {0, 0, 0, 0, 0, 0, 0, 0}, | |
| 53 | {0, 0, 0, 0, 0, 0, 0, 0}, | |
| 54 | {0, 0, 0, 0, 0, 0, 0, 0}, | |
| 55 | {0, 0, 0, 0, 0, 0, 0, 0}, | |
| 56 | {BPAWN, BPAWN, BPAWN, BPAWN, BPAWN, BPAWN, BPAWN, BPAWN}, | |
| 57 | {BROOK, BKNIGHT, BBISHOP, BQUEEN, BKING, BBISHOP, BKNIGHT, BROOK} | |
| 58 | }; | |
| 59 | memcpy(gamestate->board, initboard, sizeof(Board)); | |
|
157
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
60 | char fen[FEN_MAX_LENGTH]; |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
61 | fen_compute(fen, gamestate); |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
62 | gamestate->fen_start = strdup(fen); |
| 129 | 63 | } |
| 64 | ||
| 65 | void gamestate_cleanup(GameState *gamestate) { | |
|
158
52d452d0e7bf
gamestate_cleanup() is now safe to be called multiple times
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
66 | if (gamestate == NULL) return; |
|
52d452d0e7bf
gamestate_cleanup() is now safe to be called multiple times
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
67 | |
| 129 | 68 | free(gamestate->moves); |
|
158
52d452d0e7bf
gamestate_cleanup() is now safe to be called multiple times
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
69 | gamestate->moves = NULL; |
|
157
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
70 | free(gamestate->fen_start); |
|
158
52d452d0e7bf
gamestate_cleanup() is now safe to be called multiple times
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
71 | gamestate->fen_start = NULL; |
|
52d452d0e7bf
gamestate_cleanup() is now safe to be called multiple times
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
72 | if (gamestate->fen) { |
|
52d452d0e7bf
gamestate_cleanup() is now safe to be called multiple times
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
73 | for (unsigned i = 0 ; i < gamestate->movecount ; i++) { |
|
52d452d0e7bf
gamestate_cleanup() is now safe to be called multiple times
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
74 | free(gamestate->fen[i]); |
|
52d452d0e7bf
gamestate_cleanup() is now safe to be called multiple times
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
75 | } |
|
52d452d0e7bf
gamestate_cleanup() is now safe to be called multiple times
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
76 | free(gamestate->fen); |
|
52d452d0e7bf
gamestate_cleanup() is now safe to be called multiple times
Mike Becker <universe@uap-core.de>
parents:
157
diff
changeset
|
77 | gamestate->fen = NULL; |
|
157
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
78 | } |
| 129 | 79 | gamestate->movecount = gamestate->movecapacity = 0; |
| 80 | } | |
| 81 | ||
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
82 | static GameState gamestate_copy_sim(const GameState *gamestate) { |
|
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
|
83 | GameState simulation = *gamestate; |
|
98
9cb41383540f
change move list from linked list to array (prepares game replays)
Mike Becker <universe@uap-core.de>
parents:
87
diff
changeset
|
84 | |
|
157
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
85 | /* create new move and position lists for the simulation */ |
|
98
9cb41383540f
change move list from linked list to array (prepares game replays)
Mike Becker <universe@uap-core.de>
parents:
87
diff
changeset
|
86 | simulation.movecapacity = 4; |
|
9cb41383540f
change move list from linked list to array (prepares game replays)
Mike Becker <universe@uap-core.de>
parents:
87
diff
changeset
|
87 | simulation.movecount = 0; |
|
9cb41383540f
change move list from linked list to array (prepares game replays)
Mike Becker <universe@uap-core.de>
parents:
87
diff
changeset
|
88 | simulation.moves = malloc(4 * sizeof(Move)); |
|
157
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
89 | simulation.fen = malloc(4 * sizeof(char*)); |
|
98
9cb41383540f
change move list from linked list to array (prepares game replays)
Mike Becker <universe@uap-core.de>
parents:
87
diff
changeset
|
90 | |
|
157
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
91 | /* copy the most recent move and position if a move was played */ |
|
98
9cb41383540f
change move list from linked list to array (prepares game replays)
Mike Becker <universe@uap-core.de>
parents:
87
diff
changeset
|
92 | if (gamestate->movecount > 0) { |
|
157
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
93 | simulation.fen_start = strdup(gamestate->movecount == 1 ? |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
94 | gamestate->fen_start : gamestate->fen[gamestate->movecount - 2]); |
|
161
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
160
diff
changeset
|
95 | simulation.moves[0] = gamestate->moves[gamestate->movecount - 1]; |
|
157
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
96 | simulation.fen[0] = strdup(gamestate->fen[gamestate->movecount - 1]); |
|
98
9cb41383540f
change move list from linked list to array (prepares game replays)
Mike Becker <universe@uap-core.de>
parents:
87
diff
changeset
|
97 | simulation.movecount++; |
|
157
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
98 | } else { |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
99 | simulation.fen_start = strdup(gamestate->fen_start); |
|
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
|
100 | } |
|
51
84f2e380a434
added support for game continuation over network + fixed major bug in checkmate anticipation when the king is attacked diagonally
Mike Becker <universe@uap-core.de>
parents:
50
diff
changeset
|
101 | |
|
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
|
102 | return simulation; |
|
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
|
103 | } |
|
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
|
104 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
105 | Color current_color(const GameState *gamestate) { |
|
133
c58ae152733e
simplify FEN generation and add current_color() function to rules
Mike Becker <universe@uap-core.de>
parents:
131
diff
changeset
|
106 | return (gamestate->movecount % 2 == 0) ? WHITE : BLACK; |
|
c58ae152733e
simplify FEN generation and add current_color() function to rules
Mike Becker <universe@uap-core.de>
parents:
131
diff
changeset
|
107 | } |
|
c58ae152733e
simplify FEN generation and add current_color() function to rules
Mike Becker <universe@uap-core.de>
parents:
131
diff
changeset
|
108 | |
|
122
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
109 | static void calc_movetime(GameState *gamestate, Move *move) { |
|
181
8bda076d0a16
simplify how the elapsed move time is recorded
Mike Becker <universe@uap-core.de>
parents:
179
diff
changeset
|
110 | /* only if move has no time info, compute it */ |
|
8bda076d0a16
simplify how the elapsed move time is recorded
Mike Becker <universe@uap-core.de>
parents:
179
diff
changeset
|
111 | if (move->movetime > 0) return; |
|
8bda076d0a16
simplify how the elapsed move time is recorded
Mike Becker <universe@uap-core.de>
parents:
179
diff
changeset
|
112 | |
|
122
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
113 | struct timeval curtimestamp; |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
114 | gettimeofday(&curtimestamp, NULL); |
|
181
8bda076d0a16
simplify how the elapsed move time is recorded
Mike Becker <universe@uap-core.de>
parents:
179
diff
changeset
|
115 | move->timestamp.sec = curtimestamp.tv_sec; |
|
8bda076d0a16
simplify how the elapsed move time is recorded
Mike Becker <universe@uap-core.de>
parents:
179
diff
changeset
|
116 | move->timestamp.usec = (int32_t) curtimestamp.tv_usec; |
|
122
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
117 | if (gamestate->movecount > 1) { |
|
161
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
160
diff
changeset
|
118 | struct movetimeval lasttstamp = |
|
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
160
diff
changeset
|
119 | gamestate->moves[gamestate->movecount - 1].timestamp; |
|
122
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
120 | |
|
181
8bda076d0a16
simplify how the elapsed move time is recorded
Mike Becker <universe@uap-core.de>
parents:
179
diff
changeset
|
121 | uint64_t cur = move->timestamp.sec * 1000000ull + move->timestamp.usec; |
|
8bda076d0a16
simplify how the elapsed move time is recorded
Mike Becker <universe@uap-core.de>
parents:
179
diff
changeset
|
122 | uint64_t last = lasttstamp.sec * 1000000ull + lasttstamp.usec; |
|
8bda076d0a16
simplify how the elapsed move time is recorded
Mike Becker <universe@uap-core.de>
parents:
179
diff
changeset
|
123 | |
|
8bda076d0a16
simplify how the elapsed move time is recorded
Mike Becker <universe@uap-core.de>
parents:
179
diff
changeset
|
124 | move->movetime = cur - last; |
|
122
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
125 | } |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
126 | } |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
127 | |
|
170
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
128 | size_t piece_moves_allowed(const GameState *gamestate, |
| 194 | 129 | Rank r, File f, Move *moves) { |
|
170
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
130 | Piece p = piece_at(gamestate, r, f); |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
131 | Color c = piece_color(p); |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
132 | switch (piece_type(p)) { |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
133 | case KING: |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
134 | return king_moves_allowed(gamestate, c, r, f, moves); |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
135 | case QUEEN: |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
136 | return queen_moves_allowed(gamestate, c, r, f, moves); |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
137 | case ROOK: |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
138 | return rook_moves_allowed(gamestate, c, r, f, moves); |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
139 | case KNIGHT: |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
140 | return knight_moves_allowed(gamestate, c, r, f, moves); |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
141 | case BISHOP: |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
142 | return bishop_moves_allowed(gamestate, c, r, f, moves); |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
143 | case PAWN: |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
144 | return pawn_moves_allowed(gamestate, c, r, f, moves); |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
145 | default: |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
146 | return 0; |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
147 | } |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
148 | } |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
149 | |
|
173
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
150 | static bool check_stalemate(const GameState *gamestate) { |
|
170
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
151 | Color next_player = gamestate->movecount % 2 == 0 ? WHITE : BLACK; |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
152 | |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
153 | /* scan the board for pieces of the next player's color */ |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
154 | Move moves[QUEEN_MOVES_MAX]; |
| 194 | 155 | for (Rank r = 0; r < 8; r++) { |
|
170
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
156 | for (File f = 0; f < 8; f++) { |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
157 | if (piece_color(piece_at(gamestate, r, f)) == next_player |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
158 | && piece_moves_allowed(gamestate, r, f, moves) > 0) { |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
159 | return false; |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
160 | } |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
161 | } |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
162 | } |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
163 | |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
164 | return true; |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
165 | } |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
166 | |
|
173
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
167 | static size_t fen_len_without_moves(const char *fen) { |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
168 | size_t len = strlen(fen); |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
169 | /* find first space that separates the two move counters */ |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
170 | while (--len > 0 && fen[len] != ' ') {} |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
171 | /* find second space that separates the move counters from the rest */ |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
172 | while (--len > 0 && fen[len] != ' ') {} |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
173 | return len; |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
174 | } |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
175 | |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
176 | bool check_threefold_repetition(const GameState *gamestate) { |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
177 | if (gamestate->movecount < 3) { |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
178 | return false; |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
179 | } |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
180 | |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
181 | /* take the part of the FEN that only describes the board */ |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
182 | const char *fen = gamestate->fen[gamestate->movecount - 1]; |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
183 | size_t fen_len = fen_len_without_moves(fen); |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
184 | |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
185 | // TODO: develop a test case that involves en passant and add support here |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
186 | |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
187 | /* count the previous occurrences */ |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
188 | unsigned c = 0; |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
189 | for (size_t i = gamestate->movecount - 1; i > 0;) { |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
190 | const char *other = gamestate->fen[--i]; |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
191 | size_t other_len = fen_len_without_moves(other); |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
192 | if (fen_len != other_len) continue; |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
193 | if (strncmp(fen, other, fen_len) == 0) { |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
194 | if (++c == 2) return true; |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
195 | } |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
196 | } |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
197 | return false; |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
198 | } |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
199 | |
|
179
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
200 | static bool check_no_material_color(Color color, const GameState *gamestate) { |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
201 | /* count the available pieces */ |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
202 | unsigned piece_count[7] = {0}; |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
203 | unsigned op_piece_count[7] = {0}; |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
204 | bool has_bbishop = false, has_wbishop = false; |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
205 | bool op_has_bbishop = false, op_has_wbishop = false; |
| 194 | 206 | for (Rank r = 0 ; r < 8 ; r++) { |
|
179
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
207 | for (File f = 0 ; f < 8 ; f++) { |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
208 | Piece p = piece_at(gamestate, r, f); |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
209 | if (piece_color(p) == color) { |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
210 | piece_count[piece_type(p)]++; |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
211 | if (piece_type(p) == BISHOP) { |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
212 | if (field_color(r, f) == WHITE) { |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
213 | has_wbishop = true; |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
214 | } else { |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
215 | has_bbishop = true; |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
216 | } |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
217 | } |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
218 | } else { |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
219 | op_piece_count[piece_type(p)]++; |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
220 | if (piece_type(p) == BISHOP) { |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
221 | if (field_color(r, f) == WHITE) { |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
222 | op_has_wbishop = true; |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
223 | } else { |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
224 | op_has_bbishop = true; |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
225 | } |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
226 | } |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
227 | } |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
228 | } |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
229 | } |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
230 | |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
231 | /* rooks and queens are always enough - don't test them below */ |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
232 | if (piece_count[ROOK] > 0 || piece_count[QUEEN] > 0) |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
233 | return false; |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
234 | |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
235 | /* only the king left */ |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
236 | if (piece_count[PAWN] == 0 && piece_count[KNIGHT] == 0 |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
237 | && piece_count[BISHOP] == 0) |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
238 | return true; |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
239 | |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
240 | /* king + knight and the opponent has only king + queens */ |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
241 | if (piece_count[PAWN] == 0 && piece_count[BISHOP] == 0 |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
242 | && piece_count[KNIGHT] == 1 |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
243 | && op_piece_count[ROOK] == 0 && op_piece_count[BISHOP] == 0 |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
244 | && op_piece_count[KNIGHT] == 0 && op_piece_count[PAWN] == 0 |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
245 | && op_piece_count[QUEEN] > 0) |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
246 | return true; |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
247 | |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
248 | /* king + bishop and the opponent doesn't have |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
249 | * opposite color bishops or knights or pawns */ |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
250 | if (piece_count[PAWN] == 0 && piece_count[KNIGHT] == 0 |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
251 | && piece_count[BISHOP] > 0) { |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
252 | |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
253 | if (op_piece_count[KNIGHT] > 0 || op_piece_count[PAWN] > 0) |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
254 | return false; |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
255 | |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
256 | if (has_bbishop && op_has_wbishop) |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
257 | return false; |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
258 | |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
259 | if (has_wbishop && op_has_bbishop) |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
260 | return false; |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
261 | |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
262 | return true; |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
263 | } |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
264 | |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
265 | return false; |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
266 | } |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
267 | |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
268 | bool check_no_material(const GameState *gamestate) { |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
269 | return check_no_material_color(WHITE, gamestate) |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
270 | && check_no_material_color(BLACK, gamestate); |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
271 | } |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
272 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
273 | char getpiecechr(Piece piece) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
274 | switch (piece_type(piece)) { |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
275 | case ROOK: return 'R'; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
276 | case KNIGHT: return 'N'; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
277 | case BISHOP: return 'B'; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
278 | case QUEEN: return 'Q'; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
279 | case KING: return 'K'; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
280 | default: return '\0'; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
281 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
282 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
283 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
284 | char* getpieceunicode(Piece piece) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
285 | if (piece_color(piece) == WHITE) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
286 | switch (piece_type(piece)) { |
|
110
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
287 | case PAWN: return "\u2659"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
288 | case ROOK: return "\u2656"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
289 | case KNIGHT: return "\u2658"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
290 | case BISHOP: return "\u2657"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
291 | case QUEEN: return "\u2655"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
292 | case KING: return "\u2654"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
293 | default: return ""; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
294 | } |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
295 | } else { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
296 | switch (piece_type(piece)) { |
|
110
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
297 | case PAWN: return "\u265f"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
298 | case ROOK: return "\u265c"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
299 | case KNIGHT: return "\u265e"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
300 | case BISHOP: return "\u265d"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
301 | case QUEEN: return "\u265b"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
302 | case KING: return "\u265a"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
303 | default: return ""; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
304 | } |
| 69 | 305 | } |
| 306 | } | |
| 307 | ||
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
308 | Piece getpiece(char c, Color color) { |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
309 | switch (c) { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
310 | case 'R': return mkpiece(ROOK, color); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
311 | case 'N': return mkpiece(KNIGHT, color); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
312 | case 'B': return mkpiece(BISHOP, color); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
313 | case 'Q': return mkpiece(QUEEN, color); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
314 | case 'K': return mkpiece(KING, color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
315 | default: return 0; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
316 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
317 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
318 | |
|
173
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
319 | /* applies the move without recalculating gamestate flags */ |
|
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 | static void apply_move_internal(GameState *gamestate, Move *move) { |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
321 | /* en passant capture */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
322 | if (move->capture && piece_type(move->piece) == PAWN && |
| 194 | 323 | piece_at(gamestate, move->torank, move->tofile) == 0) { |
| 324 | piece_remove(gamestate, move->fromrank, move->tofile); | |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
325 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
326 | |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
327 | /* remove old en passant threats */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
328 | for (File file = 0 ; file < 8 ; file++) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
329 | enpassant_threat_remove(gamestate, 3, file); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
330 | enpassant_threat_remove(gamestate, 4, file); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
331 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
332 | |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
333 | /* move (and maybe capture or promote) */ |
| 194 | 334 | piece_remove(gamestate, move->fromrank, move->fromfile); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
335 | if (move->promotion) { |
| 194 | 336 | piece_set(gamestate, move->torank, move->tofile, move->promotion); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
337 | } else { |
| 194 | 338 | piece_set(gamestate, move->torank, move->tofile, move->piece); |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
339 | } |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
340 | |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
341 | /* add new en passant threat */ |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
342 | if (piece_type(move->piece) == PAWN && ( |
| 194 | 343 | (move->fromrank == 1 && move->torank == 3) || |
| 344 | (move->fromrank == 6 && move->torank == 4))) { | |
| 345 | enpassant_threat_add(gamestate, move->torank, move->tofile); | |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
346 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
347 | |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
348 | /* castling */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
349 | if (piece_type(move->piece) == KING && move->fromfile == fileidx('e')) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
350 | const Color color = piece_color(move->piece); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
351 | if (move->tofile == fileidx('g')) { |
| 194 | 352 | gamestate->board[move->torank][fileidx('h')] = 0; |
| 353 | gamestate->board[move->torank][fileidx('f')] = mkpiece(ROOK, color); | |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
354 | } else if (move->tofile == fileidx('c')) { |
| 194 | 355 | gamestate->board[move->torank][fileidx('a')] = 0; |
| 356 | gamestate->board[move->torank][fileidx('d')] = mkpiece(ROOK, color); | |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
357 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
358 | } |
|
66
f5cc75565f7c
fixes ambiguity resolver in PGN output not resolving ambiguities for diagonally attacking Knights
Mike Becker <universe@uap-core.de>
parents:
64
diff
changeset
|
359 | |
|
157
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
360 | /* add move to the moves array and the new position to the FEN array */ |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
361 | if (gamestate->movecount == gamestate->movecapacity) { |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
362 | gamestate->movecapacity += 64; /* 32 more full moves */ |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
363 | gamestate->moves = realloc(gamestate->moves, |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
364 | gamestate->movecapacity * sizeof(Move)); |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
365 | gamestate->fen = realloc(gamestate->fen, |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
366 | gamestate->movecapacity * sizeof(char*)); |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
367 | } |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
368 | |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
369 | /* copy the move data into the game's move array */ |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
370 | Move *melem = &gamestate->moves[gamestate->movecount]; |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
371 | *melem = *move; |
|
181
8bda076d0a16
simplify how the elapsed move time is recorded
Mike Becker <universe@uap-core.de>
parents:
179
diff
changeset
|
372 | calc_movetime(gamestate, melem); |
|
157
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
373 | |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
374 | /* important: only "add" the move after calculating the time! */ |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
375 | gamestate->movecount++; |
|
177
18dbb0dc9cd6
fix FEN being off by one
Mike Becker <universe@uap-core.de>
parents:
173
diff
changeset
|
376 | |
|
18dbb0dc9cd6
fix FEN being off by one
Mike Becker <universe@uap-core.de>
parents:
173
diff
changeset
|
377 | /* calculate the FEN of the new position and store it in the FEN array */ |
|
18dbb0dc9cd6
fix FEN being off by one
Mike Becker <universe@uap-core.de>
parents:
173
diff
changeset
|
378 | char fen[FEN_MAX_LENGTH]; |
|
18dbb0dc9cd6
fix FEN being off by one
Mike Becker <universe@uap-core.de>
parents:
173
diff
changeset
|
379 | fen_compute(fen, gamestate); |
|
18dbb0dc9cd6
fix FEN being off by one
Mike Becker <universe@uap-core.de>
parents:
173
diff
changeset
|
380 | gamestate->fen[gamestate->movecount - 1] = strdup(fen); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
381 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
382 | |
|
170
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
383 | void apply_move(GameState *gamestate, Move *move) { |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
384 | apply_move_internal(gamestate, move); |
|
173
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
385 | |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
386 | /* calculate gamestate flags in order of efficiency */ |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
387 | if (move->checkmate) { |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
388 | gamestate->checkmate = true; |
|
179
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
389 | } else if (check_no_material(gamestate)) { |
|
5ef724e21702
implement draw due to insufficient material
Mike Becker <universe@uap-core.de>
parents:
177
diff
changeset
|
390 | gamestate->nomaterial = true; |
|
173
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
391 | } else if (check_threefold_repetition(gamestate)) { |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
392 | gamestate->threefold = true; |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
393 | } else if (check_stalemate(gamestate)) { |
|
e541b6002933
implement first naive draw by threefold repetition
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
394 | gamestate->stalemate = true; |
|
170
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
395 | } |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
396 | } |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
397 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
398 | void gamestate_at_move(const GameState *gamestate, |
|
122
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
399 | unsigned move_number, GameState *replay) { |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
400 | gamestate_init(replay); |
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
401 | memcpy(&replay->info, &gamestate->info, sizeof(GameInfo)); |
|
122
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
402 | replay->review = true; |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
403 | if (move_number > gamestate->movecount) { |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
404 | move_number = gamestate->movecount; |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
405 | } |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
406 | for (unsigned i = 0 ; i < move_number ; i++) { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
407 | apply_move(replay, &(gamestate->moves[i])); |
|
122
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
408 | } |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
409 | } |
|
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
410 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
411 | /* return 0 = no check, 1 = check, 2 = checkmate */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
412 | static int determine_check_or_checkmate( |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
413 | const GameState *gamestate, const Move *move) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
414 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
415 | /* simulate the move */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
416 | GameState simulation = gamestate_copy_sim(gamestate); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
417 | Move simmove = *move; |
|
170
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
418 | apply_move_internal(&simulation, &simmove); |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
419 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
420 | /* find the opposing king */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
421 | Color piececolor = piece_color(move->piece); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
422 | Color oppcolor = opponent_color(piececolor); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
423 | File opkingfile = 0; |
| 194 | 424 | Rank opkingrank = 0; |
| 425 | for (Rank rank = 0 ; rank < 8 ; rank++) { | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
426 | for (File file = 0 ; file < 8 ; file++) { |
| 194 | 427 | Piece p = piece_at(&simulation, rank, file); |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
428 | if (p == mkpiece(KING, oppcolor)) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
429 | opkingfile = file; |
| 194 | 430 | opkingrank = rank; |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
431 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
432 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
433 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
434 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
435 | /* determine if the opposing king is now threatened */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
436 | Move threats[16]; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
437 | size_t threatcount; |
| 194 | 438 | bool incheck = get_threats(&simulation, opkingrank, opkingfile, |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
439 | piececolor, threats, &threatcount); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
440 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
441 | if (!incheck) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
442 | gamestate_cleanup(&simulation); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
443 | return 0; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
444 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
445 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
446 | /* determine possible escape fields */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
447 | bool canescape = false; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
448 | for (int dr = -1 ; dr <= 1 && !canescape ; dr++) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
449 | for (int df = -1 ; df <= 1 && !canescape ; df++) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
450 | if (dr == 0 && df == 0) continue; |
| 194 | 451 | Rank er = opkingrank + dr; |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
452 | File ef = opkingfile + df; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
453 | if (!isidx(er) || !isidx(ef)) continue; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
454 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
455 | /* check if piece of the king's color blocks the field */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
456 | if (piece_color(simulation.board[er][ef]) == oppcolor) |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
457 | continue; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
458 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
459 | /* check if escape field is already covered (threatened) */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
460 | if (is_covered(&simulation, er, ef, piececolor)) |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
461 | continue; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
462 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
463 | /* check if an attacking piece blocks the field */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
464 | if (piece_color(simulation.board[er][ef]) == piececolor) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
465 | /* test if the king can fight back */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
466 | GameState sim_retaliate = gamestate_copy_sim(&simulation); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
467 | Move move_retaliate = {0}; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
468 | move_retaliate.piece = mkpiece(KING, oppcolor); |
| 194 | 469 | move_retaliate.fromrank = opkingrank; |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
470 | move_retaliate.fromfile = opkingfile; |
| 194 | 471 | move_retaliate.torank = er; |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
472 | move_retaliate.tofile = ef; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
473 | move_retaliate.capture = true; |
|
170
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
474 | apply_move_internal(&sim_retaliate, &move_retaliate); |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
475 | canescape = !is_covered(&sim_retaliate, er, ef, piececolor); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
476 | gamestate_cleanup(&sim_retaliate); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
477 | continue; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
478 | } |
|
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 | /* the field is not covered and unoccupied */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
481 | canescape = true; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
482 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
483 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
484 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
485 | /* can't escape, can the king be rescued? */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
486 | if (!canescape && threatcount == 1) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
487 | canescape = is_protected(&simulation, |
| 194 | 488 | threats[0].fromrank, threats[0].fromfile, oppcolor); |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
489 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
490 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
491 | /* can't capture, can he block? */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
492 | if (!canescape && threatcount == 1) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
493 | Move *threat = &(threats[0]); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
494 | unsigned tptype = piece_type(threat->piece); |
|
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 | /* knight, pawns and the king cannot be blocked */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
497 | if (tptype == BISHOP || tptype == ROOK || tptype == QUEEN) { |
| 194 | 498 | if (threat->fromrank == threat->torank) { |
| 499 | /* rook aspect (on rank) */ | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
500 | int d = threat->tofile > threat->fromfile ? 1 : -1; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
501 | File file = threat->fromfile; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
502 | while (!canescape && file != threat->tofile - d) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
503 | file += d; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
504 | canescape |= is_protected(&simulation, |
| 194 | 505 | threat->torank, file, oppcolor); |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
506 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
507 | } else if (threat->fromfile == threat->tofile) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
508 | /* rook aspect (on file) */ |
| 194 | 509 | int d = threat->torank > threat->fromrank ? 1 : -1; |
| 510 | Rank rank = threat->fromrank; | |
| 511 | while (!canescape && rank != threat->torank - d) { | |
| 512 | rank += d; | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
513 | canescape |= is_protected(&simulation, |
| 194 | 514 | rank, threat->tofile, oppcolor); |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
515 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
516 | } else { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
517 | /* bishop aspect */ |
| 194 | 518 | int dr = threat->torank > threat->fromrank ? 1 : -1; |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
519 | int df = threat->tofile > threat->fromfile ? 1 : -1; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
520 | |
| 194 | 521 | Rank rank = threat->fromrank; |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
522 | File file = threat->fromfile; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
523 | while (!canescape && file != threat->tofile - df |
| 194 | 524 | && rank != threat->torank - dr) { |
| 525 | rank += dr; | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
526 | file += df; |
| 194 | 527 | canescape |= is_protected(&simulation, rank, file, |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
528 | oppcolor); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
529 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
530 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
531 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
532 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
533 | gamestate_cleanup(&simulation); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
534 | return canescape ? 1 : 2; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
535 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
536 | |
|
182
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
537 | |
|
186
8230904458a7
fix regression in network play: we have to transmit capture/check(mate) flags
Mike Becker <universe@uap-core.de>
parents:
185
diff
changeset
|
538 | void format_move(const GameState *gamestate, Move *move) { |
|
182
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
539 | char *string = &(move->string[0]); |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
540 | |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
541 | /* at least 8 characters should be available, wipe them out */ |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
542 | memset(string, 0, 8); |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
543 | |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
544 | unsigned int idx; |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
545 | if (piece_type(move->piece) == KING && |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
546 | abs(move->tofile-move->fromfile) == 2) { |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
547 | /* special formats for castling */ |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
548 | if (move->tofile==fileidx('c')) { |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
549 | memcpy(string, "O-O-O", 5); |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
550 | idx = 5; |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
551 | } else { |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
552 | memcpy(string, "O-O", 3); |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
553 | idx = 3; |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
554 | } |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
555 | } else { |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
556 | /* start by notating the piece character */ |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
557 | string[0] = getpiecechr(move->piece); |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
558 | idx = string[0] ? 1 : 0; |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
559 | |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
560 | /* find out how many source information we do need */ |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
561 | if (piece_type(move->piece) == PAWN) { |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
562 | if (move->capture) { |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
563 | string[idx++] = filechr(move->fromfile); |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
564 | } |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
565 | } else if (piece_type(move->piece) != KING) { |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
566 | /* resolve ambiguities, if any */ |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
567 | Move candidates[16]; |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
568 | size_t ccount; |
| 194 | 569 | if (get_real_candidates(gamestate, move->torank, move->tofile, |
|
182
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
570 | piece_color(move->piece), candidates, &ccount)) { |
| 194 | 571 | unsigned int ambranks = 0, ambfiles = 0, ambpiece = 0; |
|
182
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
572 | for (size_t i = 0 ; i < ccount ; i++) { |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
573 | if (candidates[i].piece == move->piece) { |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
574 | ambpiece++; |
| 194 | 575 | if (candidates[i].fromrank == move->fromrank) { |
| 576 | ambranks++; | |
|
182
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
577 | } |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
578 | if (candidates[i].fromfile == move->fromfile) { |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
579 | ambfiles++; |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
580 | } |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
581 | } |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
582 | } |
| 194 | 583 | /* neither file, nor rank are ambiguous, name file */ |
| 584 | if (ambpiece > 1 && ambranks == 1 && ambfiles == 1) { | |
|
182
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
585 | /* this is most likely the case with Knights |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
586 | * in diagonal opposition */ |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
587 | string[idx++] = filechr(move->fromfile); |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
588 | } else { |
| 194 | 589 | /* ambiguous rank, name file */ |
| 590 | if (ambranks > 1) { | |
|
182
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
591 | string[idx++] = filechr(move->fromfile); |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
592 | } |
| 194 | 593 | /* ambiguous file, name rank */ |
|
182
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
594 | if (ambfiles > 1) { |
| 194 | 595 | string[idx++] = rankchr(move->fromrank); |
|
182
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
596 | } |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
597 | } |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
598 | } |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
599 | } |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
600 | |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
601 | /* capturing? */ |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
602 | if (move->capture) { |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
603 | string[idx++] = 'x'; |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
604 | } |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
605 | |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
606 | /* destination */ |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
607 | string[idx++] = filechr(move->tofile); |
| 194 | 608 | string[idx++] = rankchr(move->torank); |
|
182
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
609 | |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
610 | /* promotion? */ |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
611 | if (move->promotion) { |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
612 | string[idx++] = '='; |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
613 | string[idx++] = getpiecechr(move->promotion); |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
614 | } |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
615 | } |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
616 | |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
617 | /* check? */ |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
618 | if (move->checkmate) { |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
619 | string[idx++] = '#'; |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
620 | } else if (move->check) { |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
621 | string[idx++] = '+'; |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
622 | } |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
623 | } |
|
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
624 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
625 | static int validate_move_rules(const GameState *gamestate, const Move *move) { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
626 | assert((move->piece & ~(PIECE_MASK|COLOR_MASK)) == 0); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
627 | |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
628 | /* validate indices (don't trust opponent) */ |
| 194 | 629 | if (!isidx(move->fromrank) || !isidx(move->fromfile) || |
| 630 | !isidx(move->torank) || !isidx(move->tofile)) { | |
|
153
bad2d6d4b861
fix wrong error message when move indices are invalid
Mike Becker <universe@uap-core.de>
parents:
152
diff
changeset
|
631 | return INVALID_MOVE_SYNTAX; |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
632 | } |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
633 | |
|
21
2e5846019b4f
implemented rook + some fixes
Mike Becker <universe@uap-core.de>
parents:
19
diff
changeset
|
634 | /* must move */ |
| 194 | 635 | if (move->fromfile == move->tofile && move->fromrank == move->torank) { |
|
185
c0acc89d6c01
fix wrong error code when chess rules are violated
Mike Becker <universe@uap-core.de>
parents:
182
diff
changeset
|
636 | return RULES_VIOLATED; |
|
21
2e5846019b4f
implemented rook + some fixes
Mike Becker <universe@uap-core.de>
parents:
19
diff
changeset
|
637 | } |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
638 | |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
639 | /* does piece exist */ |
| 194 | 640 | if (piece_at(gamestate, move->fromrank, move->fromfile) != move->piece) { |
|
154
5336e985bd69
rename INVALID_POSITION to PIECE_NOT_FOUND
Mike Becker <universe@uap-core.de>
parents:
153
diff
changeset
|
641 | return PIECE_NOT_FOUND; |
|
29
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
642 | } |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
643 | |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
644 | /* is there any piece at the destination? */ |
| 194 | 645 | Piece piece_at_dst = piece_at(gamestate, move->torank, move->tofile); |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
646 | |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
647 | /* can't capture own pieces */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
648 | if (piece_color(piece_at_dst) == piece_color(move->piece)) { |
|
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
|
649 | return RULES_VIOLATED; |
|
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:
40
diff
changeset
|
650 | } |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
651 | |
|
151
f1b6a0388d85
fix that en passant captures do not work
Mike Becker <universe@uap-core.de>
parents:
147
diff
changeset
|
652 | /* must capture, if and only if destination is occupied... */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
653 | if (!((piece_at_dst == 0) ^ move->capture)) { |
|
151
f1b6a0388d85
fix that en passant captures do not work
Mike Becker <universe@uap-core.de>
parents:
147
diff
changeset
|
654 | /* ... or the capture happens en passant */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
655 | if (!move->capture || piece_type(move->piece) != PAWN || |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
656 | !enpassant_threat_exists(gamestate, |
| 194 | 657 | move->fromrank, move->tofile)) { |
|
185
c0acc89d6c01
fix wrong error code when chess rules are violated
Mike Becker <universe@uap-core.de>
parents:
182
diff
changeset
|
658 | return RULES_VIOLATED; |
|
151
f1b6a0388d85
fix that en passant captures do not work
Mike Becker <universe@uap-core.de>
parents:
147
diff
changeset
|
659 | } |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
660 | } |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
661 | |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
662 | /* validate individual rules */ |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
78
diff
changeset
|
663 | bool chkrules; |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
664 | switch (piece_type(move->piece)) { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
665 | case PAWN: |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
666 | chkrules = pawn_chkrules(gamestate, move) && |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
667 | !pawn_isblocked(gamestate, move); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
668 | break; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
669 | case ROOK: |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
670 | chkrules = rook_chkrules(move) && |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
671 | !rook_isblocked(gamestate, move); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
672 | break; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
673 | case KNIGHT: |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
674 | chkrules = knight_chkrules(move) && |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
675 | !knight_isblocked(gamestate, move); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
676 | break; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
677 | case BISHOP: |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
678 | chkrules = bishop_chkrules(move) && |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
679 | !bishop_isblocked(gamestate, move); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
680 | break; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
681 | case QUEEN: |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
682 | chkrules = queen_chkrules(move) && |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
683 | !queen_isblocked(gamestate, move); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
684 | break; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
685 | case KING: |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
686 | chkrules = king_chkrules(gamestate, move) && |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
687 | !king_isblocked(gamestate, move); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
688 | break; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
689 | default: |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
690 | return INVALID_MOVE_SYNTAX; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
691 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
692 | |
|
167
fd1d3f0a7a73
fix regression: pieces could not threaten fields when pinned
Mike Becker <universe@uap-core.de>
parents:
166
diff
changeset
|
693 | return chkrules ? VALID_MOVE_SEMANTICS : RULES_VIOLATED; |
|
fd1d3f0a7a73
fix regression: pieces could not threaten fields when pinned
Mike Becker <universe@uap-core.de>
parents:
166
diff
changeset
|
694 | } |
|
fd1d3f0a7a73
fix regression: pieces could not threaten fields when pinned
Mike Becker <universe@uap-core.de>
parents:
166
diff
changeset
|
695 | |
|
fd1d3f0a7a73
fix regression: pieces could not threaten fields when pinned
Mike Becker <universe@uap-core.de>
parents:
166
diff
changeset
|
696 | int validate_move(const GameState *gamestate, const Move *move) { |
|
fd1d3f0a7a73
fix regression: pieces could not threaten fields when pinned
Mike Becker <universe@uap-core.de>
parents:
166
diff
changeset
|
697 | int result = validate_move_rules(gamestate, move); |
|
fd1d3f0a7a73
fix regression: pieces could not threaten fields when pinned
Mike Becker <universe@uap-core.de>
parents:
166
diff
changeset
|
698 | if (result != VALID_MOVE_SEMANTICS) { |
|
fd1d3f0a7a73
fix regression: pieces could not threaten fields when pinned
Mike Becker <universe@uap-core.de>
parents:
166
diff
changeset
|
699 | return result; |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
700 | } |
|
167
fd1d3f0a7a73
fix regression: pieces could not threaten fields when pinned
Mike Becker <universe@uap-core.de>
parents:
166
diff
changeset
|
701 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
702 | /* test if the move would expose our own king */ |
|
62
564af8a16828
fixes move validation working on old king's position, when the king moves
Mike Becker <universe@uap-core.de>
parents:
55
diff
changeset
|
703 | GameState simulation = gamestate_copy_sim(gamestate); |
|
564af8a16828
fixes move validation working on old king's position, when the king moves
Mike Becker <universe@uap-core.de>
parents:
55
diff
changeset
|
704 | Move simmove = *move; |
|
170
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
705 | apply_move_internal(&simulation, &simmove); |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
706 | Color piececolor = piece_color(move->piece); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
707 | Color oppcolor = opponent_color(piececolor); |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
708 | File kingfile = 0; |
| 194 | 709 | Rank kingrank = 0; |
| 710 | for (Rank rank = 0 ; rank < 8 ; rank++) { | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
711 | for (File file = 0 ; file < 8 ; file++) { |
| 194 | 712 | Piece p = piece_at(&simulation, rank, file); |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
713 | if (p == mkpiece(KING, piececolor)) { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
714 | kingfile = file; |
| 194 | 715 | kingrank = rank; |
|
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
|
716 | } |
|
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
|
717 | } |
|
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
|
718 | } |
| 194 | 719 | if (is_covered(&simulation, kingrank, kingfile, oppcolor)) { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
720 | if (piece_type(move->piece) == KING) { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
721 | result = KING_MOVES_INTO_CHECK; |
|
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
|
722 | } else { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
723 | if (is_check_position(gamestate)) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
724 | result = KING_IN_CHECK; |
|
161
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
160
diff
changeset
|
725 | } else { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
726 | result = PIECE_PINNED; |
|
161
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
160
diff
changeset
|
727 | } |
|
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
|
728 | } |
|
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
|
729 | } |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
730 | gamestate_cleanup(&simulation); |
| 139 | 731 | |
|
170
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
732 | if (result != VALID_MOVE_SEMANTICS) { |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
733 | return result; |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
734 | } |
|
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
735 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
736 | /* validate check and checkmate flags */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
737 | int cocm = determine_check_or_checkmate(gamestate, move); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
738 | if (cocm == 2) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
739 | if (!move->checkmate) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
740 | return MISSING_CHECKMATE; |
|
29
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
741 | } |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
742 | } else if (cocm == 1) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
743 | if (!move->check) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
744 | return MISSING_CHECK; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
745 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
746 | } else if (move->checkmate) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
747 | return INVALID_CHECKMATE; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
748 | } else if (move->check) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
749 | return INVALID_CHECK; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
750 | } |
|
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
|
751 | |
|
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
|
752 | return VALID_MOVE_SEMANTICS; |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
753 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
754 | |
| 194 | 755 | Piece piece_at(const GameState *gamestate, Rank rank, File file) { |
| 756 | return gamestate->board[rank][file] & (PIECE_MASK|COLOR_MASK); | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
757 | } |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
758 | |
| 194 | 759 | void piece_set(GameState *gamestate, Rank rank, File file, Piece piece) { |
| 760 | gamestate->board[rank][file] = piece; | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
761 | } |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
762 | |
| 194 | 763 | bool get_candidates(const GameState *gamestate, Rank rank, File file, |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
764 | Color color, Move *moves, size_t *movecount) { |
|
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:
40
diff
changeset
|
765 | Move candidates[32]; |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
766 | size_t ccount = 0; |
| 194 | 767 | for (Rank r = 0 ; r < 8 ; r++) { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
768 | for (File f = 0 ; f < 8 ; f++) { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
769 | Piece p = piece_at(gamestate, r, f); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
770 | if (piece_color(p) == color) { |
|
64
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
771 | /* non-capturing move */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
772 | memset(&(candidates[ccount]), 0, sizeof(Move)); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
773 | candidates[ccount].piece = p; |
| 194 | 774 | candidates[ccount].fromrank = r; |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
775 | candidates[ccount].fromfile = f; |
| 194 | 776 | candidates[ccount].torank = rank; |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
777 | candidates[ccount].tofile = file; |
| 194 | 778 | if (piece_type(p) == PAWN && (rank == 0 || rank == 7)) { |
|
135
114e764fbae5
fixes #893 - pawn could not promote
Mike Becker <universe@uap-core.de>
parents:
133
diff
changeset
|
779 | /* the exact piece for promotion does not matter */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
780 | candidates[ccount].promotion = mkpiece(QUEEN, color); |
|
135
114e764fbae5
fixes #893 - pawn could not promote
Mike Becker <universe@uap-core.de>
parents:
133
diff
changeset
|
781 | } |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
782 | ccount++; |
|
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:
40
diff
changeset
|
783 | |
|
64
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
784 | /* capturing move */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
785 | memcpy(&(candidates[ccount]), |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
786 | &(candidates[ccount-1]), sizeof(Move)); |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
787 | candidates[ccount].capture = true; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
788 | ccount++; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
789 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
790 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
791 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
792 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
793 | if (movecount) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
794 | *movecount = 0; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
795 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
796 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
797 | bool result = false; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
798 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
799 | for (size_t i = 0 ; i < ccount ; i++) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
800 | if (validate_move_rules(gamestate, &(candidates[i])) |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
801 | == VALID_MOVE_SEMANTICS) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
802 | result = true; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
803 | if (moves && movecount) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
804 | moves[(*movecount)++] = candidates[i]; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
805 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
806 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
807 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
808 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
809 | return result; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
810 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
811 | |
| 194 | 812 | bool get_threats(const GameState *gamestate, Rank rank, File file, |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
813 | Color color, Move *threats, size_t *threatcount) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
814 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
815 | /* simulate a capturing move on the target position */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
816 | Color opcolor = opponent_color(color); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
817 | GameState simulation = gamestate_copy_sim(gamestate); |
| 194 | 818 | if (piece_color(piece_at(&simulation, rank, file)) != opcolor) { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
819 | /* set a fake pawn if the field is not occupied by the opponent */ |
| 194 | 820 | piece_set(&simulation, rank, file, mkpiece(PAWN, opcolor)); |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
821 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
822 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
823 | Move candidates[16]; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
824 | size_t ccount = 0; |
| 194 | 825 | for (Rank r = 0 ; r < 8 ; r++) { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
826 | for (File f = 0 ; f < 8 ; f++) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
827 | Piece p = piece_at(&simulation, r, f); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
828 | if (piece_color(p) == color) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
829 | memset(&(candidates[ccount]), 0, sizeof(Move)); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
830 | candidates[ccount].piece = p; |
| 194 | 831 | candidates[ccount].fromrank = r; |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
832 | candidates[ccount].fromfile = f; |
| 194 | 833 | candidates[ccount].torank = rank; |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
834 | candidates[ccount].tofile = file; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
835 | candidates[ccount].capture = true; |
| 194 | 836 | if (piece_type(p) == PAWN && (rank == 0 || rank == 7)) { |
|
165
3e27c99ed721
fix regression: missing promotion when simulating threats
Mike Becker <universe@uap-core.de>
parents:
164
diff
changeset
|
837 | /* the exact piece for promotion does not matter */ |
|
3e27c99ed721
fix regression: missing promotion when simulating threats
Mike Becker <universe@uap-core.de>
parents:
164
diff
changeset
|
838 | candidates[ccount].promotion = mkpiece(QUEEN, color); |
|
3e27c99ed721
fix regression: missing promotion when simulating threats
Mike Becker <universe@uap-core.de>
parents:
164
diff
changeset
|
839 | } |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
840 | ccount++; |
|
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:
40
diff
changeset
|
841 | } |
|
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:
40
diff
changeset
|
842 | } |
|
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:
40
diff
changeset
|
843 | } |
|
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:
40
diff
changeset
|
844 | |
|
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:
40
diff
changeset
|
845 | if (threatcount) { |
|
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:
40
diff
changeset
|
846 | *threatcount = 0; |
|
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:
40
diff
changeset
|
847 | } |
|
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:
40
diff
changeset
|
848 | |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
78
diff
changeset
|
849 | bool result = false; |
|
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:
40
diff
changeset
|
850 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
851 | for (size_t i = 0 ; i < ccount ; i++) { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
852 | if (validate_move_rules(&simulation, &(candidates[i])) |
|
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
|
853 | == VALID_MOVE_SEMANTICS) { |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
78
diff
changeset
|
854 | result = true; |
|
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:
40
diff
changeset
|
855 | if (threats && threatcount) { |
|
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:
40
diff
changeset
|
856 | threats[(*threatcount)++] = candidates[i]; |
|
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:
40
diff
changeset
|
857 | } |
|
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:
40
diff
changeset
|
858 | } |
|
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:
40
diff
changeset
|
859 | } |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
860 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
861 | gamestate_cleanup(&simulation); |
|
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:
40
diff
changeset
|
862 | |
|
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:
40
diff
changeset
|
863 | return result; |
|
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:
40
diff
changeset
|
864 | } |
|
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:
40
diff
changeset
|
865 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
866 | bool is_pinned(const GameState *gamestate, const Move *move) { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
867 | Color color = piece_color(move->piece); |
|
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:
40
diff
changeset
|
868 | |
|
62
564af8a16828
fixes move validation working on old king's position, when the king moves
Mike Becker <universe@uap-core.de>
parents:
55
diff
changeset
|
869 | GameState simulation = gamestate_copy_sim(gamestate); |
|
564af8a16828
fixes move validation working on old king's position, when the king moves
Mike Becker <universe@uap-core.de>
parents:
55
diff
changeset
|
870 | Move simmove = *move; |
|
170
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
871 | apply_move_internal(&simulation, &simmove); |
|
62
564af8a16828
fixes move validation working on old king's position, when the king moves
Mike Becker <universe@uap-core.de>
parents:
55
diff
changeset
|
872 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
873 | File kingfile = 0; |
| 194 | 874 | Rank kingrank = 0; |
| 875 | for (Rank rank = 0 ; rank < 8 ; rank++) { | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
876 | for (File file = 0 ; file < 8 ; file++) { |
| 194 | 877 | if (piece_at(&simulation, rank, file) == mkpiece(KING, color)) { |
|
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:
40
diff
changeset
|
878 | kingfile = file; |
| 194 | 879 | kingrank = rank; |
|
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:
40
diff
changeset
|
880 | } |
|
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:
40
diff
changeset
|
881 | } |
|
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:
40
diff
changeset
|
882 | } |
|
62
564af8a16828
fixes move validation working on old king's position, when the king moves
Mike Becker <universe@uap-core.de>
parents:
55
diff
changeset
|
883 | |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
78
diff
changeset
|
884 | bool covered = is_covered(&simulation, |
| 194 | 885 | kingrank, kingfile, opponent_color(color)); |
|
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
|
886 | gamestate_cleanup(&simulation); |
|
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
|
887 | |
|
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
|
888 | return covered; |
|
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:
40
diff
changeset
|
889 | } |
|
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:
40
diff
changeset
|
890 | |
| 194 | 891 | bool get_real_candidates(const GameState *gamestate, Rank rank, File file, |
|
168
663676cfef6e
fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
892 | 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
|
893 | |
|
663676cfef6e
fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
894 | if (movecount) { |
|
663676cfef6e
fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
895 | *movecount = 0; |
|
663676cfef6e
fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
896 | } |
|
663676cfef6e
fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
897 | |
|
663676cfef6e
fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
898 | Move candidates[16]; |
|
663676cfef6e
fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
899 | size_t ccount; |
| 194 | 900 | if (get_candidates(gamestate, rank, file, color, candidates, &ccount)) { |
|
168
663676cfef6e
fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
901 | bool result = false; |
|
663676cfef6e
fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
902 | for (size_t i = 0 ; i < ccount ; i++) { |
|
663676cfef6e
fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
903 | if (!is_pinned(gamestate, &candidates[i])) { |
|
663676cfef6e
fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
904 | result = true; |
|
663676cfef6e
fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
905 | if (moves && movecount) { |
|
663676cfef6e
fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
906 | moves[(*movecount)++] = candidates[i]; |
|
663676cfef6e
fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
907 | } |
|
663676cfef6e
fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
908 | } |
|
663676cfef6e
fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
909 | } |
|
663676cfef6e
fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
910 | return result; |
|
663676cfef6e
fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
911 | } else { |
|
663676cfef6e
fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
912 | return false; |
|
663676cfef6e
fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
913 | } |
|
663676cfef6e
fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
914 | } |
|
663676cfef6e
fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
915 | |
| 194 | 916 | bool get_real_threats(const GameState *gamestate, Rank rank, File file, |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
917 | Color color, Move *threats, size_t *threatcount) { |
|
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:
40
diff
changeset
|
918 | |
|
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:
40
diff
changeset
|
919 | if (threatcount) { |
|
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:
40
diff
changeset
|
920 | *threatcount = 0; |
|
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:
40
diff
changeset
|
921 | } |
|
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:
40
diff
changeset
|
922 | |
|
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:
40
diff
changeset
|
923 | Move candidates[16]; |
|
168
663676cfef6e
fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
924 | size_t ccount; |
| 194 | 925 | if (get_threats(gamestate, rank, file, color, candidates, &ccount)) { |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
78
diff
changeset
|
926 | bool result = false; |
|
168
663676cfef6e
fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
927 | for (size_t i = 0 ; i < ccount ; i++) { |
|
663676cfef6e
fix unnecessary disambiguation + simplify get_real_threats() code
Mike Becker <universe@uap-core.de>
parents:
167
diff
changeset
|
928 | if (!is_pinned(gamestate, &candidates[i])) { |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
78
diff
changeset
|
929 | result = true; |
|
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:
40
diff
changeset
|
930 | if (threats && threatcount) { |
|
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:
40
diff
changeset
|
931 | threats[(*threatcount)++] = candidates[i]; |
|
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:
40
diff
changeset
|
932 | } |
|
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:
40
diff
changeset
|
933 | } |
|
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:
40
diff
changeset
|
934 | } |
|
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:
40
diff
changeset
|
935 | return result; |
|
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:
40
diff
changeset
|
936 | } else { |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
78
diff
changeset
|
937 | return false; |
|
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:
40
diff
changeset
|
938 | } |
|
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:
40
diff
changeset
|
939 | } |
|
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
|
940 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
941 | static int getlocation(const 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:
40
diff
changeset
|
942 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
943 | Color color = piece_color(move->piece); |
|
161
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
160
diff
changeset
|
944 | bool incheck = false; |
|
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
160
diff
changeset
|
945 | if (gamestate->movecount > 0) { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
946 | incheck = is_check_position(gamestate); |
|
161
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
160
diff
changeset
|
947 | } |
|
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:
40
diff
changeset
|
948 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
949 | Move candidates[16], *candidate = NULL; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
950 | size_t candidatecount; |
|
135
114e764fbae5
fixes #893 - pawn could not promote
Mike Becker <universe@uap-core.de>
parents:
133
diff
changeset
|
951 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
952 | /* determine all candidate moves and sort out the invalid ones */ |
| 194 | 953 | if (get_candidates(gamestate, move->torank, move->tofile, color, |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
954 | candidates, &candidatecount)) { |
|
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:
40
diff
changeset
|
955 | |
|
156
05fc8a454700
fix: wrong error code when king moves into check and missing auto-disambiguation when one of the candidate pieces is pinned
Mike Becker <universe@uap-core.de>
parents:
155
diff
changeset
|
956 | bool found = false; |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
957 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
958 | for (size_t i = 0 ; i < candidatecount ; i++) { |
| 194 | 959 | /* filter by partial fromrank/fromfile information */ |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
960 | if (candidates[i].piece == move->piece && |
| 194 | 961 | (move->fromrank == POS_UNSPECIFIED || |
| 962 | move->fromrank == candidates[i].fromrank) && | |
|
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:
40
diff
changeset
|
963 | (move->fromfile == POS_UNSPECIFIED || |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
964 | move->fromfile == candidates[i].fromfile)) { |
|
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:
40
diff
changeset
|
965 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
966 | /* found a candidate, here it does not matter if it's valid! */ |
|
156
05fc8a454700
fix: wrong error code when king moves into check and missing auto-disambiguation when one of the candidate pieces is pinned
Mike Becker <universe@uap-core.de>
parents:
155
diff
changeset
|
967 | found = true; |
|
05fc8a454700
fix: wrong error code when king moves into check and missing auto-disambiguation when one of the candidate pieces is pinned
Mike Becker <universe@uap-core.de>
parents:
155
diff
changeset
|
968 | |
|
05fc8a454700
fix: wrong error code when king moves into check and missing auto-disambiguation when one of the candidate pieces is pinned
Mike Becker <universe@uap-core.de>
parents:
155
diff
changeset
|
969 | /* discard pinned pieces */ |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
970 | if (!is_pinned(gamestate, &(candidates[i]))) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
971 | if (candidate) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
972 | /* we've already found a valid candidate */ |
|
156
05fc8a454700
fix: wrong error code when king moves into check and missing auto-disambiguation when one of the candidate pieces is pinned
Mike Becker <universe@uap-core.de>
parents:
155
diff
changeset
|
973 | return AMBIGUOUS_MOVE; |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
974 | } else { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
975 | candidate = &(candidates[i]); |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
976 | } |
|
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:
40
diff
changeset
|
977 | } |
|
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:
40
diff
changeset
|
978 | } |
|
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:
40
diff
changeset
|
979 | } |
|
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:
40
diff
changeset
|
980 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
981 | /* no valid candidate left */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
982 | if (!candidate) { |
|
156
05fc8a454700
fix: wrong error code when king moves into check and missing auto-disambiguation when one of the candidate pieces is pinned
Mike Becker <universe@uap-core.de>
parents:
155
diff
changeset
|
983 | if (found) { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
984 | if (piece_type(move->piece) == KING) { |
|
156
05fc8a454700
fix: wrong error code when king moves into check and missing auto-disambiguation when one of the candidate pieces is pinned
Mike Becker <universe@uap-core.de>
parents:
155
diff
changeset
|
985 | return KING_MOVES_INTO_CHECK; |
|
05fc8a454700
fix: wrong error code when king moves into check and missing auto-disambiguation when one of the candidate pieces is pinned
Mike Becker <universe@uap-core.de>
parents:
155
diff
changeset
|
986 | } else if (incheck) { |
|
05fc8a454700
fix: wrong error code when king moves into check and missing auto-disambiguation when one of the candidate pieces is pinned
Mike Becker <universe@uap-core.de>
parents:
155
diff
changeset
|
987 | return KING_IN_CHECK; |
|
05fc8a454700
fix: wrong error code when king moves into check and missing auto-disambiguation when one of the candidate pieces is pinned
Mike Becker <universe@uap-core.de>
parents:
155
diff
changeset
|
988 | } else { |
|
05fc8a454700
fix: wrong error code when king moves into check and missing auto-disambiguation when one of the candidate pieces is pinned
Mike Becker <universe@uap-core.de>
parents:
155
diff
changeset
|
989 | return PIECE_PINNED; |
|
05fc8a454700
fix: wrong error code when king moves into check and missing auto-disambiguation when one of the candidate pieces is pinned
Mike Becker <universe@uap-core.de>
parents:
155
diff
changeset
|
990 | } |
|
05fc8a454700
fix: wrong error code when king moves into check and missing auto-disambiguation when one of the candidate pieces is pinned
Mike Becker <universe@uap-core.de>
parents:
155
diff
changeset
|
991 | } else { |
|
05fc8a454700
fix: wrong error code when king moves into check and missing auto-disambiguation when one of the candidate pieces is pinned
Mike Becker <universe@uap-core.de>
parents:
155
diff
changeset
|
992 | return PIECE_NOT_FOUND; |
|
05fc8a454700
fix: wrong error code when king moves into check and missing auto-disambiguation when one of the candidate pieces is pinned
Mike Becker <universe@uap-core.de>
parents:
155
diff
changeset
|
993 | } |
|
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:
40
diff
changeset
|
994 | } |
|
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:
40
diff
changeset
|
995 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
996 | /* found a candidate, copy the source location */ |
| 194 | 997 | move->fromrank = candidate->fromrank; |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
998 | move->fromfile = candidate->fromfile; |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
999 | return VALID_MOVE_SYNTAX; |
|
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:
40
diff
changeset
|
1000 | } else { |
|
154
5336e985bd69
rename INVALID_POSITION to PIECE_NOT_FOUND
Mike Becker <universe@uap-core.de>
parents:
153
diff
changeset
|
1001 | return PIECE_NOT_FOUND; |
|
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:
40
diff
changeset
|
1002 | } |
|
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:
40
diff
changeset
|
1003 | } |
|
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:
40
diff
changeset
|
1004 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
1005 | static int eval_move1(const char *pstr, Move *move, Color color) { |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1006 | memset(move, 0, sizeof(Move)); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1007 | move->fromfile = POS_UNSPECIFIED; |
| 194 | 1008 | move->fromrank = POS_UNSPECIFIED; |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1009 | |
|
147
7e3f2d462bb6
make eval_move() and check_move() not change their input string
Mike Becker <universe@uap-core.de>
parents:
144
diff
changeset
|
1010 | size_t len = strlen(pstr); |
|
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
|
1011 | if (len < 1 || len > 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
|
1012 | return INVALID_MOVE_SYNTAX; |
|
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
|
1013 | } |
|
147
7e3f2d462bb6
make eval_move() and check_move() not change their input string
Mike Becker <universe@uap-core.de>
parents:
144
diff
changeset
|
1014 | char mstr[8]; |
|
7e3f2d462bb6
make eval_move() and check_move() not change their input string
Mike Becker <universe@uap-core.de>
parents:
144
diff
changeset
|
1015 | strcpy(mstr, pstr); |
|
186
8230904458a7
fix regression in network play: we have to transmit capture/check(mate) flags
Mike Becker <universe@uap-core.de>
parents:
185
diff
changeset
|
1016 | strcpy(move->string, pstr); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1017 | |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1018 | /* evaluate check/checkmate flags */ |
|
144
c3ae96ed44d1
fix that checkmate notation did not set the check flag in the move
Mike Becker <universe@uap-core.de>
parents:
139
diff
changeset
|
1019 | if (mstr[len-1] == '+' || mstr[len-1] == '#') { |
|
c3ae96ed44d1
fix that checkmate notation did not set the check flag in the move
Mike Becker <universe@uap-core.de>
parents:
139
diff
changeset
|
1020 | move->check = true; |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1021 | move->checkmate = mstr[len-1] == '#'; |
|
164
c19d8523b31c
fix bug when parsing checkmate indicator
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
1022 | len--; mstr[len] = '\0'; |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1023 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1024 | |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1025 | /* evaluate promotion */ |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1026 | if (len > 3 && mstr[len-2] == '=') { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
1027 | move->promotion = getpiece(mstr[len-1], color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1028 | if (!move->promotion) { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1029 | return INVALID_MOVE_SYNTAX; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1030 | } else { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1031 | len -= 2; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1032 | mstr[len] = 0; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1033 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1034 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1035 | |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1036 | if (len == 2) { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1037 | /* pawn move (e.g. "e4") */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
1038 | move->piece = mkpiece(PAWN, color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1039 | move->tofile = fileidx(mstr[0]); |
| 194 | 1040 | move->torank = rankidx(mstr[1]); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1041 | } else if (len == 3) { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1042 | if (strcmp(mstr, "O-O") == 0) { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1043 | /* king side castling */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
1044 | move->piece = mkpiece(KING, color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1045 | move->fromfile = fileidx('e'); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1046 | move->tofile = fileidx('g'); |
| 194 | 1047 | move->fromrank = move->torank = color == WHITE ? 0 : 7; |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1048 | } else { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1049 | /* move (e.g. "Nf3") */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
1050 | move->piece = getpiece(mstr[0], color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1051 | move->tofile = fileidx(mstr[1]); |
| 194 | 1052 | move->torank = rankidx(mstr[2]); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1053 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1054 | } else if (len == 4) { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
1055 | move->piece = getpiece(mstr[0], color); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
1056 | if (move->piece == 0) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
1057 | move->piece = mkpiece(PAWN, color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1058 | move->fromfile = fileidx(mstr[0]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1059 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1060 | if (mstr[1] == 'x') { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1061 | /* capture (e.g. "Nxf3", "dxe5") */ |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1062 | move->capture = true; |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1063 | } else { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1064 | /* move (e.g. "Ndf3", "N2c3", "e2e4") */ |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1065 | if (isfile(mstr[1])) { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1066 | move->fromfile = fileidx(mstr[1]); |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
1067 | /* when the piece is a pawn, second char cannot be a file */ |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
1068 | if (piece_type(move->piece) == PAWN) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
1069 | /* invalidate the result */ |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1070 | move->piece = 0; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1071 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1072 | } else { |
| 194 | 1073 | move->fromrank = rankidx(mstr[1]); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1074 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1075 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1076 | move->tofile = fileidx(mstr[2]); |
| 194 | 1077 | move->torank = rankidx(mstr[3]); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1078 | } else if (len == 5) { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1079 | if (strcmp(mstr, "O-O-O") == 0) { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1080 | /* queen side castling "O-O-O" */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
1081 | move->piece = mkpiece(KING, color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1082 | move->fromfile = fileidx('e'); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1083 | move->tofile = fileidx('c'); |
| 194 | 1084 | move->fromrank = move->torank = color == WHITE ? 0 : 7; |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1085 | } else { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
1086 | move->piece = getpiece(mstr[0], color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1087 | if (mstr[2] == 'x') { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1088 | move->capture = true; |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1089 | if (move->piece) { |
|
155
835776e0338f
fix: disambiguation by row while capturing was not implemented
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
1090 | /* capture (e.g. "Ndxf3" or "R1xh3") */ |
|
835776e0338f
fix: disambiguation by row while capturing was not implemented
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
1091 | if (isfile(mstr[1])) { |
|
835776e0338f
fix: disambiguation by row while capturing was not implemented
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
1092 | move->fromfile = fileidx(mstr[1]); |
| 194 | 1093 | } else if (isrank(mstr[1])) { |
| 1094 | move->fromrank = rankidx(mstr[1]); | |
|
155
835776e0338f
fix: disambiguation by row while capturing was not implemented
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
1095 | } else { |
|
835776e0338f
fix: disambiguation by row while capturing was not implemented
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
1096 | return INVALID_MOVE_SYNTAX; |
|
835776e0338f
fix: disambiguation by row while capturing was not implemented
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
1097 | } |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1098 | } else { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1099 | /* long notation capture (e.g. "e5xf6") */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
1100 | move->piece = mkpiece(PAWN, color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1101 | move->fromfile = fileidx(mstr[0]); |
| 194 | 1102 | move->fromrank = rankidx(mstr[1]); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1103 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1104 | } else { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1105 | /* long notation move (e.g. "Nc5a4") */ |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1106 | move->fromfile = fileidx(mstr[1]); |
| 194 | 1107 | move->fromrank = rankidx(mstr[2]); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1108 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1109 | move->tofile = fileidx(mstr[3]); |
| 194 | 1110 | move->torank = rankidx(mstr[4]); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1111 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1112 | } else if (len == 6) { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1113 | /* long notation capture (e.g. "Nc5xf3") */ |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1114 | if (mstr[3] == 'x') { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1115 | move->capture = true; |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
1116 | move->piece = getpiece(mstr[0], color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1117 | move->fromfile = fileidx(mstr[1]); |
| 194 | 1118 | move->fromrank = rankidx(mstr[2]); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1119 | move->tofile = fileidx(mstr[4]); |
| 194 | 1120 | move->torank = rankidx(mstr[5]); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1121 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1122 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1123 | |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1124 | |
|
115
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
1125 | if (!move->piece) { |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
1126 | return INVALID_MOVE_SYNTAX; |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
1127 | } |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
1128 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
1129 | if (piece_type(move->piece) == PAWN |
| 194 | 1130 | && move->torank == (color==WHITE?7:0) |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
1131 | && !move->promotion) { |
|
115
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
1132 | return NEED_PROMOTION; |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
1133 | } |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
1134 | |
|
153
bad2d6d4b861
fix wrong error message when move indices are invalid
Mike Becker <universe@uap-core.de>
parents:
152
diff
changeset
|
1135 | /* up to this point |
|
bad2d6d4b861
fix wrong error message when move indices are invalid
Mike Becker <universe@uap-core.de>
parents:
152
diff
changeset
|
1136 | * destination indices must be specified and valid |
|
bad2d6d4b861
fix wrong error message when move indices are invalid
Mike Becker <universe@uap-core.de>
parents:
152
diff
changeset
|
1137 | * source indices must either be valid or unspecified |
|
bad2d6d4b861
fix wrong error message when move indices are invalid
Mike Becker <universe@uap-core.de>
parents:
152
diff
changeset
|
1138 | */ |
| 194 | 1139 | if (!isidxr(move->fromrank) || !isidxr(move->fromfile) || |
| 1140 | !isidx(move->torank) || !isidx(move->tofile)) { | |
|
153
bad2d6d4b861
fix wrong error message when move indices are invalid
Mike Becker <universe@uap-core.de>
parents:
152
diff
changeset
|
1141 | return INVALID_MOVE_SYNTAX; |
|
115
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
1142 | } |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
1143 | |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
1144 | return VALID_MOVE_SYNTAX; |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
1145 | } |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
1146 | |
|
186
8230904458a7
fix regression in network play: we have to transmit capture/check(mate) flags
Mike Becker <universe@uap-core.de>
parents:
185
diff
changeset
|
1147 | static int eval_move2(const GameState *gamestate, |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1148 | const char *mstr, Color color, Move *move, bool lazy) { |
|
115
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
1149 | int result = eval_move1(mstr, move, color); |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
1150 | if (result == VALID_MOVE_SYNTAX) { |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1151 | if (move->fromfile == POS_UNSPECIFIED |
| 194 | 1152 | || move->fromrank == POS_UNSPECIFIED) { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1153 | result = getlocation(gamestate, move); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1154 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1155 | if (result == VALID_MOVE_SYNTAX) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1156 | /* correct check/checkmate flags */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1157 | if (lazy) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1158 | move->check = move->checkmate = false; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1159 | switch (determine_check_or_checkmate(gamestate, move)) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1160 | case 2: move->checkmate = true; |
|
193
d1420f5c5704
increase type safety + add backwards compatibility including C99
Mike Becker <universe@uap-core.de>
parents:
186
diff
changeset
|
1161 | #if __STDC_VERSION__ > 202310L |
|
d1420f5c5704
increase type safety + add backwards compatibility including C99
Mike Becker <universe@uap-core.de>
parents:
186
diff
changeset
|
1162 | [[fallthrough]]; |
|
d1420f5c5704
increase type safety + add backwards compatibility including C99
Mike Becker <universe@uap-core.de>
parents:
186
diff
changeset
|
1163 | #elif __GNUC__ |
|
d1420f5c5704
increase type safety + add backwards compatibility including C99
Mike Becker <universe@uap-core.de>
parents:
186
diff
changeset
|
1164 | __attribute__((fallthrough)); |
|
d1420f5c5704
increase type safety + add backwards compatibility including C99
Mike Becker <universe@uap-core.de>
parents:
186
diff
changeset
|
1165 | #endif |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1166 | case 1: move->check = true; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1167 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1168 | } |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1169 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1170 | } |
|
115
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
1171 | return result; |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
1172 | } |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
1173 | |
|
182
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
1174 | int eval_move(const GameState *gamestate, |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1175 | const char *mstr, Color color, Move *move) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1176 | return eval_move2(gamestate, mstr, color, move, true); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1177 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1178 | |
|
182
04c65336777f
start fixing the network protocol
Mike Becker <universe@uap-core.de>
parents:
181
diff
changeset
|
1179 | int eval_move_strict(const GameState *gamestate, |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1180 | const char *mstr, Color color, Move *move) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1181 | return eval_move2(gamestate, mstr, color, move, false); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1182 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1183 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
1184 | 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:
110
diff
changeset
|
1185 | Move move; |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
1186 | return eval_move1(mstr, &move, color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1187 | } |
|
29
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
1188 | |
| 194 | 1189 | bool is_protected(const GameState *gamestate, Rank rank, File file, Color color) { |
|
166
1a9b662bc201
fix regression: pawns cannot block check threats
Mike Becker <universe@uap-core.de>
parents:
165
diff
changeset
|
1190 | Move candidates[16]; |
|
1a9b662bc201
fix regression: pawns cannot block check threats
Mike Becker <universe@uap-core.de>
parents:
165
diff
changeset
|
1191 | size_t ccount; |
|
1a9b662bc201
fix regression: pawns cannot block check threats
Mike Becker <universe@uap-core.de>
parents:
165
diff
changeset
|
1192 | /* we need all candidates - not only threats! */ |
| 194 | 1193 | if (get_candidates(gamestate, rank, file, color, candidates, &ccount)) { |
|
166
1a9b662bc201
fix regression: pawns cannot block check threats
Mike Becker <universe@uap-core.de>
parents:
165
diff
changeset
|
1194 | for (size_t i = 0 ; i < ccount ; i++) { |
|
1a9b662bc201
fix regression: pawns cannot block check threats
Mike Becker <universe@uap-core.de>
parents:
165
diff
changeset
|
1195 | /* skip the king */ |
|
1a9b662bc201
fix regression: pawns cannot block check threats
Mike Becker <universe@uap-core.de>
parents:
165
diff
changeset
|
1196 | if (piece_type(candidates[i].piece) == KING) continue; |
|
1a9b662bc201
fix regression: pawns cannot block check threats
Mike Becker <universe@uap-core.de>
parents:
165
diff
changeset
|
1197 | /* skip pinned pieces */ |
|
1a9b662bc201
fix regression: pawns cannot block check threats
Mike Becker <universe@uap-core.de>
parents:
165
diff
changeset
|
1198 | if (is_pinned(gamestate, &candidates[i])) continue; |
|
1a9b662bc201
fix regression: pawns cannot block check threats
Mike Becker <universe@uap-core.de>
parents:
165
diff
changeset
|
1199 | /* found one */ |
|
1a9b662bc201
fix regression: pawns cannot block check threats
Mike Becker <universe@uap-core.de>
parents:
165
diff
changeset
|
1200 | return true; |
|
29
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
1201 | } |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
1202 | } |
|
166
1a9b662bc201
fix regression: pawns cannot block check threats
Mike Becker <universe@uap-core.de>
parents:
165
diff
changeset
|
1203 | return false; |
|
29
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
1204 | } |
| 33 | 1205 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1206 | uint16_t remaining_movetime(const GameState *gamestate, Color color) { |
|
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:
98
diff
changeset
|
1207 | unsigned move_number = gamestate->movecount; |
|
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:
98
diff
changeset
|
1208 | if (color == BLACK) { |
|
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:
98
diff
changeset
|
1209 | move_number |= 1; |
|
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:
98
diff
changeset
|
1210 | } else { |
|
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:
98
diff
changeset
|
1211 | move_number = (move_number + 1) & ~1; |
|
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:
98
diff
changeset
|
1212 | } |
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1213 | return remaining_movetime2(gamestate, move_number); |
|
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:
98
diff
changeset
|
1214 | } |
|
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:
98
diff
changeset
|
1215 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1216 | uint16_t remaining_movetime2(const GameState *gamestate, unsigned move_number) { |
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1217 | if (!gamestate->info.timecontrol) { |
| 33 | 1218 | return 0; |
| 1219 | } | |
|
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:
98
diff
changeset
|
1220 | |
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1221 | unsigned total_time = gamestate->info.time; |
|
181
8bda076d0a16
simplify how the elapsed move time is recorded
Mike Becker <universe@uap-core.de>
parents:
179
diff
changeset
|
1222 | uint64_t used_time_usec = 0; |
|
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:
98
diff
changeset
|
1223 | |
|
103
a2a68fd9f6cc
fix missing support for 0+X time control
Mike Becker <universe@uap-core.de>
parents:
100
diff
changeset
|
1224 | /* when this is a 0+X game, the clock starts with the increment */ |
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1225 | if (gamestate->info.time == 0) { |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1226 | total_time += gamestate->info.addtime; |
|
103
a2a68fd9f6cc
fix missing support for 0+X time control
Mike Becker <universe@uap-core.de>
parents:
100
diff
changeset
|
1227 | } |
|
a2a68fd9f6cc
fix missing support for 0+X time control
Mike Becker <universe@uap-core.de>
parents:
100
diff
changeset
|
1228 | |
|
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:
98
diff
changeset
|
1229 | /* go through all already played moves */ |
|
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:
98
diff
changeset
|
1230 | unsigned first_move = move_number % 2; |
|
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:
98
diff
changeset
|
1231 | unsigned next_move = 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:
98
diff
changeset
|
1232 | if (next_move > gamestate->movecount) next_move = gamestate->movecount; |
|
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:
98
diff
changeset
|
1233 | for (unsigned i = first_move ; i < next_move ; i += 2) { |
|
181
8bda076d0a16
simplify how the elapsed move time is recorded
Mike Becker <universe@uap-core.de>
parents:
179
diff
changeset
|
1234 | used_time_usec += gamestate->moves[i].movetime; |
|
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:
98
diff
changeset
|
1235 | /* add increments starting with move 2 */ |
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1236 | if (i > 1) total_time += gamestate->info.addtime; |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1237 | } |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1238 | |
|
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:
98
diff
changeset
|
1239 | /* when the player is currently playing, count down the clock */ |
|
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:
98
diff
changeset
|
1240 | if (is_game_running(gamestate) && move_number > 1 && |
|
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:
98
diff
changeset
|
1241 | move_number == gamestate->movecount) { |
|
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:
98
diff
changeset
|
1242 | struct movetimeval lastmovetstamp = |
|
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:
98
diff
changeset
|
1243 | gamestate->moves[move_number - 1].timestamp; |
|
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:
98
diff
changeset
|
1244 | struct timeval currenttstamp; |
|
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:
98
diff
changeset
|
1245 | gettimeofday(¤ttstamp, NULL); |
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1246 | |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1247 | /* calculate current move time */ |
|
181
8bda076d0a16
simplify how the elapsed move time is recorded
Mike Becker <universe@uap-core.de>
parents:
179
diff
changeset
|
1248 | uint64_t cusec = currenttstamp.tv_sec - lastmovetstamp.sec; |
|
8bda076d0a16
simplify how the elapsed move time is recorded
Mike Becker <universe@uap-core.de>
parents:
179
diff
changeset
|
1249 | cusec *= 1000000ull; |
|
8bda076d0a16
simplify how the elapsed move time is recorded
Mike Becker <universe@uap-core.de>
parents:
179
diff
changeset
|
1250 | cusec += currenttstamp.tv_usec - lastmovetstamp.usec; |
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1251 | |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1252 | /* add the time and respect a possible dealy */ |
|
181
8bda076d0a16
simplify how the elapsed move time is recorded
Mike Becker <universe@uap-core.de>
parents:
179
diff
changeset
|
1253 | uint64_t delay = gamestate->info.delay * 1000000ull; |
|
8bda076d0a16
simplify how the elapsed move time is recorded
Mike Becker <universe@uap-core.de>
parents:
179
diff
changeset
|
1254 | if (cusec >= delay) { |
|
8bda076d0a16
simplify how the elapsed move time is recorded
Mike Becker <universe@uap-core.de>
parents:
179
diff
changeset
|
1255 | used_time_usec += cusec - delay; |
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1256 | } |
|
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:
98
diff
changeset
|
1257 | } |
| 33 | 1258 | |
|
181
8bda076d0a16
simplify how the elapsed move time is recorded
Mike Becker <universe@uap-core.de>
parents:
179
diff
changeset
|
1259 | unsigned used_time = used_time_usec / 1000000ull; |
|
8bda076d0a16
simplify how the elapsed move time is recorded
Mike Becker <universe@uap-core.de>
parents:
179
diff
changeset
|
1260 | |
|
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:
98
diff
changeset
|
1261 | return used_time >= total_time ? 0 : total_time - used_time; |
| 33 | 1262 | } |
|
100
685af47592b5
add API for formatting clocks
Mike Becker <universe@uap-core.de>
parents:
99
diff
changeset
|
1263 | |
|
107
36dd94278142
fix that PGN (with comments) can exceed 80 chars
Mike Becker <universe@uap-core.de>
parents:
105
diff
changeset
|
1264 | 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
|
1265 | unsigned hours = time / 3600; |
|
685af47592b5
add API for formatting clocks
Mike Becker <universe@uap-core.de>
parents:
99
diff
changeset
|
1266 | unsigned minutes = (time % 3600) / 60; |
|
685af47592b5
add API for formatting clocks
Mike Becker <universe@uap-core.de>
parents:
99
diff
changeset
|
1267 | unsigned seconds = time % 60; |
|
685af47592b5
add API for formatting clocks
Mike Becker <universe@uap-core.de>
parents:
99
diff
changeset
|
1268 | if (hours > 0 || always_hours) { |
|
107
36dd94278142
fix that PGN (with comments) can exceed 80 chars
Mike Becker <universe@uap-core.de>
parents:
105
diff
changeset
|
1269 | return snprintf(str, 9, "%u:%02u:%02u", hours, minutes, seconds); |
|
100
685af47592b5
add API for formatting clocks
Mike Becker <universe@uap-core.de>
parents:
99
diff
changeset
|
1270 | } else { |
|
107
36dd94278142
fix that PGN (with comments) can exceed 80 chars
Mike Becker <universe@uap-core.de>
parents:
105
diff
changeset
|
1271 | return snprintf(str, 6, "%02u:%02u", minutes, seconds); |
|
100
685af47592b5
add API for formatting clocks
Mike Becker <universe@uap-core.de>
parents:
99
diff
changeset
|
1272 | } |
|
685af47592b5
add API for formatting clocks
Mike Becker <universe@uap-core.de>
parents:
99
diff
changeset
|
1273 | } |
|
131
c33567d61ba7
prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
1274 | |
|
170
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
1275 | size_t filter_moves_allowed(const GameState *gamestate, |
| 194 | 1276 | Color c, Rank r, File f, Move *moves, moves_generator_func func) { |
|
169
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
1277 | |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
1278 | /* worst case: the queen has the most moves */ |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
1279 | Move candidates[QUEEN_MOVES_MAX]; |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
1280 | size_t candidatecount = func(gamestate, c, r, f, candidates); |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
1281 | size_t count = 0; |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
1282 | |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
1283 | for (size_t i = 0 ; i < candidatecount ; i++) { |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
1284 | if (validate_move(gamestate, &candidates[i]) == VALID_MOVE_SEMANTICS) { |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
1285 | moves[count++] = candidates[i]; |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
1286 | } |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
1287 | } |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
1288 | |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
1289 | return count; |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
168
diff
changeset
|
1290 | } |