X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=2529a8baba97aa4f9b16bab81a2a764ae82ff1d9;hb=a3d3dca44696b194dbe3f49a97d8c92d92b42ecf;hp=718e1ca2c0d37c2d7643f199d4bce3511ac608fa;hpb=b66bf285376f1a2c08ba8f7624fa48ffbcd898a9;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index 718e1ca2..2529a8ba 100644 --- a/src/init.c +++ b/src/init.c @@ -244,6 +244,10 @@ static void InitElementSmallImagesScaledUp(int graphic) { struct GraphicInfo *g = &graphic_info[graphic]; + // if graphic was cloned, scale cloned graphic + if (graphic_info[graphic].clone_from != -1) + graphic = graphic_info[graphic].clone_from; + // create small and game tile sized bitmaps (and scale up, if needed) CreateImageWithSmallImages(graphic, g->scale_up_factor, g->tile_size); } @@ -307,6 +311,10 @@ static void InitScaledImagesScaledUp(int graphic) { struct GraphicInfo *g = &graphic_info[graphic]; + // if graphic was cloned, scale cloned graphic + if (graphic_info[graphic].clone_from != -1) + graphic = graphic_info[graphic].clone_from; + ScaleImage(graphic, g->scale_up_factor); } @@ -1147,6 +1155,8 @@ static void InitElementGraphicInfo(void) // look for special default action graphic (classic game specific) if (IS_BD_ELEMENT(i) && element_info[EL_BD_DEFAULT].graphic[act] != -1) default_action_graphic = element_info[EL_BD_DEFAULT].graphic[act]; + if (IS_BDX_ELEMENT(i) && element_info[EL_BDX_DEFAULT].graphic[act] != -1) + default_action_graphic = element_info[EL_BDX_DEFAULT].graphic[act]; if (IS_SP_ELEMENT(i) && element_info[EL_SP_DEFAULT].graphic[act] != -1) default_action_graphic = element_info[EL_SP_DEFAULT].graphic[act]; if (IS_SB_ELEMENT(i) && element_info[EL_SB_DEFAULT].graphic[act] != -1) @@ -1156,6 +1166,8 @@ static void InitElementGraphicInfo(void) if (IS_BD_ELEMENT(i) && element_info[EL_BD_DEFAULT].crumbled[act] != -1) default_action_crumbled = element_info[EL_BD_DEFAULT].crumbled[act]; + if (IS_BDX_ELEMENT(i) && element_info[EL_BDX_DEFAULT].crumbled[act] != -1) + default_action_crumbled = element_info[EL_BDX_DEFAULT].crumbled[act]; if (IS_SP_ELEMENT(i) && element_info[EL_SP_DEFAULT].crumbled[act] != -1) default_action_crumbled = element_info[EL_SP_DEFAULT].crumbled[act]; if (IS_SB_ELEMENT(i) && element_info[EL_SB_DEFAULT].crumbled[act] != -1) @@ -1271,6 +1283,19 @@ static void InitElementSpecialGraphicInfo(void) action = -1; } + // for BD effect editor graphics, replace element with effect element, if exists + if (action != -1 && special == GFX_SPECIAL_ARG_EDITOR) + { + int element_bd = map_element_RND_to_BD_effect(element, action); + int element_ef = map_element_BD_to_RND_cave(element_bd); + + if (element_ef != EL_UNKNOWN) + { + element = element_ef; + action = -1; + } + } + if (element >= MAX_NUM_ELEMENTS) continue; @@ -1337,19 +1362,27 @@ static int get_graphic_parameter_value(char *value_raw, char *suffix, int type) return -1; } -static int get_scaled_graphic_width(int graphic) +static int get_scaled_graphic_width(Bitmap *src_bitmap, int graphic) { int original_width = getOriginalImageWidthFromImageID(graphic); int scale_up_factor = graphic_info[graphic].scale_up_factor; + // only happens when loaded outside artwork system (like "global.busy") + if (graphic_info == image_initial && src_bitmap) + original_width = src_bitmap->width; + return original_width * scale_up_factor; } -static int get_scaled_graphic_height(int graphic) +static int get_scaled_graphic_height(Bitmap *src_bitmap, int graphic) { int original_height = getOriginalImageHeightFromImageID(graphic); int scale_up_factor = graphic_info[graphic].scale_up_factor; + // only happens when loaded outside artwork system (like "global.busy") + if (graphic_info == image_initial && src_bitmap) + original_height = src_bitmap->height; + return original_height * scale_up_factor; } @@ -1404,6 +1437,7 @@ static void set_graphic_parameters_ext(int graphic, int *parameter, g->sort_priority = 0; // default for title screens g->class = 0; g->style = STYLE_DEFAULT; + g->alpha = -1; g->bitmaps = src_bitmaps; g->bitmap = src_bitmap; @@ -1433,8 +1467,8 @@ static void set_graphic_parameters_ext(int graphic, int *parameter, if (g->use_image_size) { // set new default bitmap size (with scaling, but without small images) - g->width = get_scaled_graphic_width(graphic); - g->height = get_scaled_graphic_height(graphic); + g->width = get_scaled_graphic_width(src_bitmap, graphic); + g->height = get_scaled_graphic_height(src_bitmap, graphic); } // optional width and height of each animation frame @@ -1481,15 +1515,8 @@ static void set_graphic_parameters_ext(int graphic, int *parameter, if (src_bitmap) { // get final bitmap size (with scaling, but without small images) - int src_image_width = get_scaled_graphic_width(graphic); - int src_image_height = get_scaled_graphic_height(graphic); - - if (src_image_width == 0 || src_image_height == 0) - { - // only happens when loaded outside artwork system (like "global.busy") - src_image_width = src_bitmap->width; - src_image_height = src_bitmap->height; - } + int src_image_width = get_scaled_graphic_width(src_bitmap, graphic); + int src_image_height = get_scaled_graphic_height(src_bitmap, graphic); if (parameter[GFX_ARG_TILE_SIZE] != ARG_UNDEFINED_VALUE) { @@ -1548,7 +1575,7 @@ static void set_graphic_parameters_ext(int graphic, int *parameter, // optionally, the second movement tile can be specified as start tile if (parameter[GFX_ARG_2ND_SWAP_TILES] != ARG_UNDEFINED_VALUE) - g->swap_double_tiles= parameter[GFX_ARG_2ND_SWAP_TILES]; + g->swap_double_tiles = parameter[GFX_ARG_2ND_SWAP_TILES]; // automatically determine correct number of frames, if not defined if (parameter[GFX_ARG_FRAMES] != ARG_UNDEFINED_VALUE) @@ -1647,7 +1674,7 @@ static void set_graphic_parameters_ext(int graphic, int *parameter, g->draw_yoffset = parameter[GFX_ARG_DRAW_YOFFSET]; // use a different default value for global animations and toons - if ((graphic >= IMG_GFX_GLOBAL_ANIM_1 && graphic <= IMG_GFX_GLOBAL_ANIM_8) || + if ((graphic >= IMG_GFX_GLOBAL_ANIM_1 && graphic <= IMG_GFX_GLOBAL_ANIM_32) || (graphic >= IMG_TOON_1 && graphic <= IMG_TOON_20)) g->draw_masked = TRUE; @@ -1685,6 +1712,8 @@ static void set_graphic_parameters_ext(int graphic, int *parameter, g->class = parameter[GFX_ARG_CLASS]; if (parameter[GFX_ARG_STYLE] != ARG_UNDEFINED_VALUE) g->style = parameter[GFX_ARG_STYLE]; + if (parameter[GFX_ARG_ALPHA] != ARG_UNDEFINED_VALUE) + g->alpha = parameter[GFX_ARG_ALPHA]; // this is only used for drawing menu buttons and text g->active_xoffset = parameter[GFX_ARG_ACTIVE_XOFFSET]; @@ -2141,6 +2170,8 @@ static void InitElementSoundInfo(void) // look for special default action sound (classic game specific) if (IS_BD_ELEMENT(i) && element_info[EL_BD_DEFAULT].sound[act] != -1) default_action_sound = element_info[EL_BD_DEFAULT].sound[act]; + if (IS_BDX_ELEMENT(i) && element_info[EL_BDX_DEFAULT].sound[act] != -1) + default_action_sound = element_info[EL_BDX_DEFAULT].sound[act]; if (IS_SP_ELEMENT(i) && element_info[EL_SP_DEFAULT].sound[act] != -1) default_action_sound = element_info[EL_SP_DEFAULT].sound[act]; if (IS_SB_ELEMENT(i) && element_info[EL_SB_DEFAULT].sound[act] != -1) @@ -2442,6 +2473,8 @@ static void ReinitializeGraphics(void) InitImageTextures(); // create textures for certain images print_timestamp_time("InitImageTextures"); + InitGraphicInfo_BD(); // graphic mapping for BD engine + print_timestamp_time("InitGraphicInfo_BD"); InitGraphicInfo_EM(); // graphic mapping for EM engine print_timestamp_time("InitGraphicInfo_EM"); @@ -3611,15 +3644,15 @@ void InitElementPropertiesStatic(void) EL_PLAYER_3, EL_PLAYER_4, EL_BD_FIREFLY, - EL_BD_FIREFLY_1, - EL_BD_FIREFLY_2, - EL_BD_FIREFLY_3, - EL_BD_FIREFLY_4, + EL_BD_FIREFLY_LEFT, + EL_BD_FIREFLY_DOWN, + EL_BD_FIREFLY_RIGHT, + EL_BD_FIREFLY_UP, EL_BD_BUTTERFLY, - EL_BD_BUTTERFLY_1, - EL_BD_BUTTERFLY_2, - EL_BD_BUTTERFLY_3, - EL_BD_BUTTERFLY_4, + EL_BD_BUTTERFLY_DOWN, + EL_BD_BUTTERFLY_LEFT, + EL_BD_BUTTERFLY_UP, + EL_BD_BUTTERFLY_RIGHT, EL_BD_AMOEBA, EL_CHAR_QUESTION, EL_UNKNOWN, @@ -4272,6 +4305,17 @@ void InitElementPropertiesStatic(void) EL_AMOEBA_DRY, EL_AMOEBA_FULL, EL_BD_AMOEBA, + EL_BDX_AMOEBA_1, + EL_BDX_AMOEBA_2, + EL_BDX_SLIME, + EL_BDX_ACID, + EL_BDX_BITER, + EL_BDX_BITER_RIGHT, + EL_BDX_BITER_UP, + EL_BDX_BITER_LEFT, + EL_BDX_BITER_DOWN, + EL_BDX_BLADDER, + EL_BDX_NUT, EL_EMC_MAGIC_BALL, EL_EMC_ANDROID, EL_MM_GRAY_BALL, @@ -4567,6 +4611,8 @@ void InitElementPropertiesStatic(void) static int ep_editor_cascade_active[] = { EL_INTERNAL_CASCADE_BD_ACTIVE, + EL_INTERNAL_CASCADE_BDX_ACTIVE, + EL_INTERNAL_CASCADE_BDX_EFFECTS_ACTIVE, EL_INTERNAL_CASCADE_EM_ACTIVE, EL_INTERNAL_CASCADE_EMC_ACTIVE, EL_INTERNAL_CASCADE_RND_ACTIVE, @@ -4591,6 +4637,8 @@ void InitElementPropertiesStatic(void) static int ep_editor_cascade_inactive[] = { EL_INTERNAL_CASCADE_BD, + EL_INTERNAL_CASCADE_BDX, + EL_INTERNAL_CASCADE_BDX_EFFECTS, EL_INTERNAL_CASCADE_EM, EL_INTERNAL_CASCADE_EMC, EL_INTERNAL_CASCADE_RND, @@ -5024,7 +5072,7 @@ static void InitGlobal(void) element_info[i].token_name = element_name_info[i].token_name; element_info[i].class_name = element_name_info[i].class_name; - element_info[i].editor_description= element_name_info[i].editor_description; + element_info[i].editor_description = element_name_info[i].editor_description; } for (i = 0; i < NUM_GLOBAL_ANIM_TOKENS + 1; i++) @@ -5047,6 +5095,13 @@ static void InitGlobal(void) image_config[i].token, image_config[i].value); + // create hash from sound config list + sound_config_hash = newSetupFileHash(); + for (i = 0; sound_config[i].token != NULL; i++) + setHashEntry(sound_config_hash, + sound_config[i].token, + sound_config[i].value); + // create hash from element token list element_token_hash = newSetupFileHash(); for (i = 0; element_name_info[i].token_name != NULL; i++) @@ -5489,9 +5544,7 @@ static void InitSetup(void) static void InitGameInfo(void) { game.restart_level = FALSE; - game.request_active = FALSE; - game.request_active_or_moving = FALSE; game.use_masked_elements_initial = FALSE; } @@ -5591,10 +5644,15 @@ static void InitArtworkConfig(void) // dynamically determine list of sound tokens to be ignored num_ignore_sound_tokens = num_ignore_generic_tokens; + for (i = 0; sound_config_vars[i].token != NULL; i++) + num_ignore_sound_tokens++; ignore_sound_tokens = checked_malloc((num_ignore_sound_tokens + 1) * sizeof(char *)); for (i = 0; i < num_ignore_generic_tokens; i++) ignore_sound_tokens[i] = ignore_generic_tokens[i]; + for (i = 0; i < num_ignore_sound_tokens - num_ignore_generic_tokens; i++) + ignore_sound_tokens[num_ignore_generic_tokens + i] = + sound_config_vars[i].token; ignore_sound_tokens[num_ignore_sound_tokens] = NULL; // dynamically determine list of music tokens to be ignored @@ -5711,6 +5769,7 @@ void InitGfxBuffers(void) // required if door size definitions have changed InitGraphicCompatibilityInfo_Doors(); + InitGfxBuffers_BD(); InitGfxBuffers_EM(); InitGfxBuffers_SP(); InitGfxBuffers_MM(); @@ -5792,10 +5851,6 @@ static void InitGfx(void) InitFontGraphicInfo(); - DrawProgramInfo(); - - DrawInitTextHead("Loading graphics"); - InitMenuDesignSettings_Static(); // initialize settings for initial images with default values @@ -5893,6 +5948,9 @@ static void InitGfx(void) checked_free(filename_image_initial[i]); } + for (i = 0; i < NUM_INITIAL_IMAGES; i++) + image_initial[i].use_image_size = TRUE; + graphic_info = image_initial; // graphic == 0 => image_initial for (i = 0; i < NUM_INITIAL_IMAGES; i++) @@ -5911,10 +5969,13 @@ static void InitGfx(void) ClearRectangleOnBackground(window, 0, 0, WIN_XSIZE, WIN_YSIZE); + DrawProgramInfo(); + InitGfxDrawBusyAnimFunction(DrawInitAnim); InitGfxDrawGlobalAnimFunction(DrawGlobalAnimations); InitGfxDrawGlobalBorderFunction(DrawMaskedBorderToTarget); InitGfxDrawTileCursorFunction(DrawTileCursor); + InitGfxDrawEnvelopeRequestFunction(DrawEnvelopeRequestToScreen); gfx.fade_border_source_status = global.border_status; gfx.fade_border_target_status = global.border_status; @@ -5934,6 +5995,29 @@ static void InitGfxBackground(void) redraw_mask = REDRAW_ALL; } +static void InitSnd(void) +{ + InitSoundSettings_Static(); + + // read settings for initial sounds from default custom artwork config + char *snd_config_filename = getPath3(options.sounds_directory, + SND_DEFAULT_SUBDIR, + SOUNDSINFO_FILENAME); + + if (fileExists(snd_config_filename)) + { + SetupFileHash *setup_file_hash = loadSetupFileHash(snd_config_filename); + + if (setup_file_hash) + { + // read values from custom sounds config file + InitSoundSettings_FromHash(setup_file_hash, FALSE); + + freeSetupFileHash(setup_file_hash); + } + } +} + static void InitLevelInfo(void) { LoadLevelInfo(); // global level info @@ -6032,6 +6116,9 @@ static void InitSound(void) InitReloadCustomSounds(); print_timestamp_time("InitReloadCustomSounds"); + LoadSoundSettings(); + print_timestamp_time("LoadSoundSettings"); + ReinitializeSounds(); print_timestamp_time("ReinitializeSounds"); @@ -6198,9 +6285,9 @@ static void InitOverrideArtwork(void) gfx.override_level_music = FALSE; // now check if this level set has definitions for custom elements - if (setup.override_level_graphics == AUTO || - setup.override_level_sounds == AUTO || - setup.override_level_music == AUTO) + if (setup.override_level_graphics == STATE_AUTO || + setup.override_level_sounds == STATE_AUTO || + setup.override_level_music == STATE_AUTO) redefined_ce_found = (CheckArtworkTypeForRedefinedCustomElements(ARTWORK_TYPE_GRAPHICS) | CheckArtworkTypeForRedefinedCustomElements(ARTWORK_TYPE_SOUNDS) | @@ -6213,14 +6300,14 @@ static void InitOverrideArtwork(void) if (redefined_ce_found) { - // this level set has CE definitions: change "AUTO" to "FALSE" + // this level set has CE definitions: change "MODE_AUTO" to "FALSE" gfx.override_level_graphics = (setup.override_level_graphics == TRUE); gfx.override_level_sounds = (setup.override_level_sounds == TRUE); gfx.override_level_music = (setup.override_level_music == TRUE); } else { - // this level set has no CE definitions: change "AUTO" to "TRUE" + // this level set has no CE definitions: change "MODE_AUTO" to "TRUE" gfx.override_level_graphics = (setup.override_level_graphics != FALSE); gfx.override_level_sounds = (setup.override_level_sounds != FALSE); gfx.override_level_music = (setup.override_level_music != FALSE); @@ -6473,8 +6560,8 @@ void DisplayExitMessage(char *format, va_list ap) BackToFront(); - // deactivate toons on error message screen - setup.toons = FALSE; + // deactivate toons and global animations on error message screen + setup.global_animations = FALSE; WaitForEventToContinue(); } @@ -6555,6 +6642,7 @@ void OpenAll(void) print_timestamp_time("[init element properties stuff]"); InitGfx(); + InitSnd(); print_timestamp_time("InitGfx"); @@ -6583,6 +6671,7 @@ void OpenAll(void) InitGfxBackground(); + bd_open_all(); em_open_all(); sp_open_all(); mm_open_all(); @@ -6667,7 +6756,7 @@ static boolean WaitForApiThreads(void) return TRUE; // deactivate global animations (not accessible in game state "loading") - setup.toons = FALSE; + setup.global_animations = FALSE; // set game state to "loading" to be able to show busy animation SetGameStatus(GAME_MODE_LOADING); @@ -6701,6 +6790,7 @@ void CloseAllAndExit(int exit_value) FreeAllMusic(); CloseAudio(); // called after freeing sounds (needed for SDL) + bd_close_all(); em_close_all(); sp_close_all();