X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Finit.c;h=041098f2665f427118e8e5a8bce1b539d17e50f2;hb=b17343806da99bd24842f0b2e58d8513e0108bb7;hp=0f5a74cc0a9d2eb488aa507356b51adf4b9ed348;hpb=491ad391865f3746aefb49710ec7798418e0d7bb;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index 0f5a74cc..041098f2 100644 --- a/src/init.c +++ b/src/init.c @@ -35,10 +35,16 @@ #define CONFIG_TOKEN_FONT_INITIAL "font.initial" #define CONFIG_TOKEN_GLOBAL_BUSY "global.busy" +#define CONFIG_TOKEN_BACKGROUND_LOADING "background.LOADING" + +#define INITIAL_IMG_GLOBAL_BUSY 0 +#define INITIAL_IMG_BACKGROUND_LOADING 1 + +#define NUM_INITIAL_IMAGES 2 static struct FontBitmapInfo font_initial[NUM_INITIAL_FONTS]; -static struct GraphicInfo anim_initial; +static struct GraphicInfo image_initial[NUM_INITIAL_IMAGES]; static int copy_properties[][5] = { @@ -93,6 +99,20 @@ static int copy_properties[][5] = static int get_graphic_parameter_value(char *, char *, int); +static void SetLoadingBackgroundImage(void) +{ + struct GraphicInfo *graphic_info_last = graphic_info; + + graphic_info = image_initial; + + SetDrawDeactivationMask(REDRAW_NONE); + SetDrawBackgroundMask(REDRAW_ALL); + + SetWindowBackgroundImage(INITIAL_IMG_BACKGROUND_LOADING); + + graphic_info = graphic_info_last; +} + static void DrawInitAnim(void) { struct GraphicInfo *graphic_info_last = graphic_info; @@ -108,7 +128,7 @@ static void DrawInitAnim(void) if (game_status != GAME_MODE_LOADING) return; - if (anim_initial.bitmap == NULL || window == NULL) + if (image_initial[INITIAL_IMG_GLOBAL_BUSY].bitmap == NULL || window == NULL) return; if (!DelayReached(&action_delay, action_delay_value)) @@ -122,9 +142,9 @@ static void DrawInitAnim(void) x = ALIGNED_TEXT_XPOS(&init_last.busy); y = ALIGNED_TEXT_YPOS(&init_last.busy); - graphic_info = &anim_initial; // graphic == 0 => anim_initial + graphic_info = image_initial; // graphic == 0 => image_initial - if (sync_frame % anim_initial.anim_delay == 0) + if (sync_frame % image_initial[INITIAL_IMG_GLOBAL_BUSY].anim_delay == 0) { Bitmap *src_bitmap; int src_x, src_y; @@ -132,8 +152,12 @@ static void DrawInitAnim(void) int height = graphic_info[graphic].height; int frame = getGraphicAnimationFrame(graphic, sync_frame); + ClearRectangleOnBackground(drawto, x, y, width, height); + getFixedGraphicSource(graphic, frame, &src_bitmap, &src_x, &src_y); - BlitBitmap(src_bitmap, window, src_x, src_y, width, height, x, y); + BlitBitmapMasked(src_bitmap, drawto, src_x, src_y, width, height, x, y); + + BlitBitmap(drawto, window, x, y, width, height, x, y); } graphic_info = graphic_info_last; @@ -2236,6 +2260,13 @@ static void InitMusicInfo(void) } } + +static void InitGameInfoFromArtworkInfo(void) +{ + // special case: store initial value of custom artwork setting + game.use_masked_elements_initial = game.use_masked_elements; +} + static void ReinitializeGraphics(void) { print_timestamp_init("ReinitializeGraphics"); @@ -2269,16 +2300,13 @@ static void ReinitializeGraphics(void) InitGraphicCompatibilityInfo(); print_timestamp_time("InitGraphicCompatibilityInfo"); - SetMainBackgroundImage(IMG_BACKGROUND); - print_timestamp_time("SetMainBackgroundImage"); - SetDoorBackgroundImage(IMG_BACKGROUND_DOOR); - print_timestamp_time("SetDoorBackgroundImage"); - InitGadgets(); print_timestamp_time("InitGadgets"); InitDoors(); print_timestamp_time("InitDoors"); + InitGameInfoFromArtworkInfo(); + print_timestamp_done("ReinitializeGraphics"); } @@ -5307,6 +5335,8 @@ static void InitGameInfo(void) game.request_active = FALSE; game.request_active_or_moving = FALSE; + + game.use_masked_elements_initial = FALSE; } static void InitPlayerInfo(void) @@ -5533,9 +5563,15 @@ static void InitGfx(void) { struct GraphicInfo *graphic_info_last = graphic_info; char *filename_font_initial = NULL; - char *filename_anim_initial = NULL; + char *filename_image_initial[NUM_INITIAL_IMAGES] = { NULL }; + char *image_token[NUM_INITIAL_IMAGES] = + { + CONFIG_TOKEN_GLOBAL_BUSY, + CONFIG_TOKEN_BACKGROUND_LOADING + }; Bitmap *bitmap_font_initial = NULL; - int i, j; + int parameter[NUM_INITIAL_IMAGES][NUM_GFX_ARGS]; + int i, j, k; // determine settings for initial font (for displaying startup messages) for (i = 0; image_config[i].token != NULL; i++) @@ -5549,7 +5585,9 @@ static void InitGfx(void) len_font_token = strlen(font_token); if (strEqual(image_config[i].token, font_token)) + { filename_font_initial = image_config[i].value; + } else if (strlen(image_config[i].token) > len_font_token && strncmp(image_config[i].token, font_token, len_font_token) == 0) { @@ -5578,6 +5616,8 @@ static void InitGfx(void) InitGfxCustomArtworkInfo(); InitGfxOtherSettings(); + InitGfxTileSizeInfo(TILESIZE, TILESIZE); + bitmap_font_initial = LoadCustomImage(filename_font_initial); for (j = 0; j < NUM_INITIAL_FONTS; j++) @@ -5589,17 +5629,17 @@ static void InitGfx(void) DrawInitTextHead("Loading graphics"); - // initialize settings for busy animation with default values - int parameter[NUM_GFX_ARGS]; - for (i = 0; i < NUM_GFX_ARGS; i++) - parameter[i] = get_graphic_parameter_value(image_config_suffix[i].value, - image_config_suffix[i].token, - image_config_suffix[i].type); + InitMenuDesignSettings_Static(); - char *anim_token = CONFIG_TOKEN_GLOBAL_BUSY; - int len_anim_token = strlen(anim_token); + // initialize settings for initial images with default values + for (i = 0; i < NUM_INITIAL_IMAGES; i++) + for (j = 0; j < NUM_GFX_ARGS; j++) + parameter[i][j] = + get_graphic_parameter_value(image_config_suffix[j].value, + image_config_suffix[j].token, + image_config_suffix[j].type); - // read settings for busy animation from default custom artwork config + // read settings for initial images from default custom artwork config char *gfx_config_filename = getPath3(options.graphics_directory, GFX_DEFAULT_SUBDIR, GRAPHICSINFO_FILENAME); @@ -5610,74 +5650,92 @@ static void InitGfx(void) if (setup_file_hash) { - char *filename = getHashEntry(setup_file_hash, anim_token); - - if (filename) + for (i = 0; i < NUM_INITIAL_IMAGES; i++) { - filename_anim_initial = getStringCopy(filename); + char *filename = getHashEntry(setup_file_hash, image_token[i]); - for (j = 0; image_config_suffix[j].token != NULL; j++) + if (filename) { - int type = image_config_suffix[j].type; - char *suffix = image_config_suffix[j].token; - char *token = getStringCat2(anim_token, suffix); - char *value = getHashEntry(setup_file_hash, token); + filename_image_initial[i] = getStringCopy(filename); - checked_free(token); + for (j = 0; image_config_suffix[j].token != NULL; j++) + { + int type = image_config_suffix[j].type; + char *suffix = image_config_suffix[j].token; + char *token = getStringCat2(image_token[i], suffix); + char *value = getHashEntry(setup_file_hash, token); + + checked_free(token); - if (value) - parameter[j] = get_graphic_parameter_value(value, suffix, type); + if (value) + parameter[i][j] = + get_graphic_parameter_value(value, suffix, type); + } } } + // read values from custom graphics config file + InitMenuDesignSettings_FromHash(setup_file_hash, FALSE); + freeSetupFileHash(setup_file_hash); } } - if (filename_anim_initial == NULL) + for (i = 0; i < NUM_INITIAL_IMAGES; i++) { - // read settings for busy animation from static default artwork config - for (i = 0; image_config[i].token != NULL; i++) + if (filename_image_initial[i] == NULL) { - if (strEqual(image_config[i].token, anim_token)) - filename_anim_initial = getStringCopy(image_config[i].value); - else if (strlen(image_config[i].token) > len_anim_token && - strncmp(image_config[i].token, anim_token, len_anim_token) == 0) + int len_token = strlen(image_token[i]); + + // read settings for initial images from static default artwork config + for (j = 0; image_config[j].token != NULL; j++) { - for (j = 0; image_config_suffix[j].token != NULL; j++) + if (strEqual(image_config[j].token, image_token[i])) { - if (strEqual(&image_config[i].token[len_anim_token], - image_config_suffix[j].token)) - parameter[j] = - get_graphic_parameter_value(image_config[i].value, - image_config_suffix[j].token, - image_config_suffix[j].type); + filename_image_initial[i] = getStringCopy(image_config[j].value); + } + else if (strlen(image_config[j].token) > len_token && + strncmp(image_config[j].token, image_token[i], len_token) == 0) + { + for (k = 0; image_config_suffix[k].token != NULL; k++) + { + if (strEqual(&image_config[j].token[len_token], + image_config_suffix[k].token)) + parameter[i][k] = + get_graphic_parameter_value(image_config[j].value, + image_config_suffix[k].token, + image_config_suffix[k].type); + } } } } } - if (filename_anim_initial == NULL) // should not happen - Fail("cannot get filename for '%s'", CONFIG_TOKEN_GLOBAL_BUSY); + for (i = 0; i < NUM_INITIAL_IMAGES; i++) + { + if (filename_image_initial[i] == NULL) // should not happen + Fail("cannot get filename for '%s'", image_token[i]); - anim_initial.bitmaps = - checked_calloc(sizeof(Bitmap *) * NUM_IMG_BITMAP_POINTERS); + image_initial[i].bitmaps = + checked_calloc(sizeof(Bitmap *) * NUM_IMG_BITMAP_POINTERS); - anim_initial.bitmaps[IMG_BITMAP_STANDARD] = - LoadCustomImage(filename_anim_initial); + if (!strEqual(filename_image_initial[i], UNDEFINED_FILENAME)) + image_initial[i].bitmaps[IMG_BITMAP_STANDARD] = + LoadCustomImage(filename_image_initial[i]); - checked_free(filename_anim_initial); + checked_free(filename_image_initial[i]); + } - graphic_info = &anim_initial; // graphic == 0 => anim_initial + graphic_info = image_initial; // graphic == 0 => image_initial - set_graphic_parameters_ext(0, parameter, anim_initial.bitmaps); + for (i = 0; i < NUM_INITIAL_IMAGES; i++) + set_graphic_parameters_ext(i, parameter[i], image_initial[i].bitmaps); graphic_info = graphic_info_last; - init.busy.width = anim_initial.width; - init.busy.height = anim_initial.height; + SetLoadingBackgroundImage(); - InitMenuDesignSettings_Static(); + ClearRectangleOnBackground(window, 0, 0, WIN_XSIZE, WIN_YSIZE); InitGfxDrawBusyAnimFunction(DrawInitAnim); InitGfxDrawGlobalAnimFunction(DrawGlobalAnimations); @@ -6013,7 +6071,7 @@ static char *getNewArtworkIdentifier(int type) static char *last_leveldir_identifier[3] = { NULL, NULL, NULL }; static char *last_artwork_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 last_has_custom_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 = GFX_OVERRIDE_ARTWORK(type); @@ -6022,6 +6080,9 @@ static char *getNewArtworkIdentifier(int type) // !!! setLevelArtworkDir() should be moved to an earlier stage !!! char *leveldir_artwork_set = setLevelArtworkDir(artwork_first_node); boolean has_level_artwork_set = (leveldir_artwork_set != NULL); + TreeInfo *custom_artwork_set = + getTreeInfoFromIdentifier(artwork_first_node, leveldir_identifier); + boolean has_custom_artwork_set = (custom_artwork_set != NULL); char *artwork_current_identifier; char *artwork_new_identifier = NULL; // default: nothing has changed @@ -6039,9 +6100,9 @@ static char *getNewArtworkIdentifier(int type) if (setup_override_artwork) artwork_current_identifier = setup_artwork_set; - else if (leveldir_artwork_set != NULL) + else if (has_level_artwork_set) artwork_current_identifier = leveldir_artwork_set; - else if (getTreeInfoFromIdentifier(artwork_first_node, leveldir_identifier)) + else if (has_custom_artwork_set) artwork_current_identifier = leveldir_identifier; else artwork_current_identifier = setup_artwork_set; @@ -6051,11 +6112,11 @@ static char *getNewArtworkIdentifier(int type) // ---------- reload if level set and also artwork set has changed ---------- if (last_leveldir_identifier[type] != leveldir_identifier && - (last_has_level_artwork_set[type] || has_level_artwork_set)) + (last_has_custom_artwork_set[type] || has_custom_artwork_set)) artwork_new_identifier = artwork_current_identifier; last_leveldir_identifier[type] = leveldir_identifier; - last_has_level_artwork_set[type] = has_level_artwork_set; + last_has_custom_artwork_set[type] = has_custom_artwork_set; // ---------- reload if "override artwork" setting has changed -------------- if (last_override_level_artwork[type] != setup_override_artwork) @@ -6114,11 +6175,15 @@ void ReloadCustomArtwork(int force_reload) FadeOut(REDRAW_ALL); - ClearRectangle(drawto, 0, 0, WIN_XSIZE, WIN_YSIZE); - print_timestamp_time("ClearRectangle"); + SetLoadingBackgroundImage(); + + ClearRectangleOnBackground(drawto, 0, 0, WIN_XSIZE, WIN_YSIZE); + print_timestamp_time("ClearRectangleOnBackground"); FadeIn(REDRAW_ALL); + UPDATE_BUSY_STATE(); + if (gfx_new_identifier != NULL || force_reload_gfx) { #if 0 @@ -6150,8 +6215,6 @@ void ReloadCustomArtwork(int force_reload) SetGameStatus(last_game_status); // restore current game status - init_last = init; // switch to new busy animation - FadeOut(REDRAW_ALL); RedrawGlobalBorder();