Update copyright info for 2008 (minishogi patches) and recent developments.
[gnushogi.git] / gnushogi / genmove.c
index 6490319..ae91939 100644 (file)
@@ -4,6 +4,7 @@
  * ----------------------------------------------------------------------
  * Copyright (c) 1993, 1994, 1995 Matthias Mutz
  * Copyright (c) 1999 Michael Vanier and the Free Software Foundation
+ * Copyright (c) 2008, 2013, 2014 Yann Dirson and the Free Software Foundation
  *
  * GNU SHOGI is based on GNU CHESS
  *
@@ -14,8 +15,8 @@
  *
  * GNU Shogi is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 1, or (at your option) any
- * later version.
+ * Free Software Foundation; either version 3 of the License,
+ * or (at your option) any later version.
  *
  * GNU Shogi is distributed in the hope that it will be useful, but WITHOUT
  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
@@ -23,8 +24,8 @@
  * for more details.
  *
  * You should have received a copy of the GNU General Public License along
- * with GNU Shogi; see the file COPYING.  If not, write to the Free
- * Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * with GNU Shogi; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
  * ----------------------------------------------------------------------
  *
  */
@@ -40,8 +41,6 @@ static short sqking, sqxking;
 static short InCheck = false, GenerateAllMoves = false;
 static short check_determined = false;
 
-static short INCscore = 0;
-
 short deepsearchcut = true;
 short tas = false, taxs = false, ssa = false;
 
@@ -315,12 +314,12 @@ PromotionPossible(short color, short f, short t, short p)
 {
     if (color == black)
     {
-        if ((f < 54) && (t < 54))
+       if ((!InWhiteCamp(f)) && (!InWhiteCamp(t)))
             return false;
     }
     else
     {
-        if ((f > 26) && (t > 26))
+       if ((!InBlackCamp(f)) && (!InBlackCamp(t)))
             return false;
     }
 
@@ -328,8 +327,10 @@ PromotionPossible(short color, short f, short t, short p)
     switch (p)
     {
     case pawn:
+#ifndef MINISHOGI
     case lance:
     case knight:
+#endif
     case silver:
     case bishop:
     case rook:
@@ -360,6 +361,7 @@ NonPromotionPossible(short color, short f,
                     : (generate_move_flags ? ILLEGAL_TRAPPED : false));
         }
 
+#ifndef MINISHOGI
     case lance:
         if (color == black)
         {
@@ -387,6 +389,7 @@ NonPromotionPossible(short color, short f,
                     ? true
                     : (generate_move_flags ? ILLEGAL_TRAPPED : false));
         }
+#endif
     }
 
     return true;
@@ -535,7 +538,11 @@ field_bonus(short ply, short side, short piece,
 
                     /* CHECKME: is this right? */
                     if (((rvupiece == rvuboard) && (upiece == pawn))
-                        || (upiece == bishop) || (upiece == knight))
+                        || (upiece == bishop)
+#ifndef MINISHOGI
+                       || (upiece == knight)
+#endif
+                       )
                     {
                         s++; /* The opposing pawn (piece) */
 
@@ -774,7 +781,11 @@ LinkMove(short ply, short f,
             {
 #ifdef TESUJIBONUS
                 /* Look at non-promoting silver or knight */
-                if (piece == silver || piece == knight)
+                if (piece == silver
+#ifndef MINISHOGI
+                   || piece == knight
+#endif
+                   )
                 {
                     local_flag |= tesuji; /* Non-promotion */
                     s++;
@@ -910,6 +921,7 @@ DropPossible(short piece, short side, short sq)
             GenUnmakeMove(side, f, sq, tempb, tempc, false);
         }
     }
+#ifndef MINISHOGI
     else if (piece == lance)
     {
         if ((side == black) && (r == 8))
@@ -924,6 +936,7 @@ DropPossible(short piece, short side, short sq)
         else if ((side == white) && (r <= 1))
             possible = (generate_move_flags ? ILLEGAL_TRAPPED : false);
     }
+#endif
 
     return possible;
 }
@@ -1112,9 +1125,13 @@ LinkPreventCheckDrops(short side, short xside, short ply)
     if (board[square = PieceList[side][0]] != king)
         return;
 
-    for (piece = lance; piece <= rook; piece++)
+    for (piece = pawn+1; piece <= rook; piece++)
     {
-        if (piece == lance || piece == bishop || piece == rook)
+        if (
+#ifndef MINISHOGI
+           piece == lance ||
+#endif
+           piece == bishop || piece == rook)
         {
             /* check for threat of xside piece */
             ptyp = ptype[side][piece];
@@ -1641,7 +1658,7 @@ IsCheckmate(short side, short in_check, short blockable)
                  * Drops are restricted for pawns, lances, and knights.
                  */
 
-                if (piece > knight)
+                if (piece >= silver)
                     break;
             }
         }