* ----------------------------------------------------------------------
* 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
*
*
* 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
* 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/>.
* ----------------------------------------------------------------------
*
*/
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;
inline static void
-Link(short side, short piece,
+Link(short side,
short from, short to, unsigned short local_flag, short s)
{
if (*TrP == TREE)
{
- ShowMessage("TREE overflow\n");
+ dsp->ShowMessage("TREE overflow\n");
}
else
{
{
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;
}
switch (p)
{
case pawn:
+#ifndef MINISHOGI
case lance:
case knight:
+#endif
case silver:
case bishop:
case rook:
}
-inline int
-NonPromotionPossible(short color, short f,
+static inline int
+NonPromotionPossible(short color,
short t, short p)
{
switch (p)
: (generate_move_flags ? ILLEGAL_TRAPPED : false));
}
+#ifndef MINISHOGI
case lance:
if (color == black)
{
? true
: (generate_move_flags ? ILLEGAL_TRAPPED : false));
}
+#endif
}
return true;
/* bonus for possible next moves */
inline static short
-field_bonus(short ply, short side, short piece,
+field_bonus(short side, short piece,
short f, short t, unsigned short *local_flag)
{
short s, u, ptyp;
/* 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) */
if (score_if_impossible < 0)
{
/* The move is flagged as illegal. */
- Link(side, piece,
+ Link(side,
f, t, local_flag, score_if_impossible);
return;
s -= 16 / Captured[side][silver];
#if defined DROPBONUS
- s += field_bonus(ply, side, piece, f, t, &local_flag);
+ s += field_bonus(side, piece, f, t, &local_flag);
if (s == 10 && piece != pawn)
local_flag |= questionable;
{
#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++;
else
{
#if defined FIELDBONUS
- s += field_bonus(ply, side, piece, f, t, &local_flag);
+ s += field_bonus(side, piece, f, t, &local_flag);
#endif
}
}
if (try_link || GenerateAllMoves)
{
- Link(side, piece, f, t, local_flag,
+ Link(side, f, t, local_flag,
s - ((SCORE_LIMIT + 1000) * 2));
}
GenUnmakeMove(side, f, sq, tempb, tempc, false);
}
}
+#ifndef MINISHOGI
else if (piece == lance)
{
if ((side == black) && (r == 8))
else if ((side == white) && (r <= 1))
possible = (generate_move_flags ? ILLEGAL_TRAPPED : false);
}
+#endif
return possible;
}
LinkMove(ply, sq, u, local_flag | promote, xside, true);
if ((possible
- = NonPromotionPossible(color[sq], sq, u, piece)))
+ = NonPromotionPossible(color[sq], u, piece)))
{
LinkMove(ply, sq, u, local_flag, xside, possible);
}
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];
if ((PP = PromotionPossible(color[sq], sq, u, piece)))
{
- Link(side, piece,
+ Link(side,
sq, u, capture | promote,
(*value)[stage][board[u]]
#if !defined SAVE_SVALUE
if (!PP || flag.tsume)
{
- Link(side, piece,
+ Link(side,
sq, u, capture,
(*value)[stage][board[u]]
#if !defined SAVE_SVALUE
* Drops are restricted for pawns, lances, and knights.
*/
- if (piece > knight)
+ if (piece >= silver)
break;
}
}