Thu, 30 Jul 2026 19:17:38 +0200
major refactoring of rules API
- validate_move() no longer alters the game state (fixes #935)
- get_threats() now correctly only reports threats
while get_candidates() reports possible moves (fixes #959)
- qualify GameState and Move parameters as const where possible
|
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++) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
145 | 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
|
146 | ambpiece++; |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
147 | 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
|
148 | 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
|
149 | } |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
150 | 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
|
151 | 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
|
152 | } |
|
64
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
153 | } |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
154 | } |
|
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
|
155 | /* 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
|
156 | 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
|
157 | /* 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
|
158 | * in diagonal opposition */ |
|
64
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
159 | 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
|
160 | } 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
|
161 | /* 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
|
162 | 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
|
163 | 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
|
164 | } |
|
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 | /* 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
|
166 | if (ambfiles > 1) { |
|
152
231e5f07a657
fix incorrect move notation when disambiguating moves
Mike Becker <universe@uap-core.de>
parents:
151
diff
changeset
|
167 | 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
|
168 | } |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
169 | } |
|
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
170 | } |
|
64
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
171 | } |
|
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 | /* capturing? */ |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
174 | if (move->capture) { |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
175 | string[idx++] = 'x'; |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
176 | } |
|
64
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
177 | |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
178 | /* destination */ |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
179 | string[idx++] = filechr(move->tofile); |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
180 | string[idx++] = rowchr(move->torow); |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
181 | |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
182 | /* promotion? */ |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
183 | if (move->promotion) { |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
184 | string[idx++] = '='; |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
185 | string[idx++] = getpiecechr(move->promotion); |
|
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
186 | } |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
187 | } |
|
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 | /* check? */ |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
190 | if (move->checkmate) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
191 | string[idx++] = '#'; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
192 | } else if (move->check) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
193 | string[idx++] = '+'; |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
194 | } |
|
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 | |
|
122
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
197 | static void calc_movetime(GameState *gamestate, Move *move) { |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
198 | struct timeval curtimestamp; |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
199 | gettimeofday(&curtimestamp, NULL); |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
200 | move->timestamp.tv_sec = curtimestamp.tv_sec; |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
201 | 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
|
202 | move->movetime.tv_usec = 0; |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
203 | move->movetime.tv_sec = 0; |
|
122
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
204 | if (gamestate->movecount > 1) { |
|
161
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
160
diff
changeset
|
205 | struct movetimeval lasttstamp = |
|
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
160
diff
changeset
|
206 | gamestate->moves[gamestate->movecount - 1].timestamp; |
|
122
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
207 | uint64_t sec = curtimestamp.tv_sec - lasttstamp.tv_sec; |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
208 | suseconds_t micros; |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
209 | if (curtimestamp.tv_usec < lasttstamp.tv_usec) { |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
210 | micros = 1000000-(lasttstamp.tv_usec - curtimestamp.tv_usec); |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
211 | sec--; |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
212 | } else { |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
213 | micros = curtimestamp.tv_usec - lasttstamp.tv_usec; |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
214 | } |
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
215 | |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
216 | while (micros >= 1000000) { |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
217 | micros -= 1000000; |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
218 | sec++; |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
219 | } |
|
122
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
220 | |
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
221 | if (sec >= gamestate->info.delay) { |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
222 | move->movetime.tv_sec = sec; |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
223 | move->movetime.tv_usec = (int32_t) micros; |
|
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
224 | } |
|
122
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
225 | } |
|
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 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
228 | char getpiecechr(Piece piece) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
229 | switch (piece_type(piece)) { |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
230 | case ROOK: return 'R'; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
231 | case KNIGHT: return 'N'; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
232 | case BISHOP: return 'B'; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
233 | case QUEEN: return 'Q'; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
234 | case KING: return 'K'; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
235 | default: return '\0'; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
236 | } |
|
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 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
239 | char* getpieceunicode(Piece piece) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
240 | if (piece_color(piece) == WHITE) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
241 | switch (piece_type(piece)) { |
|
110
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
242 | case PAWN: return "\u2659"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
243 | case ROOK: return "\u2656"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
244 | case KNIGHT: return "\u2658"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
245 | case BISHOP: return "\u2657"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
246 | case QUEEN: return "\u2655"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
247 | case KING: return "\u2654"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
248 | default: return ""; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
249 | } |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
250 | } else { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
251 | switch (piece_type(piece)) { |
|
110
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
252 | case PAWN: return "\u265f"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
253 | case ROOK: return "\u265c"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
254 | case KNIGHT: return "\u265e"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
255 | case BISHOP: return "\u265d"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
256 | case QUEEN: return "\u265b"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
257 | case KING: return "\u265a"; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
258 | default: return ""; |
|
e2bb03494d46
correctly use unicode chars for white pieces
Mike Becker <universe@uap-core.de>
parents:
107
diff
changeset
|
259 | } |
| 69 | 260 | } |
| 261 | } | |
| 262 | ||
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
263 | Piece getpiece(char c, Color color) { |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
264 | switch (c) { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
265 | case 'R': return mkpiece(ROOK, color); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
266 | case 'N': return mkpiece(KNIGHT, color); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
267 | case 'B': return mkpiece(BISHOP, color); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
268 | case 'Q': return mkpiece(QUEEN, color); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
269 | case 'K': return mkpiece(KING, color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
270 | default: return 0; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
271 | } |
|
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 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
274 | void apply_move(GameState *gamestate, Move *move) { |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
275 | /* en passant capture */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
276 | if (move->capture && piece_type(move->piece) == PAWN && |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
277 | piece_at(gamestate, mdst(move)) == 0) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
278 | piece_remove(gamestate, move->fromrow, move->tofile); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
279 | } |
|
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 | /* remove old en passant threats */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
282 | for (File file = 0 ; file < 8 ; file++) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
283 | enpassant_threat_remove(gamestate, 3, file); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
284 | enpassant_threat_remove(gamestate, 4, file); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
285 | } |
|
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 | /* move (and maybe capture or promote) */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
288 | piece_remove(gamestate, msrc(move)); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
289 | if (move->promotion) { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
290 | piece_set(gamestate, mdst(move), move->promotion); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
291 | } else { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
292 | piece_set(gamestate, mdst(move), move->piece); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
293 | } |
|
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 | /* add new en passant threat */ |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
296 | if (piece_type(move->piece) == PAWN && ( |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
297 | (move->fromrow == 1 && move->torow == 3) || |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
298 | (move->fromrow == 6 && move->torow == 4))) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
299 | 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
|
300 | } |
|
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 | /* castling */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
303 | 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
|
304 | const Color color = piece_color(move->piece); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
305 | if (move->tofile == fileidx('g')) { |
|
23
824c9522ce66
introduced game state structure
Mike Becker <universe@uap-core.de>
parents:
21
diff
changeset
|
306 | gamestate->board[move->torow][fileidx('h')] = 0; |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
307 | 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
|
308 | } else if (move->tofile == fileidx('c')) { |
|
23
824c9522ce66
introduced game state structure
Mike Becker <universe@uap-core.de>
parents:
21
diff
changeset
|
309 | gamestate->board[move->torow][fileidx('a')] = 0; |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
310 | 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
|
311 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
312 | } |
|
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
|
313 | |
|
157
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
314 | /* 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
|
315 | if (gamestate->movecount == gamestate->movecapacity) { |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
316 | 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
|
317 | gamestate->moves = realloc(gamestate->moves, |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
318 | gamestate->movecapacity * sizeof(Move)); |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
319 | gamestate->fen = realloc(gamestate->fen, |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
320 | gamestate->movecapacity * sizeof(char*)); |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
321 | } |
|
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 | /* 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
|
324 | Move *melem = &gamestate->moves[gamestate->movecount]; |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
325 | *melem = *move; |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
326 | |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
327 | /* 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
|
328 | char fen[FEN_MAX_LENGTH]; |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
329 | fen_compute(fen, gamestate); |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
330 | gamestate->fen[gamestate->movecount] = strdup(fen); |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
331 | |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
332 | /* 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
|
333 | 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
|
334 | calc_movetime(gamestate, melem); |
|
07cbfc477b22
add FEN history to the game state
Mike Becker <universe@uap-core.de>
parents:
156
diff
changeset
|
335 | } |
|
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 | /* 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
|
338 | gamestate->movecount++; |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
339 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
340 | /* did this move checkmate the other king? */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
341 | gamestate->checkmate = move->checkmate; |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
342 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
343 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
344 | void gamestate_at_move(const GameState *gamestate, |
|
122
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
345 | unsigned move_number, GameState *replay) { |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
346 | gamestate_init(replay); |
|
130
3fc6b1d6cbe9
implement optional delay - resolves #820
Mike Becker <universe@uap-core.de>
parents:
129
diff
changeset
|
347 | memcpy(&replay->info, &gamestate->info, sizeof(GameInfo)); |
|
122
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
348 | replay->review = true; |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
349 | if (move_number > gamestate->movecount) { |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
350 | move_number = gamestate->movecount; |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
351 | } |
|
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
352 | 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
|
353 | apply_move(replay, &(gamestate->moves[i])); |
|
122
e65d9b5e9324
implement interactive game review
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
354 | } |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
355 | } |
|
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
356 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
357 | /* return 0 = no check, 1 = check, 2 = checkmate */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
358 | static int determine_check_or_checkmate( |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
359 | const GameState *gamestate, const Move *move) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
360 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
361 | /* simulate the move */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
362 | GameState simulation = gamestate_copy_sim(gamestate); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
363 | Move simmove = *move; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
364 | apply_move(&simulation, &simmove); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
365 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
366 | /* find the opposing king */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
367 | Color piececolor = piece_color(move->piece); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
368 | Color oppcolor = opponent_color(piececolor); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
369 | File opkingfile = 0; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
370 | Row opkingrow = 0; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
371 | for (Row row = 0 ; row < 8 ; row++) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
372 | for (File file = 0 ; file < 8 ; file++) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
373 | Piece p = piece_at(&simulation, row, file); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
374 | if (p == mkpiece(KING, oppcolor)) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
375 | opkingfile = file; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
376 | opkingrow = row; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
377 | } |
|
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 | /* determine if the opposing king is now threatened */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
382 | Move threats[16]; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
383 | size_t threatcount; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
384 | bool incheck = get_threats(&simulation, opkingrow, opkingfile, |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
385 | piececolor, threats, &threatcount); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
386 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
387 | if (!incheck) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
388 | gamestate_cleanup(&simulation); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
389 | return 0; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
390 | } |
|
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 | /* determine possible escape fields */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
393 | bool canescape = false; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
394 | for (int dr = -1 ; dr <= 1 && !canescape ; dr++) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
395 | for (int df = -1 ; df <= 1 && !canescape ; df++) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
396 | if (dr == 0 && df == 0) continue; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
397 | Row er = opkingrow + dr; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
398 | File ef = opkingfile + df; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
399 | if (!isidx(er) || !isidx(ef)) continue; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
400 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
401 | /* 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
|
402 | if (piece_color(simulation.board[er][ef]) == oppcolor) |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
403 | continue; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
404 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
405 | /* check if escape field is already covered (threatened) */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
406 | if (is_covered(&simulation, er, ef, piececolor)) |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
407 | continue; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
408 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
409 | /* check if an attacking piece blocks the field */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
410 | if (piece_color(simulation.board[er][ef]) == piececolor) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
411 | /* test if the king can fight back */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
412 | GameState sim_retaliate = gamestate_copy_sim(&simulation); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
413 | Move move_retaliate = {0}; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
414 | move_retaliate.piece = mkpiece(KING, oppcolor); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
415 | move_retaliate.fromrow = opkingrow; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
416 | move_retaliate.fromfile = opkingfile; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
417 | move_retaliate.torow = er; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
418 | move_retaliate.tofile = ef; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
419 | move_retaliate.capture = true; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
420 | apply_move(&sim_retaliate, &move_retaliate); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
421 | canescape = !is_covered(&sim_retaliate, er, ef, piececolor); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
422 | gamestate_cleanup(&sim_retaliate); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
423 | continue; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
424 | } |
|
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 | /* the field is not covered and unoccupied */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
427 | canescape = true; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
428 | } |
|
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 | /* can't escape, can the king be rescued? */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
432 | if (!canescape && threatcount == 1) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
433 | canescape = is_protected(&simulation, |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
434 | threats[0].fromrow, threats[0].fromfile, oppcolor); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
435 | } |
|
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 | /* can't capture, can he block? */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
438 | if (!canescape && threatcount == 1) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
439 | Move *threat = &(threats[0]); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
440 | unsigned tptype = piece_type(threat->piece); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
441 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
442 | /* knight, pawns and the king cannot be blocked */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
443 | if (tptype == BISHOP || tptype == ROOK || tptype == QUEEN) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
444 | if (threat->fromrow == threat->torow) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
445 | /* rook aspect (on row) */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
446 | int d = threat->tofile > threat->fromfile ? 1 : -1; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
447 | File file = threat->fromfile; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
448 | while (!canescape && file != threat->tofile - d) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
449 | file += d; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
450 | canescape |= is_protected(&simulation, |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
451 | threat->torow, file, oppcolor); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
452 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
453 | } else if (threat->fromfile == threat->tofile) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
454 | /* rook aspect (on file) */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
455 | int d = threat->torow > threat->fromrow ? 1 : -1; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
456 | Row row = threat->fromrow; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
457 | while (!canescape && row != threat->torow - d) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
458 | row += d; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
459 | canescape |= is_protected(&simulation, |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
460 | row, threat->tofile, oppcolor); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
461 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
462 | } else { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
463 | /* bishop aspect */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
464 | int dr = threat->torow > threat->fromrow ? 1 : -1; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
465 | int df = threat->tofile > threat->fromfile ? 1 : -1; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
466 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
467 | Row row = threat->fromrow; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
468 | File file = threat->fromfile; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
469 | while (!canescape && file != threat->tofile - df |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
470 | && row != threat->torow - dr) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
471 | row += dr; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
472 | file += df; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
473 | canescape |= is_protected(&simulation, row, file, |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
474 | oppcolor); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
475 | } |
|
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 | gamestate_cleanup(&simulation); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
480 | return canescape ? 1 : 2; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
481 | } |
|
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 | 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
|
484 | assert((move->piece & ~(PIECE_MASK|COLOR_MASK)) == 0); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
485 | |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
486 | /* 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
|
487 | 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
|
488 | !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
|
489 | return INVALID_MOVE_SYNTAX; |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
490 | } |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
491 | |
|
21
2e5846019b4f
implemented rook + some fixes
Mike Becker <universe@uap-core.de>
parents:
19
diff
changeset
|
492 | /* must move */ |
|
2e5846019b4f
implemented rook + some fixes
Mike Becker <universe@uap-core.de>
parents:
19
diff
changeset
|
493 | 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
|
494 | return INVALID_MOVE_SYNTAX; |
|
21
2e5846019b4f
implemented rook + some fixes
Mike Becker <universe@uap-core.de>
parents:
19
diff
changeset
|
495 | } |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
496 | |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
497 | /* does piece exist */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
498 | 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
|
499 | 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
|
500 | } |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
501 | |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
502 | /* is there any piece at the destination? */ |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
503 | 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
|
504 | |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
505 | /* can't capture own pieces */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
506 | 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
|
507 | 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
|
508 | } |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
509 | |
|
151
f1b6a0388d85
fix that en passant captures do not work
Mike Becker <universe@uap-core.de>
parents:
147
diff
changeset
|
510 | /* 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
|
511 | 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
|
512 | /* ... or the capture happens en passant */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
513 | if (!move->capture || piece_type(move->piece) != PAWN || |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
514 | !enpassant_threat_exists(gamestate, |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
515 | move->fromrow, move->tofile)) { |
|
151
f1b6a0388d85
fix that en passant captures do not work
Mike Becker <universe@uap-core.de>
parents:
147
diff
changeset
|
516 | return INVALID_MOVE_SYNTAX; |
|
f1b6a0388d85
fix that en passant captures do not work
Mike Becker <universe@uap-core.de>
parents:
147
diff
changeset
|
517 | } |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
518 | } |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
519 | |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
520 | /* 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
|
521 | bool chkrules; |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
522 | switch (piece_type(move->piece)) { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
523 | case PAWN: |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
524 | chkrules = pawn_chkrules(gamestate, move) && |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
525 | !pawn_isblocked(gamestate, move); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
526 | break; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
527 | case ROOK: |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
528 | chkrules = rook_chkrules(move) && |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
529 | !rook_isblocked(gamestate, move); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
530 | break; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
531 | case KNIGHT: |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
532 | chkrules = knight_chkrules(move) && |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
533 | !knight_isblocked(gamestate, move); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
534 | break; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
535 | case BISHOP: |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
536 | chkrules = bishop_chkrules(move) && |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
537 | !bishop_isblocked(gamestate, move); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
538 | break; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
539 | case QUEEN: |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
540 | chkrules = queen_chkrules(move) && |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
541 | !queen_isblocked(gamestate, move); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
542 | break; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
543 | case KING: |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
544 | chkrules = king_chkrules(gamestate, move) && |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
545 | !king_isblocked(gamestate, move); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
546 | break; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
547 | default: |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
548 | return INVALID_MOVE_SYNTAX; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
549 | } |
|
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 | /* cancel processing to save resources */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
552 | if (!chkrules) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
553 | return RULES_VIOLATED; |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
554 | } |
|
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
|
555 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
556 | /* 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
|
557 | 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
|
558 | Move simmove = *move; |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
559 | apply_move(&simulation, &simmove); |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
560 | Color piececolor = piece_color(move->piece); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
561 | Color oppcolor = opponent_color(piececolor); |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
562 | File kingfile = 0; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
563 | Row kingrow = 0; |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
564 | for (Row row = 0 ; row < 8 ; row++) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
565 | for (File file = 0 ; file < 8 ; file++) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
566 | Piece p = piece_at(&simulation, row, file); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
567 | if (p == mkpiece(KING, piececolor)) { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
568 | kingfile = file; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
569 | 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
|
570 | } |
|
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
|
571 | } |
|
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
|
572 | } |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
573 | int result = VALID_MOVE_SEMANTICS; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
574 | if (is_covered(&simulation, kingrow, kingfile, oppcolor)) { |
|
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
|
575 | gamestate_cleanup(&simulation); |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
576 | if (piece_type(move->piece) == KING) { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
577 | 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
|
578 | } else { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
579 | if (is_check_position(gamestate)) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
580 | result = KING_IN_CHECK; |
|
161
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
160
diff
changeset
|
581 | } else { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
582 | result = PIECE_PINNED; |
|
161
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
160
diff
changeset
|
583 | } |
|
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
|
584 | } |
|
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
|
585 | } |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
586 | gamestate_cleanup(&simulation); |
| 139 | 587 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
588 | return result; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
589 | } |
| 139 | 590 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
591 | int validate_move(const GameState *gamestate, const Move *move) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
592 | int result = validate_move_rules(gamestate, move); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
593 | if (result != VALID_MOVE_SEMANTICS) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
594 | return result; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
595 | } |
| 139 | 596 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
597 | /* validate check and checkmate flags */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
598 | int cocm = determine_check_or_checkmate(gamestate, move); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
599 | if (cocm == 2) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
600 | if (!move->checkmate) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
601 | 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
|
602 | } |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
603 | } else if (cocm == 1) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
604 | if (!move->check) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
605 | return MISSING_CHECK; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
606 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
607 | } else if (move->checkmate) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
608 | return INVALID_CHECKMATE; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
609 | } else if (move->check) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
610 | return INVALID_CHECK; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
611 | } |
|
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
|
612 | |
|
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
|
613 | |
|
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
|
614 | return VALID_MOVE_SEMANTICS; |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
615 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
616 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
617 | 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
|
618 | 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
|
619 | } |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
620 | |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
621 | 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
|
622 | gamestate->board[row][file] = piece; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
623 | } |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
624 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
625 | 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
|
626 | 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
|
627 | Move candidates[32]; |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
628 | size_t ccount = 0; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
629 | for (Row r = 0 ; r < 8 ; r++) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
630 | for (File f = 0 ; f < 8 ; f++) { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
631 | Piece p = piece_at(gamestate, r, f); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
632 | if (piece_color(p) == color) { |
|
64
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
633 | /* non-capturing move */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
634 | memset(&(candidates[ccount]), 0, sizeof(Move)); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
635 | candidates[ccount].piece = p; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
636 | candidates[ccount].fromrow = r; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
637 | candidates[ccount].fromfile = f; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
638 | candidates[ccount].torow = row; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
639 | candidates[ccount].tofile = file; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
640 | 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
|
641 | /* 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
|
642 | candidates[ccount].promotion = mkpiece(QUEEN, color); |
|
135
114e764fbae5
fixes #893 - pawn could not promote
Mike Becker <universe@uap-core.de>
parents:
133
diff
changeset
|
643 | } |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
644 | 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
|
645 | |
|
64
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
63
diff
changeset
|
646 | /* capturing move */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
647 | memcpy(&(candidates[ccount]), |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
648 | &(candidates[ccount-1]), sizeof(Move)); |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
649 | candidates[ccount].capture = true; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
650 | ccount++; |
|
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 | } |
|
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 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
655 | if (movecount) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
656 | *movecount = 0; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
657 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
658 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
659 | bool result = false; |
|
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 | for (size_t i = 0 ; i < ccount ; i++) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
662 | if (validate_move_rules(gamestate, &(candidates[i])) |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
663 | == VALID_MOVE_SEMANTICS) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
664 | result = true; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
665 | if (moves && movecount) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
666 | moves[(*movecount)++] = candidates[i]; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
667 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
668 | } |
|
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 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
671 | return result; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
672 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
673 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
674 | 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
|
675 | Color color, Move *threats, size_t *threatcount) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
676 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
677 | /* simulate a capturing move on the target position */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
678 | Color opcolor = opponent_color(color); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
679 | GameState simulation = gamestate_copy_sim(gamestate); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
680 | 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
|
681 | /* 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
|
682 | piece_set(&simulation, row, file, mkpiece(PAWN, opcolor)); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
683 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
684 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
685 | Move candidates[16]; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
686 | size_t ccount = 0; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
687 | for (Row r = 0 ; r < 8 ; r++) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
688 | for (File f = 0 ; f < 8 ; f++) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
689 | Piece p = piece_at(&simulation, r, f); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
690 | if (piece_color(p) == color) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
691 | memset(&(candidates[ccount]), 0, sizeof(Move)); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
692 | candidates[ccount].piece = p; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
693 | candidates[ccount].fromrow = r; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
694 | candidates[ccount].fromfile = f; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
695 | candidates[ccount].torow = row; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
696 | candidates[ccount].tofile = file; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
697 | candidates[ccount].capture = true; |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
698 | 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
|
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 | } |
|
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 | |
|
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 | 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
|
704 | *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
|
705 | } |
|
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 | |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
78
diff
changeset
|
707 | 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
|
708 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
709 | 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
|
710 | 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
|
711 | == 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
|
712 | 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
|
713 | 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
|
714 | 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
|
715 | } |
|
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
|
716 | } |
|
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
|
717 | } |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
718 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
719 | 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
|
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 | 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
|
722 | } |
|
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
|
723 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
724 | 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
|
725 | 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
|
726 | |
|
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
|
727 | 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
|
728 | 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
|
729 | 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
|
730 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
731 | File kingfile = 0; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
732 | Row kingrow = 0; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
733 | for (Row row = 0 ; row < 8 ; row++) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
734 | 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
|
735 | 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
|
736 | 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
|
737 | 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
|
738 | } |
|
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
|
739 | } |
|
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
|
740 | } |
|
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
|
741 | |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
78
diff
changeset
|
742 | 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
|
743 | 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
|
744 | 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
|
745 | |
|
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
|
746 | 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
|
747 | } |
|
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
|
748 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
749 | 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
|
750 | 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
|
751 | |
|
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 | 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
|
753 | *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
|
754 | } |
|
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
|
755 | |
|
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 | Move candidates[16]; |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
757 | 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
|
758 | 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
|
759 | |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
78
diff
changeset
|
760 | bool result = false; |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
761 | File kingfile = 0; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
762 | Row kingrow = 0; |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
763 | for (Row r = 0 ; r < 8 ; r++) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
764 | for (File f = 0 ; f < 8 ; f++) { |
| 87 | 765 | if (gamestate->board[r][f] == (color|KING)) { |
| 766 | kingfile = f; | |
| 767 | 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
|
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 | } |
|
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
|
770 | } |
|
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
|
771 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
772 | 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
|
773 | // 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
|
774 | 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
|
775 | 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
|
776 | 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
|
777 | 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
|
778 | 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
|
779 | 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
|
780 | 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
|
781 | 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
|
782 | } |
|
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 | } |
|
137
43d1b3c33369
fix memory leak when simulating real threats
Mike Becker <universe@uap-core.de>
parents:
136
diff
changeset
|
784 | 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
|
785 | } |
|
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 | |
|
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
|
787 | 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
|
788 | } else { |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
78
diff
changeset
|
789 | 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
|
790 | } |
|
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
|
791 | } |
|
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
|
792 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
793 | 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
|
794 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
795 | 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
|
796 | bool incheck = false; |
|
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
160
diff
changeset
|
797 | if (gamestate->movecount > 0) { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
798 | incheck = is_check_position(gamestate); |
|
161
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
160
diff
changeset
|
799 | } |
|
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
|
800 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
801 | Move candidates[16], *candidate = NULL; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
802 | size_t candidatecount; |
|
135
114e764fbae5
fixes #893 - pawn could not promote
Mike Becker <universe@uap-core.de>
parents:
133
diff
changeset
|
803 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
804 | /* 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
|
805 | 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
|
806 | 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
|
807 | |
|
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
|
808 | bool found = false; |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
809 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
810 | for (size_t i = 0 ; i < candidatecount ; i++) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
811 | /* filter by partial fromrow/fromfile information */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
812 | 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
|
813 | (move->fromrow == POS_UNSPECIFIED || |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
814 | 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
|
815 | (move->fromfile == POS_UNSPECIFIED || |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
816 | 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
|
817 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
818 | /* 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
|
819 | 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
|
820 | |
|
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
|
821 | /* discard pinned pieces */ |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
822 | if (!is_pinned(gamestate, &(candidates[i]))) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
823 | if (candidate) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
824 | /* 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
|
825 | return AMBIGUOUS_MOVE; |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
826 | } else { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
827 | candidate = &(candidates[i]); |
|
49
02c509a44e98
logging string representation of moves in short algebraic notation
Mike Becker <universe@uap-core.de>
parents:
48
diff
changeset
|
828 | } |
|
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
|
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 | } |
|
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
|
831 | } |
|
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
|
832 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
833 | /* no valid candidate left */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
834 | 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
|
835 | if (found) { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
836 | 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
|
837 | 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
|
838 | } 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
|
839 | 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
|
840 | } 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
|
841 | 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
|
842 | } |
|
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 | } 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
|
844 | 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
|
845 | } |
|
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
|
846 | } |
|
d726e4b46c33
refactoring of getlocation mechanism for better short algebraic notation support (does now respect pinned pieces) + fixed a bug where a pawn could advance through a piece (e.g. e2e4 could jump over a piece on e3)
Mike Becker <universe@uap-core.de>
parents:
40
diff
changeset
|
847 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
848 | /* found a candidate, copy the source location */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
849 | move->fromrow = candidate->fromrow; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
850 | 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
|
851 | 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
|
852 | } else { |
|
154
5336e985bd69
rename INVALID_POSITION to PIECE_NOT_FOUND
Mike Becker <universe@uap-core.de>
parents:
153
diff
changeset
|
853 | 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
|
854 | } |
|
d726e4b46c33
refactoring of getlocation mechanism for better short algebraic notation support (does now respect pinned pieces) + fixed a bug where a pawn could advance through a piece (e.g. e2e4 could jump over a piece on e3)
Mike Becker <universe@uap-core.de>
parents:
40
diff
changeset
|
855 | } |
|
d726e4b46c33
refactoring of getlocation mechanism for better short algebraic notation support (does now respect pinned pieces) + fixed a bug where a pawn could advance through a piece (e.g. e2e4 could jump over a piece on e3)
Mike Becker <universe@uap-core.de>
parents:
40
diff
changeset
|
856 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
857 | 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
|
858 | memset(move, 0, sizeof(Move)); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
859 | move->fromfile = POS_UNSPECIFIED; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
860 | move->fromrow = POS_UNSPECIFIED; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
861 | |
|
147
7e3f2d462bb6
make eval_move() and check_move() not change their input string
Mike Becker <universe@uap-core.de>
parents:
144
diff
changeset
|
862 | 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
|
863 | 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
|
864 | 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
|
865 | } |
|
147
7e3f2d462bb6
make eval_move() and check_move() not change their input string
Mike Becker <universe@uap-core.de>
parents:
144
diff
changeset
|
866 | 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
|
867 | strcpy(mstr, pstr); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
868 | |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
869 | /* 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
|
870 | if (mstr[len-1] == '+' || mstr[len-1] == '#') { |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
871 | len--; mstr[len] = '\0'; |
|
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
|
872 | move->check = true; |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
873 | move->checkmate = mstr[len-1] == '#'; |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
874 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
875 | |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
876 | /* evaluate promotion */ |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
877 | if (len > 3 && mstr[len-2] == '=') { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
878 | move->promotion = getpiece(mstr[len-1], color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
879 | if (!move->promotion) { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
880 | return INVALID_MOVE_SYNTAX; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
881 | } else { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
882 | len -= 2; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
883 | mstr[len] = 0; |
|
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 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
886 | |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
887 | if (len == 2) { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
888 | /* pawn move (e.g. "e4") */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
889 | move->piece = mkpiece(PAWN, color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
890 | move->tofile = fileidx(mstr[0]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
891 | move->torow = rowidx(mstr[1]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
892 | } else if (len == 3) { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
893 | if (strcmp(mstr, "O-O") == 0) { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
894 | /* king side castling */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
895 | move->piece = mkpiece(KING, color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
896 | move->fromfile = fileidx('e'); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
897 | 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
|
898 | 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
|
899 | } else { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
900 | /* move (e.g. "Nf3") */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
901 | move->piece = getpiece(mstr[0], color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
902 | move->tofile = fileidx(mstr[1]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
903 | move->torow = rowidx(mstr[2]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
904 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
905 | } else if (len == 4) { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
906 | move->piece = getpiece(mstr[0], color); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
907 | if (move->piece == 0) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
908 | move->piece = mkpiece(PAWN, color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
909 | move->fromfile = fileidx(mstr[0]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
910 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
911 | if (mstr[1] == 'x') { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
912 | /* capture (e.g. "Nxf3", "dxe5") */ |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
913 | move->capture = true; |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
914 | } else { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
915 | /* move (e.g. "Ndf3", "N2c3", "e2e4") */ |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
916 | if (isfile(mstr[1])) { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
917 | move->fromfile = fileidx(mstr[1]); |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
918 | /* 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
|
919 | if (piece_type(move->piece) == PAWN) { |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
920 | /* invalidate the result */ |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
921 | move->piece = 0; |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
922 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
923 | } else { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
924 | move->fromrow = rowidx(mstr[1]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
925 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
926 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
927 | move->tofile = fileidx(mstr[2]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
928 | move->torow = rowidx(mstr[3]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
929 | } else if (len == 5) { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
930 | if (strcmp(mstr, "O-O-O") == 0) { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
931 | /* queen side castling "O-O-O" */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
932 | move->piece = mkpiece(KING, color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
933 | move->fromfile = fileidx('e'); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
934 | 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
|
935 | 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
|
936 | } else { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
937 | move->piece = getpiece(mstr[0], color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
938 | if (mstr[2] == 'x') { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
939 | move->capture = true; |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
940 | if (move->piece) { |
|
155
835776e0338f
fix: disambiguation by row while capturing was not implemented
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
941 | /* 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
|
942 | if (isfile(mstr[1])) { |
|
835776e0338f
fix: disambiguation by row while capturing was not implemented
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
943 | 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
|
944 | } 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
|
945 | 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
|
946 | } else { |
|
835776e0338f
fix: disambiguation by row while capturing was not implemented
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
947 | return INVALID_MOVE_SYNTAX; |
|
835776e0338f
fix: disambiguation by row while capturing was not implemented
Mike Becker <universe@uap-core.de>
parents:
154
diff
changeset
|
948 | } |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
949 | } else { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
950 | /* long notation capture (e.g. "e5xf6") */ |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
951 | move->piece = mkpiece(PAWN, color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
952 | move->fromfile = fileidx(mstr[0]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
953 | move->fromrow = rowidx(mstr[1]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
954 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
955 | } else { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
956 | /* long notation move (e.g. "Nc5a4") */ |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
957 | move->fromfile = fileidx(mstr[1]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
958 | move->fromrow = rowidx(mstr[2]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
959 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
960 | move->tofile = fileidx(mstr[3]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
961 | move->torow = rowidx(mstr[4]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
962 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
963 | } else if (len == 6) { |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
964 | /* long notation capture (e.g. "Nc5xf3") */ |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
965 | if (mstr[3] == 'x') { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
966 | move->capture = true; |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
967 | move->piece = getpiece(mstr[0], color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
968 | move->fromfile = fileidx(mstr[1]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
969 | move->fromrow = rowidx(mstr[2]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
970 | move->tofile = fileidx(mstr[4]); |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
971 | move->torow = rowidx(mstr[5]); |
|
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 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
974 | |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
975 | |
|
115
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
976 | if (!move->piece) { |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
977 | return INVALID_MOVE_SYNTAX; |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
978 | } |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
979 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
980 | if (piece_type(move->piece) == PAWN |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
981 | && move->torow == (color==WHITE?7:0) |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
982 | && !move->promotion) { |
|
115
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
983 | return NEED_PROMOTION; |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
984 | } |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
985 | |
|
153
bad2d6d4b861
fix wrong error message when move indices are invalid
Mike Becker <universe@uap-core.de>
parents:
152
diff
changeset
|
986 | /* up to this point |
|
bad2d6d4b861
fix wrong error message when move indices are invalid
Mike Becker <universe@uap-core.de>
parents:
152
diff
changeset
|
987 | * 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
|
988 | * 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
|
989 | */ |
|
bad2d6d4b861
fix wrong error message when move indices are invalid
Mike Becker <universe@uap-core.de>
parents:
152
diff
changeset
|
990 | 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
|
991 | !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
|
992 | return INVALID_MOVE_SYNTAX; |
|
115
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
993 | } |
|
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 | return VALID_MOVE_SYNTAX; |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
996 | } |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
997 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
998 | int eval_move2(const GameState *gamestate, |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
999 | 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
|
1000 | 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
|
1001 | if (result == VALID_MOVE_SYNTAX) { |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1002 | if (move->fromfile == POS_UNSPECIFIED |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1003 | || move->fromrow == POS_UNSPECIFIED) { |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1004 | result = getlocation(gamestate, move); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1005 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1006 | if (result == VALID_MOVE_SYNTAX) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1007 | /* correct check/checkmate flags */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1008 | if (lazy) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1009 | move->check = move->checkmate = false; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1010 | switch (determine_check_or_checkmate(gamestate, move)) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1011 | case 2: move->checkmate = true; |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1012 | case 1: move->check = true; |
|
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 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1015 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1016 | /* format the move string */ |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1017 | format_move(gamestate, move); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1018 | } |
|
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1019 | } |
|
115
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
1020 | return result; |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
1021 | } |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
1022 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1023 | int eval_move_lazy(const GameState *gamestate, |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1024 | const char *mstr, Color color, Move *move) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1025 | return eval_move2(gamestate, mstr, color, move, true); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1026 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1027 | |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1028 | int eval_move(const GameState *gamestate, |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1029 | const char *mstr, Color color, Move *move) { |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1030 | return eval_move2(gamestate, mstr, color, move, false); |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1031 | } |
|
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1032 | |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
1033 | 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
|
1034 | Move move; |
|
206201d544be
relax validation of premoves to allow retaking pieces
Mike Becker <universe@uap-core.de>
parents:
110
diff
changeset
|
1035 | return eval_move1(mstr, &move, color); |
|
19
6a26114297a1
moved chess rules to separate lib
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1036 | } |
|
29
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
1037 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
161
diff
changeset
|
1038 | bool is_protected(const GameState *gamestate, Row row, File file, Color color) { |
|
29
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
1039 | Move threats[16]; |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
1040 | size_t threatcount; |
|
29
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
1041 | if (get_real_threats(gamestate, row, file, color, threats, &threatcount)) { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
158
diff
changeset
|
1042 | for (size_t i = 0 ; i < threatcount ; i++) { |
|
29
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
1043 | if (threats[i].piece != (color|KING)) { |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
78
diff
changeset
|
1044 | return true; |
|
29
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
1045 | } |
|
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
1046 | } |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
78
diff
changeset
|
1047 | return false; |
|
29
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
1048 | } else { |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
78
diff
changeset
|
1049 | return false; |
|
29
c6a1ad6cf749
fixed checkmate and completed implementation (more testing is still advised)
Mike Becker <universe@uap-core.de>
parents:
28
diff
changeset
|
1050 | } |
|
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 | } |