"DX Boulderdash"
};
-
#define LEVELCOLOR(n) (IS_LEVELCLASS_TUTORIAL(n) ? FC_BLUE : \
IS_LEVELCLASS_CLASSICS(n) ? FC_RED : \
- IS_LEVELCLASS_BD(n) ? FC_YELLOW : \
- IS_LEVELCLASS_EM(n) ? FC_YELLOW : \
- IS_LEVELCLASS_SP(n) ? FC_YELLOW : \
- IS_LEVELCLASS_DX(n) ? FC_YELLOW : \
- IS_LEVELCLASS_SB(n) ? FC_YELLOW : \
+ IS_LEVELCLASS_BD(n) ? FC_GREEN : \
+ IS_LEVELCLASS_EM(n) ? FC_GREEN : \
+ IS_LEVELCLASS_SP(n) ? FC_GREEN : \
+ IS_LEVELCLASS_DX(n) ? FC_GREEN : \
+ IS_LEVELCLASS_SB(n) ? FC_GREEN : \
IS_LEVELCLASS_CONTRIB(n) ? FC_GREEN : \
IS_LEVELCLASS_PRIVATE(n) ? FC_RED : \
FC_BLUE)
#define ARTWORKCOLOR(n) (IS_ARTWORKCLASS_CLASSICS(n) ? FC_RED : \
IS_ARTWORKCLASS_CONTRIB(n) ? FC_GREEN : \
IS_ARTWORKCLASS_PRIVATE(n) ? FC_RED : \
- IS_ARTWORKCLASS_LEVEL(n) ? FC_YELLOW : \
+ IS_ARTWORKCLASS_LEVEL(n) ? FC_GREEN : \
FC_BLUE)
#define ARTWORKSORTING(n) (IS_ARTWORKCLASS_CLASSICS(n) ? 0 : \
return TRUE;
}
+static int compareSetupFileData(const void *object1, const void *object2)
+{
+ const struct ConfigInfo *entry1 = (struct ConfigInfo *)object1;
+ const struct ConfigInfo *entry2 = (struct ConfigInfo *)object2;
+
+ return strcmp(entry1->token, entry2->token);
+}
+
static void saveSetupFileHash(SetupFileHash *hash, char *filename)
{
+ int item_count = hashtable_count(hash);
+ int item_size = sizeof(struct ConfigInfo);
+ struct ConfigInfo *sort_array = checked_malloc(item_count * item_size);
FILE *file;
+ int i = 0;
- if (!(file = fopen(filename, MODE_WRITE)))
+ // copy string pointers from hash to array
+ BEGIN_HASH_ITERATION(hash, itr)
{
- Warn("cannot write configuration file '%s'", filename);
+ sort_array[i].token = HASH_ITERATION_TOKEN(itr);
+ sort_array[i].value = HASH_ITERATION_VALUE(itr);
- return;
+ i++;
+
+ if (i > item_count) // should never happen
+ break;
}
+ END_HASH_ITERATION(hash, itr)
- BEGIN_HASH_ITERATION(hash, itr)
+ // sort string pointers from hash in array
+ qsort(sort_array, item_count, item_size, compareSetupFileData);
+
+ if (!(file = fopen(filename, MODE_WRITE)))
{
- fprintf(file, "%s\n", getFormattedSetupEntry(HASH_ITERATION_TOKEN(itr),
- HASH_ITERATION_VALUE(itr)));
+ Warn("cannot write configuration file '%s'", filename);
+
+ return;
}
- END_HASH_ITERATION(hash, itr)
+ for (i = 0; i < item_count; i++)
+ fprintf(file, "%s\n", getFormattedSetupEntry(sort_array[i].token,
+ sort_array[i].value));
fclose(file);
+
+ checked_free(sort_array);
}
SetupFileList *loadSetupFileList(char *filename)
if (entry1->parent_link || entry2->parent_link)
compare_result = (entry1->parent_link ? -1 : +1);
+ else if (entry1->level_group != entry2->level_group)
+ compare_result = (entry1->level_group ? -1 : +1);
else if (entry1->sort_priority == entry2->sort_priority)
- {
- char *name1 = getStringToLower(entry1->name_sorting);
- char *name2 = getStringToLower(entry2->name_sorting);
-
- compare_result = strcmp(name1, name2);
-
- free(name1);
- free(name2);
- }
+ compare_result = strcasecmp(entry1->name_sorting, entry2->name_sorting);
else if (class_sorting1 == class_sorting2)
compare_result = entry1->sort_priority - entry2->sort_priority;
else
if (timestamp_string == NULL)
return TRUE;
+ if (!fileExists(filename)) // file does not exist
+ return (atoi(timestamp_string) != 0);
+
if (stat(filename, &file_status) != 0) // cannot stat file
return TRUE;
static void MoveArtworkInfoIntoSubTree(ArtworkDirTree **artwork_node)
{
ArtworkDirTree *artwork_new = newTreeInfo();
- char *top_node_name = "dedicated custom artwork";
+ char *top_node_name = "standalone artwork";
setTreeInfoToDefaults(artwork_new, (*artwork_node)->type);
setString(&artwork_new->name_sorting, level_node->name_sorting);
artwork_new->sort_priority = level_node->sort_priority;
+ artwork_new->in_user_dir = level_node->in_user_dir;
artwork_new->color = LEVELCOLOR(artwork_new);
update_artworkinfo_cache = TRUE;
if (node_parent == NULL) // check for top tree node
{
char *top_node_name = (empty_level_set_mode ?
- "artwork-only level sets" :
- "artwork from level sets");
+ "artwork for certain level sets" :
+ "artwork included in level sets");
setString(&artwork_new->name, top_node_name);
setString(&artwork_new->name_sorting, top_node_name);