From 73cf68efe38a7edcdf15ae60200c678469e2e850 Mon Sep 17 00:00:00 2001
From: Bart Massey <bart@cs.pdx.edu>
Date: Thu, 9 Apr 2009 01:44:36 -0700
Subject: [PATCH] added support for MiniChess 2009 variant

---
 backend.c |   13 ++++++++++++-
 common.h  |    2 ++
 moves.c   |   35 ++++++++++++++++++++++++-----------
 moves.h   |    2 ++
 4 files changed, 40 insertions(+), 12 deletions(-)

diff --git a/backend.c b/backend.c
index 89610da..a5efb7b 100644
--- a/backend.c
+++ b/backend.c
@@ -269,8 +269,12 @@ PosFlags(index)
     flags &= ~F_ALL_CASTLE_OK;
     break;
   case VariantMiniChess:
+    flags |= F_BAD_BISHOP_MOVES;
+    /* fall through */
+  case VariantMiniChess2007:
     flags |= F_IGNORE_CHECK;
     flags &= ~(F_ALL_CASTLE_OK | F_DOUBLE_PAWN_MOVES);
+    break;
   default:
     break;
   }
@@ -425,7 +429,8 @@ InitBackEnd1()
 {
     int matched, min, sec;
 
-    if (!strcmp(appData.variant, "minichess")) {
+    if (!strcmp(appData.variant, "minichess2007") ||
+        !strcmp(appData.variant, "minichess")) {
       boardRows = 6;
       boardCols = 5;
       appData.alwaysPromoteToQueen = TRUE;
@@ -639,6 +644,7 @@ InitBackEnd1()
       case VariantAtomic:     /* should work except for win condition */
       case Variant3Check:     /* should work except for win condition */
       case VariantShatranj:   /* might work if TestLegality is off */
+      case VariantMiniChess2007:  /* should work */
       case VariantMiniChess:  /* should work */
 	break;
       }
@@ -1247,6 +1253,9 @@ StringToVariant(e)
 	  v = Variant36;
 	  break;
 	case 37:
+	  v = VariantMiniChess2007;
+	  break;
+	case 38:
 	  v = VariantMiniChess;
 	  break;
 
@@ -3285,11 +3294,13 @@ InitPosition(redraw)
       CopyBoard(boards[0], initialPosition);
       /* !!shuffle according to FR rules */
       break;
+    case VariantMiniChess2007:
     case VariantMiniChess:
       /* XXX can't yet dynamically switch board size */
       if (boardRows != 6 || boardCols != 5)
 	gameInfo.variant = VariantNormal;
       CopyBoard(boards[0], miniChessPosition);
+      break;
     }
     if (redraw)
       DrawPosition(FALSE, boards[currentMove]);
diff --git a/common.h b/common.h
index 5130154..391f31e 100644
--- a/common.h
+++ b/common.h
@@ -227,6 +227,7 @@ typedef enum {
     Variant34,           /* Temporary name for possible future ICC wild 34 */
     Variant35,           /* Temporary name for possible future ICC wild 35 */
     Variant36,           /* Temporary name for possible future ICC wild 36 */
+    VariantMiniChess2007,   /* MiniChess without bad bishop move */
     VariantMiniChess,    /* Simplified on a 5x6 board */
     VariantUnknown       /* Catchall for other unknown variants */
 } VariantClass;
@@ -255,6 +256,7 @@ typedef enum {
   "wild34", \
   "wild35", \
   "wild36", \
+  "minichess2007", \
   "minichess", \
   "unknown" \
 }
diff --git a/moves.c b/moves.c
index a1ade78..357d999 100644
--- a/moves.c
+++ b/moves.c
@@ -340,17 +340,30 @@ void GenPseudoLegal(board, flags, epfile, callback, closure)
 	    case WhiteBishop:
 	    case BlackBishop:
 	      for (rs = -1; rs <= 1; rs += 2) 
-		for (fs = -1; fs <= 1; fs += 2)
-		  for (i = 1;; i++) {
-		      rt = rf + (i * rs);
-		      ft = ff + (i * fs);
-		      if (rt < 0 || rt > boardRows - 1 ||
-			  ft < 0 || ft > boardCols - 1) break;
-		      if (SameColor(board[rf][ff], board[rt][ft])) break;
-		      callback(board, flags, NormalMove,
-			       rf, ff, rt, ft, closure);
-		      if (board[rt][ft] != EmptySquare) break;
-		  }
+                  for (fs = -1; fs <= 1; fs += 2)
+                      for (i = 1;; i++) {
+                          rt = rf + (i * rs);
+                          ft = ff + (i * fs);
+                          if (rt < 0 || rt > boardRows - 1 ||
+                              ft < 0 || ft > boardCols - 1) break;
+                          if (SameColor(board[rf][ff], board[rt][ft])) break;
+                          callback(board, flags, NormalMove,
+                                   rf, ff, rt, ft, closure);
+                          if (board[rt][ft] != EmptySquare) break;
+                      }
+              if (flags & F_BAD_BISHOP_MOVES) {
+                  for (i = -1; i <= 1; i++)
+                      for (j = -1; j <= 1; j++) {
+                          if (i == j || i == -j) continue;
+                          rt = rf + i;
+                          ft = ff + j;
+                          if (rt < 0 || rt > boardRows - 1 ||
+                              ft < 0 || ft > boardCols - 1) continue;
+                          if (board[rt][ft] != EmptySquare) continue;
+                          callback(board, flags, NormalMove,
+                                   rf, ff, rt, ft, closure);
+                      }
+              }
 	      break;
 
 	    case WhiteRook:
diff --git a/moves.h b/moves.h
index 6f7dee5..87f0c4c 100644
--- a/moves.h
+++ b/moves.h
@@ -72,6 +72,8 @@ typedef void (*MoveCallback) P((Board board, int flags, ChessMove kind,
 				   and all non-pawns on adjacent squares; 
 				   destroying your own king is illegal */
 #define F_DOUBLE_PAWN_MOVES 256 /* pawns can move two spaces first time */
+#define F_BAD_BISHOP_MOVES 512  /* bishops can move to any adjacent unoccupied
+                                   space to change color */
 
 /* Special epfile values */
 #define EP_NONE -1
-- 
1.6.2.1

