return complete_path;
}
+static char *getStringCat2(char *s1, char *s2)
+{
+ char *complete_string = checked_malloc(strlen(s1) + strlen(s2) + 1);
+
+ sprintf(complete_string, "%s%s", s1, s2);
+ return complete_string;
+}
+
char *getStringCopy(char *s)
{
char *s_copy;
options.graphics_directory = RO_BASE_PATH "/" GRAPHICS_DIRECTORY;
options.sounds_directory = RO_BASE_PATH "/" SOUNDS_DIRECTORY;
options.music_directory = RO_BASE_PATH "/" MUSIC_DIRECTORY;
+ options.autoplay_leveldir = NULL;
options.serveronly = FALSE;
options.network = FALSE;
options.verbose = FALSE;
" -g, --graphics <directory> alternative graphics directory\n"
" -s, --sounds <directory> alternative sounds directory\n"
" -m, --music <directory> alternative music directory\n"
+ " -a, --autoplay <level series> automatically play level tapes\n"
" -n, --network network multiplayer game\n"
" --serveronly only start network server\n"
" -v, --verbose verbose mode\n"
if (option_arg == next_option)
options_left++;
}
+ else if (strncmp(option, "-autoplay", option_len) == 0)
+ {
+ if (option_arg == NULL)
+ Error(ERR_EXIT_HELP, "option '%s' requires an argument", option_str);
+
+ options.autoplay_leveldir = option_arg;
+ if (option_arg == next_option)
+ options_left++;
+ }
else if (strncmp(option, "-network", option_len) == 0)
{
options.network = TRUE;
while (node)
{
printf("['%s' (%d)]\n", node->key,
- ((struct ArtworkListNodeInfo *)node->content)->num_references);
+ ((struct ListNodeInfo *)node->content)->num_references);
node = node->next;
}
/* functions for loading artwork configuration information */
/* ========================================================================= */
+struct FileInfo *getFileListFromConfigList(struct ConfigInfo *config_list,
+ struct ConfigInfo *suffix_list,
+ int num_file_list_entries)
+{
+ struct FileInfo *file_list;
+ int num_suffix_list_entries = 0;
+ int list_pos = 0;
+ int i, j;
+
+ file_list = checked_calloc(num_file_list_entries * sizeof(struct FileInfo));
+
+ for (i=0; suffix_list[i].token != NULL; i++)
+ num_suffix_list_entries++;
+
+ /* always start with reliable default values */
+ for (i=0; i<num_file_list_entries; i++)
+ {
+ file_list[i].token = NULL;
+ file_list[i].default_filename = NULL;
+ file_list[i].filename = NULL;
+
+ if (num_suffix_list_entries > 0)
+ {
+ int parameter_array_size = num_suffix_list_entries * sizeof(int);
+
+ file_list[i].default_parameter = checked_calloc(parameter_array_size);
+ file_list[i].parameter = checked_calloc(parameter_array_size);
+
+ for (j=0; j<num_suffix_list_entries; j++)
+ {
+ int default_parameter = atoi(suffix_list[j].value);
+
+ file_list[i].default_parameter[j] = default_parameter;
+ file_list[i].parameter[j] = default_parameter;
+ }
+ }
+ }
+
+ for (i=0; config_list[i].token != NULL; i++)
+ {
+ int len_config_token = strlen(config_list[i].token);
+ int len_config_value = strlen(config_list[i].value);
+ boolean is_file_entry = TRUE;
+
+ for (j=0; suffix_list[j].token != NULL; j++)
+ {
+ int len_suffix = strlen(suffix_list[j].token);
+
+ if (len_suffix < len_config_token &&
+ strcmp(&config_list[i].token[len_config_token - len_suffix],
+ suffix_list[j].token) == 0)
+ {
+ file_list[list_pos].default_parameter[j] = atoi(config_list[i].value);
+
+ is_file_entry = FALSE;
+ break;
+ }
+ }
+
+ if (is_file_entry)
+ {
+ if (i > 0)
+ list_pos++;
+
+ if (list_pos > num_file_list_entries - 1)
+ break;
+
+ /* simple sanity check if this is really a file definition */
+ if (strcmp(&config_list[i].value[len_config_value - 4], ".pcx") != 0 &&
+ strcmp(&config_list[i].value[len_config_value - 4], ".wav") != 0 &&
+ strcmp(config_list[i].value, UNDEFINED_FILENAME) != 0)
+ {
+ Error(ERR_RETURN, "Configuration directive '%s' -> '%s':",
+ config_list[i].token, config_list[i].value);
+ Error(ERR_EXIT, "This seems to be no valid definition -- please fix");
+ }
+
+ file_list[list_pos].token = config_list[i].token;
+ file_list[list_pos].default_filename = config_list[i].value;
+ }
+ }
+
+ if (list_pos != num_file_list_entries - 1)
+ Error(ERR_EXIT, "inconsistant config list information (%d != %d) -- please fix", list_pos, num_file_list_entries - 1);
+
+ return file_list;
+}
+
static void LoadArtworkConfig(struct ArtworkListInfo *artwork_info)
{
- int num_list_entries = artwork_info->num_list_entries;
- struct ArtworkConfigInfo *config_list = artwork_info->config_list;
+ struct FileInfo *file_list = artwork_info->file_list;
+ struct ConfigInfo *suffix_list = artwork_info->suffix_list;
+ int num_file_list_entries = artwork_info->num_file_list_entries;
+ int num_suffix_list_entries = artwork_info->num_suffix_list_entries;
char *filename = getCustomArtworkConfigFilename(artwork_info->type);
struct SetupFileList *setup_file_list;
- int i;
+ int i, j;
#if 0
printf("GOT CUSTOM ARTWORK CONFIG FILE '%s'\n", filename);
#endif
/* always start with reliable default values */
- for (i=0; i<num_list_entries; i++)
- config_list[i].filename = NULL;
+ for (i=0; i<num_file_list_entries; i++)
+ {
+ if (file_list[i].filename != NULL)
+ free(file_list[i].filename);
+ file_list[i].filename = NULL;
+
+ for (j=0; j<num_suffix_list_entries; j++)
+ file_list[i].parameter[j] = file_list[i].default_parameter[j];
+ }
if (filename == NULL)
return;
if ((setup_file_list = loadSetupFileList(filename)))
{
- for (i=0; i<num_list_entries; i++)
- config_list[i].filename =
- getStringCopy(getTokenValue(setup_file_list, config_list[i].token));
+ for (i=0; i<num_file_list_entries; i++)
+ {
+ char *filename = getTokenValue(setup_file_list, file_list[i].token);
+
+ if (filename == NULL)
+ filename = file_list[i].default_filename;
+ file_list[i].filename = getStringCopy(filename);
+
+ for (j=0; j<num_suffix_list_entries; j++)
+ {
+ char *token = getStringCat2(file_list[i].token, suffix_list[j].token);
+ char *value = getTokenValue(setup_file_list, token);
+
+ if (value != NULL)
+ file_list[i].parameter[j] = atoi(value);
+
+ free(token);
+ }
+ }
freeSetupFileList(setup_file_list);
#if 0
- for (i=0; i<num_list_entries; i++)
+ for (i=0; i<num_file_list_entries; i++)
{
- printf("'%s' ", config_list[i].token);
- if (config_list[i].filename)
- printf("-> '%s'\n", config_list[i].filename);
+ printf("'%s' ", file_list[i].token);
+ if (file_list[i].filename)
+ printf("-> '%s'\n", file_list[i].filename);
else
- printf("-> UNDEFINED [-> '%s']\n", config_list[i].default_filename);
+ printf("-> UNDEFINED [-> '%s']\n", file_list[i].default_filename);
}
#endif
}
}
-void deleteArtworkListEntry(struct ArtworkListInfo *artwork_info,
- struct ArtworkListNodeInfo **listnode)
+static void deleteArtworkListEntry(struct ArtworkListInfo *artwork_info,
+ struct ListNodeInfo **listnode)
{
if (*listnode)
{
printf("[deleting artwork '%s']\n", filename);
#endif
- deleteNodeFromList(&artwork_info->file_list, filename,
+ deleteNodeFromList(&artwork_info->content_list, filename,
artwork_info->free_artwork);
}
}
static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info,
- struct ArtworkListNodeInfo **listnode,
- char *filename)
-{
+ struct ListNodeInfo **listnode,
+ char *basename)
+{
+ char *init_text[] =
+ { "",
+ "Loading graphics:",
+ "Loading sounds:",
+ "Loading music:"
+ };
+
ListNode *node;
+ char *filename = getCustomArtworkFilename(basename, artwork_info->type);
+
+ if (filename == NULL)
+ {
+ int error_mode = ERR_WARN;
+
+ /* we can get away without sounds and music, but not without graphics */
+ if (*listnode == NULL && artwork_info->type == ARTWORK_TYPE_GRAPHICS)
+ error_mode = ERR_EXIT;
+
+ Error(error_mode, "cannot find artwork file '%s'", basename);
+ return;
+ }
/* check if the old and the new artwork file are the same */
if (*listnode && strcmp((*listnode)->source_filename, filename) == 0)
deleteArtworkListEntry(artwork_info, listnode);
/* check if the new artwork file already exists in the list of artworks */
- if ((node = getNodeFromKey(artwork_info->file_list, filename)) != NULL)
+ if ((node = getNodeFromKey(artwork_info->content_list, filename)) != NULL)
{
#if 0
printf("[artwork '%s' already exists (other list entry)]\n", filename);
#endif
- *listnode = (struct ArtworkListNodeInfo *)node->content;
+ *listnode = (struct ListNodeInfo *)node->content;
(*listnode)->num_references++;
+
+ return;
}
- else if ((*listnode = artwork_info->load_artwork(filename)) != NULL)
+
+ DrawInitText(init_text[artwork_info->type], 120, FC_GREEN);
+ DrawInitText(basename, 150, FC_YELLOW);
+
+ if ((*listnode = artwork_info->load_artwork(filename)) != NULL)
{
+#if 0
+ printf("[adding new artwork '%s']\n", filename);
+#endif
+
(*listnode)->num_references = 1;
- addNodeToList(&artwork_info->file_list, (*listnode)->source_filename,
+ addNodeToList(&artwork_info->content_list, (*listnode)->source_filename,
*listnode);
}
+ else
+ {
+ int error_mode = ERR_WARN;
+
+ /* we can get away without sounds and music, but not without graphics */
+ if (artwork_info->type == ARTWORK_TYPE_GRAPHICS)
+ error_mode = ERR_EXIT;
+
+ Error(error_mode, "cannot load artwork file '%s'", basename);
+ return;
+ }
}
static void LoadCustomArtwork(struct ArtworkListInfo *artwork_info,
- struct ArtworkListNodeInfo **listnode,
+ struct ListNodeInfo **listnode,
char *basename)
{
+#if 0
char *filename = getCustomArtworkFilename(basename, artwork_info->type);
+#endif
#if 0
printf("GOT CUSTOM ARTWORK FILE '%s'\n", filename);
return;
}
+#if 0
if (filename == NULL)
{
Error(ERR_WARN, "cannot find artwork file '%s'", basename);
}
replaceArtworkListEntry(artwork_info, listnode, filename);
+#else
+ replaceArtworkListEntry(artwork_info, listnode, basename);
+#endif
}
-void LoadArtworkToList(struct ArtworkListInfo *artwork_info,
- char *basename, int list_pos)
+static void LoadArtworkToList(struct ArtworkListInfo *artwork_info,
+ char *basename, int list_pos)
{
if (artwork_info->artwork_list == NULL ||
- list_pos >= artwork_info->num_list_entries)
+ list_pos >= artwork_info->num_file_list_entries)
return;
#if 0
printf("loading artwork '%s' ... [%d]\n",
- basename, getNumNodes(artwork_info->file_list));
+ basename, getNumNodes(artwork_info->content_list));
#endif
LoadCustomArtwork(artwork_info, &artwork_info->artwork_list[list_pos],
#if 0
printf("loading artwork '%s' done [%d]\n",
- basename, getNumNodes(artwork_info->file_list));
+ basename, getNumNodes(artwork_info->content_list));
#endif
}
-void ReloadCustomArtworkFiles(struct ArtworkListInfo *artwork_info)
+void ReloadCustomArtworkList(struct ArtworkListInfo *artwork_info)
{
+#if 0
static struct
{
char *text;
{ "Loading sounds:", TRUE },
{ "Loading music:", TRUE }
};
-
- int num_list_entries = artwork_info->num_list_entries;
- struct ArtworkConfigInfo *config_list = artwork_info->config_list;
- int i;
-
-#if 0
- Delay(5000);
#endif
-#if 0
- printf("DEBUG: reloading sounds '%s' ...\n",artwork.snd_current_identifier);
-#endif
+ int num_file_list_entries = artwork_info->num_file_list_entries;
+ struct FileInfo *file_list = artwork_info->file_list;
+ int i;
LoadArtworkConfig(artwork_info);
+#if 0
if (draw_init[artwork_info->type].do_it)
DrawInitText(draw_init[artwork_info->type].text, 120, FC_GREEN);
+#endif
#if 0
- printf("DEBUG: reloading %d sounds ...\n", num_list_entries);
+ printf("DEBUG: reloading %d artwork files ...\n", num_file_list_entries);
#endif
- for(i=0; i<num_list_entries; i++)
+ for(i=0; i<num_file_list_entries; i++)
{
+#if 0
if (draw_init[artwork_info->type].do_it)
- DrawInitText(config_list[i].token, 150, FC_YELLOW);
+ DrawInitText(file_list[i].token, 150, FC_YELLOW);
+#endif
- if (config_list[i].filename)
- LoadArtworkToList(artwork_info, config_list[i].filename, i);
- else
- LoadArtworkToList(artwork_info, config_list[i].default_filename, i);
+ LoadArtworkToList(artwork_info, file_list[i].filename, i);
+
+#if 0
+ printf("DEBUG: loading artwork file '%s'...\n", file_list[i].filename);
+#endif
}
+#if 0
draw_init[artwork_info->type].do_it = FALSE;
+#endif
/*
- printf("list size == %d\n", getNumNodes(artwork_info->file_list));
+ printf("list size == %d\n", getNumNodes(artwork_info->content_list));
*/
#if 0
- dumpList(artwork_info->file_list);
+ dumpList(artwork_info->content_list);
#endif
}
+void FreeCustomArtworkList(struct ArtworkListInfo *artwork_info)
+{
+ int i;
+
+ if (artwork_info == NULL || artwork_info->artwork_list == NULL)
+ return;
+
+#if 0
+ printf("%s: FREEING ARTWORK ...\n",
+ IS_CHILD_PROCESS(audio.mixer_pid) ? "CHILD" : "PARENT");
+#endif
+
+ for(i=0; i<artwork_info->num_file_list_entries; i++)
+ deleteArtworkListEntry(artwork_info, &artwork_info->artwork_list[i]);
+
+#if 0
+ printf("%s: FREEING ARTWORK -- DONE\n",
+ IS_CHILD_PROCESS(audio.mixer_pid) ? "CHILD" : "PARENT");
+#endif
+
+ free(artwork_info->artwork_list);
+
+ artwork_info->artwork_list = NULL;
+ artwork_info->num_file_list_entries = 0;
+}
+
/* ========================================================================= */
/* functions only needed for non-Unix (non-command-line) systems */