return;
}
+ 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) {
return;
}
if (mt->toRank < gs->ranks - gs->promoZone && mt->toRank >= gs->promoZone) {
return;
}
+ }
switch (tolower(s[1])) {
case 'f':
switch(piece) {
case ELEPHANT:
if(strstr(gs->variant, "super")) piece = EMPRESS; else
+ if(strstr(gs->variant, "seirawan"))piece = SELEPHANT; else
if(strstr(gs->variant, "great")) piece = MODERNELEPHANT; else
if(strstr(gs->variant, "courier")) piece = ALFIL2;
break;
if(strstr(gs->variant, "great")) piece = MINISTER;
break;
case HORSE:
+ if(strstr(gs->variant, "shogi")) piece = DRAGONHORSE; else
+ if(strstr(gs->variant, "seirawan")) piece = HAWK; else
if(strstr(gs->variant, "great")) piece = PRIESTESS;
- if(strstr(gs->variant, "shogi")) piece = DRAGONHORSE;
break;
case GOLD:
if(strstr(gs->variant, "great")) piece = MASTODON;
piece = piecetype(gs->board[mt->fromFile][mt->fromRank]);
}
- if ((mt->fromFile == ALG_CASTLE) && (mt->toFile > mt->toRank)) { // [HGM] castle: K ends right of R
- strcpy(mStr, "O-O");
- goto check;
- }
- if ((mt->fromFile == ALG_CASTLE) && (mt->toFile < mt->toRank)) { // [HGM] castle: K ends left of R
- strcpy(mStr, "O-O-O");
+ if (mt->fromFile == ALG_CASTLE) {
+ int r = gs->onMove == WHITE ? 1 : gs->ranks;
+ if(mt->toFile > mt->toRank) { // [HGM] castle: K ends right of R
+ strcpy(mStr, "O-O");
+ }
+ if (mt->toFile < mt->toRank) { // [HGM] castle: K ends left of R
+ strcpy(mStr, "O-O-O");
+ }
+ if(gs->drops == 2) {
+ if(mt->piecePromotionTo < 0) snprintf(mStr, 20, "%c%de%d", mt->fromRank + 'a', r, r);
+ goto suffix; // [HGM] in Seirawan castling can have gating suffix
+ }
goto check;
}
strcpy(mStr, "");
break;
case EMPRESS:
case ELEPHANT:
+ case SELEPHANT:
strcpy(mStr, "E");
break;
case ALFIL:
strcpy(mStr, "V");
break;
case HORSE:
+ case DRAGONHORSE:
+ case HAWK:
strcpy(mStr, "H");
break;
case HONORABLEHORSE:
case DRAGONKING:
strcpy(mStr, "D");
break;
- case DRAGONHORSE:
- strcpy(mStr, "H");
- break;
case LANCE:
strcpy(mStr, "L");
break;
}
sprintf(tmp, "%c%d", mt->toFile + 'a', mt->toRank + 1 - (gs->ranks > 9));
strcat(mStr, tmp);
-
- if ((piece == PAWN || gs->promoType == 3) && (mt->piecePromotionTo != NOPIECE)) {
+suffix:
+ if ((piece == PAWN || gs->promoType == 3 || gs->drops == 2) && (mt->piecePromotionTo != NOPIECE)) {
strcat(mStr, "="); /* = before promoting piece */
- switch (piecetype(mt->piecePromotionTo)) {
+ switch (piecetype(abs(mt->piecePromotionTo))) {
case KNIGHT:
strcat(mStr, "N");
break;