Fix Checkered and Ultima rules. Write Chess960 rules and complete others
authorBenjamin Auder <benjamin.auder@somewhere>
Fri, 14 Dec 2018 15:52:36 +0000 (16:52 +0100)
committerBenjamin Auder <benjamin.auder@somewhere>
Fri, 14 Dec 2018 15:52:36 +0000 (16:52 +0100)
public/javascripts/variants/Checkered.js
public/javascripts/variants/Ultima.js
views/rules/Alice.pug
views/rules/Checkered.pug
views/rules/Chess960.pug
views/rules/Extinction.pug
views/rules/Grand.pug
views/rules/Loser.pug
views/rules/Magnetic.pug
views/rules/Switching.pug
views/rules/Ultima.pug

index 019e1e2..814d91b 100644 (file)
@@ -76,10 +76,15 @@ class CheckeredRules extends ChessRules
                        return standardMoves; //king has to be treated differently (for castles)
                let moves = [];
                standardMoves.forEach(m => {
                        return standardMoves; //king has to be treated differently (for castles)
                let moves = [];
                standardMoves.forEach(m => {
-                       if (m.vanish[0].p == VariantRules.PAWN && Math.abs(m.end.x-m.start.x)==2
-                               && !this.pawnFlags[this.turn][m.start.y])
+                       if (m.vanish[0].p == VariantRules.PAWN)
                        {
                        {
-                               return; //skip forbidden 2-squares jumps
+                               if (Math.abs(m.end.x-m.start.x)==2 && !this.pawnFlags[this.turn][m.start.y])
+                                       return; //skip forbidden 2-squares jumps
+                               if (this.board[m.end.x][m.end.y] == VariantRules.EMPTY
+                                       && m.vanish.length==2 && this.getColor(m.start.x,m.start.y) == 'c')
+                               {
+                                       return; //checkered pawns cannot take en-passant
+                               }
                        }
                        if (m.vanish.length == 1)
                                moves.push(m); //no capture
                        }
                        if (m.vanish.length == 1)
                                moves.push(m); //no capture
index ac0cf95..ab12c71 100644 (file)
@@ -67,14 +67,14 @@ class UltimaRules extends ChessRules
                                && this.getColor(i,j) == oppCol)
                        {
                                const oppPiece = this.getPiece(i,j);
                                && this.getColor(i,j) == oppCol)
                        {
                                const oppPiece = this.getPiece(i,j);
-                               if (oppPiece == V.BISHOP && piece == V.IMMOBILIZER)
-                                       return true;
-                               if (oppPiece == V.IMMOBILIZER && ![V.BISHOP,V.IMMOBILIZER].includes(piece))
+                               if (oppPiece == V.IMMOBILIZER)
                                {
                                        // Moving is impossible only if this immobilizer is not neutralized
                                        for (let step2 of adjacentSteps)
                                        {
                                                const [i2,j2] = [i+step2[0],j+step2[1]];
                                {
                                        // Moving is impossible only if this immobilizer is not neutralized
                                        for (let step2 of adjacentSteps)
                                        {
                                                const [i2,j2] = [i+step2[0],j+step2[1]];
+                                               if (i2 == x && j2 == y)
+                                                       continue; //skip initial piece!
                                                if (i2>=0 && i2<sizeX && j2>=0 && j2<sizeY
                                                        && this.board[i2][j2] != V.EMPTY && this.getColor(i2,j2) == color)
                                                {
                                                if (i2>=0 && i2<sizeX && j2>=0 && j2<sizeY
                                                        && this.board[i2][j2] != V.EMPTY && this.getColor(i2,j2) == color)
                                                {
@@ -84,6 +84,9 @@ class UltimaRules extends ChessRules
                                        }
                                        return true; //immobilizer isn't neutralized
                                }
                                        }
                                        return true; //immobilizer isn't neutralized
                                }
+                               // Chameleons can't be immobilized twice, because there is only one immobilizer
+                               if (oppPiece == V.BISHOP && piece == V.IMMOBILIZER)
+                                       return true;
                        }
                }
                return false;
                        }
                }
                return false;
index 7c5fca4..dca1d47 100644 (file)
@@ -41,7 +41,14 @@ p
        | As in the orthodox game, win by checkmating the king. It shouldn't be able to
        | escape the check, not even by moving to the other board.
 
        | As in the orthodox game, win by checkmating the king. It shouldn't be able to
        | escape the check, not even by moving to the other board.
 
-p Note: en-passant and castle occur as they do in the standard game.
+p.
+       Note: en-passant and castle occur as they do in the standard game.
+       More specifically, en-passant is possible regardless of the worlds pawns are in.
+       This is justified because pawns "go through the mirror" while moving, and can
+       thus be captured either right after or just before they pass the mirror.
+       Castling should be legal according to orthodox rules on the board 1 (it cannot
+       occur on board 2, because it would mean king and rook moved). Moreover, the
+       king cannot be in check on board 2 after castling.
 
 h3 Credits
 
 
 h3 Credits
 
index 96e4475..ea9b941 100644 (file)
@@ -41,7 +41,7 @@ ol
 span Remarks:
 ul
        li A checkered move cannot be "undone" right after if this repeat the position.
 span Remarks:
 ul
        li A checkered move cannot be "undone" right after if this repeat the position.
-       li Checkered chess pieces cannot be captured.
+       li Checkered pieces cannot be captured.
 
 figure.diagram-container
        .diagram
 
 figure.diagram-container
        .diagram
@@ -53,8 +53,15 @@ figure.diagram-container
 h3 Pawn moves
 
 ul
 h3 Pawn moves
 
 ul
-       li A pawn captured on its starting square keeps the right to advance two squares.
-       li Checkered pawns cannot capture en passant.
+       li.
+               Pawns can jump two squares only from their initial rank, and only once in the game:
+               a checkered pawn returning on the pawns' start rank cannot jump. However:
+       li.
+               A pawn captured on its starting square (thus becoming "checkered") keeps the
+               right to advance two squares.
+       li.
+               Checkered pawns cannot capture en passant, because while the pawn was "passing"
+               they were of the same color.
 
 h2.stageDelimiter Stage 2
 
 
 h2.stageDelimiter Stage 2
 
index 8f70e45..a5c6e65 100644 (file)
@@ -1,3 +1,178 @@
 p.boxed
 p.boxed
-       | Orthodox rules (still with shuffled starting position). See for example the 
-       a(href="https://en.wikipedia.org/wiki/Rules_of_chess") Wikipedia page.
+       | Orthodox rules (with shuffled starting position).
+
+h3 Basics
+
+p.
+       Chess is played between two players, one moving the white pieces and the other
+       the black pieces. A "move" consists of a piece's movement on the board.
+       White and black moves alternate until a specific situation occurs (checkmate,
+       stalemate, or draw criteria met; this is detailed later).
+       White pieces always make the first move.
+
+p.
+       Each piece has a particular way to move, but almost always captures by moving to an
+       occupied square (with only one exception, detailed later).
+
+figure.diagram-container
+       .diagram
+               | fen:rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR:
+       figcaption Standard initial position.
+
+p.
+       Board coordinates: squares are always identified by a couple (letter, number).
+       The letter starts from 'a' and indicates the column, while the number starts
+       at '1' and indicates the row.
+       Since the chessboard is 64 squares, 8x8, this results in a coordinates system
+       from a1 to h8. 'a1' is the bottom left corner square from the white pieces
+       player perspective, while 'h8' is in the upper right corner.
+
+h3 Regular moves
+
+h4 Pawns
+
+p.
+       They are the weakest pieces on board, but the most complex to move.
+       From their initial rank they can either jump two squares forward (vertically),
+       or advance only one square in this same direction. After that first move they
+       only advance one square at a time, vertically, moving up.
+
+p.
+       Pawns capture by moving forward (upper on the board) one square diagonally,
+       when an enemy piece sits on that square.
+
+p.
+       When reaching the last rank, pawns must promote into any (friendly)
+       other non-royal piece: queen, rook, knight or bishop.
+
+p.
+       Moves notations: "pawn" is implicit, so for a simple move we only write the
+       destination square (because only one pawn at most can move forward to a specific
+       square). Thus, 1.e4 means "pawn from e2 to e4". However, in case of captures
+       the situation could be ambiguous (two pawns on the same rank), so the column
+       is specified too: "fxe6" (for example).
+       As you can see capture is marked by a cross symbol: "x".
+
+figure.diagram-container
+       .diagram
+               | fen:k7/8/8/1prp4/1P1P4/8/6P1/7K:
+       figcaption Possible pawn moves: g3, g4, dxc5, bxc5
+
+p
+       | For a piece movement, we just prepend the upper-case piece initial before the
+       | previously described notation. A rook taking something on f3 square writes:
+       | Rxf3. There are rules for ambiguous situation, but discussing them now would
+       | be too far off-topic. Please visit for example the 
+       a(href="https://en.wikipedia.org/wiki/Algebraic_notation_(chess)")
+               | Wikipedia page 
+       | for full information on this subject.
+
+h4 Rooks
+
+p.
+       They move either horizontally or vertically, as far as they want while the path
+       is free of pieces. If this path ends with an enemy piece, it can a priori be captured
+       (a priori because if the move ends up with the king in check, then it's illegal).
+
+h4 Knights
+
+p.
+       They are the only units able to jump over other pieces (without capturing them).
+       They do "L" moves: two squares in one direction (horizontally or vertically),
+       and then one square in an orthogonal direction.
+
+figure.diagram-container
+       .diagram
+               | fen:k7/2p5/5q2/2b5/4N3/2R3r1/3P4/7K w f6,d6,c5,f2,g3,g5:
+       figcaption Possible knight moves from e4.
+
+h4 Bishops
+
+p.
+       They move diagonally, as far as they want while the path is free of pieces.
+       If this path ends with an enemy piece, it can a priori be captured.
+
+h4 Queen
+
+p This piece combines the movement of a rook and a bishop, with the same conditions.
+
+h4 King
+
+p.
+       This piece moves like a queen, but only by one square at a time. The final square
+       must be either vacant or occupied by an enemy piece (therefore captured).
+
+p.
+       The king cannot be captured, but a move may ends up attacking enemy's king.
+       It is said to be "under check" (or "in check") and the opponent must either:
+ul
+       li move the king to a safe square, or
+       li capture the attacker, or
+       li intercept the attacking line.
+p Depending on the situation one or more of these counter-measures could be impossible.
+
+p Leaving our king in check after a move is forbidden.
+
+TODO: diagram let king in check capturing queen, bishop pinned
+figure.diagram-container
+       .diagram
+               | fen:r6k/4q3/8/8/8/B7/8/K7:
+       figcaption Bxe7 is illegal (it allows Rxa1).
+
+h3 Special moves
+
+p Apart from pawn promotion which has already been introduced, two special moves exist:
+ul
+       li.
+               castle: if both the king and the right-most (from white player perspective) rook
+               haven't moved yet, and if nothing stand in the path from king to rook, and if the
+               squares f1 and g1 are either free or occupied by the king or rook implied, then
+               the king can go to g1 while the rook moves to f1. Note that since positions are
+               shuffled one of these two pieces may apparently not move.
+               The same can be done on the other side (left-most rook), and end squares are c1
+               for king and d1 for rook. The former is small castle, and the latter large castle.
+               Notation: small castle writes "0-0" while large castle is "0-0-0".
+       li.
+               en-passant: after a pawn has jumped two squares, if an enemy pawn stands just next
+               to it then it can capture the jumping pawn "en passant", exactly as if it had
+               advanced only one square. The move is noted as usual, but with "e.p." in the end
+               to indicate the special move.
+               The capture is possible only right after the pawn jump: not later in the game.
+
+figure.diagram-container
+       .diagram
+               | fen:nr1kb1r1/ppp3pp/8/2Pp4/8/7P/PP3PP1/1R3KBR:
+       figcaption Black just played d5 (jump from d7).
+
+figure.diagram-container
+       .diagram
+               | fen:nr1kb1r1/ppp3pp/3P4/8/8/7P/PP3PP1/2KR2BR:
+       figcaption After cxd6 e.p. and 0-0-0.
+
+h3 End of the game
+
+p.
+       The best-known way to end a game is by "checkmating" the enemy king.
+       This means that you end a move in a situation where the king can be captured,
+       and your opponent has no way to avoid the capture.
+       The checkmating player has one point and the other zero, so the score writes 1-0
+       or 0-1 depending if white pieces or black pieces mated.
+
+figure.diagram-container
+       .diagram
+               | fen:rnbqkbnr/ppp2Qpp/2np4/4p3/2B1P3/8/PPPP1PPP/RNB1K1NR:
+       figcaption Famous mating pattern: 1-0
+
+p All other ways to end the game lead to a draw (1/2-1/2): nobody wins:
+ul
+       li when a player has no legal move but is not under check,
+       li.
+               when a position is repeated three times with the same castling right and
+               same player in turn,
+       li when 50 moves are played without pawn movement or capture.
+p.
+       Note: this last way to end a game is not implemented, because it quite seldom occurs,
+       does not generalize so well to variants (it depends), and more important because
+       games played on this website are not official tournament games. If you feel like
+       manoeuvring for 200 moves and your opponent isn't bored, then why would I stop you?
+       &#9786;
index 5672586..3133cc9 100644 (file)
@@ -27,6 +27,11 @@ p.
        Win by eliminating all enemy pawns, or rooks, or knights, or bishops, or queen(s),
        or king(s) (there may be several if promotions happened).
 
        Win by eliminating all enemy pawns, or rooks, or knights, or bishops, or queen(s),
        or king(s) (there may be several if promotions happened).
 
+figure.diagram-container
+       .diagram
+               | fen:n3brk1/5ppp/3q4/8/8/8/1Q3PPP/K1R1B1N1:
+       figcaption White can win in 2 moves: 1.Qb7, 2.QxN
+
 h3 Credits
 
 p
 h3 Credits
 
 p
index acafca8..4d61431 100644 (file)
@@ -35,7 +35,9 @@ p.
        promote into a friendly piece captured (which is back on the board). If none is
        available, the promotion on last rank is impossible and the pawn cannot move.
 
        promote into a friendly piece captured (which is back on the board). If none is
        available, the promotion on last rank is impossible and the pawn cannot move.
 
-p Pawn promotion is possible (but not forced) on the two ranks before last.
+p.
+       Pawn promotion is possible (but not forced) on the two ranks before last,
+       only in an already captured (friendly) piece.
 
 h3 End of the game
 
 
 h3 End of the game
 
index 3b6b1b6..584af48 100644 (file)
@@ -18,6 +18,8 @@ p.
        The king has no royal status: it can be taken as any other piece.
        Thus, there is no castle rule, no checks.
 
        The king has no royal status: it can be taken as any other piece.
        Thus, there is no castle rule, no checks.
 
+p Captures are mandatory, but when several capturing moves are possible you can choose.
+
 figure.diagram-container
        .diagram
                | fen:6nB/6P1/8/4p3/2p1P3/2P5/8/8:
 figure.diagram-container
        .diagram
                | fen:6nB/6P1/8/4p3/2p1P3/2P5/8/8:
@@ -31,7 +33,9 @@ p.
 
 h3 End of the game
 
 
 h3 End of the game
 
-p You can win by losing all material or be stalemated.
+p.
+       Win by losing all material or be stalemated (for example with only blocked pawns
+       remaining on board).
 
 h3 Credits
 
 
 h3 Credits
 
index 7a0ac2e..baad36f 100644 (file)
@@ -29,6 +29,11 @@ figure.diagram-container
                | fen:3b4/8/3K4/qR1Qr1P1/3b4/8/8/8:
        figcaption After white move Qd5
 
                | fen:3b4/8/3K4/qR1Qr1P1/3b4/8/8/8:
        figcaption After white move Qd5
 
+p.
+       Remember that since kings have a neutral charge, any of their movement does not
+       change anything on the board. They also block magnetic actions which go in
+       their direction.
+
 h3 End of the game
 
 p Win by capturing opponent's king. There is no notion of check or stalemate here.
 h3 End of the game
 
 p Win by capturing opponent's king. There is no notion of check or stalemate here.
index 4d1dcd5..ce2fdbc 100644 (file)
@@ -21,6 +21,11 @@ p
        | Switching must involves two different units.
        | Switching while the king is under check is not allowed.
 
        | Switching must involves two different units.
        | Switching while the king is under check is not allowed.
 
+figure.diagram-container
+       .diagram
+               | fen:1RB3k1/5ppp/8/8/8/8/8/K7:
+       figcaption White can mate in 1 by switching b8-c8
+
 p.
        Note: if the king and rook are on two adjacent squares, castling and switching
        from the king are triggered in the same way. Castling takes priority:
 p.
        Note: if the king and rook are on two adjacent squares, castling and switching
        from the king are triggered in the same way. Castling takes priority:
index a2f55f3..b385627 100644 (file)
@@ -39,19 +39,17 @@ p
        | one square in any direction.
        | All other pieces move like an orthodox queen.
 
        | one square in any direction.
        | All other pieces move like an orthodox queen.
 
-p When a piece is adjacent to an enemy immobilizer, it cannot move unless
-ul
-       li it is an immobilizer or a chameleon; or
-       li.
-               the enemy immobilizer is adjacent to a friendly immobilizer or chameleon
-               (cancelling the powers of the opponent's immobilizer)
+p.
+       When a piece is adjacent to an enemy immobilizer, it cannot move unless
+       the enemy immobilizer is adjacent to a friendly immobilizer or chameleon
+       (cancelling the powers of the opponent's immobilizer).
 p
        | Note : this corresponds to the "pure rules" described on 
        a(href="http://www.inference.org.uk/mackay/ultima/ultima.html") this page
        | , which slightly differ from the initial rules.
 p
        | Note : this corresponds to the "pure rules" described on 
        a(href="http://www.inference.org.uk/mackay/ultima/ultima.html") this page
        | , which slightly differ from the initial rules.
-       | The aim is to get rid of the weird suicide rule, weakening the immobilizers lock
-       | (in particular, in the original rules two adjacent immobilizer are stuck forever
-       | until one is captured).
+       | The aim is to get rid of the weird suicide rule by weakening the immobilizers lock.
+       | In particular, in the original rules two adjacent immobilizer are stuck forever
+       | until one is captured. Note that it's still the case if all chameleons disappeared.
 
 h3 Capturing moves
 
 
 h3 Capturing moves