X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=2f5bd60df686df939d9cff8bf9a4ef1a9c89fe72;hb=891c39ca37c4fea5f6cc4ca40f913a56c68ef495;hp=a4a926005cc45df991a2855d54b0146c47b3bdd5;hpb=ad15815ec04f42779d0717a6d291f93b8e847d39;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index a4a92600..2f5bd60d 100644 --- a/src/init.c +++ b/src/init.c @@ -24,11 +24,14 @@ #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 */ #include "conf_e2s.c" /* include auto-generated data structure definitions */ #include "conf_fnt.c" /* include auto-generated data structure definitions */ +#include "conf_g2s.c" /* include auto-generated data structure definitions */ +#include "conf_g2m.c" /* include auto-generated data structure definitions */ #define CONFIG_TOKEN_FONT_INITIAL "font.initial" @@ -614,6 +617,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 +654,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 +676,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); } } @@ -809,6 +826,10 @@ static void set_graphic_parameters(int graphic, char **parameter_raw) 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 */ + graphic_info[graphic].anim_delay_fixed = 0; + graphic_info[graphic].anim_delay_random = 0; + graphic_info[graphic].post_delay_fixed = 0; + graphic_info[graphic].post_delay_random = 0; /* optional x and y tile position of animation frame sequence */ if (parameter[GFX_ARG_XPOS] != ARG_UNDEFINED_VALUE) @@ -904,6 +925,20 @@ static void set_graphic_parameters(int graphic, char **parameter_raw) if (parameter[GFX_ARG_BORDER_SIZE] != ARG_UNDEFINED_VALUE) graphic_info[graphic].border_size = parameter[GFX_ARG_BORDER_SIZE]; + /* this is only used for player "boring" and "sleeping" actions */ + if (parameter[GFX_ARG_ANIM_DELAY_FIXED] != ARG_UNDEFINED_VALUE) + graphic_info[graphic].anim_delay_fixed = + parameter[GFX_ARG_ANIM_DELAY_FIXED]; + if (parameter[GFX_ARG_ANIM_DELAY_RANDOM] != ARG_UNDEFINED_VALUE) + graphic_info[graphic].anim_delay_fixed = + parameter[GFX_ARG_ANIM_DELAY_RANDOM]; + if (parameter[GFX_ARG_POST_DELAY_FIXED] != ARG_UNDEFINED_VALUE) + graphic_info[graphic].anim_delay_fixed = + parameter[GFX_ARG_POST_DELAY_FIXED]; + if (parameter[GFX_ARG_POST_DELAY_RANDOM] != ARG_UNDEFINED_VALUE) + graphic_info[graphic].anim_delay_fixed = + parameter[GFX_ARG_POST_DELAY_RANDOM]; + /* 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]; @@ -1168,6 +1203,39 @@ static void InitElementSoundInfo() } } +static void InitGameModeSoundInfo() +{ + int i; + + /* set values to -1 to identify later as "uninitialized" values */ + for (i=0; i < NUM_SPECIAL_GFX_ARGS; i++) + menu.sound[i] = -1; + + /* initialize gamemode/sound mapping from static configuration */ + for (i=0; gamemode_to_sound[i].sound > -1; i++) + { + int gamemode = gamemode_to_sound[i].gamemode; + int sound = gamemode_to_sound[i].sound; + + if (gamemode < 0) + gamemode = GAME_MODE_DEFAULT; + + menu.sound[gamemode] = sound; + } + + /* now set all '-1' values to levelset specific default values */ + for (i=0; i < NUM_SPECIAL_GFX_ARGS; i++) + if (menu.sound[i] == -1) + menu.sound[i] = menu.sound[GAME_MODE_DEFAULT]; + +#if 0 + /* TEST ONLY */ + for (i=0; i < NUM_SPECIAL_GFX_ARGS; i++) + if (menu.sound[i] != -1) + printf("::: menu.sound[%d] == %d\n", i, menu.sound[i]); +#endif +} + static void set_sound_parameters(int sound, char **parameter_raw) { int parameter[NUM_SND_ARGS]; @@ -1201,17 +1269,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 +1309,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 music = gamemode_to_music[i].music; + +#if 0 + printf("::: gamemode == %d, music == %d\n", gamemode, music); +#endif + + if (gamemode < 0) + gamemode = GAME_MODE_DEFAULT; + + menu.music[gamemode] = music; + } + + /* 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 0 + printf("::: prefix == %d, gamemode == %d, level == %d, music == %d\n", + prefix, gamemode, level, music); +#endif + + if (prefix < 0 || prefix >= NUM_MUSIC_PREFIXES) + continue; + + if (gamemode < 0) + gamemode = GAME_MODE_DEFAULT; + + /* level specific music only allowed for in-game music */ + if (level != -1 && gamemode == GAME_MODE_DEFAULT) + gamemode = GAME_MODE_PLAYING; + + if (level == -1) + { + level = 0; + default_levelset_music = music; + } + + if (gamemode == GAME_MODE_PLAYING || gamemode == GAME_MODE_DEFAULT) + levelset.music[level] = music; + if (gamemode != GAME_MODE_PLAYING) + menu.music[gamemode] = music; + } + + /* now set all '-1' values to menu specific default values */ + /* (undefined values of "levelset.music[]" might stay at "-1" to + allow dynamic selection of music files from music directory!) */ + for (i=0; i < MAX_LEVELS; i++) + if (levelset.music[i] == -1) + levelset.music[i] = default_levelset_music; + for (i=0; i < NUM_SPECIAL_GFX_ARGS; i++) + if (menu.music[i] == -1) + menu.music[i] = menu.music[GAME_MODE_DEFAULT]; + +#if 0 + /* TEST ONLY */ + for (i=0; i < MAX_LEVELS; i++) + if (levelset.music[i] != -1) + printf("::: levelset.music[%d] == %d\n", i, levelset.music[i]); + for (i=0; i < NUM_SPECIAL_GFX_ARGS; i++) + if (menu.music[i] != -1) + printf("::: menu.music[%d] == %d\n", i, menu.music[i]); +#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 */ @@ -1340,13 +1546,15 @@ static void ReinitializeSounds() { InitSoundInfo(); /* sound properties mapping */ InitElementSoundInfo(); /* element game sound mapping */ + InitGameModeSoundInfo(); /* game mode sound mapping */ - InitPlaySoundLevel(); /* internal game sound settings */ + InitPlayLevelSound(); /* internal game sound settings */ } static void ReinitializeMusic() { - /* currently nothing to do */ + InitMusicInfo(); /* music properties mapping */ + InitGameModeMusicInfo(); /* game mode music mapping */ } void InitElementPropertiesStatic() @@ -2839,7 +3047,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) && @@ -2857,7 +3065,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) && @@ -2944,22 +3152,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 } @@ -2980,7 +3197,7 @@ void Execute_Command(char *command) int i; printf("# You can configure additional/alternative image files here.\n"); - printf("# (The images below are default and therefore commented out.)\n"); + printf("# (The entries below are default and therefore commented out.)\n"); printf("\n"); printf("%s\n", getFormattedSetupEntry("name", "Classic Graphics")); printf("\n"); @@ -2999,7 +3216,7 @@ void Execute_Command(char *command) int i; printf("# You can configure additional/alternative sound files here.\n"); - printf("# (The sounds below are default and therefore commented out.)\n"); + printf("# (The entries below are default and therefore commented out.)\n"); printf("\n"); printf("%s\n", getFormattedSetupEntry("name", "Classic Sounds")); printf("\n"); @@ -3015,11 +3232,30 @@ void Execute_Command(char *command) } else if (strcmp(command, "print musicinfo.conf") == 0) { - printf("# (Currently only \"name\" and \"sort_priority\" recognized.)\n"); + int i; + + printf("# You can configure additional/alternative music files here.\n"); + printf("# (The entries below are default and therefore commented out.)\n"); printf("\n"); printf("%s\n", getFormattedSetupEntry("name", "Classic Music")); printf("\n"); printf("%s\n", getFormattedSetupEntry("sort_priority", "100")); + printf("\n"); + + for (i=0; music_config[i].token != NULL; i++) + printf("# %s\n", + getFormattedSetupEntry(music_config[i].token, + music_config[i].value)); + + exit(0); + } + else if (strcmp(command, "print editorsetup.conf") == 0) + { + printf("# You can configure your personal editor element list here.\n"); + printf("# (The entries below are default and therefore commented out.)\n"); + printf("\n"); + + PrintEditorElementList(); exit(0); } @@ -3104,6 +3340,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) { @@ -3130,9 +3378,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[] = { @@ -3140,9 +3390,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 */ @@ -3171,37 +3425,56 @@ static void InitArtworkConfig() ignore_sound_tokens[i] = ignore_generic_tokens[i]; ignore_sound_tokens[num_ignore_sound_tokens] = NULL; - for (i=0; i