Inform the engine if we have a Chess960 game.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Sat, 6 Jan 2018 12:38:13 +0000 (13:38 +0100)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Sat, 6 Jan 2018 12:38:13 +0000 (13:38 +0100)
Engine.pm
Position.pm
remoteglot.pl

index 6ec914f..c46b4a8 100644 (file)
--- a/Engine.pm
+++ b/Engine.pm
@@ -30,6 +30,7 @@ sub open {
                cb => $cb,
                seen_uciok => 0,
                stopping => 0,
+               chess960 => 0,
        };
 
        print $uciwrite "uci\n";
index 6976c96..8a42a6f 100644 (file)
@@ -221,6 +221,9 @@ sub make_move {
        if (exists($pos->{'start_fen'})) {
                $np->{'start_fen'} = $pos->{'start_fen'};
        }
+       if (exists($pos->{'chess960'})) {
+               $np->{'chess960'} = $pos->{'chess960'};
+       }
        if (defined($pretty_move)) {
                $np->{'last_move'} = $pretty_move;
        } else {
@@ -242,6 +245,11 @@ sub make_pretty_move {
        return ($pos, $uci_move);
 }
 
+sub is_chess960 {
+       my ($pos) = shift;
+       return (defined($pos->{'chess960'}) && $pos->{'chess960'});
+}
+
 sub _pos_to_square {
         my ($row, $col) = @_;
         return sprintf("%c%d", ord('a') + $col, 8 - $row);
index 7f4fd3c..66fb2ff 100755 (executable)
@@ -296,6 +296,10 @@ sub handle_pgn {
                        } else {
                                $pos = Position->start_pos($white, $black);
                        }
+                       if (exists($tags->{'Variant'}) &&
+                           $tags->{'Variant'} =~ /960|fischer/i) {
+                               $pos->{'chess960'} = 1;
+                       }
                        my $moves = $pgn->moves;
                        my @uci_moves = ();
                        my @repretty_moves = ();
@@ -386,6 +390,10 @@ sub handle_position {
        # It's wrong to just give the FEN (the move history is useful,
        # and per the UCI spec, we should really have sent "ucinewgame"),
        # but it's easier, and it works around a Stockfish repetition issue.
+       if ($engine->{'chess960'} != $pos->is_chess960()) {
+               uciprint($engine, "setoption UCI_Chess960 " . ($pos->is_chess960() ? 'true' : 'false'));
+               $engine->{'chess960'} = $pos->is_chess960();
+       }
        uciprint($engine, "position fen " . $pos->fen());
        uciprint($engine, "go infinite");
        $pos_calculating = $pos;
@@ -395,6 +403,10 @@ sub handle_position {
                        $engine2->{'stopping'} = 1;
                        uciprint($engine2, "stop");
                }
+               if ($engine2->{'chess960'} != $pos->is_chess960()) {
+                       uciprint($engine2, "setoption UCI_Chess960 " . ($pos->is_chess960() ? 'true' : 'false'));
+                       $engine2->{'chess960'} = $pos->is_chess960();
+               }
                uciprint($engine2, "position fen " . $pos->fen());
                uciprint($engine2, "go infinite");
                $pos_calculating_second_engine = $pos;