X-Git-Url: http://winboard.nl/cgi-bin?p=capablanca.git;a=blobdiff_plain;f=lasker-2.2.3%2Fsrc%2Fgameproc.c;h=ec6918cd4aa1d02737de7df72c5f9b273ff4bafa;hp=a0dba3fe1f2aae1d89b8f5fd97e02ab9bcdff586;hb=d047d3cf2718e831b4cb81aba3c4111c041fc22d;hpb=f5c9190f7e3996a99564e4b54f60641d2b5aaad7 diff --git a/lasker-2.2.3/src/gameproc.c b/lasker-2.2.3/src/gameproc.c index a0dba3f..ec6918c 100644 --- a/lasker-2.2.3/src/gameproc.c +++ b/lasker-2.2.3/src/gameproc.c @@ -413,8 +413,17 @@ static int was_promoted(struct game *g, int f, int r) for (i = g->numHalfMoves-2; i > 0; i -= 2) { if (g->moveList[i].toFile == f && g->moveList[i].toRank == r) { - if (g->moveList[i].piecePromotionTo) - return 1; + if (g->moveList[i].piecePromotionTo) { + switch(g->moveList[i].moveString[0]) { // [HGM] return original piece type rather than just TRUE + case 'P': return PAWN; + case 'N': return KNIGHT; + case 'B': return BISHOP; + case 'R': return ROOK; + case 'L': return LANCE; + case 'S': return SILVER; + default: return GOLD; + } + } if (g->moveList[i].fromFile == ALG_DROP) return 0; f = g->moveList[i].fromFile; @@ -550,6 +559,7 @@ void process_move(int p, char *command) return; } } + pp->promote = NOPIECE; // [HGM] this seemed to be uninitialized, which caused spurious promotion in Shogi if ((len = strlen(command)) > 1) { if (command[len - 2] == '=') { printf("promo '%s'\n", command); @@ -598,6 +608,14 @@ printf("promo '%s'\n", command); case 'g': pp->promote = MASTODON; break; + // Shogi promotions + case '^': + case '+': + pp->promote = GOLD; + break; + case '=': + pp->promote = NOPIECE; + break; default: pprintf(p, "Don't understand that move.\n"); return; @@ -675,14 +693,14 @@ printf("promo '%s'\n", command); if (result == MOVE_OK && (gg->link >= 0 || gg->game_state.holdings) && move.pieceCaptured != NOPIECE) { /* transfer captured piece to partner */ /* check if piece reverts to a pawn */ - int victim = move.pieceCaptured, partner = gg->link; + int victim = move.pieceCaptured, partner = gg->link, demoted; // [HGM] zh: if not Bughouse, the game_state.holdings field decides what happens if(gg->link < 0) { partner = g; // pieces stay with current board if(gg->game_state.holdings == -1) victim ^= WHITE|BLACK; // flip color } - if (was_promoted(&game_globals.garray[g], move.toFile, move.toRank)) - update_holding(partner, colorval(victim) | PAWN); // [HGM] todo: for Shogi we would have to demote differently! + if (demoted = was_promoted(&game_globals.garray[g], move.toFile, move.toRank)) + update_holding(partner, colorval(victim) | demoted); // [HGM] was_promoted now returns original piece type else update_holding(partner, victim); }