X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=972aea39f0a80c02f8fd84cee894a88694452b4a;hb=39af00f43cf5c4cea174d0e90633877df08a2f7c;hp=b859112c771a04c6ac5d2a23ab9879d637efb77e;hpb=684f9040af5b97bc73676f8f8198688d87c3ea25;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index b859112c..972aea39 100644 --- a/src/init.c +++ b/src/init.c @@ -24,6 +24,7 @@ #include "network.h" #include "netserv.h" #include "cartoons.h" +#include "config.h" #include "conf_e2g.c" /* include auto-generated data structure definitions */ #include "conf_esg.c" /* include auto-generated data structure definitions */ @@ -291,8 +292,13 @@ void InitFontGraphicInfo() /* ---------- initialize font graphic definitions ---------- */ /* always start with reliable default values (normal font graphics) */ +#if 1 + for (i=0; i < NUM_FONTS; i++) + font_info[i].graphic = IMG_FONT_INITIAL_1; +#else for (i=0; i < NUM_FONTS; i++) font_info[i].graphic = FONT_INITIAL_1; +#endif /* initialize normal font/graphic mapping from static configuration */ for (i=0; font_to_graphic[i].font_nr > -1; i++) @@ -411,24 +417,30 @@ void InitElementGraphicInfo() for (act=0; act -1; i++) { - int element = element_to_graphic[i].element; - int action = element_to_graphic[i].action; - int direction = element_to_graphic[i].direction; - int graphic = element_to_graphic[i].graphic; + int element = element_to_graphic[i].element; + int action = element_to_graphic[i].action; + int direction = element_to_graphic[i].direction; + boolean crumbled = element_to_graphic[i].crumbled; + int graphic = element_to_graphic[i].graphic; if (graphic_info[graphic].bitmap == NULL) continue; - if ((action > -1 || direction > -1) && el2img(element) != -1) + if ((action > -1 || direction > -1 || crumbled == TRUE) && + el2img(element) != -1) { boolean base_redefined = getImageListEntry(el2img(element))->redefined; boolean act_dir_redefined = getImageListEntry(graphic)->redefined; @@ -444,10 +456,20 @@ void InitElementGraphicInfo() if (action < 0) action = ACTION_DEFAULT; - if (direction > -1) - element_info[element].direction_graphic[action][direction] = graphic; + if (crumbled) + { + if (direction > -1) + element_info[element].direction_crumbled[action][direction] = graphic; + else + element_info[element].crumbled[action] = graphic; + } else - element_info[element].graphic[action] = graphic; + { + if (direction > -1) + element_info[element].direction_graphic[action][direction] = graphic; + else + element_info[element].graphic[action] = graphic; + } } /* initialize normal element/graphic mapping from dynamic configuration */ @@ -458,6 +480,13 @@ void InitElementGraphicInfo() int direction = property_mapping[i].ext2_index; int special = property_mapping[i].ext3_index; int graphic = property_mapping[i].artwork_index; + boolean crumbled = FALSE; + + if (special == GFX_SPECIAL_ARG_CRUMBLED) + { + special = -1; + crumbled = TRUE; + } if (graphic_info[graphic].bitmap == NULL) continue; @@ -468,42 +497,128 @@ void InitElementGraphicInfo() if (action < 0) action = ACTION_DEFAULT; - if (direction < 0) + if (crumbled) + { + if (direction < 0) + for (dir=0; dir -1) + element_info[element].direction_crumbled[action][direction] = graphic; + else + element_info[element].crumbled[action] = graphic; + } + else + { + if (direction < 0) + for (dir=0; dir -1) + element_info[element].direction_graphic[action][direction] = graphic; + else + element_info[element].graphic[action] = graphic; + } + } + + /* now copy all graphics that are defined to be cloned from other graphics */ + for (i=0; i -1) - element_info[element].direction_graphic[action][direction] = graphic; - else - element_info[element].graphic[action] = graphic; +#if 1 + /* now set all undefined/invalid graphics to -1 to set to default after it */ + for (i=0; i 0 && graphic_info[graphic].bitmap == NULL) + element_info[i].graphic[act] = -1; + + graphic = element_info[i].crumbled[act]; + if (graphic > 0 && graphic_info[graphic].bitmap == NULL) + element_info[i].crumbled[act] = -1; + + for (dir=0; dir 0 && graphic_info[graphic].bitmap == NULL) + element_info[i].direction_graphic[act][dir] = -1; + + graphic = element_info[i].direction_crumbled[act][dir]; + if (graphic > 0 && graphic_info[graphic].bitmap == NULL) + element_info[i].direction_crumbled[act][dir] = -1; + } + } } +#endif /* now set all '-1' values to element specific default values */ for (i=0; i= 0 && special < NUM_SPECIAL_GFX_ARGS) element_info[element].special_graphic[special] = graphic; } + +#if 1 + /* now set all undefined/invalid graphics to default */ + for (i=0; i < MAX_NUM_ELEMENTS; i++) + for (j=0; j < NUM_SPECIAL_GFX_ARGS; j++) + if (graphic_info[element_info[i].special_graphic[j]].bitmap == NULL) + element_info[i].special_graphic[j] = + element_info[i].graphic[ACTION_DEFAULT]; +#endif +} + +static int get_element_from_token(char *token) +{ + int i; + + for (i=0; i < MAX_NUM_ELEMENTS; i++) + if (strcmp(element_info[i].token_name, token) == 0) + return i; + + return -1; } static void set_graphic_parameters(int graphic, char **parameter_raw) @@ -607,10 +789,15 @@ static void set_graphic_parameters(int graphic, char **parameter_raw) /* get integer values from string parameters */ for (i=0; i < NUM_GFX_ARGS; i++) + { parameter[i] = get_parameter_value(image_config_suffix[i].token, parameter_raw[i], image_config_suffix[i].type); + if (image_config_suffix[i].type == TYPE_TOKEN) + parameter[i] = get_element_from_token(parameter_raw[i]); + } + graphic_info[graphic].bitmap = src_bitmap; /* start with reliable default values */ @@ -620,6 +807,9 @@ static void set_graphic_parameters(int graphic, char **parameter_raw) 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 */ + graphic_info[graphic].crumbled_like = -1; /* do not use clone element */ + graphic_info[graphic].diggable_like = -1; /* do not use clone element */ + graphic_info[graphic].border_size = TILEX / 8; /* "CRUMBLED" border size */ /* optional x and y tile position of animation frame sequence */ if (parameter[GFX_ARG_XPOS] != ARG_UNDEFINED_VALUE) @@ -686,8 +876,10 @@ static void set_graphic_parameters(int graphic, char **parameter_raw) graphic_info[graphic].anim_delay = 1; graphic_info[graphic].anim_mode = parameter[GFX_ARG_ANIM_MODE]; +#if 0 if (graphic_info[graphic].anim_frames == 1) graphic_info[graphic].anim_mode = ANIM_NONE; +#endif /* automatically determine correct start frame, if not defined */ if (parameter[GFX_ARG_START_FRAME] == ARG_UNDEFINED_VALUE) @@ -701,6 +893,18 @@ static void set_graphic_parameters(int graphic, char **parameter_raw) /* animation synchronized with global frame counter, not move position */ graphic_info[graphic].anim_global_sync = parameter[GFX_ARG_GLOBAL_SYNC]; + /* optional element for cloning crumble graphics */ + if (parameter[GFX_ARG_CRUMBLED_LIKE] != ARG_UNDEFINED_VALUE) + graphic_info[graphic].crumbled_like = parameter[GFX_ARG_CRUMBLED_LIKE]; + + /* optional element for cloning digging graphics */ + if (parameter[GFX_ARG_DIGGABLE_LIKE] != ARG_UNDEFINED_VALUE) + graphic_info[graphic].diggable_like = parameter[GFX_ARG_DIGGABLE_LIKE]; + + /* optional border size for "crumbling" diggable graphics */ + if (parameter[GFX_ARG_BORDER_SIZE] != ARG_UNDEFINED_VALUE) + graphic_info[graphic].border_size = parameter[GFX_ARG_BORDER_SIZE]; + /* 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]; @@ -708,6 +912,9 @@ static void set_graphic_parameters(int graphic, char **parameter_raw) /* 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]; + + /* this is only used for drawing envelope graphics */ + graphic_info[graphic].draw_masked = parameter[GFX_ARG_DRAW_MASKED]; } static void InitGraphicInfo() @@ -731,6 +938,10 @@ static void InitGraphicInfo() graphic_info = checked_calloc(num_images * sizeof(struct GraphicInfo)); +#if 0 + printf("::: graphic_info: %d entries\n", num_images); +#endif + #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) if (clipmasks_initialized) { @@ -755,7 +966,13 @@ static void InitGraphicInfo() int first_frame, last_frame; #if 0 - printf("::: image: '%s'\n", image->token); + printf("::: image: '%s' [%d]\n", image->token, i); +#endif + +#if 0 + printf("::: image # %d: '%s' ['%s']\n", + i, image->token, + getTokenFromImageID(i)); #endif set_graphic_parameters(i, image->parameter); @@ -1154,7 +1371,7 @@ void InitElementPropertiesStatic() -1 }; - static int ep_collectible[] = + static int ep_collectible_only[] = { EL_BD_DIAMOND, EL_EMERALD, @@ -1182,7 +1399,10 @@ void InitElementPropertiesStatic() EL_SHIELD_NORMAL, EL_SHIELD_DEADLY, EL_EXTRA_TIME, - EL_ENVELOPE, + EL_ENVELOPE_1, + EL_ENVELOPE_2, + EL_ENVELOPE_3, + EL_ENVELOPE_4, EL_SPEED_PILL, -1 }; @@ -1209,9 +1429,9 @@ void InitElementPropertiesStatic() /* !!! maybe this should better be handled by 'ep_diggable' !!! */ #if 1 - EL_SP_BUGGY_BASE_ACTIVE, - EL_TRAP_ACTIVE, EL_LANDMINE, + EL_TRAP_ACTIVE, + EL_SP_BUGGY_BASE_ACTIVE, #endif -1 }; @@ -1291,7 +1511,7 @@ void InitElementPropertiesStatic() EL_SIGN_EXIT, EL_SIGN_YINYANG, EL_SIGN_OTHER, - EL_STEELWALL_SLANTED, + EL_STEELWALL_SLIPPERY, EL_EMC_STEELWALL_1, EL_EMC_STEELWALL_2, EL_EMC_STEELWALL_3, @@ -1345,7 +1565,7 @@ void InitElementPropertiesStatic() static int ep_slippery[] = { - EL_WALL_CRUMBLED, + EL_WALL_SLIPPERY, EL_BD_WALL, EL_ROCK, EL_BD_ROCK, @@ -1374,7 +1594,7 @@ void InitElementPropertiesStatic() EL_SP_CHIP_TOP, EL_SP_CHIP_BOTTOM, EL_SPEED_PILL, - EL_STEELWALL_SLANTED, + EL_STEELWALL_SLIPPERY, EL_PEARL, EL_CRYSTAL, -1 @@ -1539,6 +1759,7 @@ void InitElementPropertiesStatic() EL_SOKOBAN_FIELD_EMPTY, EL_EXIT_OPEN, EL_SP_EXIT_OPEN, + EL_SP_EXIT_OPENING, EL_GATE_1, EL_GATE_2, EL_GATE_3, @@ -1610,6 +1831,16 @@ void InitElementPropertiesStatic() -1 }; + static int ep_droppable[] = + { + -1 + }; + + static int ep_can_explode_1x1[] = + { + -1 + }; + static int ep_pushable[] = { EL_ROCK, @@ -1629,21 +1860,13 @@ void InitElementPropertiesStatic() -1 }; - static int ep_can_be_crumbled[] = - { - EL_SAND, - EL_LANDMINE, - EL_TRAP, - EL_TRAP_ACTIVE, - -1 - }; - static int ep_player[] = { EL_PLAYER_1, EL_PLAYER_2, EL_PLAYER_3, EL_PLAYER_4, + EL_SP_MURPHY, -1 }; @@ -1695,7 +1918,7 @@ void InitElementPropertiesStatic() { EL_EMPTY, EL_SAND, - EL_WALL_CRUMBLED, + EL_WALL_SLIPPERY, EL_BD_WALL, EL_ROCK, EL_BD_ROCK, @@ -1722,6 +1945,9 @@ void InitElementPropertiesStatic() static int ep_sp_element[] = { + /* should always be valid */ + EL_EMPTY, + EL_SP_EMPTY, EL_SP_ZONK, EL_SP_BASE, @@ -1772,6 +1998,8 @@ void InitElementPropertiesStatic() EL_SP_TERMINAL_ACTIVE, EL_SP_BUGGY_BASE_ACTIVATING, EL_SP_BUGGY_BASE_ACTIVE, + EL_SP_EXIT_OPENING, + EL_SP_EXIT_CLOSING, -1 }; @@ -1872,7 +2100,7 @@ void InitElementPropertiesStatic() EL_EXIT_OPENING, EL_EXIT_OPEN, EL_WALL, - EL_WALL_CRUMBLED, + EL_WALL_SLIPPERY, EL_EXPANDABLE_WALL, EL_EXPANDABLE_WALL_HORIZONTAL, EL_EXPANDABLE_WALL_VERTICAL, @@ -1903,7 +2131,7 @@ void InitElementPropertiesStatic() EL_INVISIBLE_STEELWALL_ACTIVE, EL_INVISIBLE_WALL, EL_INVISIBLE_WALL_ACTIVE, - EL_STEELWALL_SLANTED, + EL_STEELWALL_SLIPPERY, EL_EMC_STEELWALL_1, EL_EMC_STEELWALL_2, EL_EMC_STEELWALL_3, @@ -1927,7 +2155,7 @@ void InitElementPropertiesStatic() EL_EXPANDABLE_WALL_VERTICAL, EL_EXPANDABLE_WALL_ANY, EL_BD_WALL, - EL_WALL_CRUMBLED, + EL_WALL_SLIPPERY, EL_EXIT_CLOSED, EL_EXIT_OPENING, EL_EXIT_OPEN, @@ -2030,7 +2258,7 @@ void InitElementPropertiesStatic() EL_SIGN_EXIT, EL_SIGN_YINYANG, EL_SIGN_OTHER, - EL_STEELWALL_SLANTED, + EL_STEELWALL_SLIPPERY, EL_EMC_STEELWALL_1, EL_EMC_STEELWALL_2, EL_EMC_STEELWALL_3, @@ -2224,7 +2452,7 @@ void InitElementPropertiesStatic() EL_SAND, EL_WALL, EL_BD_WALL, - EL_WALL_CRUMBLED, + EL_WALL_SLIPPERY, EL_STEELWALL, EL_AMOEBA_DEAD, EL_QUICKSAND_EMPTY, @@ -2342,7 +2570,7 @@ void InitElementPropertiesStatic() EL_SIGN_EXIT, EL_SIGN_YINYANG, EL_SIGN_OTHER, - EL_STEELWALL_SLANTED, + EL_STEELWALL_SLIPPERY, EL_EMC_STEELWALL_1, EL_EMC_STEELWALL_2, EL_EMC_STEELWALL_3, @@ -2358,6 +2586,20 @@ void InitElementPropertiesStatic() -1 }; + static int ep_em_slippery_wall[] = + { + -1 + }; + + static int ep_gfx_crumbled[] = + { + EL_SAND, + EL_LANDMINE, + EL_TRAP, + EL_TRAP_ACTIVE, + -1 + }; + static struct { int *elements; @@ -2365,7 +2607,7 @@ void InitElementPropertiesStatic() } element_properties[] = { { ep_diggable, EP_DIGGABLE }, - { ep_collectible, EP_COLLECTIBLE }, + { ep_collectible_only, EP_COLLECTIBLE_ONLY }, { ep_dont_run_into, EP_DONT_RUN_INTO }, { ep_dont_collide_with, EP_DONT_COLLIDE_WITH }, { ep_dont_touch, EP_DONT_TOUCH }, @@ -2386,10 +2628,10 @@ void InitElementPropertiesStatic() { ep_passable_over, EP_PASSABLE_OVER }, { ep_passable_inside, EP_PASSABLE_INSIDE }, { ep_passable_under, EP_PASSABLE_UNDER }, + { ep_droppable, EP_DROPPABLE }, + { ep_can_explode_1x1, EP_CAN_EXPLODE_1X1 }, { ep_pushable, EP_PUSHABLE }, - { ep_can_be_crumbled, EP_CAN_BE_CRUMBLED }, - { ep_player, EP_PLAYER }, { ep_can_pass_magic_wall, EP_CAN_PASS_MAGIC_WALL }, { ep_switchable, EP_SWITCHABLE }, @@ -2414,6 +2656,10 @@ void InitElementPropertiesStatic() { ep_active_bomb, EP_ACTIVE_BOMB }, { ep_inactive, EP_INACTIVE }, + { ep_em_slippery_wall, EP_EM_SLIPPERY_WALL }, + + { ep_gfx_crumbled, EP_GFX_CRUMBLED }, + { NULL, -1 } }; @@ -2502,14 +2748,13 @@ void InitElementPropertiesEngine(int engine_version) EP_BELT_SWITCH, EP_WALKABLE_UNDER, EP_EM_SLIPPERY_WALL, - EP_CAN_BE_CRUMBLED, }; #endif static int no_wall_properties[] = { EP_DIGGABLE, - EP_COLLECTIBLE, + EP_COLLECTIBLE_ONLY, EP_DONT_RUN_INTO, EP_DONT_COLLIDE_WITH, EP_CAN_MOVE, @@ -2519,8 +2764,6 @@ void InitElementPropertiesEngine(int engine_version) EP_CAN_SMASH_EVERYTHING, EP_PUSHABLE, - EP_CAN_BE_CRUMBLED, - EP_PLAYER, EP_GEM, EP_FOOD_DARK_YAMYAM, @@ -2575,6 +2818,10 @@ void InitElementPropertiesEngine(int engine_version) SET_PROPERTY(i, EP_ACCESSIBLE, (IS_WALKABLE(i) || IS_PASSABLE(i))); + /* ---------- COLLECTIBLE ---------------------------------------------- */ + SET_PROPERTY(i, EP_COLLECTIBLE, (IS_COLLECTIBLE_ONLY(i) || + IS_DROPPABLE(i))); + /* ---------- SNAPPABLE ------------------------------------------------ */ SET_PROPERTY(i, EP_SNAPPABLE, (IS_DIGGABLE(i) || IS_COLLECTIBLE(i) || @@ -2593,7 +2840,7 @@ void InitElementPropertiesEngine(int engine_version) SET_PROPERTY(i, EP_WALL, TRUE); /* ---------- SOLID_FOR_PUSHING ---------------------------------------- */ - if (engine_version < VERSION_IDENT(2,2,0)) + if (engine_version < VERSION_IDENT(2,2,0,0)) SET_PROPERTY(i, EP_SOLID_FOR_PUSHING, IS_HISTORIC_SOLID(i)); else SET_PROPERTY(i, EP_SOLID_FOR_PUSHING, (!IS_WALKABLE(i) && @@ -2611,7 +2858,7 @@ void InitElementPropertiesEngine(int engine_version) /* ---------- EXPLOSION_PROOF ------------------------------------------ */ if (i == EL_FLAMES) SET_PROPERTY(i, EP_EXPLOSION_PROOF, TRUE); - else if (engine_version < VERSION_IDENT(2,2,0)) + else if (engine_version < VERSION_IDENT(2,2,0,0)) SET_PROPERTY(i, EP_EXPLOSION_PROOF, IS_INDESTRUCTIBLE(i)); else SET_PROPERTY(i, EP_EXPLOSION_PROOF, (IS_INDESTRUCTIBLE(i) && @@ -2642,6 +2889,20 @@ void InitElementPropertiesEngine(int engine_version) SET_PROPERTY(i, EP_CAN_EXPLODE, (CAN_EXPLODE_BY_FIRE(i) || CAN_EXPLODE_SMASHED(i) || CAN_EXPLODE_IMPACT(i))); + + /* ---------- CAN_EXPLODE_3X3 ------------------------------------------ */ + SET_PROPERTY(i, EP_CAN_EXPLODE_3X3, (CAN_EXPLODE(i) && + !CAN_EXPLODE_1X1(i))); + + /* ---------- CAN_CHANGE ----------------------------------------------- */ + SET_PROPERTY(i, EP_CAN_CHANGE, FALSE); /* default: cannot change */ + for (j=0; j < element_info[i].num_change_pages; j++) + if (element_info[i].change_page[j].can_change) + SET_PROPERTY(i, EP_CAN_CHANGE, TRUE); + + /* ---------- GFX_CRUMBLED --------------------------------------------- */ + SET_PROPERTY(i, EP_GFX_CRUMBLED, + element_info[i].crumbled[ACTION_DEFAULT] != IMG_EMPTY); } #if 0 @@ -2684,22 +2945,31 @@ void InitElementPropertiesEngine(int engine_version) /* "EL_EXPANDABLE_WALL_GROWING" wasn't slippery for EM gems in 2.0.1 */ SET_PROPERTY(EL_EXPANDABLE_WALL_GROWING, EP_EM_SLIPPERY_WALL, (level.em_slippery_gems && - engine_version > VERSION_IDENT(2,0,1))); + engine_version > VERSION_IDENT(2,0,1,0))); } -#if 0 - /* dynamically adjust element properties according to game engine version */ -#if 0 - if (engine_version < RELEASE_IDENT(2,2,0,7)) -#endif +#if 1 + /* set default push delay values (corrected since version 3.0.7-1) */ + if (engine_version < VERSION_IDENT(3,0,7,1)) { - for (i=0; i < NUM_CUSTOM_ELEMENTS; i++) - { - int element = EL_CUSTOM_START + i; + game.default_push_delay_fixed = 2; + game.default_push_delay_random = 8; + } + else + { + game.default_push_delay_fixed = 8; + game.default_push_delay_random = 8; + } - element_info[element].push_delay_fixed = 2; - element_info[element].push_delay_random = 8; - } + /* set uninitialized push delay values of custom elements in older levels */ + for (i=0; i < NUM_CUSTOM_ELEMENTS; i++) + { + int element = EL_CUSTOM_START + i; + + if (element_info[element].push_delay_fixed == -1) + element_info[element].push_delay_fixed = game.default_push_delay_fixed; + if (element_info[element].push_delay_random == -1) + element_info[element].push_delay_random = game.default_push_delay_random; } #endif } @@ -3012,8 +3282,8 @@ void InitGfx() InitFontGraphicInfo(); - DrawInitText(WINDOW_TITLE_STRING, 20, FC_YELLOW); - DrawInitText(WINDOW_SUBTITLE_STRING, 50, FC_RED); + DrawInitText(getProgramInitString(), 20, FC_YELLOW); + DrawInitText(PROGRAM_COPYRIGHT_STRING, 50, FC_RED); DrawInitText("Loading graphics:", 120, FC_GREEN); @@ -3059,7 +3329,8 @@ static void InitImages() #endif #if 0 - printf("::: InitImages ['%s', '%s'] ['%s', '%s']\n", + printf("::: InitImages for '%s' ['%s', '%s'] ['%s', '%s']\n", + leveldir_current->identifier, artwork.gfx_current_identifier, artwork.gfx_current->identifier, leveldir_current->graphics_set, @@ -3074,19 +3345,31 @@ static void InitImages() ReinitializeGraphics(); } -static void InitSound() +static void InitSound(char *identifier) { + if (identifier == NULL) + identifier = artwork.snd_current->identifier; + +#if 1 + /* set artwork path to send it to the sound server process */ setLevelArtworkDir(artwork.snd_first); +#endif - InitReloadCustomSounds(artwork.snd_current->identifier); + InitReloadCustomSounds(identifier); ReinitializeSounds(); } -static void InitMusic() +static void InitMusic(char *identifier) { + if (identifier == NULL) + identifier = artwork.mus_current->identifier; + +#if 1 + /* set artwork path to send it to the sound server process */ setLevelArtworkDir(artwork.mus_first); +#endif - InitReloadCustomMusic(artwork.mus_current->identifier); + InitReloadCustomMusic(identifier); ReinitializeMusic(); } @@ -3113,186 +3396,134 @@ void InitNetworkServer() #endif } -void ReloadCustomArtwork() +static char *getNewArtworkIdentifier(int type) { - static char *leveldir_current_identifier = NULL; - static boolean last_override_level_graphics = FALSE; - static boolean last_override_level_sounds = FALSE; - static boolean last_override_level_music = FALSE; - static boolean last_own_level_graphics_set = FALSE; - static boolean last_own_level_sounds_set = FALSE; - static boolean last_own_level_music_set = FALSE; - boolean level_graphics_set_changed = FALSE; - boolean level_sounds_set_changed = FALSE; - boolean level_music_set_changed = FALSE; - /* identifier for new artwork; default: artwork configured in setup */ -#if 0 - char *gfx_new_identifier = artwork.gfx_current->identifier; - char *snd_new_identifier = artwork.snd_current->identifier; - char *mus_new_identifier = artwork.mus_current->identifier; + static char *leveldir_current_identifier[3] = { NULL, NULL, NULL }; + static boolean last_override_level_artwork[3] = { FALSE, FALSE, FALSE }; + static boolean last_has_level_artwork_set[3] = { FALSE, FALSE, FALSE }; + static boolean initialized[3] = { FALSE, FALSE, FALSE }; + TreeInfo *artwork_first_node = ARTWORK_FIRST_NODE(artwork, type); + boolean setup_override_artwork = SETUP_OVERRIDE_ARTWORK(setup, type); + char *setup_artwork_set = SETUP_ARTWORK_SET(setup, type); + char *leveldir_identifier = leveldir_current->identifier; +#if 1 + /* !!! setLevelArtworkDir() should be moved to an earlier stage !!! */ + char *leveldir_artwork_set = setLevelArtworkDir(artwork_first_node); #else - char *gfx_new_identifier = artwork.gfx_current_identifier; - char *snd_new_identifier = artwork.snd_current_identifier; - char *mus_new_identifier = artwork.mus_current_identifier; -#endif - boolean redraw_screen = FALSE; - -#if 0 - if (leveldir_current_identifier == NULL) - leveldir_current_identifier = leveldir_current->identifier; -#endif - -#if 0 - printf("CURRENT GFX: '%s' ['%s']\n", artwork.gfx_current->identifier, - leveldir_current->graphics_set); - printf("CURRENT LEV: '%s' / '%s'\n", leveldir_current_identifier, - leveldir_current->identifier); -#endif - -#if 0 - printf("graphics --> '%s' ('%s')\n", - artwork.gfx_current_identifier, artwork.gfx_current->filename); - printf("sounds --> '%s' ('%s')\n", - artwork.snd_current_identifier, artwork.snd_current->filename); - printf("music --> '%s' ('%s')\n", - artwork.mus_current_identifier, artwork.mus_current->filename); + char *leveldir_artwork_set = LEVELDIR_ARTWORK_SET(leveldir_current, type); #endif + boolean has_level_artwork_set = (leveldir_artwork_set != NULL); + char *artwork_current_identifier; + char *artwork_new_identifier = NULL; /* default: nothing has changed */ /* leveldir_current may be invalid (level group, parent link) */ if (!validLevelSeries(leveldir_current)) - return; - - /* when a new level series was selected, check if there was a change - in custom artwork stored in level series directory */ - if (1 || leveldir_current_identifier != leveldir_current->identifier) - { -#if 0 - char *identifier_old = leveldir_current_identifier; -#endif - char *identifier_new = leveldir_current->identifier; + return NULL; + + /* 1st step: determine artwork set to be activated in descending order: + -------------------------------------------------------------------- + 1. setup artwork (when configured to override everything else) + 2. artwork set configured in "levelinfo.conf" of current level set + (artwork in level directory will have priority when loading later) + 3. artwork in level directory (stored in artwork sub-directory) + 4. setup artwork (currently configured in setup menu) */ + + if (setup_override_artwork) + artwork_current_identifier = setup_artwork_set; + else if (leveldir_artwork_set != NULL) + artwork_current_identifier = leveldir_artwork_set; + else if (getTreeInfoFromIdentifier(artwork_first_node, leveldir_identifier)) + artwork_current_identifier = leveldir_identifier; + else + artwork_current_identifier = setup_artwork_set; -#if 0 - printf("::: 1: ['%s'] '%s', '%s' [%lx, %lx]\n", - gfx_new_identifier, identifier_old, identifier_new, - getTreeInfoFromIdentifier(artwork.gfx_first, identifier_old), - getTreeInfoFromIdentifier(artwork.gfx_first, identifier_new)); -#endif -#if 0 - if (getTreeInfoFromIdentifier(artwork.gfx_first, identifier_new) == NULL) - gfx_new_identifier = GRAPHICS_SUBDIR; - else if (getTreeInfoFromIdentifier(artwork.gfx_first, identifier_old) != - getTreeInfoFromIdentifier(artwork.gfx_first, identifier_new)) - gfx_new_identifier = identifier_new; -#else - if (getTreeInfoFromIdentifier(artwork.gfx_first, identifier_new)) - gfx_new_identifier = identifier_new; - else - gfx_new_identifier = setup.graphics_set; -#endif + /* 2nd step: check if it is really needed to reload artwork set + ------------------------------------------------------------ */ #if 0 - if (getTreeInfoFromIdentifier(artwork.snd_first, identifier_new) == NULL) - snd_new_identifier = SOUNDS_SUBDIR; - else if (getTreeInfoFromIdentifier(artwork.snd_first, identifier_old) != - getTreeInfoFromIdentifier(artwork.snd_first, identifier_new)) - snd_new_identifier = identifier_new; -#else - if (getTreeInfoFromIdentifier(artwork.snd_first, identifier_new)) - snd_new_identifier = identifier_new; - else - snd_new_identifier = setup.sounds_set; + if (type == ARTWORK_TYPE_GRAPHICS) + printf("::: 0: '%s' ['%s', '%s'] ['%s' ('%s')]\n", + artwork_new_identifier, + ARTWORK_CURRENT_IDENTIFIER(artwork, type), + artwork_current_identifier, + leveldir_current->graphics_set, + leveldir_current->identifier); #endif -#if 0 - if (getTreeInfoFromIdentifier(artwork.mus_first, identifier_new) == NULL) - mus_new_identifier = MUSIC_SUBDIR; - else if (getTreeInfoFromIdentifier(artwork.mus_first, identifier_new) != - getTreeInfoFromIdentifier(artwork.mus_first, identifier_new)) - mus_new_identifier = identifier_new; -#else - if (getTreeInfoFromIdentifier(artwork.mus_first, identifier_new)) - mus_new_identifier = identifier_new; - else - mus_new_identifier = setup.music_set; -#endif + /* ---------- reload if level set and also artwork set has changed ------- */ + if (leveldir_current_identifier[type] != leveldir_identifier && + (last_has_level_artwork_set[type] || has_level_artwork_set)) + artwork_new_identifier = artwork_current_identifier; -#if 0 - printf("::: 2: ['%s'] '%s', '%s'\n", - gfx_new_identifier, identifier_old, identifier_new); -#endif + leveldir_current_identifier[type] = leveldir_identifier; + last_has_level_artwork_set[type] = has_level_artwork_set; #if 0 - leveldir_current_identifier = leveldir_current->identifier; + if (type == ARTWORK_TYPE_GRAPHICS) + printf("::: 1: '%s'\n", artwork_new_identifier); #endif - } - /* custom level artwork configured in level series configuration file - always overrides custom level artwork stored in level series directory - and (level independent) custom artwork configured in setup menu */ - if (leveldir_current->graphics_set != NULL) - gfx_new_identifier = leveldir_current->graphics_set; - if (leveldir_current->sounds_set != NULL) - snd_new_identifier = leveldir_current->sounds_set; - if (leveldir_current->music_set != NULL) - mus_new_identifier = leveldir_current->music_set; + /* ---------- reload if "override artwork" setting has changed ----------- */ + if (last_override_level_artwork[type] != setup_override_artwork) + artwork_new_identifier = artwork_current_identifier; - if (leveldir_current_identifier != leveldir_current->identifier) - { - if (last_own_level_graphics_set || leveldir_current->graphics_set != NULL) - level_graphics_set_changed = TRUE; + last_override_level_artwork[type] = setup_override_artwork; - if (last_own_level_sounds_set || leveldir_current->sounds_set != NULL) - level_sounds_set_changed = TRUE; +#if 0 + if (type == ARTWORK_TYPE_GRAPHICS) + printf("::: 2: '%s'\n", artwork_new_identifier); +#endif - if (last_own_level_music_set || leveldir_current->music_set != NULL) - level_music_set_changed = TRUE; + /* ---------- reload if current artwork identifier has changed ----------- */ + if (strcmp(ARTWORK_CURRENT_IDENTIFIER(artwork, type), + artwork_current_identifier) != 0) + artwork_new_identifier = artwork_current_identifier; - last_own_level_graphics_set = (leveldir_current->graphics_set != NULL); - last_own_level_sounds_set = (leveldir_current->sounds_set != NULL); - last_own_level_music_set = (leveldir_current->music_set != NULL); - } + *(&(ARTWORK_CURRENT_IDENTIFIER(artwork, type))) = artwork_current_identifier; -#if 1 - leveldir_current_identifier = leveldir_current->identifier; +#if 0 + if (type == ARTWORK_TYPE_GRAPHICS) + printf("::: 3: '%s'\n", artwork_new_identifier); #endif - if (setup.override_level_graphics) - gfx_new_identifier = artwork.gfx_current->identifier; - if (setup.override_level_sounds) - snd_new_identifier = artwork.snd_current->identifier; - if (setup.override_level_music) - mus_new_identifier = artwork.mus_current->identifier; + /* ---------- do not reload directly after starting ---------------------- */ + if (!initialized[type]) + artwork_new_identifier = NULL; + initialized[type] = TRUE; #if 0 - printf("CHECKING OLD/NEW GFX:\n OLD: '%s'\n NEW: '%s' ['%s', '%s'] [%d]\n", - artwork.gfx_current_identifier, gfx_new_identifier, - artwork.gfx_current->identifier, leveldir_current->graphics_set, - level_graphics_set_changed); + if (type == ARTWORK_TYPE_GRAPHICS) + printf("::: 4: '%s'\n", artwork_new_identifier); #endif - if (strcmp(artwork.gfx_current_identifier, gfx_new_identifier) != 0 || - last_override_level_graphics != setup.override_level_graphics || - level_graphics_set_changed) - { #if 0 - printf("RELOADING GRAPHICS '%s' -> '%s' ['%s']\n", - artwork.gfx_current_identifier, - gfx_new_identifier, - artwork.gfx_current->identifier); + if (type == ARTWORK_TYPE_GRAPHICS) + printf("CHECKING OLD/NEW GFX:\n- OLD: %s\n- NEW: %s ['%s', '%s'] ['%s']\n", + artwork.gfx_current_identifier, artwork_current_identifier, + artwork.gfx_current->identifier, leveldir_current->graphics_set, + artwork_new_identifier); #endif -#if 0 - artwork.gfx_current = - getTreeInfoFromIdentifier(artwork.gfx_first, gfx_new_identifier); -#endif -#if 0 - artwork.gfx_current_identifier = gfx_new_identifier; -#endif + return artwork_new_identifier; +} +void ReloadCustomArtwork() +{ + char *gfx_new_identifier = getNewArtworkIdentifier(ARTWORK_TYPE_GRAPHICS); + char *snd_new_identifier = getNewArtworkIdentifier(ARTWORK_TYPE_SOUNDS); + char *mus_new_identifier = getNewArtworkIdentifier(ARTWORK_TYPE_MUSIC); + boolean redraw_screen = FALSE; + + if (gfx_new_identifier != NULL) + { #if 0 - setLevelArtworkDir(artwork.gfx_first); + printf("RELOADING GRAPHICS '%s' -> '%s' ['%s', '%s']\n", + artwork.gfx_current_identifier, + gfx_new_identifier, + artwork.gfx_current->identifier, + leveldir_current->graphics_set); #endif ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE); @@ -3300,82 +3531,30 @@ void ReloadCustomArtwork() InitImages(); #if 0 - printf("::: %d\n", menu.list_size[GAME_MODE_LEVELS]); + printf("... '%s'\n", + leveldir_current->graphics_set); #endif FreeTileClipmasks(); InitTileClipmasks(); -#if 0 - artwork.gfx_current = - getTreeInfoFromIdentifier(artwork.gfx_first, gfx_new_identifier); -#endif -#if 0 - printf("::: '%s', %lx\n", gfx_new_identifier, artwork.gfx_current); -#endif - -#if 0 - artwork.gfx_current_identifier = artwork.gfx_current->identifier; -#endif - artwork.gfx_current_identifier = gfx_new_identifier; - last_override_level_graphics = setup.override_level_graphics; - -#if 0 - printf("DONE RELOADING GFX: '%s' ['%s']\n", - artwork.gfx_current_identifier, artwork.gfx_current->identifier); -#endif redraw_screen = TRUE; } - if (strcmp(artwork.snd_current_identifier, snd_new_identifier) != 0 || - last_override_level_sounds != setup.override_level_sounds || - level_sounds_set_changed) + if (snd_new_identifier != NULL) { -#if 0 - printf("RELOADING SOUNDS '%s' -> '%s' ('%s')\n", - artwork.snd_current_identifier, - artwork.snd_current->identifier, - snd_new_identifier); -#endif - - /* set artwork path to send it to the sound server process */ - setLevelArtworkDir(artwork.snd_first); - ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE); - InitReloadCustomSounds(snd_new_identifier); - ReinitializeSounds(); - -#if 0 - artwork.snd_current = - getTreeInfoFromIdentifier(artwork.snd_first, setup.sounds_set); - artwork.snd_current_identifier = artwork.snd_current->identifier; -#endif - artwork.snd_current_identifier = snd_new_identifier; - last_override_level_sounds = setup.override_level_sounds; + InitSound(snd_new_identifier); redraw_screen = TRUE; } - if (strcmp(artwork.mus_current_identifier, mus_new_identifier) != 0 || - last_override_level_music != setup.override_level_music || - level_music_set_changed) + if (mus_new_identifier != NULL) { - /* set artwork path to send it to the sound server process */ - setLevelArtworkDir(artwork.mus_first); - ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE); - InitReloadCustomMusic(mus_new_identifier); - ReinitializeMusic(); - -#if 0 - artwork.mus_current = - getTreeInfoFromIdentifier(artwork.mus_first, setup.music_set); - artwork.mus_current_identifier = artwork.mus_current->identifier; -#endif - artwork.mus_current_identifier = mus_new_identifier; - last_override_level_music = setup.override_level_music; + InitMusic(mus_new_identifier); redraw_screen = TRUE; } @@ -3439,6 +3618,7 @@ void OpenAll() InitEventFilter(FilterMouseMotionEvents); InitElementPropertiesStatic(); + InitElementPropertiesEngine(GAME_VERSION_ACTUAL); InitGfx(); @@ -3446,8 +3626,8 @@ void OpenAll() InitLevelArtworkInfo(); InitImages(); /* needs to know current level directory */ - InitSound(); /* needs to know current level directory */ - InitMusic(); /* needs to know current level directory */ + InitSound(NULL); /* needs to know current level directory */ + InitMusic(NULL); /* needs to know current level directory */ InitGfxBackground();