Tue, 25 Aug 2026 18:59:18 +0200
rename Row to Rank
+ fix increase type safety where we overlooked it before
relates to #956
|
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 | |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
30 | #include "pawn.h" |
|
16
a298c6637c30
introduced status codes for get_location to produce detailed error messages + added knight rules
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
31 | #include "rules.h" |
|
10
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
32 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
160
diff
changeset
|
33 | bool pawn_chkrules(const GameState *gamestate, const Move *move) { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
80
diff
changeset
|
34 | int8_t d = piece_color(move->piece) == WHITE ? -1 : 1; |
|
18
6008840b859e
fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents:
16
diff
changeset
|
35 | |
| 194 | 36 | if (move->torank == (d < 0 ? 7 : 0)) { |
|
18
6008840b859e
fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents:
16
diff
changeset
|
37 | if (move->promotion) { |
|
160
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
80
diff
changeset
|
38 | unsigned ppiecetype = piece_type(move->promotion); |
|
f87832cba8b8
refactor rules.h / rules.c
Mike Becker <universe@uap-core.de>
parents:
80
diff
changeset
|
39 | if (!ppiecetype || ppiecetype == PAWN || ppiecetype == KING) { |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
55
diff
changeset
|
40 | return false; |
|
18
6008840b859e
fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents:
16
diff
changeset
|
41 | } |
|
6008840b859e
fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents:
16
diff
changeset
|
42 | } else { |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
55
diff
changeset
|
43 | return false; |
|
18
6008840b859e
fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents:
16
diff
changeset
|
44 | } |
|
6008840b859e
fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents:
16
diff
changeset
|
45 | } else { |
|
6008840b859e
fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents:
16
diff
changeset
|
46 | if (move->promotion) { |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
55
diff
changeset
|
47 | return false; |
|
18
6008840b859e
fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents:
16
diff
changeset
|
48 | } |
|
6008840b859e
fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents:
16
diff
changeset
|
49 | } |
|
6008840b859e
fixed bishop + added pawn promotion + added move log
Mike Becker <universe@uap-core.de>
parents:
16
diff
changeset
|
50 | |
|
14
970748b9a73b
fixed crucial bug where both players could move at the same time + added pawn rules (TODO: en passant)
Mike Becker <universe@uap-core.de>
parents:
12
diff
changeset
|
51 | if (move->capture) { |
| 194 | 52 | if (move->fromrank == move->torank + d && ( |
|
14
970748b9a73b
fixed crucial bug where both players could move at the same time + added pawn rules (TODO: en passant)
Mike Becker <universe@uap-core.de>
parents:
12
diff
changeset
|
53 | move->fromfile == move->tofile + 1 || |
|
970748b9a73b
fixed crucial bug where both players could move at the same time + added pawn rules (TODO: en passant)
Mike Becker <universe@uap-core.de>
parents:
12
diff
changeset
|
54 | move->fromfile == move->tofile - 1)) { |
|
15
7ffd66591afe
completed pawn rules + bug fixes for 4-char-moves
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
55 | |
| 194 | 56 | return piece_at(gamestate, move->torank, move->tofile) || |
| 57 | enpassant_threat_exists(gamestate, move->fromrank, move->tofile); | |
|
14
970748b9a73b
fixed crucial bug where both players could move at the same time + added pawn rules (TODO: en passant)
Mike Becker <universe@uap-core.de>
parents:
12
diff
changeset
|
58 | } else { |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
55
diff
changeset
|
59 | return false; |
|
14
970748b9a73b
fixed crucial bug where both players could move at the same time + added pawn rules (TODO: en passant)
Mike Becker <universe@uap-core.de>
parents:
12
diff
changeset
|
60 | } |
|
970748b9a73b
fixed crucial bug where both players could move at the same time + added pawn rules (TODO: en passant)
Mike Becker <universe@uap-core.de>
parents:
12
diff
changeset
|
61 | } else { |
|
970748b9a73b
fixed crucial bug where both players could move at the same time + added pawn rules (TODO: en passant)
Mike Becker <universe@uap-core.de>
parents:
12
diff
changeset
|
62 | if (move->fromfile == move->tofile) { |
| 194 | 63 | return (move->fromrank == move->torank + d) || |
| 64 | (move->fromrank == (d < 0 ? 1 : 6) && /* advanced first move */ | |
| 65 | move->fromrank == move->torank + d*2); | |
|
14
970748b9a73b
fixed crucial bug where both players could move at the same time + added pawn rules (TODO: en passant)
Mike Becker <universe@uap-core.de>
parents:
12
diff
changeset
|
66 | } else { |
|
80
b980a7192b5a
replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents:
55
diff
changeset
|
67 | return false; |
|
14
970748b9a73b
fixed crucial bug where both players could move at the same time + added pawn rules (TODO: en passant)
Mike Becker <universe@uap-core.de>
parents:
12
diff
changeset
|
68 | } |
|
970748b9a73b
fixed crucial bug where both players could move at the same time + added pawn rules (TODO: en passant)
Mike Becker <universe@uap-core.de>
parents:
12
diff
changeset
|
69 | } |
|
10
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
70 | } |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
71 | |
|
163
2a6d83f4677e
major refactoring of rules API
Mike Becker <universe@uap-core.de>
parents:
160
diff
changeset
|
72 | bool pawn_isblocked(const GameState *gamestate, const Move *move) { |
| 194 | 73 | if (move->torank == move->fromrank + 1 |
| 74 | || move->torank == move->fromrank - 1) { | |
| 75 | return piece_at(gamestate, move->torank, move->tofile) | |
| 76 | && !move->capture; | |
|
10
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
77 | } else { |
| 194 | 78 | return piece_at(gamestate, move->torank, move->tofile) || |
| 79 | gamestate->board[(move->fromrank + move->torank) / 2][move->tofile]; | |
|
10
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
80 | } |
|
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
81 | } |
|
169
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
82 | |
|
170
bde99d803caf
implements stalemate detection + fixes missing const qualifier in new *_moves[_allowed] API
Mike Becker <universe@uap-core.de>
parents:
169
diff
changeset
|
83 | size_t pawn_moves(const GameState *gamestate, |
| 194 | 84 | Color c, Rank r, File f, Move *moves) { |
|
193
d1420f5c5704
increase type safety + add backwards compatibility including C99
Mike Becker <universe@uap-core.de>
parents:
170
diff
changeset
|
85 | (void) gamestate; /* no (theoretical) move depends on the game state */ |
|
169
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
86 | size_t count = 0; |
| 194 | 87 | int rankdelta = c == WHITE ? 1 : -1; |
| 88 | int promotionrank = c == WHITE ? 7 : 0; | |
| 89 | int startrank = c == WHITE ? 1 : 6; | |
|
169
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
90 | const int targets[4][3] = { |
| 194 | 91 | {r + rankdelta, f, 0}, |
| 92 | {r + rankdelta, f - 1, 1}, | |
| 93 | {r + rankdelta, f + 1, 1}, | |
| 94 | {r + rankdelta * 2, f, 0} | |
|
169
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
95 | }; |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
96 | |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
97 | for (size_t i = 0 ; i < 4 ; i++) { |
| 194 | 98 | Rank rank = targets[i][0]; |
| 99 | File file = targets[i][1]; | |
|
169
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
100 | |
| 194 | 101 | if (i == 3 && r != startrank) { |
|
169
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
102 | continue; |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
103 | } |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
104 | |
| 194 | 105 | if (isidx(rank) && isidx(file)) { |
|
169
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
106 | moves[count] = (Move){0}; |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
107 | moves[count].piece = mkpiece(PAWN, c); |
| 194 | 108 | moves[count].fromrank = r; |
|
169
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
109 | moves[count].fromfile = f; |
| 194 | 110 | moves[count].torank = rank; |
|
169
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
111 | moves[count].tofile = file; |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
112 | moves[count].capture = targets[i][2]; |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
113 | |
| 194 | 114 | if (rank == promotionrank) { |
|
169
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
115 | moves[count].promotion = mkpiece(QUEEN, c); |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
116 | } |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
117 | |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
118 | count++; |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
119 | } |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
120 | } |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
121 | |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
122 | return count; |
|
9962f5d98764
add functions to list the possible moves for each piece
Mike Becker <universe@uap-core.de>
parents:
163
diff
changeset
|
123 | } |