Subversion Repositories Games.Chess Giants

Rev

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
         swprintf_s (widechar_buffer, WCHAR_SIZEOF (widechar_buffer), L"mt %d\n", max (1, sysinfo.dwNumberOfProcessors - 1));
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, L"%s\n", options.engine.command_quit);
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, L"%s %s\n", options.engine.command_force, Move_BuildString (&move)); // send the blunderous move to the engine
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, L"%s\n", options.engine.command_new);
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, L"%s %d\n", options.engine.command_sd, options.engine.depth);
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, L"%s %s\n", options.engine.command_setboard, the_board.moves[the_board.move_count - 1].fen_string);
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, L"%s\n", options.engine.command_go); // tell engine it's now the current player
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 Crafty the chosen move===\n");
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, L"%s %d\n", options.engine.command_sd, options.engine.depth);
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, L"%s\n", Move_BuildString (&the_board.moves[the_board.move_count - 1]));
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, L"%s\n", options.engine.command_go); // so let's start the game
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 Crafty for it===\n");
438
         Debug_Log (L"===Hint requested, asking engine for it===\n");
426
         Player_SendBuffer_Add (player, 1000, L"%s\n", options.engine.command_hint); // ask for a hint
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 Crafty to backup 2 moves===\n");
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, L"%s %d\n", options.engine.command_sd, options.engine.depth);
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, L"%s %s\n", options.engine.command_setboard, the_board.moves[the_board.move_count - 1].fen_string);
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