#include "config.h"
#include "conf_e2g.c" /* include auto-generated data structure definitions */
+#include "conf_esg.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();
static void InitGfx();
static void InitGfxBackground();
static void InitGadgets();
-static void InitElementImages();
+static void InitElementSmallImages();
static void InitElementGraphicInfo();
+static void InitElementSpecialGraphicInfo();
static void InitElementSoundInfo();
static void InitElementProperties();
static void InitGraphicInfo();
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
+ };
int i;
- for (i=0; i<MAX_NUM_ELEMENTS; i++)
- element_info[i].custom_description = NULL;
-
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++)
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,
- sound_class_prefix, action_suffix, dummy);
+ sound_class_prefix, action_suffix, dummy, dummy, dummy);
}
void InitLevelArtworkInfo()
static void ReinitializeGraphics()
{
- InitElementGraphicInfo(); /* initialize element/graphic config info */
- InitGraphicInfo(); /* initialize graphic info from config file */
+ InitElementGraphicInfo(); /* element game graphic mapping */
+ InitElementSpecialGraphicInfo(); /* element special graphic mapping */
+ InitGraphicInfo(); /* graphic properties mapping */
+
+ InitElementSmallImages(); /* create editor and preview images */
InitFontInfo(bitmap_font_initial,
graphic_info[IMG_FONT_BIG].bitmap,
InitGadgets();
InitToons();
-
-
-
- /* !!! TEST ONLY !!! */
- if (0)
- {
- Bitmap *tst_bitmap = graphic_info[IMG_SAND].bitmap;
- Bitmap *tmp_bitmap = ZoomBitmap(tst_bitmap,
- tst_bitmap->width / 2,
- tst_bitmap->height / 2);
-
- BlitBitmap(tmp_bitmap, tst_bitmap, 0, 0, 256, 224, 0, 448);
-
- FreeBitmap(tmp_bitmap);
- }
-
- if (1)
- {
- printf("CREATING SMALL IMAGES...\n");
-
-#if 1
- InitElementImages();
-#else
- CreateImageWithSmallImages(IMG_SAND);
- CreateImageWithSmallImages(IMG_SAND);
-#endif
-
- printf("DONE!\n");
- }
}
static void ReinitializeSounds()
{
- InitElementSoundInfo(); /* initialize element/sound config info */
- InitSoundInfo(); /* initialize sounds info from config file */
+ InitElementSoundInfo(); /* element game sound mapping */
+ InitSoundInfo(); /* sound properties mapping */
- InitPlaySoundLevel(); /* initialize internal game sound values */
+ InitPlaySoundLevel(); /* internal game sound settings */
}
static void ReinitializeMusic()
static void InitImages()
{
ReloadCustomImages();
- ReinitializeGraphics();
LoadCustomElementDescriptions();
+ LoadSpecialMenuDesignSettings();
+
+ ReinitializeGraphics();
}
static void InitSound()
void InitGfx()
{
-#if 0
+ char *config_token_font_initial = "font.small";
+ char *filename_font_initial = NULL;
int i;
-#endif
+
+ /* determine filename for initial font (for displaying startup messages) */
+ for (i=0; image_config[i].token != NULL; i++)
+ if (strcmp(image_config[i].token, config_token_font_initial) == 0)
+ filename_font_initial = 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]);
-
- InitFontInfo(NULL, NULL, pix[PIX_FONT_SMALL], NULL);
-#else
- bitmap_font_initial = LoadCustomImage(image_filename[PIX_FONT_SMALL]);
+ bitmap_font_initial = LoadCustomImage(filename_font_initial);
InitFontInfo(bitmap_font_initial, NULL, NULL, NULL, NULL);
-#endif
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();
-
- LoadCustomElementDescriptions();
+ InitImages();
FreeTileClipmasks();
InitTileClipmasks();
gadgets_initialized = TRUE;
}
-void InitElementImages()
+void InitElementSmallImages()
{
struct PropertyMapping *property_mapping = getImageListPropertyMapping();
int num_property_mappings = getImageListPropertyMappingSize();
int i;
- /* initialize images from static configuration */
+ /* 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);
+
/* initialize images from dynamic configuration */
for (i=0; i < num_property_mappings; i++)
CreateImageWithSmallImages(property_mapping[i].artwork_index);
}
}
+#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
- /* initialize element/graphic mapping from static configuration */
+ /* 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;
element_info[element].graphic[action] = graphic;
}
- /* initialize element/graphic mapping from dynamic configuration */
+ /* 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;
+
if (action < 0)
action = ACTION_DEFAULT;
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
}
-static void InitElementSoundInfo()
+void InitElementSpecialGraphicInfo()
{
- /* soon to come */
+ struct PropertyMapping *property_mapping = getImageListPropertyMapping();
+ int num_property_mappings = getImageListPropertyMappingSize();
+ int i;
+
+ /* always start with reliable default values */
+ for (i=0; i<MAX_NUM_ELEMENTS; i++)
+ {
+ element_info[i].editor_graphic = element_info[i].graphic[ACTION_DEFAULT];
+ element_info[i].preview_graphic = 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;
+
+ if (special == GFX_SPECIAL_ARG_EDITOR)
+ element_info[element].editor_graphic = graphic;
+ else if (special == GFX_SPECIAL_ARG_PREVIEW)
+ element_info[element].preview_graphic = 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 == GFX_SPECIAL_ARG_EDITOR)
+ element_info[element].editor_graphic = graphic;
+ else if (special == GFX_SPECIAL_ARG_PREVIEW)
+ element_info[element].preview_graphic = 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];
}
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)
"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->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->default_parameter);
+ set_graphic_parameters(i, fallback_image->default_parameter);
+ graphic_info[i].bitmap = fallback_bitmap;
}
#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
clipmasks_initialized = TRUE;
}
-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()
{
+ struct PropertyMapping *property_mapping = getSoundListPropertyMapping();
+ int num_property_mappings = getSoundListPropertyMappingSize();
int *sound_effect_properties;
int num_sounds = getSoundListSize();
int i, j;
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++;
}
}
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,