return false;
}
- /* FIXME: this can be simplified... */
- switch (p)
- {
- case pawn:
-#ifndef MINISHOGI
- case lance:
- case knight:
-#endif
- case silver:
- case bishop:
- case rook:
- return true;
- };
-
- return false;
+ return (typeMask[p] & (T_PAWN|T_LANCE|T_KNIGHT|T_SILVER|T_BISHOP|T_ROOK)) != 0;
}
/* CHECKME: is this right? */
if (((rvupiece == rvuboard) && (upiece == pawn))
- || (upiece == bishop)
-#ifndef MINISHOGI
- || (upiece == knight)
-#endif
+ || typeMask[upiece] & (T_BISHOP | T_KNIGHT)
)
{
s++; /* The opposing pawn (piece) */
{
#ifdef TESUJIBONUS
/* Look at non-promoting silver or knight */
- if (piece == silver
-#ifndef MINISHOGI
- || piece == knight
-#endif
- )
+ if (typeMask[piece] & (T_SILVER | T_KNIGHT))
{
local_flag |= tesuji; /* Non-promotion */
s++;
for (piece = pawn+1; piece <= rook; piece++)
{
- if (
-#ifndef MINISHOGI
- piece == lance ||
-#endif
- piece == bishop || piece == rook)
+ if (typeMask[piece] & (T_LANCE | T_BISHOP | T_ROOK))
{
/* check for threat of xside piece */
ptyp = ptype[side][piece];
king
};
+/* piece mask defines */
+enum {
+ T_PAWN = 1<<pawn,
+#ifndef MINISHOGI
+ T_LANCE = 1<<lance,
+ T_KNIGHT = 1<<knight,
+#endif
+ /* start of pieces that can be dropped at any square */
+ T_SILVER = 1<<silver,
+ T_GOLD = 1<<gold,
+ T_BISHOP = 1<<bishop,
+ T_ROOK = 1<<rook,
+ T_PPAWN = 1<<ppawn,
+#ifndef MINISHOGI
+ T_PLANCE = 1<<plance,
+ T_PKNIGHT = 1<<pknight,
+#endif
+ T_PSILVER = 1<<psilver,
+ T_PBISHOP = 1<<pbishop,
+ T_PROOK = 1<<prook,
+ T_KING = 1<<king
+#ifdef MINISHOGI
+ T_LANCE = 1<<king+1,
+ T_KNIGHT = 1<<king+2,
+#endif
+};
+
/* move types */
enum {
ptype_no_piece = 0,
false, true, true, false
};
+const int typeMask[NO_PIECES] =
+{
+ 0, T_PAWN,
+#ifndef MINISHOGI
+ T_LANCE, T_KNIGHT,
+#endif
+ T_SILVER, T_GOLD, T_BISHOP, T_ROOK,
+ T_PPAWN,
+#ifndef MINISHOGI
+ T_PLANCE, T_PKNIGHT,
+#endif
+ T_PSILVER, T_PBISHOP, T_PROOK, T_KING
+};
+
#ifdef SAVE_DISTDATA
short