Sun, 02 Aug 2026 15:08:43 +0200
fix regression: pieces could not threaten fields when pinned
relates to #960
|
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 | |
|
67
c76e46970a59
verified that checkmate notation does work correctly
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
109 | /* MUST be called BETWEEN validating AND applying a move to work correctly */ |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
110 | static void format_move(const GameState *gamestate, Move *move) { |
|
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
|
111 | char *string = &(move->string[0]); |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
112 | |
|
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
113 | /* at least 8 characters should be available, wipe them out */ |
|
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
114 | memset(string, 0, 8); |
|
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
115 | |
|
64
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
116 | unsigned int idx; |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
117 | if (piece_type(move->piece) == KING && |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
118 | abs(move->tofile-move->fromfile) == 2) { |
|
64
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
119 | /* special formats for castling */ |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
120 | if (move->tofile==fileidx('c')) { |
|
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
121 | memcpy(string, "O-O-O", 5); |
|
64
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
122 | idx = 5; |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
123 | } else { |
|
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
124 | memcpy(string, "O-O", 3); |
|
64
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
125 | idx = 3; |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
126 | } |
|
64
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
127 | } else { |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
128 | /* start by notating the piece character */ |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
129 | string[0] = getpiecechr(move->piece); |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
130 | idx = string[0] ? 1 : 0; |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
131 | |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
132 | /* find out how many source information we do need */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
133 | if (piece_type(move->piece) == PAWN) { |
|
64
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
134 | if (move->capture) { |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
135 | string[idx++] = filechr(move->fromfile); |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
136 | } |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
137 | } else if (piece_type(move->piece) != KING) { |
|
64
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
138 | /* resolve ambiguities, if any */ |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
139 | Move candidates[16]; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
140 | size_t ccount; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
141 | if (get_candidates(gamestate, move->torow, move->tofile, |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
142 | piece_color(move->piece), candidates, &ccount)) { |
|
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
|
143 | unsigned int ambrows = 0, ambfiles = 0, ambpiece = 0; |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
144 | for (size_t i = 0 ; i < ccount ; i++) { |
|
167
fd1d3f0a7a73
fix regression: pieces could not threaten fields when pinned
Mike Becker <universe@uap-core.de>
parents:
166
diff
changeset
|
145 | // TODO: check if we need to discard pinned pieces here |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
146 | if (candidates[i].piece == move->piece) { |
|
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
|
147 | ambpiece++; |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
148 | if (candidates[i].fromrow == move->fromrow) { |
|
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
|
149 | ambrows++; |
|
f5cc75565f7c
fixes ambiguity resolver in PGN output not resolving ambiguities for diagonally attacking Knights
Mike Becker <universe@uap-core.de>
parents:
64
diff
changeset
|
150 | } |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
151 | if (candidates[i].fromfile == move->fromfile) { |
|
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
|
152 | ambfiles++; |
|
f5cc75565f7c
fixes ambiguity resolver in PGN output not resolving ambiguities for diagonally attacking Knights
Mike Becker <universe@uap-core.de>
parents:
64
diff
changeset
|
153 | } |
|
64
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
154 | } |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
155 | } |
|
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
|
156 | /* neither file, nor row are ambiguous, name file */ |
|
f5cc75565f7c
fixes ambiguity resolver in PGN output not resolving ambiguities for diagonally attacking Knights
Mike Becker <universe@uap-core.de>
parents:
64
diff
changeset
|
157 | if (ambpiece > 1 && ambrows == 1 && ambfiles == 1) { |
|
f5cc75565f7c
fixes ambiguity resolver in PGN output not resolving ambiguities for diagonally attacking Knights
Mike Becker <universe@uap-core.de>
parents:
64
diff
changeset
|
158 | /* this is most likely the case with Knights |
|
f5cc75565f7c
fixes ambiguity resolver in PGN output not resolving ambiguities for diagonally attacking Knights
Mike Becker <universe@uap-core.de>
parents:
64
diff
changeset
|
159 | * in diagonal opposition */ |
|
64
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
160 | string[idx++] = filechr(move->fromfile); |
|
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
|
161 | } else { |
|
f5cc75565f7c
fixes ambiguity resolver in PGN output not resolving ambiguities for diagonally attacking Knights
Mike Becker <universe@uap-core.de>
parents:
64
diff
changeset
|
162 | /* ambiguous row, name file */ |
|
f5cc75565f7c
fixes ambiguity resolver in PGN output not resolving ambiguities for diagonally attacking Knights
Mike Becker <universe@uap-core.de>
parents:
64
diff
changeset
|
163 | if (ambrows > 1) { |
|
f5cc75565f7c
fixes ambiguity resolver in PGN output not resolving ambiguities for diagonally attacking Knights
Mike Becker <universe@uap-core.de>
parents:
64
diff
changeset
|
164 | string[idx++] = filechr(move->fromfile); |
|
f5cc75565f7c
fixes ambiguity resolver in PGN output not resolving ambiguities for diagonally attacking Knights
Mike Becker <universe@uap-core.de>
parents:
64
diff
changeset
|
165 | } |
|
f5cc75565f7c
fixes ambiguity resolver in PGN output not resolving ambiguities for diagonally attacking Knights
Mike Becker <universe@uap-core.de>
parents:
64
diff
changeset
|
166 | /* ambiguous file, name row */ |
|
f5cc75565f7c
fixes ambiguity resolver in PGN output not resolving ambiguities for diagonally attacking Knights
Mike Becker <universe@uap-core.de>
parents:
64
diff
changeset
|
167 | if (ambfiles > 1) { |
|
152
231e5f07a657
fix incorrect move notation when disambiguating moves
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
168 | string[idx++] = rowchr(move->fromrow); |
|
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
|
169 | } |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
170 | } |
|
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
171 | } |
|
64
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
172 | } |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
173 | |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
174 | /* capturing? */ |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
175 | if (move->capture) { |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
176 | string[idx++] = 'x'; |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
177 | } |
|
64
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
178 | |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
179 | /* destination */ |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
180 | string[idx++] = filechr(move->tofile); |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
181 | string[idx++] = rowchr(move->torow); |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
182 | |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
183 | /* promotion? */ |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
184 | if (move->promotion) { |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
185 | string[idx++] = '='; |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
186 | string[idx++] = getpiecechr(move->promotion); |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
187 | } |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
188 | } |
|
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
189 | |
|
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
190 | /* check? */ |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
191 | if (move->checkmate) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
192 | string[idx++] = '#'; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
193 | } else if (move->check) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
194 | string[idx++] = '+'; |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
195 | } |
|
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
196 | } |
|
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
197 | |
|
122
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
198 | static void calc_movetime(GameState *gamestate, Move *move) { |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
199 | struct timeval curtimestamp; |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
200 | gettimeofday(&curtimestamp, NULL); |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
201 | move->timestamp.tv_sec = curtimestamp.tv_sec; |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
202 | move->timestamp.tv_usec = (int32_t) curtimestamp.tv_usec; |
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
203 | move->movetime.tv_usec = 0; |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
204 | move->movetime.tv_sec = 0; |
|
122
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
205 | if (gamestate->movecount > 1) { |
|
161
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
160
diff
changeset
|
206 | struct movetimeval lasttstamp = |
|
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
160
diff
changeset
|
207 | gamestate->moves[gamestate->movecount - 1].timestamp; |
|
122
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
208 | uint64_t sec = curtimestamp.tv_sec - lasttstamp.tv_sec; |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
209 | suseconds_t micros; |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
210 | if (curtimestamp.tv_usec < lasttstamp.tv_usec) { |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
211 | micros = 1000000-(lasttstamp.tv_usec - curtimestamp.tv_usec); |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
212 | sec--; |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
213 | } else { |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
214 | micros = curtimestamp.tv_usec - lasttstamp.tv_usec; |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
215 | } |
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
216 | |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
217 | while (micros >= 1000000) { |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
218 | micros -= 1000000; |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
219 | sec++; |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
220 | } |
|
122
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
221 | |
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
222 | if (sec >= gamestate->info.delay) { |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
223 | move->movetime.tv_sec = sec; |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
224 | move->movetime.tv_usec = (int32_t) micros; |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
225 | } |
|
122
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
226 | } |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
227 | } |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
228 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
229 | char getpiecechr(Piece piece) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
230 | switch (piece_type(piece)) { |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
231 | case ROOK: return 'R'; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
232 | case KNIGHT: return 'N'; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
233 | case BISHOP: return 'B'; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
234 | case QUEEN: return 'Q'; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
235 | case KING: return 'K'; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
236 | default: return '\0'; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
237 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
238 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
239 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
240 | char* getpieceunicode(Piece piece) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
241 | if (piece_color(piece) == WHITE) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
242 | switch (piece_type(piece)) { |
|
110
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
243 | case PAWN: return "\u2659"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
244 | case ROOK: return "\u2656"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
245 | case KNIGHT: return "\u2658"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
246 | case BISHOP: return "\u2657"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
247 | case QUEEN: return "\u2655"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
248 | case KING: return "\u2654"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
249 | default: return ""; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
250 | } |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
251 | } else { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
252 | switch (piece_type(piece)) { |
|
110
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
253 | case PAWN: return "\u265f"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
254 | case ROOK: return "\u265c"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
255 | case KNIGHT: return "\u265e"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
256 | case BISHOP: return "\u265d"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
257 | case QUEEN: return "\u265b"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
258 | case KING: return "\u265a"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
259 | default: return ""; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
260 | } |
| 69 | 261 | } |
| 262 | } | |
| 263 | ||
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
264 | Piece getpiece(char c, Color color) { |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
265 | switch (c) { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
266 | case 'R': return mkpiece(ROOK, color); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
267 | case 'N': return mkpiece(KNIGHT, color); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
268 | case 'B': return mkpiece(BISHOP, color); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
269 | case 'Q': return mkpiece(QUEEN, color); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
270 | case 'K': return mkpiece(KING, color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
271 | default: return 0; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
272 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
273 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
274 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
275 | void apply_move(GameState *gamestate, Move *move) { |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
276 | /* en passant capture */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
277 | if (move->capture && piece_type(move->piece) == PAWN && |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
278 | piece_at(gamestate, mdst(move)) == 0) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
279 | piece_remove(gamestate, move->fromrow, move->tofile); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
280 | } |
|
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 | /* remove old en passant threats */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
283 | for (File file = 0 ; file < 8 ; file++) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
284 | enpassant_threat_remove(gamestate, 3, file); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
285 | enpassant_threat_remove(gamestate, 4, file); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
286 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
287 | |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
288 | /* move (and maybe capture or promote) */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
289 | piece_remove(gamestate, msrc(move)); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
290 | if (move->promotion) { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
291 | piece_set(gamestate, mdst(move), move->promotion); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
292 | } else { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
293 | piece_set(gamestate, mdst(move), move->piece); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
294 | } |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
295 | |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
296 | /* add new en passant threat */ |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
297 | if (piece_type(move->piece) == PAWN && ( |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
298 | (move->fromrow == 1 && move->torow == 3) || |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
299 | (move->fromrow == 6 && move->torow == 4))) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
300 | enpassant_threat_add(gamestate, move->torow, move->tofile); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
301 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
302 | |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
303 | /* castling */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
304 | 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
|
305 | const Color color = piece_color(move->piece); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
306 | if (move->tofile == fileidx('g')) { |
|
23
824c9522ce66
introduced game state structure
Mike Becker <universe@uap-core.de>
parents:
21
diff
changeset
|
307 | gamestate->board[move->torow][fileidx('h')] = 0; |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
308 | gamestate->board[move->torow][fileidx('f')] = mkpiece(ROOK, color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
309 | } else if (move->tofile == fileidx('c')) { |
|
23
824c9522ce66
introduced game state structure
Mike Becker <universe@uap-core.de>
parents:
21
diff
changeset
|
310 | gamestate->board[move->torow][fileidx('a')] = 0; |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
311 | gamestate->board[move->torow][fileidx('d')] = mkpiece(ROOK, color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
312 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
313 | } |
|
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
|
314 | |
|
157
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
315 | /* 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
|
316 | if (gamestate->movecount == gamestate->movecapacity) { |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
317 | 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
|
318 | gamestate->moves = realloc(gamestate->moves, |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
319 | gamestate->movecapacity * sizeof(Move)); |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
320 | gamestate->fen = realloc(gamestate->fen, |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
321 | gamestate->movecapacity * sizeof(char*)); |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
322 | } |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
323 | |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
324 | /* 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
|
325 | Move *melem = &gamestate->moves[gamestate->movecount]; |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
326 | *melem = *move; |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
327 | |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
328 | /* calculate the FEN and store it in the FEN array */ |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
329 | char fen[FEN_MAX_LENGTH]; |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
330 | fen_compute(fen, gamestate); |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
331 | gamestate->fen[gamestate->movecount] = strdup(fen); |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
332 | |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
333 | /* only if move has no time info, compute it */ |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
334 | if (melem->movetime.tv_sec == 0 && melem->movetime.tv_usec == 0) { |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
335 | calc_movetime(gamestate, melem); |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
336 | } |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
337 | |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
338 | /* 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
|
339 | gamestate->movecount++; |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
340 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
341 | /* did this move checkmate the other king? */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
342 | gamestate->checkmate = move->checkmate; |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
343 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
344 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
345 | void gamestate_at_move(const GameState *gamestate, |
|
122
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
346 | unsigned move_number, GameState *replay) { |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
347 | gamestate_init(replay); |
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
348 | memcpy(&replay->info, &gamestate->info, sizeof(GameInfo)); |
|
122
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
349 | replay->review = true; |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
350 | if (move_number > gamestate->movecount) { |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
351 | move_number = gamestate->movecount; |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
352 | } |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
353 | 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
|
354 | apply_move(replay, &(gamestate->moves[i])); |
|
122
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
355 | } |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
356 | } |
|
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
357 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
358 | /* return 0 = no check, 1 = check, 2 = checkmate */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
359 | static int determine_check_or_checkmate( |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
360 | const GameState *gamestate, const Move *move) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
361 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
362 | /* simulate the move */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
363 | GameState simulation = gamestate_copy_sim(gamestate); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
364 | Move simmove = *move; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
365 | apply_move(&simulation, &simmove); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
366 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
367 | /* find the opposing king */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
368 | Color piececolor = piece_color(move->piece); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
369 | Color oppcolor = opponent_color(piececolor); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
370 | File opkingfile = 0; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
371 | Row opkingrow = 0; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
372 | for (Row row = 0 ; row < 8 ; row++) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
373 | for (File file = 0 ; file < 8 ; file++) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
374 | Piece p = piece_at(&simulation, row, file); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
375 | if (p == mkpiece(KING, oppcolor)) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
376 | opkingfile = file; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
377 | opkingrow = row; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
378 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
379 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
380 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
381 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
382 | /* determine if the opposing king is now threatened */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
383 | Move threats[16]; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
384 | size_t threatcount; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
385 | bool incheck = get_threats(&simulation, opkingrow, opkingfile, |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
386 | piececolor, threats, &threatcount); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
387 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
388 | if (!incheck) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
389 | gamestate_cleanup(&simulation); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
390 | return 0; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
391 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
392 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
393 | /* determine possible escape fields */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
394 | bool canescape = false; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
395 | for (int dr = -1 ; dr <= 1 && !canescape ; dr++) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
396 | for (int df = -1 ; df <= 1 && !canescape ; df++) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
397 | if (dr == 0 && df == 0) continue; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
398 | Row er = opkingrow + dr; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
399 | File ef = opkingfile + df; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
400 | if (!isidx(er) || !isidx(ef)) continue; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
401 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
402 | /* 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
|
403 | if (piece_color(simulation.board[er][ef]) == oppcolor) |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
404 | continue; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
405 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
406 | /* check if escape field is already covered (threatened) */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
407 | if (is_covered(&simulation, er, ef, piececolor)) |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
408 | continue; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
409 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
410 | /* check if an attacking piece blocks the field */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
411 | if (piece_color(simulation.board[er][ef]) == piececolor) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
412 | /* test if the king can fight back */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
413 | GameState sim_retaliate = gamestate_copy_sim(&simulation); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
414 | Move move_retaliate = {0}; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
415 | move_retaliate.piece = mkpiece(KING, oppcolor); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
416 | move_retaliate.fromrow = opkingrow; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
417 | move_retaliate.fromfile = opkingfile; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
418 | move_retaliate.torow = er; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
419 | move_retaliate.tofile = ef; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
420 | move_retaliate.capture = true; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
421 | apply_move(&sim_retaliate, &move_retaliate); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
422 | canescape = !is_covered(&sim_retaliate, er, ef, piececolor); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
423 | gamestate_cleanup(&sim_retaliate); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
424 | continue; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
425 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
426 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
427 | /* the field is not covered and unoccupied */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
428 | canescape = true; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
429 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
430 | } |
|
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 | /* can't escape, can the king be rescued? */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
433 | if (!canescape && threatcount == 1) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
434 | canescape = is_protected(&simulation, |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
435 | threats[0].fromrow, threats[0].fromfile, oppcolor); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
436 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
437 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
438 | /* can't capture, can he block? */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
439 | if (!canescape && threatcount == 1) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
440 | Move *threat = &(threats[0]); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
441 | unsigned tptype = piece_type(threat->piece); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
442 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
443 | /* knight, pawns and the king cannot be blocked */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
444 | if (tptype == BISHOP || tptype == ROOK || tptype == QUEEN) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
445 | if (threat->fromrow == threat->torow) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
446 | /* rook aspect (on row) */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
447 | int d = threat->tofile > threat->fromfile ? 1 : -1; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
448 | File file = threat->fromfile; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
449 | while (!canescape && file != threat->tofile - d) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
450 | file += d; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
451 | canescape |= is_protected(&simulation, |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
452 | threat->torow, file, oppcolor); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
453 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
454 | } else if (threat->fromfile == threat->tofile) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
455 | /* rook aspect (on file) */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
456 | int d = threat->torow > threat->fromrow ? 1 : -1; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
457 | Row row = threat->fromrow; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
458 | while (!canescape && row != threat->torow - d) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
459 | row += d; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
460 | canescape |= is_protected(&simulation, |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
461 | row, threat->tofile, oppcolor); |
|
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 | } else { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
464 | /* bishop aspect */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
465 | int dr = threat->torow > threat->fromrow ? 1 : -1; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
466 | int df = threat->tofile > threat->fromfile ? 1 : -1; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
467 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
468 | Row row = threat->fromrow; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
469 | File file = threat->fromfile; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
470 | while (!canescape && file != threat->tofile - df |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
471 | && row != threat->torow - dr) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
472 | row += dr; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
473 | file += df; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
474 | canescape |= is_protected(&simulation, row, file, |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
475 | oppcolor); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
476 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
477 | } |
|
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 | gamestate_cleanup(&simulation); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
481 | return canescape ? 1 : 2; |
|
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 | 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
|
485 | assert((move->piece & ~(PIECE_MASK|COLOR_MASK)) == 0); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
486 | |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
487 | /* validate indices (don't trust opponent) */ |
|
153
bad2d6d4b861
fix wrong error message when move indices are invalid
Mike Becker <universe@uap-core.de>
parents:
152
diff
changeset
|
488 | if (!isidx(move->fromrow) || !isidx(move->fromfile) || |
|
bad2d6d4b861
fix wrong error message when move indices are invalid
Mike Becker <universe@uap-core.de>
parents:
152
diff
changeset
|
489 | !isidx(move->torow) || !isidx(move->tofile)) { |
|
bad2d6d4b861
fix wrong error message when move indices are invalid
Mike Becker <universe@uap-core.de>
parents:
152
diff
changeset
|
490 | return INVALID_MOVE_SYNTAX; |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
491 | } |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
492 | |
|
21
2e5846019b4f
implemented rook + some fixes
Mike Becker <universe@uap-core.de>
parents:
19
diff
changeset
|
493 | /* must move */ |
|
2e5846019b4f
implemented rook + some fixes
Mike Becker <universe@uap-core.de>
parents:
19
diff
changeset
|
494 | if (move->fromfile == move->tofile && move->fromrow == move->torow) { |
|
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
|
495 | return INVALID_MOVE_SYNTAX; |
|
21
2e5846019b4f
implemented rook + some fixes
Mike Becker <universe@uap-core.de>
parents:
19
diff
changeset
|
496 | } |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
497 | |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
498 | /* does piece exist */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
499 | if (piece_at(gamestate, msrc(move)) != move->piece) { |
|
154
5336e985bd69
rename INVALID_POSITION to PIECE_NOT_FOUND
Mike Becker <universe@uap-core.de>
parents:
153
diff
changeset
|
500 | 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
|
501 | } |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
502 | |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
503 | /* is there any piece at the destination? */ |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
504 | Piece piece_at_dst = piece_at(gamestate, mdst(move)); |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
505 | |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
506 | /* can't capture own pieces */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
507 | 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
|
508 | 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
|
509 | } |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
510 | |
|
151
f1b6a0388d85
fix that en passant captures do not work
Mike Becker <universe@uap-core.de>
parents:
147
diff
changeset
|
511 | /* 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
|
512 | 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
|
513 | /* ... or the capture happens en passant */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
514 | if (!move->capture || piece_type(move->piece) != PAWN || |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
515 | !enpassant_threat_exists(gamestate, |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
516 | move->fromrow, move->tofile)) { |
|
151
f1b6a0388d85
fix that en passant captures do not work
Mike Becker <universe@uap-core.de>
parents:
147
diff
changeset
|
517 | return INVALID_MOVE_SYNTAX; |
|
f1b6a0388d85
fix that en passant captures do not work
Mike Becker <universe@uap-core.de>
parents:
147
diff
changeset
|
518 | } |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
519 | } |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
520 | |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
521 | /* 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
|
522 | bool chkrules; |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
523 | switch (piece_type(move->piece)) { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
524 | case PAWN: |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
525 | chkrules = pawn_chkrules(gamestate, move) && |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
526 | !pawn_isblocked(gamestate, move); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
527 | break; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
528 | case ROOK: |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
529 | chkrules = rook_chkrules(move) && |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
530 | !rook_isblocked(gamestate, move); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
531 | break; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
532 | case KNIGHT: |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
533 | chkrules = knight_chkrules(move) && |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
534 | !knight_isblocked(gamestate, move); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
535 | break; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
536 | case BISHOP: |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
537 | chkrules = bishop_chkrules(move) && |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
538 | !bishop_isblocked(gamestate, move); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
539 | break; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
540 | case QUEEN: |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
541 | chkrules = queen_chkrules(move) && |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
542 | !queen_isblocked(gamestate, move); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
543 | break; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
544 | case KING: |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
545 | chkrules = king_chkrules(gamestate, move) && |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
546 | !king_isblocked(gamestate, move); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
547 | break; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
548 | default: |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
549 | return INVALID_MOVE_SYNTAX; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
550 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
551 | |
|
167
fd1d3f0a7a73
fix regression: pieces could not threaten fields when pinned
Mike Becker <universe@uap-core.de>
parents:
166
diff
changeset
|
552 | 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
|
553 | } |
|
fd1d3f0a7a73
fix regression: pieces could not threaten fields when pinned
Mike Becker <universe@uap-core.de>
parents:
166
diff
changeset
|
554 | |
|
fd1d3f0a7a73
fix regression: pieces could not threaten fields when pinned
Mike Becker <universe@uap-core.de>
parents:
166
diff
changeset
|
555 | 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
|
556 | 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
|
557 | 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
|
558 | return result; |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
559 | } |
|
167
fd1d3f0a7a73
fix regression: pieces could not threaten fields when pinned
Mike Becker <universe@uap-core.de>
parents:
166
diff
changeset
|
560 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
561 | /* 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
|
562 | 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
|
563 | Move simmove = *move; |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
564 | apply_move(&simulation, &simmove); |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
565 | Color piececolor = piece_color(move->piece); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
566 | Color oppcolor = opponent_color(piececolor); |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
567 | File kingfile = 0; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
568 | Row kingrow = 0; |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
569 | for (Row row = 0 ; row < 8 ; row++) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
570 | for (File file = 0 ; file < 8 ; file++) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
571 | Piece p = piece_at(&simulation, row, file); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
572 | if (p == mkpiece(KING, piececolor)) { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
573 | kingfile = file; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
574 | kingrow = row; |
|
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
|
575 | } |
|
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
|
576 | } |
|
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
|
577 | } |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
578 | if (is_covered(&simulation, kingrow, kingfile, oppcolor)) { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
579 | if (piece_type(move->piece) == KING) { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
580 | 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
|
581 | } else { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
582 | if (is_check_position(gamestate)) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
583 | result = KING_IN_CHECK; |
|
161
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
160
diff
changeset
|
584 | } else { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
585 | result = PIECE_PINNED; |
|
161
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
160
diff
changeset
|
586 | } |
|
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
|
587 | } |
|
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
|
588 | } |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
589 | gamestate_cleanup(&simulation); |
| 139 | 590 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
591 | /* validate check and checkmate flags */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
592 | int cocm = determine_check_or_checkmate(gamestate, move); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
593 | if (cocm == 2) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
594 | if (!move->checkmate) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
595 | 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
|
596 | } |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
597 | } else if (cocm == 1) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
598 | if (!move->check) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
599 | return MISSING_CHECK; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
600 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
601 | } else if (move->checkmate) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
602 | return INVALID_CHECKMATE; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
603 | } else if (move->check) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
604 | return INVALID_CHECK; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
605 | } |
|
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
|
606 | |
|
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
|
607 | return VALID_MOVE_SEMANTICS; |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
608 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
609 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
610 | Piece piece_at(const GameState *gamestate, Row row, File file) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
611 | return gamestate->board[row][file] & (PIECE_MASK|COLOR_MASK); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
612 | } |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
613 | |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
614 | void piece_set(GameState *gamestate, Row row, File file, Piece piece) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
615 | gamestate->board[row][file] = piece; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
616 | } |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
617 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
618 | bool get_candidates(const GameState *gamestate, Row row, File file, |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
619 | 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
|
620 | Move candidates[32]; |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
621 | size_t ccount = 0; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
622 | for (Row r = 0 ; r < 8 ; r++) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
623 | for (File f = 0 ; f < 8 ; f++) { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
624 | Piece p = piece_at(gamestate, r, f); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
625 | if (piece_color(p) == color) { |
|
64
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
626 | /* non-capturing move */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
627 | memset(&(candidates[ccount]), 0, sizeof(Move)); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
628 | candidates[ccount].piece = p; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
629 | candidates[ccount].fromrow = r; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
630 | candidates[ccount].fromfile = f; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
631 | candidates[ccount].torow = row; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
632 | candidates[ccount].tofile = file; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
633 | if (piece_type(p) == PAWN && (row == 0 || row == 7)) { |
|
135
114e764fbae5
fixes #893 - pawn could not promote
Mike Becker <universe@uap-core.de>
parents:
133
diff
changeset
|
634 | /* 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
|
635 | candidates[ccount].promotion = mkpiece(QUEEN, color); |
|
135
114e764fbae5
fixes #893 - pawn could not promote
Mike Becker <universe@uap-core.de>
parents:
133
diff
changeset
|
636 | } |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
637 | 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
|
638 | |
|
64
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
639 | /* capturing move */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
640 | memcpy(&(candidates[ccount]), |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
641 | &(candidates[ccount-1]), sizeof(Move)); |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
642 | candidates[ccount].capture = true; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
643 | ccount++; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
644 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
645 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
646 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
647 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
648 | if (movecount) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
649 | *movecount = 0; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
650 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
651 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
652 | bool result = false; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
653 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
654 | for (size_t i = 0 ; i < ccount ; i++) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
655 | if (validate_move_rules(gamestate, &(candidates[i])) |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
656 | == VALID_MOVE_SEMANTICS) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
657 | result = true; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
658 | if (moves && movecount) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
659 | moves[(*movecount)++] = candidates[i]; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
660 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
661 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
662 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
663 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
664 | return result; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
665 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
666 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
667 | bool get_threats(const GameState *gamestate, Row row, File file, |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
668 | Color color, Move *threats, size_t *threatcount) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
669 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
670 | /* simulate a capturing move on the target position */ |
|
167
fd1d3f0a7a73
fix regression: pieces could not threaten fields when pinned
Mike Becker <universe@uap-core.de>
parents:
166
diff
changeset
|
671 | // TODO: this does NOT disregard the pin, as stated in the spec! |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
672 | Color opcolor = opponent_color(color); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
673 | GameState simulation = gamestate_copy_sim(gamestate); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
674 | if (piece_color(piece_at(&simulation, row, file)) != opcolor) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
675 | /* set a fake pawn if the field is not occupied by the opponent */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
676 | piece_set(&simulation, row, file, mkpiece(PAWN, opcolor)); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
677 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
678 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
679 | Move candidates[16]; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
680 | size_t ccount = 0; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
681 | for (Row r = 0 ; r < 8 ; r++) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
682 | for (File f = 0 ; f < 8 ; f++) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
683 | Piece p = piece_at(&simulation, r, f); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
684 | if (piece_color(p) == color) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
685 | memset(&(candidates[ccount]), 0, sizeof(Move)); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
686 | candidates[ccount].piece = p; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
687 | candidates[ccount].fromrow = r; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
688 | candidates[ccount].fromfile = f; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
689 | candidates[ccount].torow = row; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
690 | candidates[ccount].tofile = file; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
691 | candidates[ccount].capture = true; |
|
165
3e27c99ed721
fix regression: missing promotion when simulating threats
Mike Becker <universe@uap-core.de>
parents:
164
diff
changeset
|
692 | if (piece_type(p) == PAWN && (row == 0 || row == 7)) { |
|
3e27c99ed721
fix regression: missing promotion when simulating threats
Mike Becker <universe@uap-core.de>
parents:
164
diff
changeset
|
693 | /* 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
|
694 | candidates[ccount].promotion = mkpiece(QUEEN, color); |
|
3e27c99ed721
fix regression: missing promotion when simulating threats
Mike Becker <universe@uap-core.de>
parents:
164
diff
changeset
|
695 | } |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
696 | 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
|
697 | } |
|
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
|
698 | } |
|
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
|
699 | } |
|
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
|
700 | |
|
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
|
701 | 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
|
702 | *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
|
703 | } |
|
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
|
704 | |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
78
diff
changeset
|
705 | 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
|
706 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
707 | 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
|
708 | 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
|
709 | == 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
|
710 | 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
|
711 | 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
|
712 | 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
|
713 | } |
|
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
|
714 | } |
|
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
|
715 | } |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
716 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
717 | 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
|
718 | |
|
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
|
719 | 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
|
720 | } |
|
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
|
721 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
722 | 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
|
723 | 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
|
724 | |
|
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
|
725 | 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
|
726 | Move simmove = *move; |
|
564af8a16828
fixes move validation working on old king's position, when the king moves
Mike Becker <universe@uap-core.de>
parents:
55
diff
changeset
|
727 | apply_move(&simulation, &simmove); |
|
564af8a16828
fixes move validation working on old king's position, when the king moves
Mike Becker <universe@uap-core.de>
parents:
55
diff
changeset
|
728 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
729 | File kingfile = 0; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
730 | Row kingrow = 0; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
731 | for (Row row = 0 ; row < 8 ; row++) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
732 | for (File file = 0 ; file < 8 ; file++) { |
|
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
|
733 | if (simulation.board[row][file] == (color|KING)) { |
|
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
|
734 | kingfile = file; |
|
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
|
735 | kingrow = row; |
|
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
|
736 | } |
|
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
|
737 | } |
|
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
|
738 | } |
|
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
|
739 | |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
78
diff
changeset
|
740 | bool covered = is_covered(&simulation, |
|
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
|
741 | kingrow, kingfile, opponent_color(color)); |
|
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
|
742 | 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
|
743 | |
|
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
|
744 | 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
|
745 | } |
|
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
|
746 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
747 | bool get_real_threats(const GameState *gamestate, Row row, File file, |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
748 | 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
|
749 | |
|
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
|
750 | 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
|
751 | *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
|
752 | } |
|
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
|
753 | |
|
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
|
754 | Move candidates[16]; |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
755 | size_t 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
|
756 | if (get_threats(gamestate, row, file, color, candidates, &candidatecount)) { |
|
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
|
757 | |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
78
diff
changeset
|
758 | bool result = false; |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
759 | File kingfile = 0; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
760 | Row kingrow = 0; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
761 | for (Row r = 0 ; r < 8 ; r++) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
762 | for (File f = 0 ; f < 8 ; f++) { |
| 87 | 763 | if (gamestate->board[r][f] == (color|KING)) { |
| 764 | kingfile = f; | |
| 765 | kingrow = r; | |
|
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
|
766 | } |
|
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
|
767 | } |
|
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
|
768 | } |
|
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
|
769 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
770 | for (size_t i = 0 ; i < candidatecount ; i++) { |
|
137
43d1b3c33369
fix memory leak when simulating real threats
Mike Becker <universe@uap-core.de>
parents:
136
diff
changeset
|
771 | // TODO: check if we really need full-blown simulations here |
|
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
|
772 | GameState simulation = gamestate_copy_sim(gamestate); |
|
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
|
773 | Move simmove = 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
|
774 | apply_move(&simulation, &simmove); |
|
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
|
775 | if (!is_covered(&simulation, kingrow, kingfile, |
|
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
|
776 | opponent_color(color))) { |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
78
diff
changeset
|
777 | 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
|
778 | 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
|
779 | 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
|
780 | } |
|
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
|
781 | } |
|
137
43d1b3c33369
fix memory leak when simulating real threats
Mike Becker <universe@uap-core.de>
parents:
136
diff
changeset
|
782 | 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
|
783 | } |
|
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
|
784 | |
|
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
|
785 | 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
|
786 | } else { |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
78
diff
changeset
|
787 | 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
|
788 | } |
|
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
|
789 | } |
|
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
|
790 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
791 | 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
|
792 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
793 | 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
|
794 | bool incheck = false; |
|
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
160
diff
changeset
|
795 | if (gamestate->movecount > 0) { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
796 | incheck = is_check_position(gamestate); |
|
161
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
160
diff
changeset
|
797 | } |
|
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
|
798 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
799 | Move candidates[16], *candidate = NULL; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
800 | size_t candidatecount; |
|
135
114e764fbae5
fixes #893 - pawn could not promote
Mike Becker <universe@uap-core.de>
parents:
133
diff
changeset
|
801 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
802 | /* determine all candidate moves and sort out the invalid ones */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
803 | if (get_candidates(gamestate, move->torow, move->tofile, color, |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
804 | 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
|
805 | |
|
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
|
806 | bool found = false; |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
807 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
808 | for (size_t i = 0 ; i < candidatecount ; i++) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
809 | /* filter by partial fromrow/fromfile information */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
810 | if (candidates[i].piece == 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
|
811 | (move->fromrow == POS_UNSPECIFIED || |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
812 | move->fromrow == candidates[i].fromrow) && |
|
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
|
813 | (move->fromfile == POS_UNSPECIFIED || |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
814 | 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
|
815 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
816 | /* 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
|
817 | 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
|
818 | |
|
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
|
819 | /* discard pinned pieces */ |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
820 | if (!is_pinned(gamestate, &(candidates[i]))) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
821 | if (candidate) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
822 | /* 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
|
823 | return AMBIGUOUS_MOVE; |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
824 | } else { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
825 | candidate = &(candidates[i]); |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
826 | } |
|
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
|
827 | } |
|
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
|
828 | } |
|
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
|
829 | } |
|
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
|
830 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
831 | /* no valid candidate left */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
832 | 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
|
833 | if (found) { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
834 | 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
|
835 | 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
|
836 | } 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
|
837 | 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
|
838 | } 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
|
839 | 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
|
840 | } |
|
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
|
841 | } 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
|
842 | 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
|
843 | } |
|
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
|
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 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
846 | /* found a candidate, copy the source location */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
847 | move->fromrow = candidate->fromrow; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
848 | 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
|
849 | 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
|
850 | } else { |
|
154
5336e985bd69
rename INVALID_POSITION to PIECE_NOT_FOUND
Mike Becker <universe@uap-core.de>
parents:
153
diff
changeset
|
851 | 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
|
852 | } |
|
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
|
853 | } |
|
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
|
854 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
855 | 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
|
856 | memset(move, 0, sizeof(Move)); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
857 | move->fromfile = POS_UNSPECIFIED; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
858 | move->fromrow = POS_UNSPECIFIED; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
859 | |
|
147
7e3f2d462bb6
make eval_move() and check_move() not change their input string
Mike Becker <universe@uap-core.de>
parents:
144
diff
changeset
|
860 | 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
|
861 | 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
|
862 | 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
|
863 | } |
|
147
7e3f2d462bb6
make eval_move() and check_move() not change their input string
Mike Becker <universe@uap-core.de>
parents:
144
diff
changeset
|
864 | 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
|
865 | strcpy(mstr, pstr); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
866 | |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
867 | /* 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
|
868 | 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
|
869 | move->check = true; |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
870 | move->checkmate = mstr[len-1] == '#'; |
|
164
c19d8523b31c
fix bug when parsing checkmate indicator
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
871 | len--; mstr[len] = '\0'; |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
872 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
873 | |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
874 | /* evaluate promotion */ |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
875 | if (len > 3 && mstr[len-2] == '=') { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
876 | move->promotion = getpiece(mstr[len-1], color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
877 | if (!move->promotion) { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
878 | return INVALID_MOVE_SYNTAX; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
879 | } else { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
880 | len -= 2; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
881 | mstr[len] = 0; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
882 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
883 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
884 | |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
885 | if (len == 2) { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
886 | /* pawn move (e.g. "e4") */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
887 | move->piece = mkpiece(PAWN, color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
888 | move->tofile = fileidx(mstr[0]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
889 | move->torow = rowidx(mstr[1]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
890 | } else if (len == 3) { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
891 | if (strcmp(mstr, "O-O") == 0) { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
892 | /* king side castling */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
893 | move->piece = mkpiece(KING, color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
894 | move->fromfile = fileidx('e'); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
895 | move->tofile = fileidx('g'); |
|
50
41017d0a72c5
added pgn parser and writer (without comment support yet) + minor refactorings
Mike Becker <universe@uap-core.de>
parents:
49
diff
changeset
|
896 | move->fromrow = move->torow = color == WHITE ? 0 : 7; |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
897 | } else { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
898 | /* move (e.g. "Nf3") */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
899 | move->piece = getpiece(mstr[0], color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
900 | move->tofile = fileidx(mstr[1]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
901 | move->torow = rowidx(mstr[2]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
902 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
903 | } else if (len == 4) { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
904 | move->piece = getpiece(mstr[0], color); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
905 | if (move->piece == 0) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
906 | move->piece = mkpiece(PAWN, color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
907 | move->fromfile = fileidx(mstr[0]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
908 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
909 | if (mstr[1] == 'x') { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
910 | /* capture (e.g. "Nxf3", "dxe5") */ |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
911 | move->capture = true; |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
912 | } else { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
913 | /* move (e.g. "Ndf3", "N2c3", "e2e4") */ |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
914 | if (isfile(mstr[1])) { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
915 | move->fromfile = fileidx(mstr[1]); |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
916 | /* 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
|
917 | if (piece_type(move->piece) == PAWN) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
918 | /* invalidate the result */ |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
919 | move->piece = 0; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
920 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
921 | } else { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
922 | move->fromrow = rowidx(mstr[1]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
923 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
924 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
925 | move->tofile = fileidx(mstr[2]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
926 | move->torow = rowidx(mstr[3]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
927 | } else if (len == 5) { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
928 | if (strcmp(mstr, "O-O-O") == 0) { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
929 | /* queen side castling "O-O-O" */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
930 | move->piece = mkpiece(KING, color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
931 | move->fromfile = fileidx('e'); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
932 | move->tofile = fileidx('c'); |
|
50
41017d0a72c5
added pgn parser and writer (without comment support yet) + minor refactorings
Mike Becker <universe@uap-core.de>
parents:
49
diff
changeset
|
933 | move->fromrow = move->torow = color == WHITE ? 0 : 7; |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
934 | } else { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
935 | move->piece = getpiece(mstr[0], color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
936 | if (mstr[2] == 'x') { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
937 | move->capture = true; |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
938 | if (move->piece) { |
|
155
835776e0338f
fix: disambiguation by row while capturing was not implemented
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
939 | /* 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
|
940 | if (isfile(mstr[1])) { |
|
835776e0338f
fix: disambiguation by row while capturing was not implemented
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
941 | move->fromfile = fileidx(mstr[1]); |
|
835776e0338f
fix: disambiguation by row while capturing was not implemented
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
942 | } else if (isrow(mstr[1])) { |
|
835776e0338f
fix: disambiguation by row while capturing was not implemented
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
943 | move->fromrow = rowidx(mstr[1]); |
|
835776e0338f
fix: disambiguation by row while capturing was not implemented
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
944 | } else { |
|
835776e0338f
fix: disambiguation by row while capturing was not implemented
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
945 | return INVALID_MOVE_SYNTAX; |
|
835776e0338f
fix: disambiguation by row while capturing was not implemented
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
946 | } |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
947 | } else { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
948 | /* long notation capture (e.g. "e5xf6") */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
949 | move->piece = mkpiece(PAWN, color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
950 | move->fromfile = fileidx(mstr[0]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
951 | move->fromrow = rowidx(mstr[1]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
952 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
953 | } else { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
954 | /* long notation move (e.g. "Nc5a4") */ |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
955 | move->fromfile = fileidx(mstr[1]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
956 | move->fromrow = rowidx(mstr[2]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
957 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
958 | move->tofile = fileidx(mstr[3]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
959 | move->torow = rowidx(mstr[4]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
960 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
961 | } else if (len == 6) { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
962 | /* long notation capture (e.g. "Nc5xf3") */ |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
963 | if (mstr[3] == 'x') { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
964 | move->capture = true; |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
965 | move->piece = getpiece(mstr[0], color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
966 | move->fromfile = fileidx(mstr[1]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
967 | move->fromrow = rowidx(mstr[2]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
968 | move->tofile = fileidx(mstr[4]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
969 | move->torow = rowidx(mstr[5]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
970 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
971 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
972 | |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
973 | |
|
115
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
974 | if (!move->piece) { |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
975 | return INVALID_MOVE_SYNTAX; |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
976 | } |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
977 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
978 | if (piece_type(move->piece) == PAWN |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
979 | && move->torow == (color==WHITE?7:0) |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
980 | && !move->promotion) { |
|
115
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
981 | return NEED_PROMOTION; |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
982 | } |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
983 | |
|
153
bad2d6d4b861
fix wrong error message when move indices are invalid
Mike Becker <universe@uap-core.de>
parents:
152
diff
changeset
|
984 | /* up to this point |
|
bad2d6d4b861
fix wrong error message when move indices are invalid
Mike Becker <universe@uap-core.de>
parents:
152
diff
changeset
|
985 | * 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
|
986 | * 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
|
987 | */ |
|
bad2d6d4b861
fix wrong error message when move indices are invalid
Mike Becker <universe@uap-core.de>
parents:
152
diff
changeset
|
988 | if (!isidxr(move->fromrow) || !isidxr(move->fromfile) || |
|
bad2d6d4b861
fix wrong error message when move indices are invalid
Mike Becker <universe@uap-core.de>
parents:
152
diff
changeset
|
989 | !isidx(move->torow) || !isidx(move->tofile)) { |
|
bad2d6d4b861
fix wrong error message when move indices are invalid
Mike Becker <universe@uap-core.de>
parents:
152
diff
changeset
|
990 | return INVALID_MOVE_SYNTAX; |
|
115
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
991 | } |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
992 | |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
993 | return VALID_MOVE_SYNTAX; |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
994 | } |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
995 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
996 | int eval_move2(const GameState *gamestate, |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
997 | 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
|
998 | 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
|
999 | if (result == VALID_MOVE_SYNTAX) { |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1000 | if (move->fromfile == POS_UNSPECIFIED |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1001 | || move->fromrow == POS_UNSPECIFIED) { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1002 | result = getlocation(gamestate, move); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1003 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1004 | if (result == VALID_MOVE_SYNTAX) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1005 | /* correct check/checkmate flags */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1006 | if (lazy) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1007 | move->check = move->checkmate = false; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1008 | switch (determine_check_or_checkmate(gamestate, move)) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1009 | case 2: move->checkmate = true; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1010 | case 1: move->check = true; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1011 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1012 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1013 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1014 | /* format the move string */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1015 | format_move(gamestate, move); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1016 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1017 | } |
|
115
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
1018 | return result; |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
1019 | } |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
1020 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1021 | int eval_move_lazy(const GameState *gamestate, |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1022 | const char *mstr, Color color, Move *move) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1023 | return eval_move2(gamestate, mstr, color, move, true); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1024 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1025 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1026 | int eval_move(const GameState *gamestate, |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1027 | const char *mstr, Color color, Move *move) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1028 | return eval_move2(gamestate, mstr, color, move, false); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1029 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1030 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
1031 | 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
|
1032 | Move move; |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
1033 | return eval_move1(mstr, &move, color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1034 | } |
|
29
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
1035 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1036 | bool is_protected(const GameState *gamestate, Row row, File file, Color color) { |
|
166
1a9b662bc201
fix regression: pawns cannot block check threats
Mike Becker <universe@uap-core.de>
parents:
165
diff
changeset
|
1037 | Move candidates[16]; |
|
1a9b662bc201
fix regression: pawns cannot block check threats
Mike Becker <universe@uap-core.de>
parents:
165
diff
changeset
|
1038 | size_t ccount; |
|
1a9b662bc201
fix regression: pawns cannot block check threats
Mike Becker <universe@uap-core.de>
parents:
165
diff
changeset
|
1039 | /* we need all candidates - not only threats! */ |
|
1a9b662bc201
fix regression: pawns cannot block check threats
Mike Becker <universe@uap-core.de>
parents:
165
diff
changeset
|
1040 | if (get_candidates(gamestate, row, file, color, candidates, &ccount)) { |
|
1a9b662bc201
fix regression: pawns cannot block check threats
Mike Becker <universe@uap-core.de>
parents:
165
diff
changeset
|
1041 | 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
|
1042 | /* skip the king */ |
|
1a9b662bc201
fix regression: pawns cannot block check threats
Mike Becker <universe@uap-core.de>
parents:
165
diff
changeset
|
1043 | 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
|
1044 | /* skip pinned pieces */ |
|
1a9b662bc201
fix regression: pawns cannot block check threats
Mike Becker <universe@uap-core.de>
parents:
165
diff
changeset
|
1045 | 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
|
1046 | /* found one */ |
|
1a9b662bc201
fix regression: pawns cannot block check threats
Mike Becker <universe@uap-core.de>
parents:
165
diff
changeset
|
1047 | return true; |
|
29
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
1048 | } |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
1049 | } |
|
166
1a9b662bc201
fix regression: pawns cannot block check threats
Mike Becker <universe@uap-core.de>
parents:
165
diff
changeset
|
1050 | return false; |
|
29
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
1051 | } |
| 33 | 1052 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1053 | 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
|
1054 | 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
|
1055 | 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
|
1056 | 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
|
1057 | } 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
|
1058 | 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
|
1059 | } |
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1060 | 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
|
1061 | } |
|
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
|
1062 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1063 | 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
|
1064 | if (!gamestate->info.timecontrol) { |
| 33 | 1065 | return 0; |
| 1066 | } | |
|
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
|
1067 | |
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1068 | unsigned total_time = gamestate->info.time; |
|
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
|
1069 | unsigned used_time = 0; |
|
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
|
1070 | suseconds_t micros = 0; |
|
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
|
1071 | |
|
103
a2a68fd9f6cc
fix missing support for 0+X time control
Mike Becker <universe@uap-core.de>
parents:
100
diff
changeset
|
1072 | /* 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
|
1073 | if (gamestate->info.time == 0) { |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1074 | 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
|
1075 | } |
|
a2a68fd9f6cc
fix missing support for 0+X time control
Mike Becker <universe@uap-core.de>
parents:
100
diff
changeset
|
1076 | |
|
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
|
1077 | /* 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
|
1078 | 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
|
1079 | 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
|
1080 | 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
|
1081 | for (unsigned i = first_move ; i < next_move ; i += 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
|
1082 | used_time += gamestate->moves[i].movetime.tv_sec; |
|
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
|
1083 | micros += gamestate->moves[i].movetime.tv_usec; |
|
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
|
1084 | /* add increments starting with move 2 */ |
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1085 | if (i > 1) total_time += gamestate->info.addtime; |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1086 | } |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1087 | |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1088 | /* apply microseconds */ |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1089 | while (micros >= 1000000) { |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1090 | micros -= 1000000; |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1091 | used_time++; |
|
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
|
1092 | } |
|
98
9cb41383540f
change move list from linked list to array (prepares game replays)
Mike Becker <universe@uap-core.de>
parents:
87
diff
changeset
|
1093 | |
|
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
|
1094 | /* 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
|
1095 | 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
|
1096 | 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
|
1097 | 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
|
1098 | 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
|
1099 | 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
|
1100 | gettimeofday(¤ttstamp, NULL); |
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1101 | |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1102 | /* calculate current move time */ |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1103 | unsigned cmsec = currenttstamp.tv_sec - lastmovetstamp.tv_sec; |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1104 | suseconds_t cmusec = currenttstamp.tv_usec - lastmovetstamp.tv_usec; |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1105 | |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1106 | /* add microseconds carried over from last move and apply both */ |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1107 | cmusec += micros; |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1108 | cmsec += cmusec / 1000000; |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1109 | |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1110 | /* add the time and respect a possible dealy */ |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1111 | if (cmsec >= gamestate->info.delay) { |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1112 | used_time += cmsec - gamestate->info.delay; |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
1113 | } |
|
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
|
1114 | } |
| 33 | 1115 | |
|
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
|
1116 | return used_time >= total_time ? 0 : total_time - used_time; |
| 33 | 1117 | } |
|
100
685af47592b5
add API for formatting clocks
Mike Becker <universe@uap-core.de>
parents:
99
diff
changeset
|
1118 | |
|
107
36dd94278142
fix that PGN (with comments) can exceed 80 chars
Mike Becker <universe@uap-core.de>
parents:
105
diff
changeset
|
1119 | 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
|
1120 | unsigned hours = time / 3600; |
|
685af47592b5
add API for formatting clocks
Mike Becker <universe@uap-core.de>
parents:
99
diff
changeset
|
1121 | unsigned minutes = (time % 3600) / 60; |
|
685af47592b5
add API for formatting clocks
Mike Becker <universe@uap-core.de>
parents:
99
diff
changeset
|
1122 | unsigned seconds = time % 60; |
|
685af47592b5
add API for formatting clocks
Mike Becker <universe@uap-core.de>
parents:
99
diff
changeset
|
1123 | 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
|
1124 | 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
|
1125 | } else { |
|
107
36dd94278142
fix that PGN (with comments) can exceed 80 chars
Mike Becker <universe@uap-core.de>
parents:
105
diff
changeset
|
1126 | 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
|
1127 | } |
|
685af47592b5
add API for formatting clocks
Mike Becker <universe@uap-core.de>
parents:
99
diff
changeset
|
1128 | } |
|
131
c33567d61ba7
prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
1129 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1130 | bool check_threefold_repetition(const GameState *gamestate) { |
|
131
c33567d61ba7
prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
1131 | // TODO: implement threefold repetition detection |
|
c33567d61ba7
prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
1132 | return false; |
|
c33567d61ba7
prepare netcode for claiming threefold repetition
Mike Becker <universe@uap-core.de>
parents:
130
diff
changeset
|
1133 | } |