X-Git-Url: http://winboard.nl/cgi-bin?p=capablanca.git;a=blobdiff_plain;f=lasker-2.2.3%2Fsrc%2Falgcheck.c;h=aa7d5af20234175f5e72457413e08fda8c3ca4e7;hp=3efc4ce34ed04d60441290a7cb8b5d9645cc0971;hb=ec7b6bb32ba9632cda17b308808ce9ba1e27c090;hpb=de64701702c2b4d4d951be0e77afeda5177bc494 diff --git a/lasker-2.2.3/src/algcheck.c b/lasker-2.2.3/src/algcheck.c index 3efc4ce..aa7d5af 100644 --- a/lasker-2.2.3/src/algcheck.c +++ b/lasker-2.2.3/src/algcheck.c @@ -106,9 +106,9 @@ static int get_move_info(const char *str, int *piece, int *ff, int *fr, int *tf, case 'r': if ((tmp[j] < '0') || (tmp[j] > '9')) // [HGM] also match 0- and 9-rank goto nomatch; - if (ltr == ALG_UNKNOWN) - ltr = tmp[j] - '0'; // [HGM] allow 0-rank for Xiangqi, correct later - else + if (ltr == ALG_UNKNOWN) + ltr = tmp[j] - '0'; // [HGM] allow 0-rank for Xiangqi, correct later + else lfr = tmp[j] - '0'; break; case 'p': @@ -261,18 +261,18 @@ static void add_promotion(struct game_state_t *gs, const char *mstr, struct move case 'q': piece = QUEEN; break; - case 'c': - if(!gs->capablancaPieces) return; // [HGM] should make variant-dependent piece mask - piece = MARSHALL; - break; - case 'a': - if(!gs->capablancaPieces) return; - piece = CARDINAL; - break; - case 'm': - if(!gs->royalKnight) return; // [HGM] only in knightmate - piece = MAN; - break; + case 'c': + if(!gs->capablancaPieces) return; // [HGM] should make variant-dependent piece mask + piece = MARSHALL; + break; + case 'a': + if(!gs->capablancaPieces) return; + piece = CARDINAL; + break; + case 'm': + if(!gs->royalKnight) return; // [HGM] only in knightmate + piece = MAN; + break; case 'r': piece = ROOK; break; @@ -280,7 +280,7 @@ static void add_promotion(struct game_state_t *gs, const char *mstr, struct move piece = BISHOP; break; case 'n': - if(gs->royalKnight) return; // [HGM] not in knightmate + if(gs->royalKnight) return; // [HGM] not in knightmate piece = KNIGHT; break; // Superchess promotons: filtered out later by promoType @@ -296,18 +296,22 @@ static void add_promotion(struct game_state_t *gs, const char *mstr, struct move case 'v': piece = CENTAUR; break; - case 'e': - piece = EMPRESS; + case 'e': + piece = gs->drops == 2 ? SELEPHANT : EMPRESS; // for Seirawan break; case 's': piece = PRINCESS; break; + case 'h': + if(gs->drops != 2) return; + piece = HAWK; + break; default: return; } i = colorval(gs->board[mt->fromFile][mt->fromRank]) == WHITE ? 0 : 1; if(gs->promoType == 2 && gs->holding[i][piece-1] == 0) return; // only if piece was captured - if(piece >= WOODY && (gs->promoType != 2 || gs->promoZone == 3)) return; // reserved for Superchess + if(piece >= WOODY && piece < KING && (gs->promoType != 2 || gs->promoZone == 3)) return; // reserved for Superchess mt->piecePromotionTo = piece | colorval(gs->board[mt->fromFile][mt->fromRank]); } @@ -322,13 +326,13 @@ int alg_parse_move(char *mstr, struct game_state_t * gs, struct move_t * mt) d_printf( "CHESSD: Shouldn't try to algebraicly parse non-algabraic move string.\n"); return MOVE_ILLEGAL; } - // [HGM] check if move does not stray off board - if(gs->ranks < 10) { - if(tr == 0 || fr == 0) return MOVE_ILLEGAL; // used nonexistent 0-rank - if(tr != ALG_UNKNOWN) tr--; if(fr != ALG_UNKNOWN) fr--; // shift to lowest rank = 1 - } - if(tr >= gs->ranks || fr >= gs->ranks || tf >= gs->files || ff >= gs->files) - return MOVE_ILLEGAL; + // [HGM] check if move does not stray off board + if(gs->ranks < 10) { + if(tr == 0 || fr == 0) return MOVE_ILLEGAL; // used nonexistent 0-rank + if(tr != ALG_UNKNOWN) tr--; if(fr != ALG_UNKNOWN) fr--; // shift to lowest rank = 1 + } + if(tr >= gs->ranks || fr >= gs->ranks || tf >= gs->files || ff >= gs->files) + return MOVE_ILLEGAL; // [HGM] resolve ambiguity in piece, type based on variant switch(piece) { @@ -371,7 +375,7 @@ int alg_parse_move(char *mstr, struct game_state_t * gs, struct move_t * mt) if(strstr(gs->variant, "great")) piece = MASTODON; break; } - + /* Resolve ambiguities in to-ness */ if (tf == ALG_UNKNOWN) { d_printf("Ambiguous %s(%d)\n", __FUNCTION__, __LINE__); @@ -521,14 +525,14 @@ 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"); - goto check; - } + 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"); + goto check; + } strcpy(mStr, ""); switch (piece) { case PAWN: @@ -551,16 +555,16 @@ char *alg_unparse(struct game_state_t * gs, struct move_t * mt) break; case ALFIL2: case AMAZON: - case CARDINAL: - strcpy(mStr, "A"); - break; + case CARDINAL: + strcpy(mStr, "A"); + break; case CANNON: - case MARSHALL: - strcpy(mStr, "C"); - break; - case MAN: - strcpy(mStr, "M"); - break; + case MARSHALL: + strcpy(mStr, "C"); + break; + case MAN: + strcpy(mStr, "M"); + break; case FERZ: case QUEEN: strcpy(mStr, "Q"); @@ -625,8 +629,8 @@ char *alg_unparse(struct game_state_t * gs, struct move_t * mt) /* Checks for ambiguity in short notation ( Ncb3, R8e8 or so) */ if (piece != PAWN) { ambig = r_ambig = f_ambig = 0; - for (r = 0; r < gs->ranks; r++) - for (f = 0; f < gs->files; f++) { + for (r = 0; r < gs->ranks; r++) + for (f = 0; f < gs->files; f++) { if ((gs->board[f][r] != NOPIECE) && iscolor(gs->board[f][r], gs->onMove) && (piecetype(gs->board[f][r]) == piece) && ((f != mt->fromFile) || (r != mt->fromRank))) { @@ -660,87 +664,89 @@ char *alg_unparse(struct game_state_t * gs, struct move_t * mt) } } } - if (ambig > 0) { - /* Ambiguity in short notation, need to add file,rank or _both_ in - notation */ - if (f_ambig == 0) { - sprintf(tmp, "%c", mt->fromFile + 'a'); - strcat(mStr, tmp); - } else if (r_ambig == 0) { - sprintf(tmp, "%d", mt->fromRank + 1 - (gs->ranks > 9)); - strcat(mStr, tmp); - } else { - sprintf(tmp, "%c%d", mt->fromFile + 'a', mt->fromRank + 1 - (gs->ranks > 9)); - strcat(mStr, tmp); - } - } - } - if ((gs->board[mt->toFile][mt->toRank] != NOPIECE) || - ((piece == PAWN) && (mt->fromFile != mt->toFile))) { - strcat(mStr, "x"); - } - } - 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)) { - strcat(mStr, "="); /* = before promoting piece */ - switch (piecetype(mt->piecePromotionTo)) { - case KNIGHT: - strcat(mStr, "N"); - break; - case BISHOP: - strcat(mStr, "B"); - break; - case ROOK: - strcat(mStr, "R"); - break; - case CARDINAL: - strcat(mStr, "A"); - break; - case MARSHALL: - strcat(mStr, "C"); - break; - case MAN: - strcat(mStr, "M"); - break; - case QUEEN: - strcat(mStr, "Q"); - break; - case FERZ2: - strcat(mStr, "F"); - break; - case WOODY: - strcat(mStr, "W"); - break; - case EMPRESS: - strcat(mStr, "E"); - break; - case CENTAUR: - strcat(mStr, "V"); - break; - case PRINCESS: - strcat(mStr, "S"); - break; - case SQUIRREL: - strcat(mStr, "O"); - break; - case MASTODON: - strcat(mStr, "G"); - break; - case GOLD: // [HGM] Shogi promotions: avoid use of '+' - strcat(mStr, "G"); - break; - case DRAGONHORSE: - strcat(mStr, "H"); - break; - case DRAGONKING: - strcat(mStr, "D"); - break; - default: - break; - } - } + if (ambig > 0) { + /* Ambiguity in short notation, need to add file,rank or _both_ in + notation */ + if (f_ambig == 0) { + sprintf(tmp, "%c", mt->fromFile + 'a'); + strcat(mStr, tmp); + } else if (r_ambig == 0) { + sprintf(tmp, "%d", mt->fromRank + 1 - (gs->ranks > 9)); + strcat(mStr, tmp); + } else { + sprintf(tmp, "%c%d", mt->fromFile + 'a', mt->fromRank + 1 - (gs->ranks > 9)); + strcat(mStr, tmp); + } + } + } + if ((gs->board[mt->toFile][mt->toRank] != NOPIECE) || + ((piece == PAWN) && (mt->fromFile != mt->toFile))) { + strcat(mStr, "x"); + } + } + 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)) { + strcat(mStr, "="); /* = before promoting piece */ + switch (piecetype(mt->piecePromotionTo)) { + case KNIGHT: + strcat(mStr, "N"); + break; + case BISHOP: + strcat(mStr, "B"); + break; + case ROOK: + strcat(mStr, "R"); + break; + case CARDINAL: + strcat(mStr, "A"); + break; + case MARSHALL: + strcat(mStr, "C"); + break; + case MAN: + strcat(mStr, "M"); + break; + case QUEEN: + strcat(mStr, "Q"); + break; + case FERZ2: + strcat(mStr, "F"); + break; + case WOODY: + strcat(mStr, "W"); + break; + case SELEPHANT: + case EMPRESS: + strcat(mStr, "E"); + break; + case CENTAUR: + strcat(mStr, "V"); + break; + case PRINCESS: + strcat(mStr, "S"); + break; + case SQUIRREL: + strcat(mStr, "O"); + break; + case MASTODON: + strcat(mStr, "G"); + break; + case GOLD: // [HGM] Shogi promotions: avoid use of '+' + strcat(mStr, "G"); + break; + case HAWK: + case DRAGONHORSE: + strcat(mStr, "H"); + break; + case DRAGONKING: + strcat(mStr, "D"); + break; + default: + break; + } + } check:; fakeMove = *gs; execute_move(&fakeMove, mt, 0);