#include "config.h"
#include "conf_e2g.c" /* include auto-generated data structure definitions */
-
-
-static char *image_filename[NUM_PICTURES] =
-{
-#if 0
- "RocksScreen.pcx",
- "RocksDoor.pcx",
- "RocksToons.pcx",
- "RocksFontBig.pcx",
- "RocksFontSmall.pcx",
- "RocksFontMedium.pcx",
- "RocksFontEM.pcx"
-#else
- "RocksScreen.pcx",
- "RocksElements.pcx",
- "RocksDoor.pcx",
- "RocksHeroes.pcx",
- "RocksToons.pcx",
- "RocksSP.pcx",
- "RocksDC.pcx",
- "RocksMore.pcx",
- "RocksFontBig.pcx",
- "RocksFontSmall.pcx",
- "RocksFontMedium.pcx",
- "RocksFontEM.pcx"
-#endif
-};
-
-static Bitmap *bitmap_font_initial = NULL;
-
-static void InitGlobal(void);
-static void InitSetup(void);
-static void InitPlayerInfo(void);
-static void InitLevelInfo(void);
-static void InitArtworkInfo(void);
-static void InitLevelArtworkInfo(void);
-static void InitNetworkServer(void);
-static void InitArtworkConfig(void);
-static void InitImages(void);
-static void InitMixer(void);
-static void InitSound(void);
-static void InitMusic(void);
-static void InitGfx(void);
-static void InitGfxBackground(void);
-static void InitGadgets(void);
-static void InitElementProperties(void);
-static void InitElementInfo(void);
-static void InitGraphicInfo(void);
+#include "conf_esg.c" /* include auto-generated data structure definitions */
+
+#define CONFIG_TOKEN_FONT_INITIAL "font.initial"
+
+struct FontBitmapInfo font_initial[NUM_INITIAL_FONTS];
+
+static void InitGlobal();
+static void InitSetup();
+static void InitPlayerInfo();
+static void InitLevelInfo();
+static void InitArtworkInfo();
+static void InitLevelArtworkInfo();
+static void InitNetworkServer();
+static void InitArtworkConfig();
+static void InitImages();
+static void InitMixer();
+static void InitSound();
+static void InitMusic();
+static void InitGfx();
+static void InitGfxBackground();
+static void InitGadgets();
+static void InitFontGraphicInfo();
+static void InitElementSmallImages();
+static void InitElementGraphicInfo();
+static void InitElementSpecialGraphicInfo();
+static void InitElementSoundInfo();
+static void InitElementProperties();
+static void InitGraphicInfo();
static void InitSoundInfo();
static void Execute_Command(char *);
-void OpenAll(void)
+void OpenAll()
{
InitGlobal(); /* initialize some global variables */
InitEventFilter(FilterMouseMotionEvents);
InitElementProperties();
- InitElementInfo();
InitGfx();
static void InitArtworkConfig()
{
static char *element_prefix[MAX_NUM_ELEMENTS + 1];
+ static char *sound_class_prefix[MAX_NUM_ELEMENTS + 1];
static char *action_suffix[NUM_ACTIONS + 1];
static char *direction_suffix[NUM_DIRECTIONS + 1];
+ static char *special_suffix[NUM_SPECIAL_GFX_ARGS + 1];
static char *dummy[1] = { NULL };
+ static char *ignore_image_tokens[] =
+ {
+ "name",
+ "sort_priority",
+ "menu.main.hide_static_text",
+ "global.num_toons",
+ NULL
+ };
+ static char *ignore_sound_tokens[] =
+ {
+ "name",
+ "sort_priority",
+ NULL
+ };
int i;
for (i=0; i<MAX_NUM_ELEMENTS + 1; i++)
element_prefix[i] = element_info[i].token_name;
+ for (i=0; i<MAX_NUM_ELEMENTS + 1; i++)
+ sound_class_prefix[i] = element_info[i].sound_class_name;
for (i=0; i<NUM_ACTIONS + 1; i++)
action_suffix[i] = element_action_info[i].suffix;
for (i=0; i<NUM_DIRECTIONS + 1; i++)
direction_suffix[i] = element_direction_info[i].suffix;
+ for (i=0; i<NUM_SPECIAL_GFX_ARGS + 1; i++)
+ special_suffix[i] = special_suffix_info[i].suffix;
InitImageList(image_config, NUM_IMAGE_FILES, image_config_suffix,
- element_prefix, action_suffix, direction_suffix);
+ element_prefix, action_suffix, direction_suffix,
+ special_suffix, ignore_image_tokens);
InitSoundList(sound_config, NUM_SOUND_FILES, sound_config_suffix,
- element_prefix, action_suffix, dummy);
+ sound_class_prefix, action_suffix, dummy,
+ dummy, ignore_sound_tokens);
}
void InitLevelArtworkInfo()
static void ReinitializeGraphics()
{
- InitGraphicInfo(); /* initialize graphic info from config file */
+ InitElementGraphicInfo(); /* element game graphic mapping */
+ InitElementSpecialGraphicInfo(); /* element special graphic mapping */
+ InitGraphicInfo(); /* graphic properties mapping */
- InitFontInfo(bitmap_font_initial,
- graphic_info[IMG_FONT_BIG].bitmap,
- graphic_info[IMG_FONT_MEDIUM].bitmap,
- graphic_info[IMG_FONT_SMALL].bitmap,
- graphic_info[IMG_FONT_EM].bitmap);
+ InitElementSmallImages(); /* create editor and preview images */
+ InitFontGraphicInfo(); /* initialize text drawing functions */
- SetMainBackgroundImage(IMG_BACKGROUND_DEFAULT);
+ SetMainBackgroundImage(IMG_BACKGROUND);
SetDoorBackgroundImage(IMG_BACKGROUND_DOOR);
InitGadgets();
static void ReinitializeSounds()
{
- InitSoundInfo(); /* initialize sounds info from config file */
+ InitElementSoundInfo(); /* element game sound mapping */
+ InitSoundInfo(); /* sound properties mapping */
+
+ InitPlaySoundLevel(); /* internal game sound settings */
}
static void ReinitializeMusic()
static void InitImages()
{
ReloadCustomImages();
+
+ LoadCustomElementDescriptions();
+ LoadSpecialMenuDesignSettings();
+
ReinitializeGraphics();
}
void InitGfx()
{
-#if 0
- int i;
-#endif
+ char *filename_font_initial = NULL;
+ Bitmap *bitmap_font_initial = NULL;
+ int i, j;
+
+ /* determine settings for initial font (for displaying startup messages) */
+ for (i=0; image_config[i].token != NULL; i++)
+ {
+ for (j=0; j < NUM_INITIAL_FONTS; j++)
+ {
+ char font_token[128];
+ int len_font_token;
+
+ sprintf(font_token, "%s_%d", CONFIG_TOKEN_FONT_INITIAL, j + 1);
+ len_font_token = strlen(font_token);
+
+ if (strcmp(image_config[i].token, font_token) == 0)
+ filename_font_initial = image_config[i].value;
+ else if (strlen(image_config[i].token) > len_font_token &&
+ strncmp(image_config[i].token, font_token, len_font_token) == 0)
+ {
+ if (strcmp(&image_config[i].token[len_font_token], ".x") == 0)
+ font_initial[j].src_x = atoi(image_config[i].value);
+ else if (strcmp(&image_config[i].token[len_font_token], ".y") == 0)
+ font_initial[j].src_y = atoi(image_config[i].value);
+ else if (strcmp(&image_config[i].token[len_font_token], ".width") == 0)
+ font_initial[j].width = atoi(image_config[i].value);
+ else if (strcmp(&image_config[i].token[len_font_token],".height") == 0)
+ font_initial[j].height = atoi(image_config[i].value);
+ }
+ }
+ }
+
+ if (filename_font_initial == NULL) /* should not happen */
+ Error(ERR_EXIT, "cannot get filename for '%s'", CONFIG_TOKEN_FONT_INITIAL);
/* initialize screen properties */
InitGfxFieldInfo(SX, SY, SXSIZE, SYSIZE,
bitmap_db_field = CreateBitmap(FXSIZE, FYSIZE, DEFAULT_DEPTH);
bitmap_db_door = CreateBitmap(3 * DXSIZE, DYSIZE + VYSIZE, DEFAULT_DEPTH);
-#if 0
- pix[PIX_FONT_SMALL] = LoadCustomImage(image_filename[PIX_FONT_SMALL]);
+ bitmap_font_initial = LoadCustomImage(filename_font_initial);
- InitFontInfo(NULL, NULL, pix[PIX_FONT_SMALL], NULL);
-#else
- bitmap_font_initial = LoadCustomImage(image_filename[PIX_FONT_SMALL]);
+ for (j=0; j < NUM_INITIAL_FONTS; j++)
+ font_initial[j].bitmap = bitmap_font_initial;
- InitFontInfo(bitmap_font_initial, NULL, NULL, NULL, NULL);
-#endif
+ InitFontGraphicInfo();
DrawInitText(WINDOW_TITLE_STRING, 20, FC_YELLOW);
DrawInitText(WINDOW_SUBTITLE_STRING, 50, FC_RED);
DrawInitText("Loading graphics:", 120, FC_GREEN);
-#if 0
- for (i=0; i<NUM_PICTURES; i++)
- {
-#if 0
- if (i != PIX_FONT_SMALL)
-#endif
- {
- DrawInitText(image_filename[i], 150, FC_YELLOW);
-
- pix[i] = LoadCustomImage(image_filename[i]);
- }
- }
-#endif
-
-#if 0
- InitFontInfo(pix[PIX_FONT_BIG], pix[PIX_FONT_MEDIUM], pix[PIX_FONT_SMALL],
- pix[PIX_FONT_EM]);
-#endif
-
InitTileClipmasks();
}
ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE);
- ReloadCustomImages();
- ReinitializeGraphics();
+ InitImages();
FreeTileClipmasks();
InitTileClipmasks();
gadgets_initialized = TRUE;
}
-void InitElementInfo()
+void InitElementSmallImages()
+{
+ struct PropertyMapping *property_mapping = getImageListPropertyMapping();
+ int num_property_mappings = getImageListPropertyMappingSize();
+ int i;
+
+ /* initialize normal images from static configuration */
+ for (i=0; element_to_graphic[i].element > -1; i++)
+ CreateImageWithSmallImages(element_to_graphic[i].graphic);
+
+ /* initialize special images from static configuration */
+ for (i=0; element_to_special_graphic[i].element > -1; i++)
+ CreateImageWithSmallImages(element_to_special_graphic[i].graphic);
+
+ /* !!! CHECK FOR ELEMENT-ONLY GRAPHICS !!! */
+ /* initialize images from dynamic configuration */
+ for (i=0; i < num_property_mappings; i++)
+ CreateImageWithSmallImages(property_mapping[i].artwork_index);
+}
+
+void InitFontGraphicInfo()
+{
+ static struct FontBitmapInfo font_bitmap_info[NUM_IMG_FONTS];
+ int num_fonts = NUM_IMG_FONTS;
+ int i;
+
+ if (graphic_info == NULL) /* still at startup phase */
+ num_fonts = NUM_INITIAL_FONTS;
+
+ for (i=0; i < num_fonts; i++)
+ {
+ if (i < NUM_INITIAL_FONTS)
+ font_bitmap_info[i] = font_initial[i];
+ else
+ {
+ /* copy font relevant information from graphics information */
+ font_bitmap_info[i].bitmap = graphic_info[FIRST_IMG_FONT + i].bitmap;
+ font_bitmap_info[i].src_x = graphic_info[FIRST_IMG_FONT + i].src_x;
+ font_bitmap_info[i].src_y = graphic_info[FIRST_IMG_FONT + i].src_y;
+ font_bitmap_info[i].width = graphic_info[FIRST_IMG_FONT + i].width;
+ font_bitmap_info[i].height = graphic_info[FIRST_IMG_FONT + i].height;
+ font_bitmap_info[i].draw_x = graphic_info[FIRST_IMG_FONT + i].draw_x;
+ font_bitmap_info[i].draw_y = graphic_info[FIRST_IMG_FONT + i].draw_y;
+ }
+ }
+
+ InitFontInfo(font_bitmap_info, num_fonts);
+}
+
+void InitElementGraphicInfo()
{
+ struct PropertyMapping *property_mapping = getImageListPropertyMapping();
+ int num_property_mappings = getImageListPropertyMappingSize();
int i, act, dir;
/* set values to -1 to identify later as "uninitialized" values */
}
}
+#if 0
for (i=EL_CHAR_START; i<=EL_CHAR_END; i++)
element_info[i].graphic[ACTION_DEFAULT] =
IMG_CHAR_START + (i - EL_CHAR_START);
for (i=EL_CUSTOM_START; i<=EL_CUSTOM_END; i++)
element_info[i].graphic[ACTION_DEFAULT] =
IMG_CUSTOM_START + (i - EL_CUSTOM_START);
+#endif
- i = 0;
- while (element_to_graphic[i].element > -1)
+ /* initialize normal element/graphic mapping from static configuration */
+ for (i=0; element_to_graphic[i].element > -1; i++)
{
int element = element_to_graphic[i].element;
- int direction = element_to_graphic[i].direction;
int action = element_to_graphic[i].action;
+ int direction = element_to_graphic[i].direction;
int graphic = element_to_graphic[i].graphic;
if (action < 0)
action = ACTION_DEFAULT;
if (direction > -1)
- {
- direction = MV_DIR_BIT(direction);
-
element_info[element].direction_graphic[action][direction] = graphic;
- }
else
element_info[element].graphic[action] = graphic;
+ }
+
+ /* initialize normal element/graphic mapping from dynamic configuration */
+ for (i=0; i < num_property_mappings; i++)
+ {
+ int element = property_mapping[i].base_index;
+ int action = property_mapping[i].ext1_index;
+ int direction = property_mapping[i].ext2_index;
+ int special = property_mapping[i].ext3_index;
+ int graphic = property_mapping[i].artwork_index;
+
+ if (special != -1)
+ continue;
- i++;
+ if (action < 0)
+ action = ACTION_DEFAULT;
+
+ if (direction > -1)
+ element_info[element].direction_graphic[action][direction] = graphic;
+ else
+ element_info[element].graphic[action] = graphic;
}
/* now set all '-1' values to element specific default values */
element_info[i].graphic[act] = default_action_graphic;
}
}
+
+#if 0
+#if DEBUG
+ if (options.verbose)
+ {
+ for (i=0; i<MAX_NUM_ELEMENTS; i++)
+ if (element_info[i].graphic[ACTION_DEFAULT] == IMG_CHAR_QUESTION &&
+ i != EL_CHAR_QUESTION)
+ Error(ERR_RETURN, "warning: no graphic for element '%s' (%d)",
+ element_info[i].token_name, i);
+ }
+#endif
+#endif
+}
+
+void InitElementSpecialGraphicInfo()
+{
+ struct PropertyMapping *property_mapping = getImageListPropertyMapping();
+ int num_property_mappings = getImageListPropertyMappingSize();
+ int i, j;
+
+ /* always start with reliable default values */
+ for (i=0; i < MAX_NUM_ELEMENTS; i++)
+ for (j=0; j < NUM_SPECIAL_GFX_ARGS; j++)
+ element_info[i].special_graphic[j] =
+ element_info[i].graphic[ACTION_DEFAULT];
+
+ /* initialize special element/graphic mapping from static configuration */
+ for (i=0; element_to_special_graphic[i].element > -1; i++)
+ {
+ int element = element_to_special_graphic[i].element;
+ int special = element_to_special_graphic[i].special;
+ int graphic = element_to_special_graphic[i].graphic;
+ boolean base_redefined = getImageListEntry(el2img(element))->redefined;
+ boolean special_redefined = getImageListEntry(graphic)->redefined;
+
+ if (base_redefined && !special_redefined)
+ continue;
+
+ element_info[element].special_graphic[special] = graphic;
+ }
+
+ /* initialize special element/graphic mapping from dynamic configuration */
+ for (i=0; i < num_property_mappings; i++)
+ {
+ int element = property_mapping[i].base_index;
+ int special = property_mapping[i].ext3_index;
+ int graphic = property_mapping[i].artwork_index;
+
+ if (special >= 0 && special < NUM_SPECIAL_GFX_ARGS)
+ element_info[element].special_graphic[special] = graphic;
+ }
}
-static void set_graphic_parameters(int graphic, int *parameter)
+static void set_graphic_parameters(int graphic, char **parameter_raw)
{
Bitmap *src_bitmap = getBitmapFromImageID(graphic);
int num_xtiles = (src_bitmap ? src_bitmap->width : TILEX) / TILEX;
int num_ytiles = (src_bitmap ? src_bitmap->height * 2 / 3 : TILEY) / TILEY;
+ int parameter[NUM_GFX_ARGS];
+ int i;
- graphic_info[graphic].bitmap = src_bitmap;
+ /* get integer values from string parameters */
+ for (i=0; i < NUM_GFX_ARGS; i++)
+ parameter[i] =
+ get_parameter_value(image_config_suffix[i].type, parameter_raw[i]);
- graphic_info[graphic].src_x = parameter[GFX_ARG_XPOS] * TILEX;
- graphic_info[graphic].src_y = parameter[GFX_ARG_YPOS] * TILEY;
- graphic_info[graphic].offset_x = parameter[GFX_ARG_OFFSET];
- graphic_info[graphic].offset_y = 0;
+ graphic_info[graphic].bitmap = src_bitmap;
- /* animation frames are ordered vertically instead of horizontally */
- if (parameter[GFX_ARG_VERTICAL])
+ /* start with reliable default values */
+ graphic_info[graphic].src_x = 0;
+ graphic_info[graphic].src_y = 0;
+ graphic_info[graphic].width = TILEX;
+ graphic_info[graphic].height = TILEY;
+ graphic_info[graphic].offset_x = 0; /* one or both of these values ... */
+ graphic_info[graphic].offset_y = 0; /* ... will be corrected later */
+
+ /* optional x and y tile position of animation frame sequence */
+ if (parameter[GFX_ARG_XPOS] != ARG_UNDEFINED_VALUE)
+ graphic_info[graphic].src_x = parameter[GFX_ARG_XPOS] * TILEX;
+ if (parameter[GFX_ARG_YPOS] != ARG_UNDEFINED_VALUE)
+ graphic_info[graphic].src_y = parameter[GFX_ARG_YPOS] * TILEY;
+
+ /* optional x and y pixel position of animation frame sequence */
+ if (parameter[GFX_ARG_X] != ARG_UNDEFINED_VALUE)
+ graphic_info[graphic].src_x = parameter[GFX_ARG_X];
+ if (parameter[GFX_ARG_Y] != ARG_UNDEFINED_VALUE)
+ graphic_info[graphic].src_y = parameter[GFX_ARG_Y];
+
+ /* optional width and height of each animation frame */
+ if (parameter[GFX_ARG_WIDTH] != ARG_UNDEFINED_VALUE)
+ graphic_info[graphic].width = parameter[GFX_ARG_WIDTH];
+ if (parameter[GFX_ARG_HEIGHT] != ARG_UNDEFINED_VALUE)
+ graphic_info[graphic].height = parameter[GFX_ARG_HEIGHT];
+
+ /* correct x or y offset dependant of vertical or horizontal frame order */
+ if (parameter[GFX_ARG_VERTICAL]) /* frames are ordered vertically */
+ {
+ if (parameter[GFX_ARG_OFFSET] != ARG_UNDEFINED_VALUE)
+ graphic_info[graphic].offset_y = parameter[GFX_ARG_OFFSET];
+ else
+ graphic_info[graphic].offset_y = graphic_info[graphic].height;
+ }
+ else /* frames are ordered horizontally */
{
- graphic_info[graphic].offset_x = 0;
- graphic_info[graphic].offset_y = parameter[GFX_ARG_OFFSET];
+ if (parameter[GFX_ARG_OFFSET] != ARG_UNDEFINED_VALUE)
+ graphic_info[graphic].offset_x = parameter[GFX_ARG_OFFSET];
+ else
+ graphic_info[graphic].offset_x = graphic_info[graphic].width;
}
/* optionally, the x and y offset of frames can be specified directly */
/* animation synchronized with global frame counter, not move position */
graphic_info[graphic].anim_global_sync = parameter[GFX_ARG_GLOBAL_SYNC];
+
+ /* this is only used for toon animations */
+ graphic_info[graphic].step_offset = parameter[GFX_ARG_STEP_OFFSET];
+ graphic_info[graphic].step_delay = parameter[GFX_ARG_STEP_DELAY];
+
+ /* this is only used for drawing font characters */
+ graphic_info[graphic].draw_x = parameter[GFX_ARG_DRAW_XOFFSET];
+ graphic_info[graphic].draw_y = parameter[GFX_ARG_DRAW_YOFFSET];
}
static void InitGraphicInfo()
{
- static boolean clipmasks_initialized = FALSE;
+ int fallback_graphic = IMG_CHAR_EXCLAM;
+ struct FileInfo *fallback_image = getImageListEntry(fallback_graphic);
+ Bitmap *fallback_bitmap = getBitmapFromImageID(fallback_graphic);
+ int num_images = getImageListSize();
int i;
+
#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
+ static boolean clipmasks_initialized = FALSE;
Pixmap src_pixmap;
XGCValues clip_gc_values;
unsigned long clip_gc_valuemask;
GC copy_clipmask_gc = None;
#endif
- image_files = getCurrentImageList();
+ if (graphic_info != NULL)
+ free(graphic_info);
+
+ graphic_info = checked_calloc(num_images * sizeof(struct GraphicInfo));
#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
if (clipmasks_initialized)
{
- for (i=0; i<NUM_IMAGE_FILES; i++)
+ for (i=0; i<num_images; i++)
{
if (graphic_info[i].clip_mask)
XFreePixmap(display, graphic_info[i].clip_mask);
}
#endif
- for (i=0; i<NUM_IMAGE_FILES; i++)
+ for (i=0; i<num_images; i++)
{
+ struct FileInfo *image = getImageListEntry(i);
Bitmap *src_bitmap;
int src_x, src_y;
int first_frame, last_frame;
- set_graphic_parameters(i, image_files[i].parameter);
+ set_graphic_parameters(i, image->parameter);
/* now check if no animation frames are outside of the loaded image */
"error: first animation frame out of bounds (%d, %d)",
src_x, src_y);
Error(ERR_RETURN, "custom graphic rejected for this element/action");
+
+ if (i == fallback_graphic)
+ Error(ERR_EXIT, "fatal error: no fallback graphic available");
+
+ Error(ERR_RETURN, "fallback done to 'char_exclam' for this graphic");
Error(ERR_RETURN_LINE, "-");
- set_graphic_parameters(i, image_files[i].default_parameter);
+ set_graphic_parameters(i, fallback_image->default_parameter);
+ graphic_info[i].bitmap = fallback_bitmap;
}
last_frame = graphic_info[i].anim_frames - 1;
"error: last animation frame (%d) out of bounds (%d, %d)",
last_frame, src_x, src_y);
Error(ERR_RETURN, "custom graphic rejected for this element/action");
+
+ if (i == fallback_graphic)
+ Error(ERR_EXIT, "fatal error: no fallback graphic available");
+
+ Error(ERR_RETURN, "fallback done to 'char_exclam' for this graphic");
Error(ERR_RETURN_LINE, "-");
- set_graphic_parameters(i, image_files[i].default_parameter);
+ set_graphic_parameters(i, fallback_image->default_parameter);
+ graphic_info[i].bitmap = fallback_bitmap;
}
#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
clip_gc_values.graphics_exposures = False;
clip_gc_values.clip_mask = graphic_info[i].clip_mask;
clip_gc_valuemask = GCGraphicsExposures | GCClipMask;
+
graphic_info[i].clip_gc =
XCreateGC(display, window->drawable, clip_gc_valuemask, &clip_gc_values);
#endif
#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
if (copy_clipmask_gc)
XFreeGC(display, copy_clipmask_gc);
-#endif
clipmasks_initialized = TRUE;
+#endif
}
-static void set_sound_parameters(int sound, int *parameter)
+static void InitElementSoundInfo()
{
+ /* !!! soon to come !!! */
+}
+
+static void set_sound_parameters(int sound, char **parameter_raw)
+{
+ int parameter[NUM_SND_ARGS];
+ int i;
+
+ /* get integer values from string parameters */
+ for (i=0; i < NUM_SND_ARGS; i++)
+ parameter[i] =
+ get_parameter_value(sound_config_suffix[i].type, parameter_raw[i]);
+
/* explicit loop mode setting in configuration overrides default value */
if (parameter[SND_ARG_MODE_LOOP] != ARG_UNDEFINED_VALUE)
sound_info[sound].loop = parameter[SND_ARG_MODE_LOOP];
static void InitSoundInfo()
{
- int sound_effect_properties[NUM_SOUND_FILES];
+ struct PropertyMapping *property_mapping = getSoundListPropertyMapping();
+ int num_property_mappings = getSoundListPropertyMappingSize();
+ int *sound_effect_properties;
+ int num_sounds = getSoundListSize();
int i, j;
- sound_files = getCurrentSoundList();
+ if (sound_info != NULL)
+ free(sound_info);
+
+ sound_effect_properties = checked_calloc(num_sounds * sizeof(int));
+ sound_info = checked_calloc(num_sounds * sizeof(struct SoundInfo));
/* initialize sound effect for all elements to "no sound" */
for (i=0; i<MAX_NUM_ELEMENTS; i++)
for (j=0; j<NUM_ACTIONS; j++)
element_info[i].sound[j] = SND_UNDEFINED;
- for (i=0; i<NUM_SOUND_FILES; i++)
+ for (i=0; i<num_sounds; i++)
{
- int len_effect_text = strlen(sound_files[i].token);
+ struct FileInfo *sound = getSoundListEntry(i);
+ int len_effect_text = strlen(sound->token);
sound_effect_properties[i] = ACTION_OTHER;
sound_info[i].loop = FALSE;
int len_action_text = strlen(element_action_info[j].suffix);
if (len_action_text < len_effect_text &&
- strcmp(&sound_files[i].token[len_effect_text - len_action_text],
+ strcmp(&sound->token[len_effect_text - len_action_text],
element_action_info[j].suffix) == 0)
{
sound_effect_properties[i] = element_action_info[j].value;
int len_class_text = strlen(element_info[j].sound_class_name);
if (len_class_text + 1 < len_effect_text &&
- strncmp(sound_files[i].token,
+ strncmp(sound->token,
element_info[j].sound_class_name, len_class_text) == 0 &&
- sound_files[i].token[len_class_text] == '.')
+ sound->token[len_class_text] == '.')
{
int sound_action_value = sound_effect_properties[i];
}
}
- set_sound_parameters(i, sound_files[i].parameter);
+ set_sound_parameters(i, sound->parameter);
}
+ free(sound_effect_properties);
+
+ /* initialize element/sound mapping from dynamic configuration */
+ for (i=0; i < num_property_mappings; i++)
+ {
+ int element = property_mapping[i].base_index;
+ int action = property_mapping[i].ext1_index;
+ int sound = property_mapping[i].artwork_index;
+
+ if (action < 0)
+ action = ACTION_DEFAULT;
+
+ element_info[element].sound[action] = sound;
+ }
+
+#if 0
+ /* TEST ONLY */
+ {
+ int element = EL_CUSTOM_11;
+ int j = 0;
+
+ while (element_action_info[j].suffix)
+ {
+ printf("element %d, sound action '%s' == %d\n",
+ element, element_action_info[j].suffix,
+ element_info[element].sound[j]);
+ j++;
+ }
+ }
+
+ PlaySoundLevelElementAction(0,0, EL_CUSTOM_11, ACTION_PUSHING);
+#endif
+
#if 0
/* TEST ONLY */
{
if (element_action_info[j].value == sound_action)
printf("element %d, sound action '%s' == %d\n",
element, element_action_info[j].suffix,
- element_info_[element].sound[sound_action]);
+ element_info[element].sound[sound_action]);
j++;
}
}
static int ep_solid[] =
{
- EL_STEELWALL,
EL_WALL,
EL_WALL_GROWING,
EL_WALL_GROWING_X,
EL_BD_MAGIC_WALL_DEAD,
EL_GAMEOFLIFE,
EL_BIOMAZE,
- EL_ACIDPOOL_TOPLEFT,
- EL_ACIDPOOL_TOPRIGHT,
- EL_ACIDPOOL_BOTTOMLEFT,
- EL_ACIDPOOL_BOTTOM,
- EL_ACIDPOOL_BOTTOMRIGHT,
EL_SP_CHIP_SINGLE,
EL_SP_CHIP_LEFT,
EL_SP_CHIP_RIGHT,
EL_SP_CHIP_UPPER,
EL_SP_CHIP_LOWER,
+ EL_SP_TERMINAL,
+ EL_SP_TERMINAL_ACTIVE,
+ EL_SP_EXIT_CLOSED,
+ EL_SP_EXIT_OPEN,
+ EL_INVISIBLE_WALL,
+ EL_INVISIBLE_WALL_ACTIVE,
+ EL_SWITCHGATE_SWITCH_UP,
+ EL_SWITCHGATE_SWITCH_DOWN,
+ EL_TIMEGATE_SWITCH,
+ EL_TIMEGATE_SWITCH_ACTIVE,
+ EL_EMC_WALL_PILLAR_UPPER,
+ EL_EMC_WALL_PILLAR_MIDDLE,
+ EL_EMC_WALL_PILLAR_LOWER,
+ EL_EMC_WALL4,
+ EL_EMC_WALL5,
+ EL_EMC_WALL6,
+ EL_EMC_WALL7,
+ EL_EMC_WALL8,
+ EL_WALL_PEARL,
+ EL_WALL_CRYSTAL,
+
+ /* the following elements are a direct copy of "indestructible" elements,
+ except "EL_ACID", which is "indestructible", but not "solid"! */
+#if 0
+ EL_ACID,
+#endif
+ EL_STEELWALL,
+ EL_ACIDPOOL_TOPLEFT,
+ EL_ACIDPOOL_TOPRIGHT,
+ EL_ACIDPOOL_BOTTOMLEFT,
+ EL_ACIDPOOL_BOTTOM,
+ EL_ACIDPOOL_BOTTOMRIGHT,
EL_SP_HARD_GRAY,
EL_SP_HARD_GREEN,
EL_SP_HARD_BLUE,
EL_SP_HARD_BASE4,
EL_SP_HARD_BASE5,
EL_SP_HARD_BASE6,
- EL_SP_TERMINAL,
- EL_SP_TERMINAL_ACTIVE,
- EL_SP_EXIT_CLOSED,
- EL_SP_EXIT_OPEN,
EL_INVISIBLE_STEELWALL,
EL_INVISIBLE_STEELWALL_ACTIVE,
- EL_INVISIBLE_WALL,
- EL_INVISIBLE_WALL_ACTIVE,
EL_CONVEYOR_BELT1_SWITCH_LEFT,
EL_CONVEYOR_BELT1_SWITCH_MIDDLE,
EL_CONVEYOR_BELT1_SWITCH_RIGHT,
EL_CONVEYOR_BELT4_SWITCH_LEFT,
EL_CONVEYOR_BELT4_SWITCH_MIDDLE,
EL_CONVEYOR_BELT4_SWITCH_RIGHT,
- EL_SWITCHGATE_SWITCH_UP,
- EL_SWITCHGATE_SWITCH_DOWN,
EL_LIGHT_SWITCH,
EL_LIGHT_SWITCH_ACTIVE,
- EL_TIMEGATE_SWITCH,
- EL_TIMEGATE_SWITCH_ACTIVE,
EL_SIGN_EXCLAMATION,
EL_SIGN_RADIOACTIVITY,
EL_SIGN_STOP,
EL_EMC_STEELWALL2,
EL_EMC_STEELWALL3,
EL_EMC_STEELWALL4,
- EL_EMC_WALL_PILLAR_UPPER,
- EL_EMC_WALL_PILLAR_MIDDLE,
- EL_EMC_WALL_PILLAR_LOWER,
- EL_EMC_WALL4,
- EL_EMC_WALL5,
- EL_EMC_WALL6,
- EL_EMC_WALL7,
- EL_EMC_WALL8,
EL_CRYSTAL,
- EL_WALL_PEARL,
- EL_WALL_CRYSTAL,
EL_GATE1,
EL_GATE2,
EL_GATE3,
};
static int ep_solid_num = SIZEOF_ARRAY_INT(ep_solid);
- static int ep_massive[] =
+ static int ep_indestructible[] =
{
EL_STEELWALL,
EL_ACID,
EL_TUBE_RIGHT_UP,
EL_TUBE_RIGHT_DOWN
};
- static int ep_massive_num = SIZEOF_ARRAY_INT(ep_massive);
+ static int ep_indestructible_num = SIZEOF_ARRAY_INT(ep_indestructible);
static int ep_slippery[] =
{
EL_EMERALD_RED,
EL_EMERALD_PURPLE,
EL_DIAMOND,
- EL_KEY1,
- EL_KEY2,
- EL_KEY3,
- EL_KEY4,
- EL_EM_KEY1,
- EL_EM_KEY2,
- EL_EM_KEY3,
- EL_EM_KEY4,
EL_BOMB,
EL_NUT,
EL_AMOEBA_DROP,
EP_BIT_SCHLUESSEL,
EP_BIT_PFORTE,
EP_BIT_SOLID,
- EP_BIT_MASSIVE,
+ EP_BIT_INDESTRUCTIBLE,
EP_BIT_SLIPPERY,
EP_BIT_ENEMY,
EP_BIT_MAUER,
ep_schluessel,
ep_pforte,
ep_solid,
- ep_massive,
+ ep_indestructible,
ep_slippery,
ep_enemy,
ep_mauer,
&ep_schluessel_num,
&ep_pforte_num,
&ep_solid_num,
- &ep_massive_num,
+ &ep_indestructible_num,
&ep_slippery_num,
&ep_enemy_num,
&ep_mauer_num,
FreeAllImages();
FreeTileClipmasks();
- if (bitmap_font_initial)
- FreeBitmap(bitmap_font_initial);
-
CloseVideoDisplay();
ClosePlatformDependantStuff();