]> git.sesse.net Git - remoteglot/blobdiff - Board.pm
Fix a castling edge case in Chess960 positions where the kings start on the e-file...
[remoteglot] / Board.pm
index 579adbd1c0809b4596218185a746af6d1a5ffeaf..6fb413ac906ed5670930f3d62750f8519260207f 100644 (file)
--- a/Board.pm
+++ b/Board.pm
@@ -43,10 +43,14 @@ sub make_move {
        }
 
        if ($piece eq 'K') {
+               # Convert to Chess960 king-takes-rook.
+               $to_col = 7 if ($move eq 'e1g1' && $board->[$to_row][$to_col] ne 'R');
+               $to_col = 0 if ($move eq 'e1c1' && $board->[$to_row][$to_col] ne 'R');
+
                my $dst_piece = $board->[$to_row][$to_col];
 
-               # White short castling (regular or Chess960 king-takes-rook)
-               if ($move eq 'e1g1' || ($dst_piece eq 'R' && $to_col > $from_col)) {
+               # White short castling.
+               if ($dst_piece eq 'R' && $to_col > $from_col) {
                        # king
                        $nb->[7][$from_col] = '-';
                        $nb->[7][$to_col] = '-';
@@ -56,8 +60,8 @@ sub make_move {
                        return $nb;
                }
 
-               # White long castling (regular or Chess960 king-takes-rook)
-               if ($move eq 'e1c1' || ($dst_piece eq 'R' && $to_col < $from_col)) {
+               # Black short castling.
+               if ($dst_piece eq 'R' && $to_col < $from_col) {
                        $nb->[7][$from_col] = '-';
                        $nb->[7][$to_col] = '-';
                        $nb->[7][2] = 'K';
@@ -66,10 +70,14 @@ sub make_move {
                        return $nb;
                }
        } elsif ($piece eq 'k') {
+               # Convert to Chess960 king-takes-rook.
+               $to_col = 7 if ($move eq 'e8g8' && $board->[$to_row][$to_col] ne 'r');
+               $to_col = 0 if ($move eq 'e8c8' && $board->[$to_row][$to_col] ne 'r');
+
                my $dst_piece = $board->[$to_row][$to_col];
 
-               # Black short castling (regular or Chess960 king-takes-rook)
-               if ($move eq 'e8g8' || ($dst_piece eq 'r' && $to_col > $from_col)) {
+               # Black short castling.
+               if ($dst_piece eq 'r' && $to_col > $from_col) {
                        $nb->[0][$from_col] = '-';
                        $nb->[0][$to_col] = '-';
                        $nb->[0][6] = 'k';
@@ -78,8 +86,8 @@ sub make_move {
                        return $nb;
                }
 
-               # black long castling
-               if ($move eq 'e8c8' || ($dst_piece eq 'r' && $to_col < $from_col)) {
+               # Black long castling.
+               if ($dst_piece eq 'r' && $to_col < $from_col) {
                        # king
                        $nb->[0][$from_col] = '-';
                        $nb->[0][$to_col] = '-';