sprintf(timestamp, "%s", getCurrentTimestamp());
sprintf(basename_raw, "%s-%s", timestamp, name);
sprintf(timestamp, "%s", getCurrentTimestamp());
sprintf(basename_raw, "%s-%s", timestamp, name);
- sprintf(basename, "%s-%08x", timestamp, get_hash_from_key(basename_raw));
+ sprintf(basename, "%s-%08x", timestamp, get_hash_from_string(basename_raw));
boolean want_1 = (prefer_2 == FALSE);
boolean want_2 = (prefer_2 == TRUE);
boolean has_only_1 = (!*artwork_set && !*artwork_set_2);
boolean has_only_2 = (!*artwork_set && !*artwork_set_1);
char *artwork_set_new = NULL;
boolean want_1 = (prefer_2 == FALSE);
boolean want_2 = (prefer_2 == TRUE);
boolean has_only_1 = (!*artwork_set && !*artwork_set_2);
boolean has_only_2 = (!*artwork_set && !*artwork_set_1);
char *artwork_set_new = NULL;
+ // replace missing special artwork 1 or 2 with (optional) standard artwork
+
+ if (!*artwork_set_1)
+ setString(artwork_set_1, *artwork_set);
+
+ if (!*artwork_set_2)
+ setString(artwork_set_2, *artwork_set);
+
+ // set standard artwork to either special artwork 1 or 2, as requested
+
-int hash_keys_are_equal(void *key1, void *key2)
+unsigned int get_hash_from_integer(void *key)
+{
+ unsigned int hash = PTR_TO_UINT(key);
+
+ return hash;
+}
+
+int hash_key_strings_are_equal(void *key1, void *key2)
- create_hashtable(16, 0.75, get_hash_from_key, hash_keys_are_equal);
+ create_hashtable(get_hash_from_string, hash_key_strings_are_equal, free, free);
#define LEVELINFO_TOKEN_HANDICAP 29
#define LEVELINFO_TOKEN_TIME_LIMIT 30
#define LEVELINFO_TOKEN_SKIP_LEVELS 31
#define LEVELINFO_TOKEN_HANDICAP 29
#define LEVELINFO_TOKEN_TIME_LIMIT 30
#define LEVELINFO_TOKEN_SKIP_LEVELS 31
-#define LEVELINFO_TOKEN_USE_EMC_TILES 32
-#define LEVELINFO_TOKEN_INFO_SCREENS_FROM_MAIN 33
+#define LEVELINFO_TOKEN_ALLOW_SKIPPING_LEVELS 32
+#define LEVELINFO_TOKEN_USE_EMC_TILES 33
+#define LEVELINFO_TOKEN_INFO_SCREENS_FROM_MAIN 34
{ TYPE_BOOLEAN, &ldi.latest_engine, "latest_engine" },
{ TYPE_BOOLEAN, &ldi.level_group, "level_group" },
{ TYPE_BOOLEAN, &ldi.readonly, "readonly" },
{ TYPE_BOOLEAN, &ldi.latest_engine, "latest_engine" },
{ TYPE_BOOLEAN, &ldi.level_group, "level_group" },
{ TYPE_BOOLEAN, &ldi.readonly, "readonly" },
+ { TYPE_STRING, &ldi.graphics_set_ecs, "graphics_set.old" },
+ { TYPE_STRING, &ldi.graphics_set_aga, "graphics_set.new" },
{ TYPE_STRING, &ldi.graphics_set_ecs, "graphics_set.ecs" },
{ TYPE_STRING, &ldi.graphics_set_aga, "graphics_set.aga" },
{ TYPE_STRING, &ldi.graphics_set, "graphics_set" },
{ TYPE_STRING, &ldi.graphics_set_ecs, "graphics_set.ecs" },
{ TYPE_STRING, &ldi.graphics_set_aga, "graphics_set.aga" },
{ TYPE_STRING, &ldi.graphics_set, "graphics_set" },
- case TYPE_SWITCH3:
- strcpy(value_string, (*(int *)value == AUTO ? "auto" :
- *(int *)value == FALSE ? "off" : "on"));
+ case TYPE_SWITCH_3_STATES:
+ strcpy(value_string, (*(int *)value == STATE_AUTO ? "auto" :
+ *(int *)value == STATE_ASK ? "ask" :
+ *(int *)value == STATE_FALSE ? "off" : "on"));
- strcpy(value_string, (*(int *)value == AUTO ? "auto" :
- *(int *)value == FALSE ? "no" : "yes"));
+ strcpy(value_string, (*(int *)value == STATE_AUTO ? "auto" :
+ *(int *)value == STATE_FALSE ? "no" : "yes"));
+ break;
+
+ case TYPE_YES_NO_ASK:
+ strcpy(value_string, (*(int *)value == STATE_ASK ? "ask" :
+ *(int *)value == STATE_FALSE ? "no" : "yes"));