Thu, 30 Jul 2026 11:49:47 +0200
convert some macros to static inline functions
also fixes a theoretical memmory access bug in king_isblocked()
|
10
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1 | /* |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
3 | * |
|
55
54ea19938d57
updated copyright and version info
Mike Becker <universe@uap-core.de>
parents:
47
diff
changeset
|
4 | * Copyright 2016 Mike Becker. All rights reserved. |
|
10
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
5 | * |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
6 | * Redistribution and use in source and binary forms, with or without |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
7 | * modification, are permitted provided that the following conditions are met: |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
8 | * |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
9 | * 1. Redistributions of source code must retain the above copyright |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
10 | * notice, this list of conditions and the following disclaimer. |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
11 | * |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
12 | * 2. Redistributions in binary form must reproduce the above copyright |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
13 | * notice, this list of conditions and the following disclaimer in the |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
14 | * documentation and/or other materials provided with the distribution. |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
15 | * |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
26 | * POSSIBILITY OF SUCH DAMAGE. |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
27 | * |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
28 | */ |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
29 | |
|
16
a298c6637c30
introduced status codes for get_location to produce detailed error messages + added knight rules
Mike Becker <universe@uap-core.de>
parents:
12
diff
changeset
|
30 | #include "rules.h" |
|
10
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
31 | #include "king.h" |
| 25 | 32 | |
|
161
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
98
diff
changeset
|
33 | #include <string.h> |
|
98
9cb41383540f
change move list from linked list to array (prepares game replays)
Mike Becker <universe@uap-core.de>
parents:
80
diff
changeset
|
34 | |
|
161
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
98
diff
changeset
|
35 | static bool king_castling_chkmoved(GameState *gamestate, Row row, File file) { |
|
98
9cb41383540f
change move list from linked list to array (prepares game replays)
Mike Becker <universe@uap-core.de>
parents:
80
diff
changeset
|
36 | for (unsigned i = 0; i < gamestate->movecount; i++) { |
|
9cb41383540f
change move list from linked list to array (prepares game replays)
Mike Becker <universe@uap-core.de>
parents:
80
diff
changeset
|
37 | if (gamestate->moves[i].fromfile == file |
|
9cb41383540f
change move list from linked list to array (prepares game replays)
Mike Becker <universe@uap-core.de>
parents:
80
diff
changeset
|
38 | && gamestate->moves[i].fromrow == row) { |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
64
diff
changeset
|
39 | return true; |
| 25 | 40 | } |
| 41 | } | |
| 42 | ||
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
64
diff
changeset
|
43 | return false; |
| 25 | 44 | } |
|
10
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
45 | |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
64
diff
changeset
|
46 | bool king_chkrules(GameState *gamestate, Move* move) { |
| 25 | 47 | if (abs(move->torow - move->fromrow) <= 1 && |
| 48 | abs(move->tofile - move->fromfile) <= 1) { | |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
64
diff
changeset
|
49 | return true; |
| 25 | 50 | } else { |
| 51 | /* castling */ | |
| 52 | if (move->fromrow == move->torow && | |
|
161
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
98
diff
changeset
|
53 | move->fromrow == (piece_color(move->piece) == WHITE ? 0 : 7) && |
| 25 | 54 | move->fromfile == fileidx('e') && |
| 55 | (move->tofile == fileidx('c') || move->tofile == fileidx('g'))) { | |
| 56 | ||
| 57 | return !king_castling_chkmoved(gamestate, | |
| 58 | move->fromrow, move->fromfile) && | |
| 59 | !king_castling_chkmoved(gamestate, move->fromrow, | |
| 60 | move->tofile == fileidx('c') ? 0 : 7); | |
| 61 | } else { | |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
64
diff
changeset
|
62 | return false; |
| 25 | 63 | } |
| 64 | } | |
|
10
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
65 | } |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
66 | |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
64
diff
changeset
|
67 | bool king_isblocked(GameState *gamestate, Move *move) { |
| 25 | 68 | |
|
161
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
98
diff
changeset
|
69 | uint8_t opponent_color = opponent_color(piece_color(move->piece)); |
| 25 | 70 | |
|
64
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
55
diff
changeset
|
71 | /* being in check does not "block" the king, so don't test it here */ |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
64
diff
changeset
|
72 | bool blocked = 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:
25
diff
changeset
|
73 | |
|
64
4eda5df55f86
fixes castling not printed correctly to PGN
Mike Becker <universe@uap-core.de>
parents:
55
diff
changeset
|
74 | /* just test, if castling move is blocked */ |
| 25 | 75 | if (abs(move->tofile - move->fromfile) == 2) { |
| 76 | if (move->tofile == fileidx('c')) { | |
| 77 | blocked |= gamestate->board[move->torow][fileidx('b')]; | |
| 78 | } | |
| 79 | uint8_t midfile = (move->tofile+move->fromfile)/2; | |
|
161
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
98
diff
changeset
|
80 | bool incheck = false; |
|
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
98
diff
changeset
|
81 | if (gamestate->movecount > 0) { |
|
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
98
diff
changeset
|
82 | incheck = gamestate->moves[gamestate->movecount-1].check; |
|
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
98
diff
changeset
|
83 | } |
|
3ff96fec144a
convert some macros to static inline functions
Mike Becker <universe@uap-core.de>
parents:
98
diff
changeset
|
84 | blocked |= incheck || gamestate->board[move->torow][midfile] || |
| 25 | 85 | is_covered(gamestate, move->torow, midfile, opponent_color); |
| 86 | } | |
| 87 | ||
| 88 | return blocked; | |
|
10
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
89 | } |