Rev 83 | Rev 124 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 83 | Rev 119 | ||
|---|---|---|---|
| Line 18... | Line 18... | ||
| 18 | // WARNING: it does also build the smilies list ! |
18 | // WARNING: it does also build the smilies list ! |
| 19 | 19 | ||
| 20 | void *inifile; |
20 | void *inifile; |
| 21 | smiley_t *smiley; |
21 | smiley_t *smiley; |
| 22 | char *file_buffer; |
22 | char *file_buffer; |
| 23 | wchar_t |
23 | wchar_t temp_string[MAX_PATH]; |
| 24 | wchar_t smiley_pathname[MAX_PATH]; |
24 | wchar_t smiley_pathname[MAX_PATH]; |
| 25 | wchar_t *smiley_name; |
25 | wchar_t *smiley_name; |
| 26 | int language_index; |
26 | int language_index; |
| - | 27 | int program_index; |
|
| 27 | int smiley_index; |
28 | int smiley_index; |
| 28 | int file_length; |
29 | int file_length; |
| 29 | FILE *fp; |
30 | FILE *fp; |
| 30 | 31 | ||
| 31 | // open the INI file |
32 | // open the INI file |
| Line 48... | Line 49... | ||
| 48 | options.want_sepiafilter = (INIFile_ReadEntryAsBool (inifile, L"options", L"use sepia filter for past moves", true) > 0); |
49 | options.want_sepiafilter = (INIFile_ReadEntryAsBool (inifile, L"options", L"use sepia filter for past moves", true) > 0); |
| 49 | options.want_autorotateon1vs1 = (INIFile_ReadEntryAsBool (inifile, L"options", L"auto-rotate board",true) > 0); |
50 | options.want_autorotateon1vs1 = (INIFile_ReadEntryAsBool (inifile, L"options", L"auto-rotate board",true) > 0); |
| 50 | options.rotate_speed = INIFile_ReadEntryAsLong (inifile, L"options", L"rotation speed", 5); |
51 | options.rotate_speed = INIFile_ReadEntryAsLong (inifile, L"options", L"rotation speed", 5); |
| 51 | 52 | ||
| 52 | // [display] |
53 | // [display] |
| 53 | READ_WIDESTRING ( |
54 | READ_WIDESTRING (temp_string, inifile, L"display", L"language", L"auto"); // first, try to read the language from the config file |
| 54 | for (language_index = 0; language_index < language_count; language_index++) |
55 | for (language_index = 0; language_index < language_count; language_index++) |
| 55 | if (_wcsicmp (languages[language_index].name, |
56 | if (_wcsicmp (languages[language_index].name, temp_string) == 0) |
| 56 | { |
57 | { |
| 57 | language_id = language_index; // identify the claimed language's ID among the list of known languages |
58 | language_id = language_index; // identify the claimed language's ID among the list of known languages |
| 58 | break; // stop searching as soon as we find it |
59 | break; // stop searching as soon as we find it |
| 59 | } |
60 | } |
| 60 | if (language_index == language_count) |
61 | if (language_index == language_count) |
| 61 | { |
62 | { |
| 62 | GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SENGLANGUAGE, |
63 | GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SENGLANGUAGE, temp_string, WCHAR_SIZEOF (temp_string)); // if unspecified, query the OS locale |
| 63 | for (language_index = 0; language_index < language_count; language_index++) |
64 | for (language_index = 0; language_index < language_count; language_index++) |
| 64 | if (_wcsicmp (languages[language_index].name, |
65 | if (_wcsicmp (languages[language_index].name, temp_string) == 0) |
| 65 | { |
66 | { |
| 66 | language_id = language_index; // identify the claimed language's ID among the list of known languages |
67 | language_id = language_index; // identify the claimed language's ID among the list of known languages |
| 67 | break; // stop searching as soon as we find it |
68 | break; // stop searching as soon as we find it |
| 68 | } |
69 | } |
| 69 | } |
70 | } |
| Line 95... | Line 96... | ||
| 95 | want_flaticons = (INIFile_ReadEntryAsBool (inifile, L"theme", L"flat icons instead", false) > 0); |
96 | want_flaticons = (INIFile_ReadEntryAsBool (inifile, L"theme", L"flat icons instead", false) > 0); |
| 96 | want_custombackground = (INIFile_ReadEntryAsBool (inifile, L"theme", L"use custom background", false) > 0); |
97 | want_custombackground = (INIFile_ReadEntryAsBool (inifile, L"theme", L"use custom background", false) > 0); |
| 97 | READ_WIDESTRING (custombackground_pathname, inifile, L"theme", L"custom background picture", L""); |
98 | READ_WIDESTRING (custombackground_pathname, inifile, L"theme", L"custom background picture", L""); |
| 98 | 99 | ||
| 99 | // [engine] |
100 | // [engine] |
| - | 101 | Config_LoadEngines (); // discover all engine parameters from the engines folder |
|
| - | 102 | for (program_index = 0; program_index < options.engine.program_count; program_index++) |
|
| - | 103 | { |
|
| 100 |
|
104 | READ_WIDESTRING (temp_string, inifile, L"engine", L"program", L"Stockfish"); |
| - | 105 | if (_wcsicmp (temp_string, options.engine.programs[program_index].folder) == 0) |
|
| - | 106 | break; // identify the preferred engine, break as soon as we find it |
|
| - | 107 | } |
|
| - | 108 | options.engine.selected_program = (program_index < options.engine.program_count ? program_index : 0); // consistency check |
|
| 101 | options.engine.depth = INIFile_ReadEntryAsLong (inifile, L"engine", L"allowed depth", 4); |
109 | options.engine.depth = INIFile_ReadEntryAsLong (inifile, L"engine", L"allowed depth", 4); |
| 102 | options.engine.max_depth = INIFile_ReadEntryAsLong (inifile, L"engine", L"maximum depth", 100); |
110 | options.engine.max_depth = INIFile_ReadEntryAsLong (inifile, L"engine", L"maximum depth", 100); |
| 103 | options.engine.blunder_chances = INIFile_ReadEntryAsLong (inifile, L"engine", L"blunder chances", 0); |
111 | options.engine.blunder_chances = INIFile_ReadEntryAsLong (inifile, L"engine", L"blunder chances", 0); |
| 104 | options.engine.obstinacy_level = INIFile_ReadEntryAsLong (inifile, L"engine", L"obstinacy", 0); |
112 | options.engine.obstinacy_level = INIFile_ReadEntryAsLong (inifile, L"engine", L"obstinacy", 0); |
| 105 | options.engine.is_expert_mode = (INIFile_ReadEntryAsBool (inifile, L"engine", L"expert mode", false) > 0); |
113 | options.engine.is_expert_mode = (INIFile_ReadEntryAsBool (inifile, L"engine", L"expert mode", false) > 0); |
| Line 184... | Line 192... | ||
| 184 | INIFile_FreeINIFile (inifile); |
192 | INIFile_FreeINIFile (inifile); |
| 185 | return; // finished loading config |
193 | return; // finished loading config |
| 186 | } |
194 | } |
| 187 | 195 | ||
| 188 | 196 | ||
| 189 | void |
197 | void Config_LoadEngines () |
| 190 | { |
198 | { |
| 191 | // this function loads the engine-specific parameters. The best place to call it is at the beginning |
199 | // this function loads the engine-specific parameters. The best place to call it is at the beginning |
| 192 | // of a game versus the computer, just before the engine executable process is started. |
200 | // of a game versus the computer, just before the engine executable process is started. |
| 193 | 201 | ||
| - | 202 | wchar_t temp_string[MAX_PATH]; |
|
| - | 203 | engineprogram_t *engineprogram; |
|
| 194 | void *engine_inifile; |
204 | void *engine_inifile; |
| - | 205 | WIN32_FIND_DATA wfd; |
|
| - | 206 | HANDLE hFind; |
|
| 195 | wchar_t *ptr; |
207 | wchar_t *ptr; |
| 196 | 208 | ||
| 197 |
|
209 | options.engine.programs = NULL; |
| 198 |
|
210 | options.engine.program_count = 0; |
| 199 | 211 | ||
| 200 | // |
212 | swprintf_s (temp_string, sizeof (temp_string), L"%s\\engines\\*.*", app_path); // build the search pattern string out of the path |
| 201 |
|
213 | hFind = FindFirstFile (temp_string, &wfd); // initiate search from that point |
| 202 |
|
214 | if (hFind != INVALID_HANDLE_VALUE) |
| - | 215 | { |
|
| 203 |
|
216 | // start examining search results... |
| - | 217 | do |
|
| - | 218 | { |
|
| - | 219 | if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || (wfd.cFileName[0] == L'.')) |
|
| 204 |
|
220 | continue; // skip everything that is NOT a directory, and every directories that begin with a dot |
| 205 | 221 | ||
| 206 | // |
222 | // reallocate space for one more engine program, and clean up the allocated slot |
| 207 |
|
223 | options.engine.programs = (engineprogram_t *) SAFE_realloc (options.engine.programs, options.engine.program_count, options.engine.program_count + 1, sizeof (engineprogram_t), true); |
| 208 |
|
224 | engineprogram = &options.engine.programs[options.engine.program_count]; // quick access to engine |
| 209 | 225 | ||
| - | 226 | // given the selected engine program, load and interpret the right engine config file |
|
| - | 227 | wcscpy_s (engineprogram->folder, sizeof (engineprogram->folder), wfd.cFileName); // save engine program's folder name |
|
| - | 228 | swprintf_s (filename, WCHAR_SIZEOF (filename), L"%s/engines/%s/engine.ini", app_path, engineprogram->folder); |
|
| - | 229 | engine_inifile = INIFile_LoadINIFile (filename); // see if an ini file exists for this engine |
|
| 210 |
|
230 | if (engine_inifile == NULL) |
| 211 |
|
231 | continue; // engine .ini file not found, skip this one |
| 212 | 232 | ||
| - | 233 | // basic program information |
|
| - | 234 | READ_WIDESTRING (engineprogram->name, engine_inifile, L"program", L"name", L"Crafty v24.0"); |
|
| - | 235 | READ_WIDESTRING (engineprogram->cmdline, engine_inifile, L"program", L"executable", L"crafty.exe"); |
|
| - | 236 | ||
| - | 237 | // reply string patterns |
|
| - | 238 | READ_WIDESTRING (engineprogram->replystring_move, engine_inifile, L"reply strings", L"move", L"): "); |
|
| - | 239 | ||
| 213 | // engine commands |
240 | // engine commands |
| 214 | READ_WIDESTRING ( |
241 | READ_WIDESTRING (engineprogram->command_new, engine_inifile, L"commands", L"new game", L"new"); |
| 215 | for (ptr = |
242 | for (ptr = engineprogram->command_new; *ptr != 0; ptr++) if (*ptr == L';') *ptr = L'\n'; |
| 216 | READ_WIDESTRING ( |
243 | READ_WIDESTRING (engineprogram->command_setboard, engine_inifile, L"commands", L"setup table from FEN", L"setboard %s"); |
| 217 | for (ptr = |
244 | for (ptr = engineprogram->command_setboard; *ptr != 0; ptr++) if (*ptr == L';') *ptr = L'\n'; |
| 218 | READ_WIDESTRING ( |
245 | READ_WIDESTRING (engineprogram->command_sd, engine_inifile, L"commands", L"search depth set", L"sd %d"); |
| 219 | for (ptr = |
246 | for (ptr = engineprogram->command_sd; *ptr != 0; ptr++) if (*ptr == L';') *ptr = L'\n'; |
| 220 | READ_WIDESTRING ( |
247 | READ_WIDESTRING (engineprogram->command_go, engine_inifile, L"commands", L"play", L"go"); |
| 221 | for (ptr = |
248 | for (ptr = engineprogram->command_go; *ptr != 0; ptr++) if (*ptr == L';') *ptr = L'\n'; |
| 222 | READ_WIDESTRING ( |
249 | READ_WIDESTRING (engineprogram->command_move, engine_inifile, L"commands", L"move", L"%s"); |
| 223 | for (ptr = |
250 | for (ptr = engineprogram->command_move; *ptr != 0; ptr++) if (*ptr == L';') *ptr = L'\n'; |
| 224 | READ_WIDESTRING ( |
251 | READ_WIDESTRING (engineprogram->command_force, engine_inifile, L"commands", L"force move", L"force %s"); |
| 225 | for (ptr = |
252 | for (ptr = engineprogram->command_force; *ptr != 0; ptr++) if (*ptr == L';') *ptr = L'\n'; |
| 226 | READ_WIDESTRING ( |
253 | READ_WIDESTRING (engineprogram->command_quit, engine_inifile, L"commands", L"quit", L"quit"); |
| 227 | for (ptr = |
254 | for (ptr = engineprogram->command_quit; *ptr != 0; ptr++) if (*ptr == L';') *ptr = L'\n'; |
| - | 255 | ||
| - | 256 | INIFile_FreeINIFile (engine_inifile); // close the engine config file |
|
| - | 257 | ||
| - | 258 | options.engine.program_count++; // we've identified one engine more |
|
| - | 259 | } while (FindNextFile (hFind, &wfd)); // ...and don't stop as long as there are directory entries to go |
|
| - | 260 | FindClose (hFind); // close the search handle |
|
| - | 261 | } |
|
| 228 | 262 | ||
| 229 | INIFile_FreeINIFile (engine_inifile); // close the engine config file |
- | |
| 230 | return; // engine parameters loaded successfully |
263 | return; // engine parameters loaded successfully |
| 231 | } |
264 | } |
| 232 | 265 | ||
| 233 | 266 | ||
| 234 | void Config_Save (void) |
267 | void Config_Save (void) |
| Line 279... | Line 312... | ||
| 279 | INIFile_WriteEntryAsBool (inifile, L"theme", L"flat icons instead", want_flaticons); |
312 | INIFile_WriteEntryAsBool (inifile, L"theme", L"flat icons instead", want_flaticons); |
| 280 | INIFile_WriteEntryAsBool (inifile, L"theme", L"use custom background", want_custombackground); |
313 | INIFile_WriteEntryAsBool (inifile, L"theme", L"use custom background", want_custombackground); |
| 281 | WRITE_WIDESTRING (L"theme", L"custom background picture", custombackground_pathname); |
314 | WRITE_WIDESTRING (L"theme", L"custom background picture", custombackground_pathname); |
| 282 | 315 | ||
| 283 | // [engine] |
316 | // [engine] |
| 284 | WRITE_WIDESTRING (L"engine", L"program", options.engine. |
317 | WRITE_WIDESTRING (L"engine", L"program", options.engine.programs[options.engine.selected_program].folder); |
| 285 | INIFile_WriteEntryAsLong (inifile, L"engine", L"allowed depth", options.engine.depth); |
318 | INIFile_WriteEntryAsLong (inifile, L"engine", L"allowed depth", options.engine.depth); |
| 286 | INIFile_WriteEntryAsLong (inifile, L"engine", L"maximum depth", options.engine.max_depth); |
319 | INIFile_WriteEntryAsLong (inifile, L"engine", L"maximum depth", options.engine.max_depth); |
| 287 | INIFile_WriteEntryAsLong (inifile, L"engine", L"blunder chances", options.engine.blunder_chances); |
320 | INIFile_WriteEntryAsLong (inifile, L"engine", L"blunder chances", options.engine.blunder_chances); |
| 288 | INIFile_WriteEntryAsLong (inifile, L"engine", L"obstinacy", options.engine.obstinacy_level); |
321 | INIFile_WriteEntryAsLong (inifile, L"engine", L"obstinacy", options.engine.obstinacy_level); |
| 289 | INIFile_WriteEntryAsBool (inifile, L"engine", L"expert mode", options.engine.is_expert_mode); |
322 | INIFile_WriteEntryAsBool (inifile, L"engine", L"expert mode", options.engine.is_expert_mode); |