matchVal = i;
nomatch:;
}
+
if (matchVal != -1)
return MS_ALG;
else
if (s == NULL) {
return;
}
-
if(gs->promoType == 3) { // handle Shogi promotions
piece = gs->board[mt->fromFile][mt->fromRank];
if(colorval(piece) == WHITE && mt->fromRank < gs->ranks - gs->ranks/3
if (piecetype(gs->board[mt->fromFile][mt->fromRank]) != PAWN) {
return;
}
- if (mt->toRank != gs->ranks-1 && mt->toRank != 0) {
+ if (mt->toRank < gs->ranks - gs->promoZone && mt->toRank >= gs->promoZone) {
return;
}
default:
return;
}
-
i = colorval(gs->board[mt->fromFile][mt->fromRank]) == WHITE ? 0 : 1;
- if(piece >= WOODY && (gs->promoType != 2 || gs->holding[i][piece-1] == 0)) return;
+ if(gs->promoType == 2 && gs->holding[i][piece-1] == 0) return; // only if piece was captured
+ if(piece >= WOODY && (gs->promoType != 2 || gs->promoZone == 3)) return; // reserved for Superchess
mt->piecePromotionTo = piece | colorval(gs->board[mt->fromFile][mt->fromRank]);
}
d_printf( "CHESSD: Shouldn't try to algebraicly parse non-algabraic move string.\n");
return MOVE_ILLEGAL;
}
- \r
// [HGM] check if move does not stray off board\r
if(gs->ranks < 10) { \r
if(tr == 0 || fr == 0) return MOVE_ILLEGAL; // used nonexistent 0-rank\r
// note that the interpretation Bxc4 is matched last, and has set piece to BISHOP
continue;
}
-
if (legal_andcheck_move(gs, f, r, tf, tr)) {
if ((piecetype(gs->board[f][r]) == PAWN) && (f != tolower(mstr[0]) - 'a')) {
continue;
} else
if ((piecetype(gs->board[mt->fromFile][mt->fromRank]) == PAWN) &&
!gs->palace && // [HGM] XQ: no promotions in xiangqi\r
- ((mt->toRank == 0) || (mt->toRank == gs->ranks-1))) {
+ ((mt->toRank < gs->promoZone) || (mt->toRank >= gs->ranks - gs->promoZone))) {
+ int stm = colorval(gs->board[mt->fromFile][mt->fromRank]);
+ if(!promote && (mt->toRank == 0 || mt->toRank == gs->ranks-1)) { // promotion obligatory, but not specified
+ if(gs->promoType != 2) promote = QUEEN; else { // choose a default
+ for(promote=KING-1; promote>PAWN; promote--) if(gs->holding[stm == BLACK][promote-1]) break;
+ if(promote == PAWN) return MOVE_ILLEGAL; // nothing available
+ }
+ } // if not obligatory, we defer unless promoton was explicitly specified!
if(!gs->pawnDblStep && promote == PRINCESS) promote = MAN2;
if(!gs->pawnDblStep && promote != FERZ2 && promote != MAN2) promote = FERZ; // [HGM] kludge to recognize shatranj
- mt->piecePromotionTo = promote |\r
- (colorval(gs->board[mt->fromFile][mt->fromRank]));\r
+ // non-promotion can still be an option for deeper promotion zones
+ mt->piecePromotionTo = promote ? (promote | stm) : NOPIECE;
+ if(promote && gs->promoType == 2 && !gs->holding[stm == BLACK][promote-1]) return MOVE_ILLEGAL; // unavailable piece specified
} else {\r
mt->piecePromotionTo = NOPIECE;\r
}\r
\r
sprintf(mt->algString, alg_unparse(gs, mt));\r
fakeMove = *gs;\r
- /* Calculates enPassant also */\r
+ /* Calculates enPassant also */
execute_move(&fakeMove, mt, 0);\r
\r
/* Does making this move leave ME in check? */\r
int tFile, int tRank)
{
struct move_t mt;
+
if (!legal_move(gs, fFile, fRank, tFile, tRank))
return 0;
mt.color = gs->onMove;
mt.toFile = tFile;
mt.toRank = tRank;
/* This should take into account a pawn promoting to another piece */
- if (move_calculate(gs, &mt, QUEEN) == MOVE_OK)
+ if (move_calculate(gs, &mt, NOPIECE) == MOVE_OK)
return 1;
else
return 0;
\r
if (mt->piecePromotionTo != NOPIECE) {
promote = piecetype(mt->piecePromotionTo);\r
-printf("promotion piece = %d, type = %d",mt->piecePromotionTo, promote);\r
}\r
\r
return move_calculate(gs, mt, promote);\r
for (i = 0; i < gs->files; i++) {\r
gs->ep_possible[0][i] = 0;\r
gs->ep_possible[1][i] = 0;\r
- }\r
+ }
/* Added by Sparky 3/16/95
From soso@Viktoria.drp.fmph.uniba.sk Thu Mar 16 13:08:51 1995
return MOVE_NOMATERIAL;\r
} else {\r
gs->onMove = CToggle(gs->onMove);\r
- }\r
+ }
+\r
return MOVE_OK;\r
}