Rev 33 | Rev 40 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 33 | Rev 39 | ||
|---|---|---|---|
| Line 92... | Line 92... | ||
| 92 | // could the init file be opened ? |
92 | // could the init file be opened ? |
| 93 | if (fp != NULL) |
93 | if (fp != NULL) |
| 94 | { |
94 | { |
| 95 | Debug_Log (L"===Found initialization file, parsing...===\n"); |
95 | Debug_Log (L"===Found initialization file, parsing...===\n"); |
| 96 | 96 | ||
| 97 | // SMP HACK -- is our engine Crafty ? if so, set the max CPUs to use to core max - 1 |
97 | // SMP HACK -- is our engine Crafty or GNU Chess ? if so, set the max CPUs to use to core max - 1 |
| 98 | // (the computer will look like hung if all CPU is taken) |
98 | // (the computer will look like hung if all CPU is taken) |
| 99 | if (wcsistr (options.engine.name, L"Crafty") != NULL) |
99 | if ((wcsistr (options.engine.name, L"Crafty") != NULL) || (wcsistr (options.engine.name, L"GNU Chess") != NULL)) |
| 100 | { |
100 | { |
| 101 | GetSystemInfo (&sysinfo); // get the number of cores and build the corresponding engine initialization order |
101 | GetSystemInfo (&sysinfo); // get the number of cores and build the corresponding engine initialization order |
| 102 |
|
102 | Player_SendBuffer_Add (player, 1000, L"mt %d\n", max (1, sysinfo.dwNumberOfProcessors - 1)); |
| 103 | Player_SendBuffer_Add (player, 1000, widechar_buffer); |
- | |
| 104 | } |
103 | } |
| 105 | 104 | ||
| 106 | // read line per line |
105 | // read line per line |
| 107 | while (fgetws (widechar_buffer, WCHAR_SIZEOF (widechar_buffer), fp) != NULL) |
106 | while (fgetws (widechar_buffer, WCHAR_SIZEOF (widechar_buffer), fp) != NULL) |
| 108 | { |
107 | { |
| Line 130... | Line 129... | ||
| 130 | unsigned long exit_code; |
129 | unsigned long exit_code; |
| 131 | unsigned long handle_flags; |
130 | unsigned long handle_flags; |
| 132 | int attempt_index; |
131 | int attempt_index; |
| 133 | 132 | ||
| 134 | // send the engine a quit command |
133 | // send the engine a quit command |
| 135 | Player_SendBuffer_Add (player, 1000 |
134 | Player_SendBuffer_Add (player, 1000, options.engine.command_quit); |
| - | 135 | Player_SendBuffer_Add (player, 1000, L"\n"); // since the format string was read from the options, don't forget to end it with a carriage return |
|
| 136 | PlayerEngine_Send (player); |
136 | PlayerEngine_Send (player); |
| 137 | 137 | ||
| 138 | // close the pipe handles |
138 | // close the pipe handles |
| 139 | if (hChessEngineStdinRd) |
139 | if (hChessEngineStdinRd) |
| 140 | CloseHandle (hChessEngineStdinRd); |
140 | CloseHandle (hChessEngineStdinRd); |
| Line 309... | Line 309... | ||
| 309 | 309 | ||
| 310 | // is it NOT a hint, are blunders allowed, should we do one now AND can we do one now ? |
310 | // is it NOT a hint, are blunders allowed, should we do one now AND can we do one now ? |
| 311 | if (!is_hint && (options.engine.blunder_chances > 0) && (rand () % 100 < options.engine.blunder_chances) |
311 | if (!is_hint && (options.engine.blunder_chances > 0) && (rand () % 100 < options.engine.blunder_chances) |
| 312 | && Move_FindRandomMove (&the_board.moves[the_board.move_count - 1], player->color, &move)) |
312 | && Move_FindRandomMove (&the_board.moves[the_board.move_count - 1], player->color, &move)) |
| 313 | { |
313 | { |
| 314 | Player_SendBuffer_Add (player, 1000 |
314 | Player_SendBuffer_Add (player, 1000, options.engine.command_force, Move_BuildString (&move)); // send the blunderous move to the engine |
| - | 315 | Player_SendBuffer_Add (player, 1000, L"\n"); // since the format string was read from the options, don't forget to end it with a carriage return |
|
| - | 316 | if (wcscmp (options.engine.program, L"Crafty") == 0) |
|
| 315 | Player_SendBuffer_Add (player, 1000, L"disp\n"); |
317 | Player_SendBuffer_Add (player, 1000, L"disp\n"); |
| 316 | Debug_Log (L"===Discarding engine move, forcing a blunderous move (%s) instead===\n", Move_BuildString (&move)); // blunder |
318 | Debug_Log (L"===Discarding engine move, forcing a blunderous move (%s) instead===\n", Move_BuildString (&move)); // blunder |
| 317 | } |
319 | } |
| 318 | 320 | ||
| 319 | // mark the engine's selected and hovered squares |
321 | // mark the engine's selected and hovered squares |
| 320 | Board_SetSelectedAndHovered (&the_board, move.source[0], move.source[1], move.target[0], move.target[1]); |
322 | Board_SetSelectedAndHovered (&the_board, move.source[0], move.source[1], move.target[0], move.target[1]); |
| Line 361... | Line 363... | ||
| 361 | if (the_board.was_setup) |
363 | if (the_board.was_setup) |
| 362 | { |
364 | { |
| 363 | Debug_Log (L"===Got board setup notification from interface===\n"); |
365 | Debug_Log (L"===Got board setup notification from interface===\n"); |
| 364 | 366 | ||
| 365 | // send a new game command to the chess engine |
367 | // send a new game command to the chess engine |
| 366 | Player_SendBuffer_Add (player, 1000 |
368 | Player_SendBuffer_Add (player, 1000, options.engine.command_new); |
| - | 369 | Player_SendBuffer_Add (player, 1000, L"\n"); // since the format string was read from the options, don't forget to end it with a carriage return |
|
| 367 | 370 | ||
| 368 | // just set up the board from its Forsyth-Edwards notation |
371 | // just set up the board from its Forsyth-Edwards notation |
| 369 | Debug_Log (L"===setting up board using FEN string===\n"); |
372 | Debug_Log (L"===setting up board using FEN string===\n"); |
| 370 | 373 | ||
| 371 | // instruct it about its allowed search depth BEFORE each table set (this ensures engine will be "ready" to handle the command) |
374 | // instruct it about its allowed search depth BEFORE each table set (this ensures engine will be "ready" to handle the command) |
| 372 | // then get the current game state in FEN format and feed it to the engine |
375 | // then get the current game state in FEN format and feed it to the engine |
| 373 | Player_SendBuffer_Add (player, 1000 |
376 | Player_SendBuffer_Add (player, 1000, options.engine.command_sd, options.engine.depth); |
| - | 377 | Player_SendBuffer_Add (player, 1000, L"\n"); // since the format string was read from the options, don't forget to end it with a carriage return |
|
| 374 | Player_SendBuffer_Add (player, 1000 |
378 | Player_SendBuffer_Add (player, 1000, options.engine.command_setboard, the_board.moves[the_board.move_count - 1].fen_string); |
| - | 379 | Player_SendBuffer_Add (player, 1000, L"\n"); // since the format string was read from the options, don't forget to end it with a carriage return |
|
| 375 | 380 | ||
| 376 | // and reset current obstinacy |
381 | // and reset current obstinacy |
| 377 | current_obstinacy = 0; |
382 | current_obstinacy = 0; |
| 378 | 383 | ||
| - | 384 | if (wcscmp (options.engine.program, L"Crafty") == 0) |
|
| 379 | Player_SendBuffer_Add (player, 1000, L"disp\n"); |
385 | Player_SendBuffer_Add (player, 1000, L"disp\n"); |
| 380 | } |
386 | } |
| 381 | 387 | ||
| 382 | // have we been notified that players are swapping colors ? (N.B. when this happens in human vs. computer mode, it's always that the human player is *GIVING* his turn) |
388 | // have we been notified that players are swapping colors ? (N.B. when this happens in human vs. computer mode, it's always that the human player is *GIVING* his turn) |
| 383 | if (the_board.want_playerswap) |
389 | if (the_board.want_playerswap) |
| 384 | { |
390 | { |
| 385 | Debug_Log (L"===Got player SWAP notification from interface===\n"); |
391 | Debug_Log (L"===Got player SWAP notification from interface===\n"); |
| 386 | Player_SendBuffer_Add (player, 1000 |
392 | Player_SendBuffer_Add (player, 1000, options.engine.command_go); // tell engine it's now the current player |
| - | 393 | Player_SendBuffer_Add (player, 1000, L"\n"); // since the format string was read from the options, don't forget to end it with a carriage return |
|
| 387 | } |
394 | } |
| 388 | 395 | ||
| 389 | // have we been notified that the current player just changed ? |
396 | // have we been notified that the current player just changed ? |
| 390 | if (the_board.has_playerchanged) |
397 | if (the_board.has_playerchanged) |
| 391 | { |
398 | { |
| Line 395... | Line 402... | ||
| 395 | if (Board_ColorToMove (&the_board) == player->color) |
402 | if (Board_ColorToMove (&the_board) == player->color) |
| 396 | { |
403 | { |
| 397 | // is it NOT a board setup AND has at least one move been played (meaning it was just the other's turn before) ? |
404 | // is it NOT a board setup AND has at least one move been played (meaning it was just the other's turn before) ? |
| 398 | if (!the_board.was_setup && (the_board.move_count > 1)) |
405 | if (!the_board.was_setup && (the_board.move_count > 1)) |
| 399 | { |
406 | { |
| 400 | Debug_Log (L"===Player just played, sending |
407 | Debug_Log (L"===Player just played, sending the chosen move to engine===\n"); |
| - | 408 | if (wcscmp (options.engine.program, L"Crafty") == 0) |
|
| 401 | Player_SendBuffer_Add (player, 1000, L"disp\n"); |
409 | Player_SendBuffer_Add (player, 1000, L"disp\n"); |
| 402 | 410 | ||
| 403 | // instruct it about its allowed search depth BEFORE each move (this ensures engine will be "ready" to handle the command) |
411 | // instruct it about its allowed search depth BEFORE each move (this ensures engine will be "ready" to handle the command) |
| 404 | // then build the move string, and send the move string to the engine |
412 | // then build the move string, and send the move string to the engine |
| 405 | Player_SendBuffer_Add (player, 1000 |
413 | Player_SendBuffer_Add (player, 1000, options.engine.command_sd, options.engine.depth); |
| - | 414 | Player_SendBuffer_Add (player, 1000, L"\n"); // since the format string was read from the options, don't forget to end it with a carriage return |
|
| 406 | Player_SendBuffer_Add (player, 1000 |
415 | Player_SendBuffer_Add (player, 1000, Move_BuildString (&the_board.moves[the_board.move_count - 1])); |
| - | 416 | Player_SendBuffer_Add (player, 1000, L"\n"); // end the send buffer with a carriage return |
|
| 407 | } |
417 | } |
| 408 | 418 | ||
| 409 | // else game has not started yet, but it's our turn |
419 | // else game has not started yet, but it's our turn |
| 410 | else |
420 | else |
| - | 421 | { |
|
| 411 | Player_SendBuffer_Add (player, 1000 |
422 | Player_SendBuffer_Add (player, 1000, options.engine.command_go); // so let's start the game |
| - | 423 | Player_SendBuffer_Add (player, 1000, L"\n"); // since the format string was read from the options, don't forget to end it with a carriage return |
|
| - | 424 | } |
|
| 412 | } |
425 | } |
| 413 | } |
426 | } |
| 414 | 427 | ||
| 415 | // END NOTIFICATIONS PROCESSING |
428 | // END NOTIFICATIONS PROCESSING |
| 416 | /////////////////////////////// |
429 | /////////////////////////////// |
| Line 420... | Line 433... | ||
| 420 | { |
433 | { |
| 421 | // does our opponent want a hint ? |
434 | // does our opponent want a hint ? |
| 422 | if (current_player->wants_hint) |
435 | if (current_player->wants_hint) |
| 423 | { |
436 | { |
| 424 | current_player->wants_hint = false; // don't ask twice |
437 | current_player->wants_hint = false; // don't ask twice |
| 425 | Debug_Log (L"===Hint requested, asking |
438 | Debug_Log (L"===Hint requested, asking engine for it===\n"); |
| 426 | Player_SendBuffer_Add (player, 1000 |
439 | Player_SendBuffer_Add (player, 1000, options.engine.command_hint); // ask for a hint |
| - | 440 | Player_SendBuffer_Add (player, 1000, L"\n"); // since the format string was read from the options, don't forget to end it with a carriage return |
|
| 427 | } |
441 | } |
| 428 | 442 | ||
| 429 | // does our opponent want to cancel a move ? |
443 | // does our opponent want to cancel a move ? |
| 430 | if (current_player->wants_cancel) |
444 | if (current_player->wants_cancel) |
| 431 | { |
445 | { |
| 432 | current_player->wants_cancel = false; // don't ask twice (remember now before we switch players) |
446 | current_player->wants_cancel = false; // don't ask twice (remember now before we switch players) |
| 433 | Debug_Log (L"===Move cancellation requested, rebuilding board and telling |
447 | Debug_Log (L"===Move cancellation requested, rebuilding board and telling engine to backup 2 moves===\n"); |
| 434 | 448 | ||
| 435 | // rewind game 2 moves back |
449 | // rewind game 2 moves back |
| 436 | the_board.moves = (boardmove_t *) SAFE_realloc (the_board.moves, the_board.move_count, max (1, the_board.move_count - 2), sizeof (boardmove_t), false); |
450 | the_board.moves = (boardmove_t *) SAFE_realloc (the_board.moves, the_board.move_count, max (1, the_board.move_count - 2), sizeof (boardmove_t), false); |
| 437 | the_board.move_count = max (1, the_board.move_count - 2); // figure out how many moves we have now |
451 | the_board.move_count = max (1, the_board.move_count - 2); // figure out how many moves we have now |
| 438 | the_board.viewed_move = the_board.move_count - 1; // take us back to the last move |
452 | the_board.viewed_move = the_board.move_count - 1; // take us back to the last move |
| Line 440... | Line 454... | ||
| 440 | // just set up the board from its Forsyth-Edwards notation |
454 | // just set up the board from its Forsyth-Edwards notation |
| 441 | Debug_Log (L"===setting up board using FEN string===\n"); |
455 | Debug_Log (L"===setting up board using FEN string===\n"); |
| 442 | 456 | ||
| 443 | // instruct it about its allowed search depth BEFORE each table set (this ensures engine will be "ready" to handle the command) |
457 | // instruct it about its allowed search depth BEFORE each table set (this ensures engine will be "ready" to handle the command) |
| 444 | // then get the current game state in FEN format and feed it to the engine |
458 | // then get the current game state in FEN format and feed it to the engine |
| 445 | Player_SendBuffer_Add (player, 1000 |
459 | Player_SendBuffer_Add (player, 1000, options.engine.command_sd, options.engine.depth); |
| - | 460 | Player_SendBuffer_Add (player, 1000, L"\n"); // since the format string was read from the options, don't forget to end it with a carriage return |
|
| 446 | Player_SendBuffer_Add (player, 1000 |
461 | Player_SendBuffer_Add (player, 1000, options.engine.command_setboard, the_board.moves[the_board.move_count - 1].fen_string); |
| - | 462 | Player_SendBuffer_Add (player, 1000, L"\n"); // since the format string was read from the options, don't forget to end it with a carriage return |
|
| 447 | 463 | ||
| - | 464 | if (wcscmp (options.engine.program, L"Crafty") == 0) |
|
| 448 | Player_SendBuffer_Add (player, 1000, L"disp\n"); |
465 | Player_SendBuffer_Add (player, 1000, L"disp\n"); |
| 449 | 466 | ||
| 450 | do_update = true; // remember to update the 3D scene |
467 | do_update = true; // remember to update the 3D scene |
| 451 | } |
468 | } |
| 452 | } |
469 | } |
| 453 | 470 | ||