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 HONORABLEHORSE; // !!! this is Shogi, so no 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;
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);
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;
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);
}