X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=862365fa1259bf46ec62d09a9f8971d969efd2fe;hb=0548cd8fd0353c19608df8a7079fc2c39cc4ce27;hp=2b1b7931420cc5d8f66cd702400d2b4db57bf917;hpb=ee0895b12e544444db37febb1242bcc8a72d6ad8;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index 2b1b7931..862365fa 100644 --- a/src/init.c +++ b/src/init.c @@ -27,58 +27,36 @@ #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(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); +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 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 */ @@ -119,7 +97,6 @@ void OpenAll(void) InitEventFilter(FilterMouseMotionEvents); InitElementProperties(); - InitElementInfo(); InitGfx(); @@ -184,8 +161,38 @@ static void InitArtworkInfo() static void InitArtworkConfig() { - InitImageList(image_config, image_config_suffix, NUM_IMAGE_FILES); - InitSoundList(sound_config, sound_config_suffix, NUM_SOUND_FILES); + 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 + }; + int i; + + for (i=0; i '%s'\n", artwork.gfx_current_identifier); -#endif - /* when a new level series was selected, check if there was a change in custom artwork stored in level series directory */ if (leveldir_current_identifier != leveldir_current->identifier) @@ -587,8 +584,8 @@ void ReloadCustomArtwork() if (strcmp(artwork.gfx_current_identifier, gfx_new_identifier) != 0 || last_override_level_graphics != setup.override_level_graphics) { -#if 1 - printf("RELOADING GRAPHICS '%s' -> '%s' (-> '%s')\n", +#if 0 + printf("RELOADING GRAPHICS '%s' -> '%s' ('%s')\n", artwork.gfx_current_identifier, artwork.gfx_current->identifier, gfx_new_identifier); @@ -598,17 +595,12 @@ void ReloadCustomArtwork() ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE); - ReloadCustomImages(); - ReinitializeGraphics(); + InitImages(); FreeTileClipmasks(); InitTileClipmasks(); -#if 0 - artwork.gfx_current_identifier = gfx_new_identifier; -#else artwork.gfx_current_identifier = artwork.gfx_current->identifier; -#endif last_override_level_graphics = setup.override_level_graphics; redraw_screen = TRUE; @@ -617,11 +609,11 @@ void ReloadCustomArtwork() if (strcmp(artwork.snd_current_identifier, snd_new_identifier) != 0 || last_override_level_sounds != setup.override_level_sounds) { -#if 1 - printf("RELOADING SOUNDS '%s' -> '%s' (-> '%s')\n", +#if 0 + printf("RELOADING SOUNDS '%s' -> '%s' ('%s')\n", artwork.snd_current_identifier, - snd_new_identifier, - artwork.snd_current->identifier); + artwork.snd_current->identifier, + snd_new_identifier); #endif /* set artwork path to send it to the sound server process */ @@ -630,12 +622,7 @@ void ReloadCustomArtwork() InitReloadCustomSounds(snd_new_identifier); ReinitializeSounds(); -#if 0 - artwork.snd_current_identifier = snd_new_identifier; -#else artwork.snd_current_identifier = artwork.snd_current->identifier; -#endif - last_override_level_sounds = setup.override_level_sounds; redraw_screen = TRUE; @@ -650,11 +637,7 @@ void ReloadCustomArtwork() InitReloadCustomMusic(mus_new_identifier); ReinitializeMusic(); -#if 0 - artwork.mus_current_identifier = mus_new_identifier; -#else artwork.mus_current_identifier = artwork.mus_current->identifier; -#endif last_override_level_music = setup.override_level_music; redraw_screen = TRUE; @@ -668,10 +651,6 @@ void ReloadCustomArtwork() SetDoorState(DOOR_OPEN_ALL); CloseDoor(DOOR_CLOSE_ALL | DOOR_NO_DELAY); } - -#if 0 - printf("<-- '%s'\n", artwork.gfx_current_identifier); -#endif } void FreeGadgets() @@ -699,9 +678,29 @@ void InitGadgets() 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); + + /* initialize images from dynamic configuration */ + for (i=0; i < num_property_mappings; i++) + CreateImageWithSmallImages(property_mapping[i].artwork_index); +} +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 */ @@ -716,6 +715,7 @@ void InitElementInfo() } } +#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); @@ -723,28 +723,44 @@ void InitElementInfo() 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; + + if (action < 0) + action = ACTION_DEFAULT; - i++; + 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 */ @@ -785,26 +801,121 @@ void InitElementInfo() element_info[i].graphic[act] = default_action_graphic; } } + +#if 0 +#if DEBUG + if (options.verbose) + { + for (i=0; i -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 action, 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 */ @@ -847,66 +958,48 @@ static void set_graphic_parameters(int graphic, int action, int *parameter) if (parameter[GFX_ARG_MODE_REVERSE]) graphic_info[graphic].anim_mode |= ANIM_REVERSE; - /* set first frame of animation after determining animation mode */ - graphic_info[graphic].anim_start_frame = parameter[GFX_ARG_START_FRAME]; - /* automatically determine correct start frame, if not defined */ if (parameter[GFX_ARG_START_FRAME] == ARG_UNDEFINED_VALUE) graphic_info[graphic].anim_start_frame = 0; else if (graphic_info[graphic].anim_mode & ANIM_REVERSE) graphic_info[graphic].anim_start_frame = graphic_info[graphic].anim_frames - parameter[GFX_ARG_START_FRAME] - 1; + else + graphic_info[graphic].anim_start_frame = parameter[GFX_ARG_START_FRAME]; /* animation synchronized with global frame counter, not move position */ graphic_info[graphic].anim_global_sync = parameter[GFX_ARG_GLOBAL_SYNC]; - /* set global_sync for all animations with undefined "animation action" */ - if (parameter[GFX_ARG_GLOBAL_SYNC] == ARG_UNDEFINED_VALUE) - graphic_info[graphic].anim_global_sync = - (action == ACTION_DEFAULT ? TRUE : FALSE); - - /* "linear" animations are never globally synchronized */ - if (parameter[GFX_ARG_MODE_LINEAR]) - graphic_info[graphic].anim_global_sync = FALSE; + /* 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; - static int gfx_action[NUM_IMAGE_FILES]; + 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(); - - /* set temporary graphics action field to default value */ - for (i=0; i -1) - { - int action = element_to_graphic[i].action; - int graphic = element_to_graphic[i].graphic; - - if (action == -1) - action = ACTION_DEFAULT; - - gfx_action[graphic] = action; - - i++; - } + graphic_info = checked_calloc(num_images * sizeof(struct GraphicInfo)); #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) if (clipmasks_initialized) { - for (i=0; iparameter); /* now check if no animation frames are outside of the loaded image */ @@ -950,10 +1044,15 @@ static void InitGraphicInfo() "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, gfx_action[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; @@ -974,10 +1073,15 @@ static void InitGraphicInfo() "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, gfx_action[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) @@ -1002,6 +1106,7 @@ static void InitGraphicInfo() 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 @@ -1010,13 +1115,26 @@ static void InitGraphicInfo() #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]; @@ -1024,36 +1142,44 @@ static void set_sound_parameters(int sound, int *parameter) 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; itoken); sound_effect_properties[i] = ACTION_OTHER; sound_info[i].loop = FALSE; /* determine all loop sounds and identify certain sound classes */ - for (j=0; sound_action_properties[j].text; j++) + for (j=0; element_action_info[j].suffix; j++) { - int len_action_text = strlen(sound_action_properties[j].text); + 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], - sound_action_properties[j].text) == 0) + strcmp(&sound->token[len_effect_text - len_action_text], + element_action_info[j].suffix) == 0) { - sound_effect_properties[i] = sound_action_properties[j].value; + sound_effect_properties[i] = element_action_info[j].value; - if (sound_action_properties[j].is_loop) + if (element_action_info[j].is_loop_sound) sound_info[i].loop = TRUE; } } @@ -1067,9 +1193,9 @@ static void InitSoundInfo() 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]; @@ -1078,9 +1204,42 @@ static void InitSoundInfo() } } - 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 */ { @@ -1088,12 +1247,12 @@ static void InitSoundInfo() int sound_action = ACTION_DIGGING; int j = 0; - while (sound_action_properties[j].text) + while (element_action_info[j].suffix) { - if (sound_action_properties[j].value == sound_action) + if (element_action_info[j].value == sound_action) printf("element %d, sound action '%s' == %d\n", - element, sound_action_properties[j].text, - element_info_[element].sound[sound_action]); + element, element_action_info[j].suffix, + element_info[element].sound[sound_action]); j++; } } @@ -1577,14 +1736,6 @@ void InitElementProperties() 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,