X-Git-Url: http://winboard.nl/cgi-bin?p=capablanca.git;a=blobdiff_plain;f=lasker-2.2.3%2Fsrc%2Fmovecheck.c;h=30ada65a3b6797751c188110bc5da3f9020402a3;hp=c0dd853effa9629da1f31b236b18ffc5b9119b5b;hb=8d865da206fa04e0642d6a134a85b12a068ed0ac;hpb=d047d3cf2718e831b4cb81aba3c4111c041fc22d diff --git a/lasker-2.2.3/src/movecheck.c b/lasker-2.2.3/src/movecheck.c index c0dd853..30ada65 100644 --- a/lasker-2.2.3/src/movecheck.c +++ b/lasker-2.2.3/src/movecheck.c @@ -218,7 +218,7 @@ static int legal_honorablehorse_move(struct game_state_t * gs, int ff, int fr, i 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; } @@ -1303,6 +1303,21 @@ int legal_move(struct game_state_t * gs, 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; rranks; 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; @@ -1495,7 +1510,7 @@ static int move_calculate(struct game_state_t * gs, struct move_t * mt, int prom switch(piecetype(piece)) { case PAWN: case LANCE: - case KNIGHT: + case HONORABLEHORSE: case SILVER: promote = GOLD; break; case BISHOP: @@ -1506,7 +1521,7 @@ static int move_calculate(struct game_state_t * gs, struct move_t * mt, int prom } } 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: @@ -1613,7 +1628,7 @@ int in_check(struct game_state_t * gs) } for (InitPieceLoop(gs->board, &f, &r, gs->onMove); NextPieceLoop(gs->board, &f, &r, gs->onMove, gs->files, gs->ranks);) { - if (legal_move(gs, f, r, kf, kr)) { /* In Check? */ + if (legal_move(gs, f, r, kf, kr)) { /* In Check? */ return 1; } }