X-Git-Url: http://winboard.nl/cgi-bin?p=capablanca.git;a=blobdiff_plain;f=lasker-2.2.3%2Fsrc%2Falgcheck.c;h=219b5de025b6d9d02b3490517d63a3b5f17e8a00;hp=1c1ff75585e17431c7e6f3184d87475a47b38917;hb=15d6762279fb7e4c1fecc81699507d9011287779;hpb=3f31178e2168d0dc5ca0db4e245c63c25bb7ed1d diff --git a/lasker-2.2.3/src/algcheck.c b/lasker-2.2.3/src/algcheck.c index 1c1ff75..219b5de 100644 --- a/lasker-2.2.3/src/algcheck.c +++ b/lasker-2.2.3/src/algcheck.c @@ -248,7 +248,8 @@ static void add_promotion(struct game_state_t *gs, const char *mstr, struct move } 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) { @@ -264,6 +265,7 @@ static void add_promotion(struct game_state_t *gs, const char *mstr, struct move 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; @@ -287,14 +289,24 @@ static void add_promotion(struct game_state_t *gs, const char *mstr, struct move 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; @@ -529,12 +541,18 @@ char *alg_unparse(struct game_state_t * gs, struct move_t * mt) 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, ""); @@ -562,6 +580,7 @@ char *alg_unparse(struct game_state_t * gs, struct move_t * mt) case CARDINAL: strcpy(mStr, "A"); break; + case CAPTAIN: case CANNON: case MARSHALL: strcpy(mStr, "C"); @@ -584,6 +603,7 @@ char *alg_unparse(struct game_state_t * gs, struct move_t * mt) case FERZ2: strcpy(mStr, "F"); break; + case WARLORD: case WOODY: case WAZIR: strcpy(mStr, "W"); @@ -597,6 +617,7 @@ char *alg_unparse(struct game_state_t * gs, struct move_t * mt) case HORSE: case DRAGONHORSE: case HAWK: + case HOPLITE: strcpy(mStr, "H"); break; case HONORABLEHORSE: @@ -605,6 +626,7 @@ char *alg_unparse(struct game_state_t * gs, struct move_t * mt) case DRAGONKING: strcpy(mStr, "D"); break; + case LIEUTENANT: case LANCE: strcpy(mStr, "L"); break; @@ -613,6 +635,7 @@ char *alg_unparse(struct game_state_t * gs, struct move_t * mt) strcpy(mStr, "S"); break; case MASTODON: + case GENERAL: case GOLD: strcpy(mStr, "G"); break; @@ -690,10 +713,13 @@ char *alg_unparse(struct game_state_t * gs, struct move_t * mt) } sprintf(tmp, "%c%d", mt->toFile + 'a', mt->toRank + 1 - (gs->ranks > 9)); strcat(mStr, tmp); - - if ((piece == PAWN || gs->promoType == 3 || gs->drops == 2) && (mt->piecePromotionTo != NOPIECE)) { +suffix: + if ((piece == PAWN || piece == HOPLITE || gs->promoType == 3 || gs->drops == 2) && (mt->piecePromotionTo != NOPIECE)) { strcat(mStr, "="); /* = before promoting piece */ - switch (piecetype(mt->piecePromotionTo)) { + switch (piecetype(abs(mt->piecePromotionTo))) { + case KING: + strcat(mStr, "K"); + break; case KNIGHT: strcat(mStr, "N"); break; @@ -707,6 +733,7 @@ char *alg_unparse(struct game_state_t * gs, struct move_t * mt) strcat(mStr, "A"); break; case MARSHALL: + case CAPTAIN: strcat(mStr, "C"); break; case MAN: @@ -718,6 +745,7 @@ char *alg_unparse(struct game_state_t * gs, struct move_t * mt) case FERZ2: strcat(mStr, "F"); break; + case WARLORD: case WOODY: strcat(mStr, "W"); break; @@ -735,8 +763,7 @@ char *alg_unparse(struct game_state_t * gs, struct move_t * mt) strcat(mStr, "O"); break; case MASTODON: - strcat(mStr, "G"); - break; + case GENERAL: case GOLD: // [HGM] Shogi promotions: avoid use of '+' strcat(mStr, "G"); break; @@ -747,6 +774,9 @@ char *alg_unparse(struct game_state_t * gs, struct move_t * mt) case DRAGONKING: strcat(mStr, "D"); break; + case LIEUTENANT: + strcat(mStr, "L"); + break; default: break; }