Thu, 10 Apr 2014 12:10:09 +0200
minor improvements by using macros
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 | * |
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
4 | * Copyright 2014 Mike Becker. All rights reserved. |
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 | #include <stdlib.h> |
33 | ||
34 | static _Bool king_castling_chkmoved(GameState *gamestate, | |
35 | uint8_t row, uint8_t file) { | |
36 | ||
37 | MoveList *ml = gamestate->movelist; | |
38 | while (ml) { | |
39 | if (ml->move.fromfile == file && ml->move.fromrow == row) { | |
40 | return 1; | |
41 | } | |
42 | ml = ml->next; | |
43 | } | |
44 | ||
45 | return 0; | |
46 | } | |
10
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
47 | |
23
824c9522ce66
introduced game state structure
Mike Becker <universe@uap-core.de>
parents:
19
diff
changeset
|
48 | _Bool king_chkrules(GameState *gamestate, Move* move) { |
25 | 49 | if (abs(move->torow - move->fromrow) <= 1 && |
50 | abs(move->tofile - move->fromfile) <= 1) { | |
51 | return 1; | |
52 | } else { | |
53 | /* castling */ | |
54 | if (move->fromrow == move->torow && | |
55 | move->fromrow == ((move->piece&COLOR_MASK) == WHITE ? 0 : 7) && | |
56 | move->fromfile == fileidx('e') && | |
57 | (move->tofile == fileidx('c') || move->tofile == fileidx('g'))) { | |
58 | ||
59 | return !king_castling_chkmoved(gamestate, | |
60 | move->fromrow, move->fromfile) && | |
61 | !king_castling_chkmoved(gamestate, move->fromrow, | |
62 | move->tofile == fileidx('c') ? 0 : 7); | |
63 | } else { | |
64 | return 0; | |
65 | } | |
66 | } | |
10
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
67 | } |
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
68 | |
23
824c9522ce66
introduced game state structure
Mike Becker <universe@uap-core.de>
parents:
19
diff
changeset
|
69 | _Bool king_isblocked(GameState *gamestate, Move *move) { |
25 | 70 | |
71 | uint8_t opponent_color = opponent_color(move->piece&COLOR_MASK); | |
72 | _Bool blocked = is_covered(gamestate, move->torow, move->tofile, | |
73 | opponent_color); | |
74 | ||
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; | |
80 | blocked |= gamestate->lastmove->move.check || | |
81 | gamestate->board[move->torow][midfile] || | |
82 | is_covered(gamestate, move->torow, midfile, opponent_color); | |
83 | } | |
84 | ||
85 | return blocked; | |
10
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
86 | } |
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
87 | |
23
824c9522ce66
introduced game state structure
Mike Becker <universe@uap-core.de>
parents:
19
diff
changeset
|
88 | int king_getlocation(GameState *gamestate, Move *move) { |
25 | 89 | |
90 | uint8_t file, row; | |
91 | ||
92 | for (int f = -1 ; f <= 1 ; f++) { | |
93 | for (int r = -1 ; r <= 1 ; r++) { | |
94 | if (f == 0 && r == 0) { | |
95 | continue; | |
96 | } | |
97 | file = move->tofile + f; | |
98 | row = move->torow + r; | |
99 | if (isidx(file) && isidx(row)) { | |
100 | if (gamestate->board[row][file] == move->piece) { | |
101 | if ((move->fromfile != POS_UNSPECIFIED | |
102 | && move->fromfile != file) || | |
103 | (move->fromrow != POS_UNSPECIFIED | |
104 | && move->fromrow != row)) { | |
105 | return INVALID_POSITION; | |
106 | } | |
107 | move->fromfile = file; | |
108 | move->fromrow = row; | |
109 | return VALID_MOVE_SYNTAX; | |
110 | } | |
111 | } | |
112 | } | |
113 | } | |
114 | ||
115 | return INVALID_POSITION; | |
10
1347e4dabac0
prepared code base for implementing rules
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
116 | } |