From bdf7fb246fa3fcf64350d8edd3f3a9ea9c32f46f Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Sat, 6 Jan 2018 13:38:13 +0100 Subject: [PATCH] Inform the engine if we have a Chess960 game. --- Engine.pm | 1 + Position.pm | 8 ++++++++ remoteglot.pl | 12 ++++++++++++ 3 files changed, 21 insertions(+) diff --git a/Engine.pm b/Engine.pm index 6ec914f..c46b4a8 100644 --- 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"; diff --git a/Position.pm b/Position.pm index 6976c96..8a42a6f 100644 --- a/Position.pm +++ b/Position.pm @@ -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); diff --git a/remoteglot.pl b/remoteglot.pl index 7f4fd3c..66fb2ff 100755 --- a/remoteglot.pl +++ b/remoteglot.pl @@ -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; -- 2.39.2