int err, pos = -1;
GameMode oldGameMode;
VariantClass v, oldVariant = gameInfo.variant; /* [HGM] PGNvariant */
- char oldName[MSG_SIZ];
+ char oldName[MSG_SIZ], vs = 0;
safeStrCpy(oldName, engineVariant, MSG_SIZ); v = oldVariant;
if (!err) numPGNTags++;
/* [HGM] PGNvariant: automatically switch to variant given in PGN tag */
- if(gameInfo.variant != oldVariant && (gameInfo.variant != VariantNormal || gameInfo.variantName == NULL || *gameInfo.variantName == NULLCHAR)) {
+ if(gameInfo.variant != oldVariant && gameInfo.variant != VariantUnknown &&
+ (gameInfo.variant != VariantNormal || gameInfo.variantName == NULL || *gameInfo.variantName == NULLCHAR) || vs) {
startedFromPositionFile = FALSE; /* [HGM] loadPos: variant switch likely makes position invalid */
ResetFrontEnd(); // [HGM] might need other bitmaps. Cannot use Reset() because it clears gameInfo :-(
InitPosition(TRUE);
- oldVariant = gameInfo.variant;
+ oldVariant = gameInfo.variant; vs++; // force obeying second variant switch
if (appData.debugMode)
fprintf(debugFP, "New variant %d\n", (int) oldVariant);
}
success = TRUE;
} else if (StrCaseCmp(name, "Variant") == 0) {
/* xboard-defined extension */
+ int oldVariant = gameInfo->variant;
success = StrSavePtr(value, &gameInfo->variantName) != NULL;
if(*value && strcmp(value, engineVariant)) // keep current engine-defined variant if it matches
gameInfo->variant = StringToVariant(value);
+ if(oldVariant != VariantNormal) safeStrCpy(engineVariant, value, MSG_SIZ);
+ } else if (StrCaseCmp(name, "VariantFamily") == 0) {
+ /* xboard-defined extension */
+ gameInfo->variant = StringToVariant(value);
} else if (StrCaseCmp(name, "VariantMen") == 0) {
success = LoadPieceDesc(value);
} else if (StrCaseCmp(name, PGN_OUT_OF_BOOK) == 0) {
fprintf(fp, "[BlackElo \"%d\"]\n", gameInfo->blackRating);
if (gameInfo->timeControl)
fprintf(fp, "[TimeControl \"%s\"]\n", gameInfo->timeControl);
- if (gameInfo->variant != VariantNormal)
+ if (gameInfo->variant != VariantNormal) {
+ char c = *engineVariant;
fprintf(fp, "[Variant \"%s\"]\n", VariantName(gameInfo->variant));
+ if(c) {
+ *engineVariant = NULLCHAR;
+ fprintf(fp, "[VariantFamily \"%s\"]\n", VariantName(gameInfo->variant));
+ *engineVariant = c;
+ }
+ }
if (*(p = CollectPieceDescriptors()))
fprintf(fp, "[VariantMen \"%s\"]\n", p);
if (gameInfo->extraTags)
if (gameInfo->whiteRating >= 0) len += 40;
if (gameInfo->blackRating >= 0) len += 40;
if (gameInfo->timeControl) len += strlen(gameInfo->timeControl) + 20;
- if (gameInfo->variant != VariantNormal) len += 50;
+ if (gameInfo->variant != VariantNormal) len += strlen(engineVariant) + 150;
if (gameInfo->extraTags) len += strlen(gameInfo->extraTags);
buf = malloc(len);
p += sprintf(p, "[BlackElo \"%d\"]\n", gameInfo->blackRating);
if (gameInfo->timeControl)
p += sprintf(p, "[TimeControl \"%s\"]\n", gameInfo->timeControl);
- if (gameInfo->variant != VariantNormal)
- p += sprintf(p, "[Variant \"%s\"]\n", VariantName(gameInfo->variant));
+ if (gameInfo->variant != VariantNormal) {
+ char c = *engineVariant;
+ p += sprintf(p, "[Variant \"%s\"]\n", VariantName(gameInfo->variant));
+ if(c) {
+ *engineVariant = NULLCHAR;
+ p += sprintf(p, "[VariantFamily \"%s\"]\n", VariantName(gameInfo->variant));
+ *engineVariant = c;
+ }
+ }
if (gameInfo->extraTags)
strcpy(p, gameInfo->extraTags);
return buf;