Line data Source code
1 : /*
2 : * Copyright (C) 2014 Fulvio Benini
3 :
4 : * This file is part of Scid (Shane's Chess Information Database).
5 : *
6 : * Scid is free software: you can redistribute it and/or modify
7 : * it under the terms of the GNU General Public License as published by
8 : * the Free Software Foundation.
9 : *
10 : * Scid is distributed in the hope that it will be useful,
11 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 : * GNU General Public License for more details.
14 : *
15 : * You should have received a copy of the GNU General Public License
16 : * along with Scid. If not, see <http://www.gnu.org/licenses/>.
17 : */
18 :
19 : #include "stored.h"
20 : #include <cstring>
21 :
22 : // Stored line codes: used to speed up tree searches.
23 :
24 : // The basic idea is: keep a fixed dictionary of popular opening lines where
25 : // move order is significant (e.g. 1.d4 e6 2.e4 is NOT equal to 1.e4 e6 2.d4).
26 : // For each game, the longest sequence of initial moves found in the
27 : // dictionary is stored in the index file, as an integer value.
28 :
29 : // When tree-searching for a position, each stored line is searched
30 : // first and if an exact match is found for one (and it has a further
31 : // move), all games with that stored line code can be found as matches
32 : // without decoding.
33 : // Furthermore, if we detect that a line cannot possibly lead to a match
34 : // because of its end material value or pawn configuration, all games with
35 : // that stored line code can be excluded and skipped without decoding.
36 :
37 : namespace {
38 :
39 : class Board {
40 : pieceT b_[64];
41 :
42 : public:
43 0 : Board(const pieceT* b) {
44 0 : for (int i=0; i < 64; i++) b_[i] = b[i];
45 0 : }
46 0 : void doMove(FullMove m) {
47 : //No promo, no null moves, no queenside castle
48 0 : if (! m.isCastle()) {
49 0 : b_[m.getFrom()] = EMPTY;
50 0 : b_[m.getTo()] = piece_Make(m.getColor(), m.getPiece());
51 : } else {
52 0 : b_[m.getFrom()] = EMPTY;
53 0 : b_[m.getTo()] = EMPTY;
54 0 : int black = (m.getColor() == BLACK) ? 56 : 0;
55 0 : b_[black + G1] = piece_Make(m.getColor(), KING);
56 0 : b_[black + F1] = piece_Make(m.getColor(), ROOK);
57 : }
58 0 : }
59 0 : bool operator==(const Board& b) const {
60 0 : return (std::memcmp(b_, b.b_, sizeof b_) == 0);
61 : }
62 0 : bool neverMatch(const Board& m) const {
63 : // Pawns allows to exclude some games:
64 0 : int p[3][8] = {{0}};
65 0 : for (int i=0; i < 64; i++) {
66 0 : pieceT a = b_[i];
67 0 : pieceT b = m.b_[i];
68 : // 1) because a pawn will never go back to home position
69 0 : if (b == WP && a != WP && (i/8) == 1) return true;
70 0 : if (b == BP && a != BP && (i/8) == 6) return true;
71 0 : p[piece_Color(a)][piece_Type(a)] += 1;
72 0 : p[piece_Color(b)][piece_Type(b)] -= 1;
73 : }
74 0 : int df[2] = {0};
75 0 : for (pieceT i=QUEEN; i < PAWN; i++) {
76 0 : if (p[WHITE][i] < 0) df[WHITE] -= p[WHITE][i];
77 0 : if (p[BLACK][i] < 0) df[BLACK] -= p[BLACK][i];
78 : }
79 : // 2) because only extra pawns can be promoted to create other pieces.
80 0 : if (p[WHITE][PAWN] < df[WHITE] || p[BLACK][PAWN] < df[BLACK]) return true;
81 0 : return false;
82 : }
83 : };
84 :
85 : constexpr FullMove fm[] = {
86 : // "1.b3"
87 : 0x6000251,
88 : // "1.c4"
89 : 0x600029a,
90 : // "1.c4 c5"
91 : 0x600029a, 0xe000ca2,
92 : // "1.c4 c5 2.Nf3"
93 : 0x600029a, 0xe000ca2, 0x5000195,
94 : // "1.c4 e5"
95 : 0x600029a, 0xe000d24,
96 : // "1.c4 e5 2.Nc3"
97 : 0x600029a, 0xe000d24, 0x5000052,
98 : // "1.c4 e5 2.Nc3 Nf6"
99 : 0x600029a, 0xe000d24, 0x5000052, 0xd000fad,
100 : // "1.c4 e6"
101 : 0x600029a, 0xe000d2c,
102 : // "1.c4 e6 2.Nf3"
103 : 0x600029a, 0xe000d2c, 0x5000195,
104 : // "1.c4 g6"
105 : 0x600029a, 0xe000dae,
106 : // "1.c4 Nf6"
107 : 0x600029a, 0xd000fad,
108 : // "1.c4 Nf6 2.Nc3"
109 : 0x600029a, 0xd000fad, 0x5000052,
110 : // "1.c4 Nf6 2.Nc3 e6"
111 : 0x600029a, 0xd000fad, 0x5000052, 0xe000d2c,
112 : // "1.c4 Nf6 2.Nc3 g6"
113 : 0x600029a, 0xd000fad, 0x5000052, 0xe000dae,
114 : // "1.d4"
115 : 0x60002db,
116 : // "1.d4 d5"
117 : 0x60002db, 0xe000ce3,
118 : // "1.d4 d5 2.c4"
119 : 0x60002db, 0xe000ce3, 0x600029a,
120 : // "1.d4 d5 2.c4 c6"
121 : 0x60002db, 0xe000ce3, 0x600029a, 0xe000caa,
122 : // "1.d4 d5 2.c4 c6 3.Nc3"
123 : 0x60002db, 0xe000ce3, 0x600029a, 0xe000caa, 0x5000052,
124 : // "1.d4 d5 2.c4 c6 3.Nc3 Nf6"
125 : 0x60002db, 0xe000ce3, 0x600029a, 0xe000caa, 0x5000052, 0xd000fad,
126 : // "1.d4 d5 2.c4 c6 3.Nc3 Nf6 4.Nf3"
127 : 0x60002db, 0xe000ce3, 0x600029a, 0xe000caa, 0x5000052, 0xd000fad, 0x5000195,
128 : // "1.d4 d5 2.c4 c6 3.Nf3"
129 : 0x60002db, 0xe000ce3, 0x600029a, 0xe000caa, 0x5000195,
130 : // "1.d4 d5 2.c4 c6 3.Nf3 Nf6"
131 : 0x60002db, 0xe000ce3, 0x600029a, 0xe000caa, 0x5000195, 0xd000fad,
132 : // "1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3"
133 : 0x60002db, 0xe000ce3, 0x600029a, 0xe000caa, 0x5000195, 0xd000fad, 0x5000052,
134 : // "1.d4 d5 2.c4 c6 3.Nf3 Nf6 4.Nc3 e6"
135 : 0x60002db, 0xe000ce3, 0x600029a, 0xe000caa, 0x5000195, 0xd000fad, 0x5000052, 0xe000d2c,
136 : // "1.d4 d5 2.c4 dxc4"
137 : 0x60002db, 0xe000ce3, 0x600029a, 0xec008da,
138 : // "1.d4 d5 2.c4 dxc4 3.Nf3"
139 : 0x60002db, 0xe000ce3, 0x600029a, 0xec008da, 0x5000195,
140 : // "1.d4 d5 2.c4 dxc4 3.Nf3 Nf6"
141 : 0x60002db, 0xe000ce3, 0x600029a, 0xec008da, 0x5000195, 0xd000fad,
142 : // "1.d4 d5 2.c4 e6"
143 : 0x60002db, 0xe000ce3, 0x600029a, 0xe000d2c,
144 : // "1.d4 d5 2.c4 e6 3.Nc3"
145 : 0x60002db, 0xe000ce3, 0x600029a, 0xe000d2c, 0x5000052,
146 : // "1.d4 d5 2.c4 e6 3.Nc3 c6"
147 : 0x60002db, 0xe000ce3, 0x600029a, 0xe000d2c, 0x5000052, 0xe000caa,
148 : // "1.d4 d5 2.c4 e6 3.Nc3 Nf6"
149 : 0x60002db, 0xe000ce3, 0x600029a, 0xe000d2c, 0x5000052, 0xd000fad,
150 : // "1.d4 d5 2.c4 e6 3.Nf3"
151 : 0x60002db, 0xe000ce3, 0x600029a, 0xe000d2c, 0x5000195,
152 : // "1.d4 d5 2.Nf3"
153 : 0x60002db, 0xe000ce3, 0x5000195,
154 : // "1.d4 d5 2.Nf3 Nf6"
155 : 0x60002db, 0xe000ce3, 0x5000195, 0xd000fad,
156 : // "1.d4 d5 2.Nf3 Nf6 3.c4"
157 : 0x60002db, 0xe000ce3, 0x5000195, 0xd000fad, 0x600029a,
158 : // "1.d4 d5 2.Nf3 Nf6 3.c4 c6"
159 : 0x60002db, 0xe000ce3, 0x5000195, 0xd000fad, 0x600029a, 0xe000caa,
160 : // "1.d4 d5 2.Nf3 Nf6 3.c4 e6"
161 : 0x60002db, 0xe000ce3, 0x5000195, 0xd000fad, 0x600029a, 0xe000d2c,
162 : // "1.d4 d6"
163 : 0x60002db, 0xe000ceb,
164 : // "1.d4 d6 2.Nf3"
165 : 0x60002db, 0xe000ceb, 0x5000195,
166 : // "1.d4 e6"
167 : 0x60002db, 0xe000d2c,
168 : // "1.d4 e6 2.c4"
169 : 0x60002db, 0xe000d2c, 0x600029a,
170 : // "1.d4 e6 2.c4 Nf6"
171 : 0x60002db, 0xe000d2c, 0x600029a, 0xd000fad,
172 : // "1.d4 f5"
173 : 0x60002db, 0xe000d65,
174 : // "1.d4 f5 2.g3 Nf6 3.Bg2"
175 : 0x60002db, 0xe000d65, 0x6000396, 0xd000fad, 0x400014e,
176 : // "1.d4 g6"
177 : 0x60002db, 0xe000dae,
178 : // "1.d4 g6 2.c4 Bg7"
179 : 0x60002db, 0xe000dae, 0x600029a, 0xc000f76,
180 : // "1.d4 Nf6"
181 : 0x60002db, 0xd000fad,
182 : // "1.d4 Nf6 2.Bg5"
183 : 0x60002db, 0xd000fad, 0x40000a6,
184 : // "1.d4 Nf6 2.Bg5 Ne4"
185 : 0x60002db, 0xd000fad, 0x40000a6, 0xd000b5c,
186 : // "1.d4 Nf6 2.c4"
187 : 0x60002db, 0xd000fad, 0x600029a,
188 : // "1.d4 Nf6 2.c4 c5"
189 : 0x60002db, 0xd000fad, 0x600029a, 0xe000ca2,
190 : // "1.d4 Nf6 2.c4 c5 3.d5"
191 : 0x60002db, 0xd000fad, 0x600029a, 0xe000ca2, 0x60006e3,
192 : // "1.d4 Nf6 2.c4 c5 3.d5 b5"
193 : 0x60002db, 0xd000fad, 0x600029a, 0xe000ca2, 0x60006e3, 0xe000c61,
194 : // "1.d4 Nf6 2.c4 c5 3.d5 b5 4.cxb5 a6"
195 : 0x60002db, 0xd000fad, 0x600029a, 0xe000ca2, 0x60006e3, 0xe000c61, 0x6c006a1, 0xe000c28,
196 : // "1.d4 Nf6 2.c4 e6 3.g3"
197 : 0x60002db, 0xd000fad, 0x600029a, 0xe000d2c, 0x6000396,
198 : // "1.d4 Nf6 2.c4 e6 3.g3 d5"
199 : 0x60002db, 0xd000fad, 0x600029a, 0xe000d2c, 0x6000396, 0xe000ce3,
200 : // "1.d4 Nf6 2.c4 e6 3.Nc3"
201 : 0x60002db, 0xd000fad, 0x600029a, 0xe000d2c, 0x5000052,
202 : // "1.d4 Nf6 2.c4 e6 3.Nc3 Bb4"
203 : 0x60002db, 0xd000fad, 0x600029a, 0xe000d2c, 0x5000052, 0xc000f59,
204 : // "1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3"
205 : 0x60002db, 0xd000fad, 0x600029a, 0xe000d2c, 0x5000052, 0xc000f59, 0x6000314,
206 : // "1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.e3 O-O"
207 : 0x60002db, 0xd000fad, 0x600029a, 0xe000d2c, 0x5000052, 0xc000f59, 0x6000314, 0x900cf3f,
208 : // "1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2"
209 : 0x60002db, 0xd000fad, 0x600029a, 0xe000d2c, 0x5000052, 0xc000f59, 0x20000ca,
210 : // "1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 O-O"
211 : 0x60002db, 0xd000fad, 0x600029a, 0xe000d2c, 0x5000052, 0xc000f59, 0x20000ca, 0x900cf3f,
212 : // "1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Qc2 O-O 5.a3 Bxc3+ 6.Qxc3"
213 : 0x60002db, 0xd000fad, 0x600029a, 0xe000d2c, 0x5000052, 0xc000f59, 0x20000ca, 0x900cf3f, 0x6000210, 0x4ca00652, 0x2800292,
214 : // "1.d4 Nf6 2.c4 e6 3.Nc3 d5"
215 : 0x60002db, 0xd000fad, 0x600029a, 0xe000d2c, 0x5000052, 0xe000ce3,
216 : // "1.d4 Nf6 2.c4 e6 3.Nf3"
217 : 0x60002db, 0xd000fad, 0x600029a, 0xe000d2c, 0x5000195,
218 : // "1.d4 Nf6 2.c4 e6 3.Nf3 b6"
219 : 0x60002db, 0xd000fad, 0x600029a, 0xe000d2c, 0x5000195, 0xe000c69,
220 : // "1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.a3"
221 : 0x60002db, 0xd000fad, 0x600029a, 0xe000d2c, 0x5000195, 0xe000c69, 0x6000210,
222 : // "1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3"
223 : 0x60002db, 0xd000fad, 0x600029a, 0xe000d2c, 0x5000195, 0xe000c69, 0x6000396,
224 : // "1.d4 Nf6 2.c4 e6 3.Nf3 b6 4.g3 Ba6"
225 : 0x60002db, 0xd000fad, 0x600029a, 0xe000d2c, 0x5000195, 0xe000c69, 0x6000396, 0xc000ea8,
226 : // "1.d4 Nf6 2.c4 e6 3.Nf3 Bb4+"
227 : 0x60002db, 0xd000fad, 0x600029a, 0xe000d2c, 0x5000195, 0x4c000f59,
228 : // "1.d4 Nf6 2.c4 e6 3.Nf3 d5"
229 : 0x60002db, 0xd000fad, 0x600029a, 0xe000d2c, 0x5000195, 0xe000ce3,
230 : // "1.d4 Nf6 2.c4 e6 3.Nf3 d5 4.Nc3"
231 : 0x60002db, 0xd000fad, 0x600029a, 0xe000d2c, 0x5000195, 0xe000ce3, 0x5000052,
232 : // "1.d4 Nf6 2.c4 g6"
233 : 0x60002db, 0xd000fad, 0x600029a, 0xe000dae,
234 : // "1.d4 Nf6 2.c4 g6 3.Nc3 Bg7"
235 : 0x60002db, 0xd000fad, 0x600029a, 0xe000dae, 0x5000052, 0xc000f76,
236 : // "1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4"
237 : 0x60002db, 0xd000fad, 0x600029a, 0xe000dae, 0x5000052, 0xc000f76, 0x600031c,
238 : // "1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6"
239 : 0x60002db, 0xd000fad, 0x600029a, 0xe000dae, 0x5000052, 0xc000f76, 0x600031c, 0xe000ceb,
240 : // "1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O"
241 : 0x60002db, 0xd000fad, 0x600029a, 0xe000dae, 0x5000052, 0xc000f76, 0x600031c, 0xe000ceb, 0x400014c, 0x900cf3f,
242 : // "1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Be2 O-O 6.Nf3"
243 : 0x60002db, 0xd000fad, 0x600029a, 0xe000dae, 0x5000052, 0xc000f76, 0x600031c, 0xe000ceb, 0x400014c, 0x900cf3f, 0x5000195,
244 : // "1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3"
245 : 0x60002db, 0xd000fad, 0x600029a, 0xe000dae, 0x5000052, 0xc000f76, 0x600031c, 0xe000ceb, 0x6000355,
246 : // "1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O"
247 : 0x60002db, 0xd000fad, 0x600029a, 0xe000dae, 0x5000052, 0xc000f76, 0x600031c, 0xe000ceb, 0x6000355, 0x900cf3f,
248 : // "1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.f3 O-O 6.Be3"
249 : 0x60002db, 0xd000fad, 0x600029a, 0xe000dae, 0x5000052, 0xc000f76, 0x600031c, 0xe000ceb, 0x6000355, 0x900cf3f, 0x4000094,
250 : // "1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O"
251 : 0x60002db, 0xd000fad, 0x600029a, 0xe000dae, 0x5000052, 0xc000f76, 0x600031c, 0xe000ceb, 0x5000195, 0x900cf3f,
252 : // "1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2"
253 : 0x60002db, 0xd000fad, 0x600029a, 0xe000dae, 0x5000052, 0xc000f76, 0x600031c, 0xe000ceb, 0x5000195, 0x900cf3f, 0x400014c,
254 : // "1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5"
255 : 0x60002db, 0xd000fad, 0x600029a, 0xe000dae, 0x5000052, 0xc000f76, 0x600031c, 0xe000ceb, 0x5000195, 0x900cf3f, 0x400014c, 0xe000d24,
256 : // "1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O"
257 : 0x60002db, 0xd000fad, 0x600029a, 0xe000dae, 0x5000052, 0xc000f76, 0x600031c, 0xe000ceb, 0x5000195, 0x900cf3f, 0x400014c, 0xe000d24, 0x100c107,
258 : // "1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nf3 O-O 6.Be2 e5 7.O-O Nc6 8.d5 Ne7"
259 : 0x60002db, 0xd000fad, 0x600029a, 0xe000dae, 0x5000052, 0xc000f76, 0x600031c, 0xe000ceb, 0x5000195, 0x900cf3f, 0x400014c, 0xe000d24, 0x100c107, 0xd000e6a, 0x60006e3, 0xd000ab4,
260 : // "1.d4 Nf6 2.c4 g6 3.Nc3 d5"
261 : 0x60002db, 0xd000fad, 0x600029a, 0xe000dae, 0x5000052, 0xe000ce3,
262 : // "1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.Nf3"
263 : 0x60002db, 0xd000fad, 0x600029a, 0xe000dae, 0x5000052, 0xe000ce3, 0x5000195,
264 : // "1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5"
265 : 0x60002db, 0xd000fad, 0x600029a, 0xe000dae, 0x5000052, 0xe000ce3, 0x6c006a3, 0xdc00b63,
266 : // "1.d4 Nf6 2.c4 g6 3.Nc3 d5 4.cxd5 Nxd5 5.e4 Nxc3 6.bxc3 Bg7"
267 : 0x60002db, 0xd000fad, 0x600029a, 0xe000dae, 0x5000052, 0xe000ce3, 0x6c006a3, 0xdc00b63, 0x600031c, 0xda008d2, 0x6a00252, 0xc000f76,
268 : // "1.d4 Nf6 2.Nf3"
269 : 0x60002db, 0xd000fad, 0x5000195,
270 : // "1.d4 Nf6 2.Nf3 c5"
271 : 0x60002db, 0xd000fad, 0x5000195, 0xe000ca2,
272 : // "1.d4 Nf6 2.Nf3 d5"
273 : 0x60002db, 0xd000fad, 0x5000195, 0xe000ce3,
274 : // "1.d4 Nf6 2.Nf3 e6"
275 : 0x60002db, 0xd000fad, 0x5000195, 0xe000d2c,
276 : // "1.d4 Nf6 2.Nf3 e6 3.Bg5"
277 : 0x60002db, 0xd000fad, 0x5000195, 0xe000d2c, 0x40000a6,
278 : // "1.d4 Nf6 2.Nf3 e6 3.c4"
279 : 0x60002db, 0xd000fad, 0x5000195, 0xe000d2c, 0x600029a,
280 : // "1.d4 Nf6 2.Nf3 g6"
281 : 0x60002db, 0xd000fad, 0x5000195, 0xe000dae,
282 : // "1.d4 Nf6 2.Nf3 g6 3.Bg5"
283 : 0x60002db, 0xd000fad, 0x5000195, 0xe000dae, 0x40000a6,
284 : // "1.d4 Nf6 2.Nf3 g6 3.c4"
285 : 0x60002db, 0xd000fad, 0x5000195, 0xe000dae, 0x600029a,
286 : // "1.d4 Nf6 2.Nf3 g6 3.c4 Bg7"
287 : 0x60002db, 0xd000fad, 0x5000195, 0xe000dae, 0x600029a, 0xc000f76,
288 : // "1.d4 Nf6 2.Nf3 g6 3.c4 Bg7 4.Nc3"
289 : 0x60002db, 0xd000fad, 0x5000195, 0xe000dae, 0x600029a, 0xc000f76, 0x5000052,
290 : // "1.d4 Nf6 2.Nf3 g6 3.c4 Bg7 4.Nc3 O-O"
291 : 0x60002db, 0xd000fad, 0x5000195, 0xe000dae, 0x600029a, 0xc000f76, 0x5000052, 0x900cf3f,
292 : // "1.d4 Nf6 2.Nf3 g6 3.g3"
293 : 0x60002db, 0xd000fad, 0x5000195, 0xe000dae, 0x6000396,
294 : // "1.d4 Nf6 2.Nf3 g6 3.g3 Bg7 4.Bg2"
295 : 0x60002db, 0xd000fad, 0x5000195, 0xe000dae, 0x6000396, 0xc000f76, 0x400014e,
296 : // "1.e4"
297 : 0x600031c,
298 : // "1.e4 c5"
299 : 0x600031c, 0xe000ca2,
300 : // "1.e4 c5 2.c3"
301 : 0x600031c, 0xe000ca2, 0x6000292,
302 : // "1.e4 c5 2.c3 d5 3.exd5 Qxd5 4.d4"
303 : 0x600031c, 0xe000ca2, 0x6000292, 0xe000ce3, 0x6c00723, 0xac00ee3, 0x60002db,
304 : // "1.e4 c5 2.c3 d5 3.exd5 Qxd5 4.d4 Nf6"
305 : 0x600031c, 0xe000ca2, 0x6000292, 0xe000ce3, 0x6c00723, 0xac00ee3, 0x60002db, 0xd000fad,
306 : // "1.e4 c5 2.c3 Nf6 3.e5 Nd5"
307 : 0x600031c, 0xe000ca2, 0x6000292, 0xd000fad, 0x6000724, 0xd000b63,
308 : // "1.e4 c5 2.c3 Nf6 3.e5 Nd5 4.d4 cxd4"
309 : 0x600031c, 0xe000ca2, 0x6000292, 0xd000fad, 0x6000724, 0xd000b63, 0x60002db, 0xec0089b,
310 : // "1.e4 c5 2.d4 cxd4"
311 : 0x600031c, 0xe000ca2, 0x60002db, 0xec0089b,
312 : // "1.e4 c5 2.Nc3"
313 : 0x600031c, 0xe000ca2, 0x5000052,
314 : // "1.e4 c5 2.Nc3 Nc6"
315 : 0x600031c, 0xe000ca2, 0x5000052, 0xd000e6a,
316 : // "1.e4 c5 2.Nc3 Nc6 3.g3"
317 : 0x600031c, 0xe000ca2, 0x5000052, 0xd000e6a, 0x6000396,
318 : // "1.e4 c5 2.Nc3 Nc6 3.g3 g6"
319 : 0x600031c, 0xe000ca2, 0x5000052, 0xd000e6a, 0x6000396, 0xe000dae,
320 : // "1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7"
321 : 0x600031c, 0xe000ca2, 0x5000052, 0xd000e6a, 0x6000396, 0xe000dae, 0x400014e, 0xc000f76,
322 : // "1.e4 c5 2.Nc3 Nc6 3.g3 g6 4.Bg2 Bg7 5.d3"
323 : 0x600031c, 0xe000ca2, 0x5000052, 0xd000e6a, 0x6000396, 0xe000dae, 0x400014e, 0xc000f76, 0x60002d3,
324 : // "1.e4 c5 2.Nf3"
325 : 0x600031c, 0xe000ca2, 0x5000195,
326 : // "1.e4 c5 2.Nf3 d6"
327 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000ceb,
328 : // "1.e4 c5 2.Nf3 d6 3.Bb5+"
329 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000ceb, 0x44000161,
330 : // "1.e4 c5 2.Nf3 d6 3.d4"
331 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000ceb, 0x60002db,
332 : // "1.e4 c5 2.Nf3 d6 3.d4 cxd4"
333 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000ceb, 0x60002db, 0xec0089b,
334 : // "1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4"
335 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000ceb, 0x60002db, 0xec0089b, 0x5c0055b,
336 : // "1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6"
337 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000ceb, 0x60002db, 0xec0089b, 0x5c0055b, 0xd000fad,
338 : // "1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3"
339 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000ceb, 0x60002db, 0xec0089b, 0x5c0055b, 0xd000fad, 0x5000052,
340 : // "1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6"
341 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000ceb, 0x60002db, 0xec0089b, 0x5c0055b, 0xd000fad, 0x5000052, 0xe000c28,
342 : // "1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bc4"
343 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000ceb, 0x60002db, 0xec0089b, 0x5c0055b, 0xd000fad, 0x5000052, 0xe000c28, 0x400015a,
344 : // "1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be2"
345 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000ceb, 0x60002db, 0xec0089b, 0x5c0055b, 0xd000fad, 0x5000052, 0xe000c28, 0x400014c,
346 : // "1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Be3"
347 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000ceb, 0x60002db, 0xec0089b, 0x5c0055b, 0xd000fad, 0x5000052, 0xe000c28, 0x4000094,
348 : // "1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5"
349 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000ceb, 0x60002db, 0xec0089b, 0x5c0055b, 0xd000fad, 0x5000052, 0xe000c28, 0x40000a6,
350 : // "1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6"
351 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000ceb, 0x60002db, 0xec0089b, 0x5c0055b, 0xd000fad, 0x5000052, 0xe000c28, 0x40000a6, 0xe000d2c,
352 : // "1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6"
353 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000ceb, 0x60002db, 0xec0089b, 0x5c0055b, 0xd000fad, 0x5000052, 0xe000dae,
354 : // "1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3"
355 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000ceb, 0x60002db, 0xec0089b, 0x5c0055b, 0xd000fad, 0x5000052, 0xe000dae, 0x4000094, 0xc000f76, 0x6000355,
356 : // "1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 g6 6.Be3 Bg7 7.f3 O-O"
357 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000ceb, 0x60002db, 0xec0089b, 0x5c0055b, 0xd000fad, 0x5000052, 0xe000dae, 0x4000094, 0xc000f76, 0x6000355, 0x900cf3f,
358 : // "1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6"
359 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000ceb, 0x60002db, 0xec0089b, 0x5c0055b, 0xd000fad, 0x5000052, 0xd000e6a,
360 : // "1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5"
361 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000ceb, 0x60002db, 0xec0089b, 0x5c0055b, 0xd000fad, 0x5000052, 0xd000e6a, 0x40000a6,
362 : // "1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bg5 e6 7.Qd2"
363 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000ceb, 0x60002db, 0xec0089b, 0x5c0055b, 0xd000fad, 0x5000052, 0xd000e6a, 0x40000a6, 0xe000d2c, 0x20000cb,
364 : // "1.e4 c5 2.Nf3 e6"
365 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000d2c,
366 : // "1.e4 c5 2.Nf3 e6 3.d3"
367 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000d2c, 0x60002d3,
368 : // "1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4"
369 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000d2c, 0x60002db, 0xec0089b, 0x5c0055b,
370 : // "1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6"
371 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000d2c, 0x60002db, 0xec0089b, 0x5c0055b, 0xe000c28,
372 : // "1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 a6 5.Bd3"
373 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000d2c, 0x60002db, 0xec0089b, 0x5c0055b, 0xe000c28, 0x4000153,
374 : // "1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6"
375 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000d2c, 0x60002db, 0xec0089b, 0x5c0055b, 0xd000e6a,
376 : // "1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3"
377 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000d2c, 0x60002db, 0xec0089b, 0x5c0055b, 0xd000e6a, 0x5000052,
378 : // "1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nc6 5.Nc3 Qc7"
379 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000d2c, 0x60002db, 0xec0089b, 0x5c0055b, 0xd000e6a, 0x5000052, 0xa000ef2,
380 : // "1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nf6"
381 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000d2c, 0x60002db, 0xec0089b, 0x5c0055b, 0xd000fad,
382 : // "1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3"
383 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000d2c, 0x60002db, 0xec0089b, 0x5c0055b, 0xd000fad, 0x5000052,
384 : // "1.e4 c5 2.Nf3 e6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 d6"
385 : 0x600031c, 0xe000ca2, 0x5000195, 0xe000d2c, 0x60002db, 0xec0089b, 0x5c0055b, 0xd000fad, 0x5000052, 0xe000ceb,
386 : // "1.e4 c5 2.Nf3 Nc6"
387 : 0x600031c, 0xe000ca2, 0x5000195, 0xd000e6a,
388 : // "1.e4 c5 2.Nf3 Nc6 3.Bb5"
389 : 0x600031c, 0xe000ca2, 0x5000195, 0xd000e6a, 0x4000161,
390 : // "1.e4 c5 2.Nf3 Nc6 3.Bb5 g6"
391 : 0x600031c, 0xe000ca2, 0x5000195, 0xd000e6a, 0x4000161, 0xe000dae,
392 : // "1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4"
393 : 0x600031c, 0xe000ca2, 0x5000195, 0xd000e6a, 0x60002db, 0xec0089b, 0x5c0055b,
394 : // "1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 e5"
395 : 0x600031c, 0xe000ca2, 0x5000195, 0xd000e6a, 0x60002db, 0xec0089b, 0x5c0055b, 0xe000d24,
396 : // "1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 g6"
397 : 0x600031c, 0xe000ca2, 0x5000195, 0xd000e6a, 0x60002db, 0xec0089b, 0x5c0055b, 0xe000dae,
398 : // "1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3"
399 : 0x600031c, 0xe000ca2, 0x5000195, 0xd000e6a, 0x60002db, 0xec0089b, 0x5c0055b, 0xd000fad, 0x5000052,
400 : // "1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 d6"
401 : 0x600031c, 0xe000ca2, 0x5000195, 0xd000e6a, 0x60002db, 0xec0089b, 0x5c0055b, 0xd000fad, 0x5000052, 0xe000ceb,
402 : // "1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 d6 6.Bg5"
403 : 0x600031c, 0xe000ca2, 0x5000195, 0xd000e6a, 0x60002db, 0xec0089b, 0x5c0055b, 0xd000fad, 0x5000052, 0xe000ceb, 0x40000a6,
404 : // "1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5"
405 : 0x600031c, 0xe000ca2, 0x5000195, 0xd000e6a, 0x60002db, 0xec0089b, 0x5c0055b, 0xd000fad, 0x5000052, 0xe000d24,
406 : // "1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6"
407 : 0x600031c, 0xe000ca2, 0x5000195, 0xd000e6a, 0x60002db, 0xec0089b, 0x5c0055b, 0xd000fad, 0x5000052, 0xe000d24, 0x150006e1, 0xe000ceb,
408 : // "1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6"
409 : 0x600031c, 0xe000ca2, 0x5000195, 0xd000e6a, 0x60002db, 0xec0089b, 0x5c0055b, 0xd000fad, 0x5000052, 0xe000d24, 0x150006e1, 0xe000ceb, 0x40000a6, 0xe000c28,
410 : // "1.e4 c5 2.Nf3 Nc6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 e5 6.Ndb5 d6 7.Bg5 a6 8.Na3 b5"
411 : 0x600031c, 0xe000ca2, 0x5000195, 0xd000e6a, 0x60002db, 0xec0089b, 0x5c0055b, 0xd000fad, 0x5000052, 0xe000d24, 0x150006e1, 0xe000ceb, 0x40000a6, 0xe000c28, 0x5000850, 0xe000c61,
412 : // "1.e4 c6"
413 : 0x600031c, 0xe000caa,
414 : // "1.e4 c6 2.d4 d5"
415 : 0x600031c, 0xe000caa, 0x60002db, 0xe000ce3,
416 : // "1.e4 c6 2.d4 d5 3.e5"
417 : 0x600031c, 0xe000caa, 0x60002db, 0xe000ce3, 0x6000724,
418 : // "1.e4 c6 2.d4 d5 3.e5 Bf5"
419 : 0x600031c, 0xe000caa, 0x60002db, 0xe000ce3, 0x6000724, 0xc000ea5,
420 : // "1.e4 c6 2.d4 d5 3.exd5 cxd5"
421 : 0x600031c, 0xe000caa, 0x60002db, 0xe000ce3, 0x6c00723, 0xec00aa3,
422 : // "1.e4 c6 2.d4 d5 3.exd5 cxd5 4.c4 Nf6 5.Nc3"
423 : 0x600031c, 0xe000caa, 0x60002db, 0xe000ce3, 0x6c00723, 0xec00aa3, 0x600029a, 0xd000fad, 0x5000052,
424 : // "1.e4 c6 2.d4 d5 3.Nc3"
425 : 0x600031c, 0xe000caa, 0x60002db, 0xe000ce3, 0x5000052,
426 : // "1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4"
427 : 0x600031c, 0xe000caa, 0x60002db, 0xe000ce3, 0x5000052, 0xec008dc, 0x5c0049c,
428 : // "1.e4 c6 2.d4 d5 3.Nd2 dxe4 4.Nxe4"
429 : 0x600031c, 0xe000caa, 0x60002db, 0xe000ce3, 0x500004b, 0xec008dc, 0x5c002dc,
430 : // "1.e4 d5 2.exd5 Nf6"
431 : 0x600031c, 0xe000ce3, 0x6c00723, 0xd000fad,
432 : // "1.e4 d5 2.exd5 Qxd5"
433 : 0x600031c, 0xe000ce3, 0x6c00723, 0xac00ee3,
434 : // "1.e4 d5 2.exd5 Qxd5 3.Nc3"
435 : 0x600031c, 0xe000ce3, 0x6c00723, 0xac00ee3, 0x5000052,
436 : // "1.e4 d5 2.exd5 Qxd5 3.Nc3 Qa5"
437 : 0x600031c, 0xe000ce3, 0x6c00723, 0xac00ee3, 0x5000052, 0xa0008e0,
438 : // "1.e4 d6"
439 : 0x600031c, 0xe000ceb,
440 : // "1.e4 d6 2.d4"
441 : 0x600031c, 0xe000ceb, 0x60002db,
442 : // "1.e4 d6 2.d4 Nf6"
443 : 0x600031c, 0xe000ceb, 0x60002db, 0xd000fad,
444 : // "1.e4 d6 2.d4 Nf6 3.Nc3"
445 : 0x600031c, 0xe000ceb, 0x60002db, 0xd000fad, 0x5000052,
446 : // "1.e4 d6 2.d4 Nf6 3.Nc3 g6"
447 : 0x600031c, 0xe000ceb, 0x60002db, 0xd000fad, 0x5000052, 0xe000dae,
448 : // "1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.f4 Bg7 5.Nf3"
449 : 0x600031c, 0xe000ceb, 0x60002db, 0xd000fad, 0x5000052, 0xe000dae, 0x600035d, 0xc000f76, 0x5000195,
450 : // "1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7"
451 : 0x600031c, 0xe000ceb, 0x60002db, 0xd000fad, 0x5000052, 0xe000dae, 0x5000195, 0xc000f76,
452 : // "1.e4 e5"
453 : 0x600031c, 0xe000d24,
454 : // "1.e4 e5 2.f4"
455 : 0x600031c, 0xe000d24, 0x600035d,
456 : // "1.e4 e5 2.Nc3"
457 : 0x600031c, 0xe000d24, 0x5000052,
458 : // "1.e4 e5 2.Nf3"
459 : 0x600031c, 0xe000d24, 0x5000195,
460 : // "1.e4 e5 2.Nf3 Nc6"
461 : 0x600031c, 0xe000d24, 0x5000195, 0xd000e6a,
462 : // "1.e4 e5 2.Nf3 Nc6 3.Bb5"
463 : 0x600031c, 0xe000d24, 0x5000195, 0xd000e6a, 0x4000161,
464 : // "1.e4 e5 2.Nf3 Nc6 3.Bb5 a6"
465 : 0x600031c, 0xe000d24, 0x5000195, 0xd000e6a, 0x4000161, 0xe000c28,
466 : // "1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4"
467 : 0x600031c, 0xe000d24, 0x5000195, 0xd000e6a, 0x4000161, 0xe000c28, 0x4000858,
468 : // "1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6"
469 : 0x600031c, 0xe000d24, 0x5000195, 0xd000e6a, 0x4000161, 0xe000c28, 0x4000858, 0xd000fad,
470 : // "1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O"
471 : 0x600031c, 0xe000d24, 0x5000195, 0xd000e6a, 0x4000161, 0xe000c28, 0x4000858, 0xd000fad, 0x100c107,
472 : // "1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O b5 6.Bb3"
473 : 0x600031c, 0xe000d24, 0x5000195, 0xd000e6a, 0x4000161, 0xe000c28, 0x4000858, 0xd000fad, 0x100c107, 0xe000c61, 0x4000611,
474 : // "1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7"
475 : 0x600031c, 0xe000d24, 0x5000195, 0xd000e6a, 0x4000161, 0xe000c28, 0x4000858, 0xd000fad, 0x100c107, 0xc000f74,
476 : // "1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 d6"
477 : 0x600031c, 0xe000d24, 0x5000195, 0xd000e6a, 0x4000161, 0xe000c28, 0x4000858, 0xd000fad, 0x100c107, 0xc000f74, 0x3000144, 0xe000c61, 0x4000611, 0xe000ceb,
478 : // "1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 d6 8.c3 O-O"
479 : 0x600031c, 0xe000d24, 0x5000195, 0xd000e6a, 0x4000161, 0xe000c28, 0x4000858, 0xd000fad, 0x100c107, 0xc000f74, 0x3000144, 0xe000c61, 0x4000611, 0xe000ceb, 0x6000292, 0x900cf3f,
480 : // "1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 d6 8.c3 O-O 9.h3"
481 : 0x600031c, 0xe000d24, 0x5000195, 0xd000e6a, 0x4000161, 0xe000c28, 0x4000858, 0xd000fad, 0x100c107, 0xc000f74, 0x3000144, 0xe000c61, 0x4000611, 0xe000ceb, 0x6000292, 0x900cf3f, 0x60003d7,
482 : // "1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 d6 8.c3 O-O 9.h3 Na5 10.Bc2 c5 11.d4"
483 : 0x600031c, 0xe000d24, 0x5000195, 0xd000e6a, 0x4000161, 0xe000c28, 0x4000858, 0xd000fad, 0x100c107, 0xc000f74, 0x3000144, 0xe000c61, 0x4000611, 0xe000ceb, 0x6000292, 0x900cf3f, 0x60003d7, 0xd000aa0, 0x400044a, 0xe000ca2, 0x60002db,
484 : // "1.e4 e5 2.Nf3 Nc6 3.Bb5 a6 4.Ba4 Nf6 5.O-O Be7 6.Re1 b5 7.Bb3 O-O"
485 : 0x600031c, 0xe000d24, 0x5000195, 0xd000e6a, 0x4000161, 0xe000c28, 0x4000858, 0xd000fad, 0x100c107, 0xc000f74, 0x3000144, 0xe000c61, 0x4000611, 0x900cf3f,
486 : // "1.e4 e5 2.Nf3 Nc6 3.Bb5 Nf6"
487 : 0x600031c, 0xe000d24, 0x5000195, 0xd000e6a, 0x4000161, 0xd000fad,
488 : // "1.e4 e5 2.Nf3 Nc6 3.Bc4"
489 : 0x600031c, 0xe000d24, 0x5000195, 0xd000e6a, 0x400015a,
490 : // "1.e4 e5 2.Nf3 Nc6 3.Bc4 Nf6"
491 : 0x600031c, 0xe000d24, 0x5000195, 0xd000e6a, 0x400015a, 0xd000fad,
492 : // "1.e4 e5 2.Nf3 Nc6 3.d4 exd4"
493 : 0x600031c, 0xe000d24, 0x5000195, 0xd000e6a, 0x60002db, 0xec0091b,
494 : // "1.e4 e5 2.Nf3 Nc6 3.d4 exd4 4.Nxd4"
495 : 0x600031c, 0xe000d24, 0x5000195, 0xd000e6a, 0x60002db, 0xec0091b, 0x5c0055b,
496 : // "1.e4 e5 2.Nf3 Nc6 3.Nc3"
497 : 0x600031c, 0xe000d24, 0x5000195, 0xd000e6a, 0x5000052,
498 : // "1.e4 e5 2.Nf3 Nc6 3.Nc3 Nf6"
499 : 0x600031c, 0xe000d24, 0x5000195, 0xd000e6a, 0x5000052, 0xd000fad,
500 : // "1.e4 e5 2.Nf3 Nf6"
501 : 0x600031c, 0xe000d24, 0x5000195, 0xd000fad,
502 : // "1.e4 e5 2.Nf3 Nf6 3.Nxe5 d6"
503 : 0x600031c, 0xe000d24, 0x5000195, 0xd000fad, 0x5c00564, 0xe000ceb,
504 : // "1.e4 e6"
505 : 0x600031c, 0xe000d2c,
506 : // "1.e4 e6 2.d3"
507 : 0x600031c, 0xe000d2c, 0x60002d3,
508 : // "1.e4 e6 2.d4"
509 : 0x600031c, 0xe000d2c, 0x60002db,
510 : // "1.e4 e6 2.d4 d5"
511 : 0x600031c, 0xe000d2c, 0x60002db, 0xe000ce3,
512 : // "1.e4 e6 2.d4 d5 3.e5 c5"
513 : 0x600031c, 0xe000d2c, 0x60002db, 0xe000ce3, 0x6000724, 0xe000ca2,
514 : // "1.e4 e6 2.d4 d5 3.e5 c5 4.c3"
515 : 0x600031c, 0xe000d2c, 0x60002db, 0xe000ce3, 0x6000724, 0xe000ca2, 0x6000292,
516 : // "1.e4 e6 2.d4 d5 3.Nc3"
517 : 0x600031c, 0xe000d2c, 0x60002db, 0xe000ce3, 0x5000052,
518 : // "1.e4 e6 2.d4 d5 3.Nc3 Bb4"
519 : 0x600031c, 0xe000d2c, 0x60002db, 0xe000ce3, 0x5000052, 0xc000f59,
520 : // "1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5"
521 : 0x600031c, 0xe000d2c, 0x60002db, 0xe000ce3, 0x5000052, 0xc000f59, 0x6000724,
522 : // "1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5"
523 : 0x600031c, 0xe000d2c, 0x60002db, 0xe000ce3, 0x5000052, 0xc000f59, 0x6000724, 0xe000ca2,
524 : // "1.e4 e6 2.d4 d5 3.Nc3 Bb4 4.e5 c5 5.a3 Bxc3+ 6.bxc3"
525 : 0x600031c, 0xe000d2c, 0x60002db, 0xe000ce3, 0x5000052, 0xc000f59, 0x6000724, 0xe000ca2, 0x6000210, 0x4ca00652, 0x6800252,
526 : // "1.e4 e6 2.d4 d5 3.Nc3 Nf6"
527 : 0x600031c, 0xe000d2c, 0x60002db, 0xe000ce3, 0x5000052, 0xd000fad,
528 : // "1.e4 e6 2.d4 d5 3.Nc3 Nf6 4.Bg5"
529 : 0x600031c, 0xe000d2c, 0x60002db, 0xe000ce3, 0x5000052, 0xd000fad, 0x40000a6,
530 : // "1.e4 e6 2.d4 d5 3.Nd2"
531 : 0x600031c, 0xe000d2c, 0x60002db, 0xe000ce3, 0x500004b,
532 : // "1.e4 e6 2.d4 d5 3.Nd2 c5"
533 : 0x600031c, 0xe000d2c, 0x60002db, 0xe000ce3, 0x500004b, 0xe000ca2,
534 : // "1.e4 e6 2.d4 d5 3.Nd2 Nf6"
535 : 0x600031c, 0xe000d2c, 0x60002db, 0xe000ce3, 0x500004b, 0xd000fad,
536 : // "1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7"
537 : 0x600031c, 0xe000d2c, 0x60002db, 0xe000ce3, 0x500004b, 0xd000fad, 0x6000724, 0x1d000b73,
538 : // "1.e4 e6 2.d4 d5 3.Nd2 Nf6 4.e5 Nfd7 5.Bd3 c5 6.c3 Nc6 7.Ne2"
539 : 0x600031c, 0xe000d2c, 0x60002db, 0xe000ce3, 0x500004b, 0xd000fad, 0x6000724, 0x1d000b73, 0x4000153, 0xe000ca2, 0x6000292, 0xd000e6a, 0x500018c,
540 : // "1.e4 g6"
541 : 0x600031c, 0xe000dae,
542 : // "1.e4 g6 2.d4"
543 : 0x600031c, 0xe000dae, 0x60002db,
544 : // "1.e4 g6 2.d4 Bg7"
545 : 0x600031c, 0xe000dae, 0x60002db, 0xc000f76,
546 : // "1.e4 g6 2.d4 Bg7 3.Nc3"
547 : 0x600031c, 0xe000dae, 0x60002db, 0xc000f76, 0x5000052,
548 : // "1.e4 g6 2.d4 Bg7 3.Nc3 d6"
549 : 0x600031c, 0xe000dae, 0x60002db, 0xc000f76, 0x5000052, 0xe000ceb,
550 : // "1.e4 Nf6"
551 : 0x600031c, 0xd000fad,
552 : // "1.e4 Nf6 2.e5 Nd5"
553 : 0x600031c, 0xd000fad, 0x6000724, 0xd000b63,
554 : // "1.e4 Nf6 2.e5 Nd5 3.d4 d6"
555 : 0x600031c, 0xd000fad, 0x6000724, 0xd000b63, 0x60002db, 0xe000ceb,
556 : // "1.e4 Nf6 2.e5 Nd5 3.d4 d6 4.Nf3"
557 : 0x600031c, 0xd000fad, 0x6000724, 0xd000b63, 0x60002db, 0xe000ceb, 0x5000195,
558 : // "1.f4"
559 : 0x600035d,
560 : // "1.g3"
561 : 0x6000396,
562 : // "1.Nf3"
563 : 0x5000195,
564 : // "1.Nf3 c5"
565 : 0x5000195, 0xe000ca2,
566 : // "1.Nf3 c5 2.c4"
567 : 0x5000195, 0xe000ca2, 0x600029a,
568 : // "1.Nf3 d5"
569 : 0x5000195, 0xe000ce3,
570 : // "1.Nf3 d5 2.c4"
571 : 0x5000195, 0xe000ce3, 0x600029a,
572 : // "1.Nf3 d5 2.d4"
573 : 0x5000195, 0xe000ce3, 0x60002db,
574 : // "1.Nf3 d5 2.g3"
575 : 0x5000195, 0xe000ce3, 0x6000396,
576 : // "1.Nf3 g6"
577 : 0x5000195, 0xe000dae,
578 : // "1.Nf3 Nf6"
579 : 0x5000195, 0xd000fad,
580 : // "1.Nf3 Nf6 2.c4"
581 : 0x5000195, 0xd000fad, 0x600029a,
582 : // "1.Nf3 Nf6 2.c4 c5"
583 : 0x5000195, 0xd000fad, 0x600029a, 0xe000ca2,
584 : // "1.Nf3 Nf6 2.c4 e6"
585 : 0x5000195, 0xd000fad, 0x600029a, 0xe000d2c,
586 : // "1.Nf3 Nf6 2.c4 g6"
587 : 0x5000195, 0xd000fad, 0x600029a, 0xe000dae,
588 : // "1.Nf3 Nf6 2.c4 g6 3.Nc3"
589 : 0x5000195, 0xd000fad, 0x600029a, 0xe000dae, 0x5000052,
590 : // "1.Nf3 Nf6 2.g3"
591 : 0x5000195, 0xd000fad, 0x6000396,
592 : // "1.Nf3 Nf6 2.g3 g6"
593 : 0x5000195, 0xd000fad, 0x6000396, 0xe000dae
594 : };
595 : } // End of anonymous namespace
596 :
597 : const FullMove* StoredLine::Moves_ [STORED_LINES +1] = {
598 : // index zero is unused
599 : // last index ( Moves_[STORED_LINES] ) is used to detect the end of the array
600 : fm + 0, fm + 0, fm + 1, fm + 2, fm + 4, fm + 7, fm + 9, fm + 12,
601 : fm + 16, fm + 18, fm + 21, fm + 23, fm + 25, fm + 28, fm + 32, fm + 36,
602 : fm + 37, fm + 39, fm + 42, fm + 46, fm + 51, fm + 57, fm + 64, fm + 69,
603 : fm + 75, fm + 82, fm + 90, fm + 94, fm + 99, fm + 105, fm + 109, fm + 114,
604 : fm + 120, fm + 126, fm + 131, fm + 134, fm + 138, fm + 143, fm + 149, fm + 155,
605 : fm + 157, fm + 160, fm + 162, fm + 165, fm + 169, fm + 171, fm + 176, fm + 178,
606 : fm + 182, fm + 184, fm + 187, fm + 191, fm + 194, fm + 198, fm + 203, fm + 209,
607 : fm + 217, fm + 222, fm + 228, fm + 233, fm + 239, fm + 246, fm + 254, fm + 261,
608 : fm + 269, fm + 280, fm + 286, fm + 291, fm + 297, fm + 304, fm + 311, fm + 319,
609 : fm + 325, fm + 331, fm + 338, fm + 342, fm + 348, fm + 355, fm + 363, fm + 373,
610 : fm + 384, fm + 393, fm + 403, fm + 414, fm + 424, fm + 435, fm + 447, fm + 460,
611 : fm + 476, fm + 482, fm + 489, fm + 497, fm + 509, fm + 512, fm + 516, fm + 520,
612 : fm + 524, fm + 529, fm + 534, fm + 538, fm + 543, fm + 548, fm + 554, fm + 561,
613 : fm + 569, fm + 574, fm + 581, fm + 582, fm + 584, fm + 587, fm + 594, fm + 602,
614 : fm + 608, fm + 616, fm + 620, fm + 623, fm + 627, fm + 632, fm + 638, fm + 646,
615 : fm + 655, fm + 658, fm + 662, fm + 667, fm + 672, fm + 678, fm + 685, fm + 693,
616 : fm + 702, fm + 712, fm + 723, fm + 734, fm + 745, fm + 756, fm + 768, fm + 778,
617 : fm + 791, fm + 805, fm + 815, fm + 826, fm + 839, fm + 843, fm + 848, fm + 855,
618 : fm + 863, fm + 872, fm + 880, fm + 889, fm + 899, fm + 907, fm + 916, fm + 926,
619 : fm + 930, fm + 935, fm + 941, fm + 948, fm + 956, fm + 964, fm + 973, fm + 983,
620 : fm + 994, fm +1004, fm +1016, fm +1030, fm +1046, fm +1048, fm +1052, fm +1057,
621 : fm +1063, fm +1069, fm +1078, fm +1083, fm +1090, fm +1097, fm +1101, fm +1105,
622 : fm +1110, fm +1116, fm +1118, fm +1121, fm +1125, fm +1130, fm +1136, fm +1145,
623 : fm +1153, fm +1155, fm +1158, fm +1161, fm +1164, fm +1168, fm +1173, fm +1179,
624 : fm +1186, fm +1194, fm +1203, fm +1214, fm +1224, fm +1238, fm +1254, fm +1271,
625 : fm +1292, fm +1306, fm +1312, fm +1317, fm +1323, fm +1329, fm +1336, fm +1341,
626 : fm +1347, fm +1351, fm +1357, fm +1359, fm +1362, fm +1365, fm +1369, fm +1375,
627 : fm +1382, fm +1387, fm +1393, fm +1400, fm +1408, fm +1419, fm +1425, fm +1432,
628 : fm +1437, fm +1443, fm +1449, fm +1457, fm +1470, fm +1472, fm +1475, fm +1479,
629 : fm +1484, fm +1490, fm +1492, fm +1496, fm +1502, fm +1509, fm +1510, fm +1511,
630 : fm +1512, fm +1514, fm +1517, fm +1519, fm +1522, fm +1525, fm +1528, fm +1530,
631 : fm +1532, fm +1535, fm +1539, fm +1543, fm +1547, fm +1552, fm +1555, fm +1559
632 : };
633 :
634 0 : StoredLine::StoredLine(const pieceT* board, colorT toMove)
635 : {
636 0 : Board search(board);
637 0 : matches_[0] = -1;
638 0 : matches_[STORED_LINES] = -1;
639 0 : for (uint line = 1; line < STORED_LINES; line++) {
640 0 : Board b(START_BOARD);
641 0 : const FullMove* end = Moves_[line +1];
642 0 : for (int ply=0; ply < 99; ply++) {
643 0 : if (((ply %2) == toMove) && b == search) {
644 0 : matches_[line] = ply;
645 0 : break;
646 : }
647 0 : const FullMove* m = Moves_[line] + ply;
648 0 : if (m == end) {
649 0 : matches_[line] = b.neverMatch(search) ? -2 : -1;
650 0 : break;
651 : }
652 0 : b.doMove(*m);
653 : }
654 : }
655 0 : }
656 :
|