dx = ff - tf;
dy = fr - tr;
- if (dy == gs->onMove == WHITE ? 2 : -2) {
+ if (dy == (gs->onMove == WHITE ? -2 : 2)) {
if (abs(dx) == 1)
return 1;
}
return 0;
if (gs->board[tFile][tRank] != NOPIECE)
return 0;
+ if (gs->promoType == 3) { // Shogi
+ int r;
+ switch(move_piece) {
+ case PAWN: // check for own Pawn in same file
+ for(r=0; r<gs->ranks; r++) if(gs->board[tFile][r] == (gs->onMove|PAWN)) return 0;
+ case LANCE: // Pawns and Lances not on last rank
+ if(gs->onMove == WHITE && tRank >= gs->ranks-1) return 0;
+ if(gs->onMove == BLACK && tRank < 1) return 0;
+ break;
+ case HONORABLEHORSE: // Knights at least two ranks from edge
+ if(gs->onMove == WHITE && tRank >= gs->ranks-2) return 0;
+ if(gs->onMove == BLACK && tRank < 2) return 0;
+ default: ;
+ }
+ } else
if (move_piece == PAWN && (tRank == 0 || tRank == gs->ranks-1))
return 0;
return 1;
switch(piecetype(piece)) {
case PAWN:
case LANCE:
- case KNIGHT:
+ case HONORABLEHORSE:
case SILVER:
promote = GOLD; break;
case BISHOP:
}
} else
switch(piecetype(piece)) { // force mandatory promotions
- case KNIGHT:
+ case HONORABLEHORSE:
if(mt->toRank == 1 || mt->toRank == gs->files-2) promote = GOLD;
case PAWN:
case LANCE:
}\r
for (InitPieceLoop(gs->board, &f, &r, gs->onMove);\r
NextPieceLoop(gs->board, &f, &r, gs->onMove, gs->files, gs->ranks);) {\r
- if (legal_move(gs, f, r, kf, kr)) { /* In Check? */\r
+ if (legal_move(gs, f, r, kf, kr)) { /* In Check? */
return 1;\r
}\r
}\r