X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=d7be34a66381b5146a798940f08ef9f1fe0b130e;hb=c8acee298eb56783813578bf38cabddfee9976c4;hp=f6985eb9068dab43102081c268d32b416e043ff8;hpb=3140ab2a0de5599122e88579f48603146595e1c7;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index f6985eb9..d7be34a6 100644 --- a/src/init.c +++ b/src/init.c @@ -30,32 +30,6 @@ #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(); @@ -193,6 +167,20 @@ static void InitArtworkConfig() 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 -1; i++) @@ -870,6 +842,11 @@ void InitElementSpecialGraphicInfo() 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; @@ -891,29 +868,61 @@ void InitElementSpecialGraphicInfo() } } -static void InitElementSoundInfo() -{ - /* soon to come */ -} - -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 */ @@ -967,14 +976,22 @@ static void set_graphic_parameters(int graphic, int *parameter) /* 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) + static boolean clipmasks_initialized = FALSE; Pixmap src_pixmap; XGCValues clip_gc_values; unsigned long clip_gc_valuemask; @@ -1034,9 +1051,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, 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; @@ -1057,9 +1080,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, image->default_parameter); + set_graphic_parameters(i, fallback_image->default_parameter); + graphic_info[i].bitmap = fallback_bitmap; } #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) @@ -1084,6 +1113,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 @@ -1092,13 +1122,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 InitElementSoundInfo() +{ + /* !!! soon to come !!! */ } -static void set_sound_parameters(int sound, int *parameter) +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]; @@ -1106,6 +1149,8 @@ static void set_sound_parameters(int sound, int *parameter) static void InitSoundInfo() { + struct PropertyMapping *property_mapping = getSoundListPropertyMapping(); + int num_property_mappings = getSoundListPropertyMappingSize(); int *sound_effect_properties; int num_sounds = getSoundListSize(); int i, j; @@ -1171,6 +1216,37 @@ static void InitSoundInfo() 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 */ { @@ -1183,7 +1259,7 @@ static void InitSoundInfo() 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++; } } @@ -1268,7 +1344,6 @@ void InitElementProperties() static int ep_solid[] = { - EL_STEELWALL, EL_WALL, EL_WALL_GROWING, EL_WALL_GROWING_X, @@ -1302,16 +1377,43 @@ void InitElementProperties() 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, @@ -1323,14 +1425,8 @@ void InitElementProperties() 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, @@ -1343,12 +1439,8 @@ void InitElementProperties() 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, @@ -1366,17 +1458,7 @@ void InitElementProperties() 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, @@ -1415,7 +1497,7 @@ void InitElementProperties() }; static int ep_solid_num = SIZEOF_ARRAY_INT(ep_solid); - static int ep_massive[] = + static int ep_indestructible[] = { EL_STEELWALL, EL_ACID, @@ -1505,7 +1587,7 @@ void InitElementProperties() 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[] = { @@ -1667,14 +1749,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, @@ -2271,7 +2345,7 @@ void InitElementProperties() EP_BIT_SCHLUESSEL, EP_BIT_PFORTE, EP_BIT_SOLID, - EP_BIT_MASSIVE, + EP_BIT_INDESTRUCTIBLE, EP_BIT_SLIPPERY, EP_BIT_ENEMY, EP_BIT_MAUER, @@ -2312,7 +2386,7 @@ void InitElementProperties() ep_schluessel, ep_pforte, ep_solid, - ep_massive, + ep_indestructible, ep_slippery, ep_enemy, ep_mauer, @@ -2353,7 +2427,7 @@ void InitElementProperties() &ep_schluessel_num, &ep_pforte_num, &ep_solid_num, - &ep_massive_num, + &ep_indestructible_num, &ep_slippery_num, &ep_enemy_num, &ep_mauer_num,