}
if(gs->drops != 2 || (gs->onMove == WHITE ? 0 : gs->ranks-1) != mt->fromRank) { // [HGM] always accept if backrank mover in Seirawan
- if (piecetype(gs->board[mt->fromFile][mt->fromRank]) != PAWN) {
+ if (piecetype(gs->board[mt->fromFile][mt->fromRank]) != PAWN &&
+ piecetype(gs->board[mt->fromFile][mt->fromRank]) != HOPLITE) {
return;
}
if (mt->toRank < gs->ranks - gs->promoZone && mt->toRank >= gs->promoZone) {
piece = QUEEN;
break;
case 'c':
+ if(piecetype(gs->board[mt->fromFile][mt->fromRank]) == HOPLITE) piece = CAPTAIN; else
if(!gs->capablancaPieces) return; // [HGM] should make variant-dependent piece mask
piece = MARSHALL;
break;
break;
// Superchess promotons: filtered out later by promoType
case 'g':
+ if(piecetype(gs->board[mt->fromFile][mt->fromRank]) == HOPLITE) piece = GENERAL; else
piece = MASTODON;
break;
case 'o':
piece = SQUIRREL;
break;
case 'w':
+ if(piecetype(gs->board[mt->fromFile][mt->fromRank]) == HOPLITE) piece = WARLORD; else
piece = WOODY;
break;
+ case 'k':
+ if(piecetype(gs->board[mt->fromFile][mt->fromRank]) != HOPLITE) return;
+ piece = KING;
+ break;
+ case 'l':
+ if(piecetype(gs->board[mt->fromFile][mt->fromRank]) != HOPLITE) return;
+ piece = LIEUTENANT;
+ break;
case 'v':
piece = CENTAUR;
break;
case CARDINAL:
strcpy(mStr, "A");
break;
+ case CAPTAIN:
case CANNON:
case MARSHALL:
strcpy(mStr, "C");
case FERZ2:
strcpy(mStr, "F");
break;
+ case WARLORD:
case WOODY:
case WAZIR:
strcpy(mStr, "W");
case HORSE:
case DRAGONHORSE:
case HAWK:
+ case HOPLITE:
strcpy(mStr, "H");
break;
case HONORABLEHORSE:
case DRAGONKING:
strcpy(mStr, "D");
break;
+ case LIEUTENANT:
case LANCE:
strcpy(mStr, "L");
break;
strcpy(mStr, "S");
break;
case MASTODON:
+ case GENERAL:
case GOLD:
strcpy(mStr, "G");
break;
sprintf(tmp, "%c%d", mt->toFile + 'a', mt->toRank + 1 - (gs->ranks > 9));
strcat(mStr, tmp);
suffix:
- if ((piece == PAWN || gs->promoType == 3 || gs->drops == 2) && (mt->piecePromotionTo != NOPIECE)) {
+ if ((piece == PAWN || piece == HOPLITE || gs->promoType == 3 || gs->drops == 2) && (mt->piecePromotionTo != NOPIECE)) {
strcat(mStr, "="); /* = before promoting piece */
switch (piecetype(abs(mt->piecePromotionTo))) {
+ case KING:
+ strcat(mStr, "K");
+ break;
case KNIGHT:
strcat(mStr, "N");
break;
strcat(mStr, "A");
break;
case MARSHALL:
+ case CAPTAIN:
strcat(mStr, "C");
break;
case MAN:
case FERZ2:
strcat(mStr, "F");
break;
+ case WARLORD:
case WOODY:
strcat(mStr, "W");
break;
strcat(mStr, "O");
break;
case MASTODON:
- strcat(mStr, "G");
- break;
+ case GENERAL:
case GOLD: // [HGM] Shogi promotions: avoid use of '+'
strcat(mStr, "G");
break;
case DRAGONKING:
strcat(mStr, "D");
break;
+ case LIEUTENANT:
+ strcat(mStr, "L");
+ break;
default:
break;
}