Fix null-move entry during play
authorH.G.Muller <hgm@hgm-xboard.(none)>
Wed, 2 Jul 2014 10:37:18 +0000 (12:37 +0200)
committerH.G.Muller <hgm@hgm-xboard.(none)>
Wed, 2 Jul 2014 10:37:18 +0000 (12:37 +0200)
Null moving by clicking the clock was only accepted in Edit Game and Analyze
mode, while in Chu Shogi and spin-offs it is also allowed during play.
An F_NULL_MOVE flag was introduced to make it easy to test for such variants,
and Machine White/Black mode now also interpret clock clicks as a null move
if the opponent's flag has not yet fallen.

backend.c
moves.h

index 9d659e2..3d9f020 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -413,6 +413,11 @@ PosFlags (index)
   case VariantGrand:
     flags &= ~F_ALL_CASTLE_OK;
     break;
+  case VariantChu:
+  case VariantChuChess:
+  case VariantLion:
+    flags |= F_NULL_MOVE;
+    break;
   default:
     break;
   }
@@ -15289,7 +15294,8 @@ ClockClick (int which)
          if (gameMode == EditPosition || gameMode == IcsExamining) {
            if(!appData.pieceMenu && blackPlaysFirst) EditPositionMenuEvent(ClearBoard, 0, 0);
            SetBlackToPlayEvent();
-         } else if ((gameMode == AnalyzeMode || gameMode == EditGame) && !blackFlag && WhiteOnMove(currentMove)) {
+         } else if ((gameMode == AnalyzeMode || gameMode == EditGame ||
+                     gameMode == MachinePlaysBlack && PosFlags(0) & F_NULL_MOVE && !blackFlag) && WhiteOnMove(currentMove)) {
           UserMoveEvent((int)EmptySquare, DROP_RANK, 0, 0, 0); // [HGM] multi-move: if not out of time, enters null move
          } else if (shiftKey) {
            AdjustClock(which, -1);
@@ -15301,7 +15307,8 @@ ClockClick (int which)
          if (gameMode == EditPosition || gameMode == IcsExamining) {
            if(!appData.pieceMenu && !blackPlaysFirst) EditPositionMenuEvent(ClearBoard, 0, 0);
            SetWhiteToPlayEvent();
-         } else if ((gameMode == AnalyzeMode || gameMode == EditGame) && !whiteFlag && !WhiteOnMove(currentMove)) {
+         } else if ((gameMode == AnalyzeMode || gameMode == EditGame ||
+                     gameMode == MachinePlaysWhite && PosFlags(0) & F_NULL_MOVE && !whiteFlag) && !WhiteOnMove(currentMove)) {
           UserMoveEvent((int)EmptySquare, DROP_RANK, 0, 0, 0); // [HGM] multi-move
          } else if (shiftKey) {
            AdjustClock(which, -1);
diff --git a/moves.h b/moves.h
index b4b9eb3..a86cca5 100644 (file)
--- a/moves.h
+++ b/moves.h
@@ -81,6 +81,7 @@ typedef void (*MoveCallback) P((Board board, int flags, ChessMove kind,
                                   destroying your own king is illegal */
 #define F_FRC_TYPE_CASTLING 256 /* generate castlings as captures of own Rook */
 #define F_MANDATORY_CAPTURE 0x200
+#define F_NULL_MOVE         0x400
 
 /* Special epfile values. [HGM] positive values are non-reversible moves! */
 #define EP_NONE (-6)           /* [HGM] Tricky! order matters:            */