X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Finit.c;h=301f0022ad53f499e762dc15bd04eec51a22984b;hb=3607ef8e4000754063935d908053d564de92c0a2;hp=c7a199118fea2390f170d8c2bbdc212910a0a1a8;hpb=3494549d6f5c8d1d5497ec7eb9fa80a7ca6579ee;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index c7a19911..301f0022 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 */ @@ -614,6 +615,10 @@ void InitElementGraphicInfo() boolean act_remove = ((IS_DIGGABLE(i) && act == ACTION_DIGGING) || (IS_SNAPPABLE(i) && act == ACTION_SNAPPING) || (IS_COLLECTIBLE(i) && act == ACTION_COLLECTING)); + boolean act_turning = (act == ACTION_TURNING_FROM_LEFT || + act == ACTION_TURNING_FROM_RIGHT || + act == ACTION_TURNING_FROM_UP || + act == ACTION_TURNING_FROM_DOWN); /* generic default action graphic (defined by "[default]" directive) */ int default_action_graphic = element_info[EL_DEFAULT].graphic[act]; @@ -647,10 +652,16 @@ void InitElementGraphicInfo() /* no graphic for current action -- use default direction graphic */ if (default_action_direction_graphic == -1) default_action_direction_graphic = - (act_remove ? IMG_EMPTY : default_direction_graphic[dir]); + (act_remove ? IMG_EMPTY : + act_turning ? + element_info[i].direction_graphic[ACTION_TURNING][dir] : + default_direction_graphic[dir]); if (default_action_direction_crumbled == -1) default_action_direction_crumbled = - (act_remove ? IMG_EMPTY : default_direction_crumbled[dir]); + (act_remove ? IMG_EMPTY : + act_turning ? + element_info[i].direction_crumbled[ACTION_TURNING][dir] : + default_direction_crumbled[dir]); if (element_info[i].direction_graphic[act][dir] == -1) element_info[i].direction_graphic[act][dir] = @@ -663,10 +674,14 @@ void InitElementGraphicInfo() /* no graphic for this specific action -- use default action graphic */ if (element_info[i].graphic[act] == -1) element_info[i].graphic[act] = - (act_remove ? IMG_EMPTY : default_action_graphic); + (act_remove ? IMG_EMPTY : + act_turning ? element_info[i].graphic[ACTION_TURNING] : + default_action_graphic); if (element_info[i].crumbled[act] == -1) element_info[i].crumbled[act] = - (act_remove ? IMG_EMPTY : default_action_crumbled); + (act_remove ? IMG_EMPTY : + act_turning ? element_info[i].crumbled[ACTION_TURNING] : + default_action_crumbled); } } @@ -1201,17 +1216,17 @@ static void InitSoundInfo() 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; + sound_info[i].loop = FALSE; /* default: play sound only once */ #if 0 printf("::: sound %d: '%s'\n", i, sound->token); @@ -1241,7 +1256,7 @@ static void InitSoundInfo() /* associate elements and some selected sound actions */ - for (j=0; j -1; i++) + { + int gamemode = gamemode_to_music[i].gamemode; + int level = gamemode_to_music[i].level; + int music = gamemode_to_music[i].music; + + if (gamemode < 0) + gamemode = 0; + + if (level < 0) + level = 0; + + levelset.music[gamemode][level] = music; + } +#endif + + /* initialize gamemode/music mapping from dynamic configuration */ + for (i=0; i < num_property_mappings; i++) + { + int prefix = property_mapping[i].base_index; + int gamemode = property_mapping[i].ext1_index; + int level = property_mapping[i].ext2_index; + int music = property_mapping[i].artwork_index; + + if (prefix < 0 || prefix >= NUM_MUSIC_PREFIXES) + continue; + + if (gamemode < 0) + gamemode = 0; + + if (level < 0) + level = 0; + + levelset.music[gamemode][level] = music; + } + + /* now set all '-1' values to levelset specific default values */ + for (i=0; i < NUM_SPECIAL_GFX_ARGS; i++) + { + for (j=0; j < MAX_LEVELS; j++) + { + /* generic default music */ + int default_music = levelset.music[i][0]; /* may still be -1 */ + + /* no music for this specific game mode and level -- use default music */ + if (levelset.music[i][j] == -1) + levelset.music[i][j] = default_music; + } + } + +#if 0 + /* TEST ONLY */ + for (i=0; i < NUM_SPECIAL_GFX_ARGS; i++) + for (j=0; j < MAX_LEVELS; j++) + if (levelset.music[i][j] != -1) + printf("::: levelset.music[%d][%d] == %d\n", + i, j, levelset.music[i][j]); +#endif +} + +static void set_music_parameters(int music, char **parameter_raw) +{ + int parameter[NUM_MUS_ARGS]; + int i; + + /* get integer values from string parameters */ + for (i=0; i < NUM_MUS_ARGS; i++) + parameter[i] = + get_parameter_value(music_config_suffix[i].token, parameter_raw[i], + music_config_suffix[i].type); + + /* explicit loop mode setting in configuration overrides default value */ + if (parameter[MUS_ARG_MODE_LOOP] != ARG_UNDEFINED_VALUE) + music_info[music].loop = parameter[MUS_ARG_MODE_LOOP]; +} + +static void InitMusicInfo() +{ + int num_music = getMusicListSize(); + int i, j; + + if (music_info != NULL) + free(music_info); + + music_info = checked_calloc(num_music * sizeof(struct MusicInfo)); + + for (i=0; i < num_music; i++) + { + struct FileInfo *music = getMusicListEntry(i); + int len_music_text = strlen(music->token); + + music_info[i].loop = TRUE; /* default: play music in loop mode */ + + /* determine all loop music */ + + for (j=0; music_prefix_info[j].prefix; j++) + { + int len_prefix_text = strlen(music_prefix_info[j].prefix); + + if (len_prefix_text < len_music_text && + strncmp(music->token, + music_prefix_info[j].prefix, len_prefix_text) == 0) + { + music_info[i].loop = music_prefix_info[j].is_loop_music; + + break; + } + } + + set_music_parameters(i, music->parameter); + } +} + static void ReinitializeGraphics() { InitGraphicInfo(); /* graphic properties mapping */ @@ -1341,12 +1482,13 @@ static void ReinitializeSounds() InitSoundInfo(); /* sound properties mapping */ InitElementSoundInfo(); /* element game sound mapping */ - InitPlaySoundLevel(); /* internal game sound settings */ + InitPlayLevelSound(); /* internal game sound settings */ } static void ReinitializeMusic() { - /* currently nothing to do */ + InitMusicInfo(); /* music properties mapping */ + InitLevelsetMusicInfo(); /* levelset music mapping */ } void InitElementPropertiesStatic() @@ -1758,6 +1900,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, @@ -1996,6 +2139,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 }; @@ -2836,7 +2981,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) && @@ -2854,7 +2999,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) && @@ -2941,22 +3086,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 } @@ -3101,6 +3255,18 @@ static char *get_string_in_brackets(char *string) return string_in_brackets; } +static char *get_level_id_suffix(int id_nr) +{ + char *id_suffix = checked_malloc(1 + 3 + 1); + + if (id_nr < 0 || id_nr > 999) + id_nr = 0; + + sprintf(id_suffix, ".%03d", id_nr); + + return id_suffix; +} + #if 0 static char *get_element_class_token(int element) { @@ -3127,9 +3293,11 @@ static void InitArtworkConfig() { static char *image_id_prefix[MAX_NUM_ELEMENTS + NUM_FONTS + 1]; static char *sound_id_prefix[2 * MAX_NUM_ELEMENTS + 1]; + static char *music_id_prefix[NUM_MUSIC_PREFIXES + 1]; static char *action_id_suffix[NUM_ACTIONS + 1]; static char *direction_id_suffix[NUM_DIRECTIONS + 1]; static char *special_id_suffix[NUM_SPECIAL_GFX_ARGS + 1]; + static char *level_id_suffix[MAX_LEVELS + 1]; static char *dummy[1] = { NULL }; static char *ignore_generic_tokens[] = { @@ -3137,9 +3305,13 @@ static void InitArtworkConfig() "sort_priority", NULL }; - static char **ignore_image_tokens, **ignore_sound_tokens; + static char **ignore_image_tokens; + static char **ignore_sound_tokens; + static char **ignore_music_tokens; int num_ignore_generic_tokens; - int num_ignore_image_tokens, num_ignore_sound_tokens; + int num_ignore_image_tokens; + int num_ignore_sound_tokens; + int num_ignore_music_tokens; int i; /* dynamically determine list of generic tokens to be ignored */ @@ -3168,37 +3340,56 @@ static void InitArtworkConfig() ignore_sound_tokens[i] = ignore_generic_tokens[i]; ignore_sound_tokens[num_ignore_sound_tokens] = NULL; - for (i=0; i