X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Finit.c;h=62a5d0ff860865ef4d203e8b71f2b30da8b23ff7;hp=2e250179934eeeefbf911a3343785c12ef5e7800;hb=HEAD;hpb=27fd44d4a7662658efd3c01f4362070599f6b426 diff --git a/src/init.c b/src/init.c index 2e250179..62a5d0ff 100644 --- a/src/init.c +++ b/src/init.c @@ -34,15 +34,24 @@ #define CONFIG_TOKEN_FONT_INITIAL "font.initial" +#define CONFIG_TOKEN_GLOBAL_BUSY_INITIAL "global.busy_initial" #define CONFIG_TOKEN_GLOBAL_BUSY "global.busy" +#define CONFIG_TOKEN_GLOBAL_BUSY_PLAYFIELD "global.busy_playfield" +#define CONFIG_TOKEN_BACKGROUND "background" #define CONFIG_TOKEN_BACKGROUND_LOADING_INITIAL "background.LOADING_INITIAL" #define CONFIG_TOKEN_BACKGROUND_LOADING "background.LOADING" -#define INITIAL_IMG_GLOBAL_BUSY 0 -#define INITIAL_IMG_BACKGROUND_LOADING_INITIAL 1 -#define INITIAL_IMG_BACKGROUND_LOADING 2 +#define INITIAL_IMG_GLOBAL_BUSY_INITIAL 0 +#define INITIAL_IMG_GLOBAL_BUSY 1 +#define INITIAL_IMG_GLOBAL_BUSY_PLAYFIELD 2 -#define NUM_INITIAL_IMAGES 3 +#define NUM_INITIAL_IMAGES_BUSY 3 + +#define INITIAL_IMG_BACKGROUND 3 +#define INITIAL_IMG_BACKGROUND_LOADING_INITIAL 4 +#define INITIAL_IMG_BACKGROUND_LOADING 5 + +#define NUM_INITIAL_IMAGES 6 static struct FontBitmapInfo font_initial[NUM_INITIAL_FONTS]; @@ -101,6 +110,16 @@ static int copy_properties[][5] = static int get_graphic_parameter_value(char *, char *, int); +static int getLoadingBackgroundImage(int graphic) +{ + return getImageFromGraphicOrDefault(graphic, INITIAL_IMG_BACKGROUND); +} + +static void SetLoadingWindowBackgroundImage(int graphic) +{ + SetBackgroundImage(getLoadingBackgroundImage(graphic), REDRAW_ALL); +} + static void SetLoadingBackgroundImage(void) { struct GraphicInfo *graphic_info_last = graphic_info; @@ -113,43 +132,53 @@ static void SetLoadingBackgroundImage(void) SetDrawDeactivationMask(REDRAW_NONE); SetDrawBackgroundMask(REDRAW_ALL); - SetWindowBackgroundImage(background_image); + SetLoadingWindowBackgroundImage(background_image); graphic_info = graphic_info_last; } -static void DrawInitAnim(void) +static void DrawInitAnim(boolean only_when_loading) { struct GraphicInfo *graphic_info_last = graphic_info; - int graphic = 0; - static unsigned int action_delay = 0; - unsigned int action_delay_value = GameFrameDelay; + int graphic = (game_status_last_screen == -1 ? + INITIAL_IMG_GLOBAL_BUSY_INITIAL : + game_status == GAME_MODE_LOADING ? + INITIAL_IMG_GLOBAL_BUSY : + INITIAL_IMG_GLOBAL_BUSY_PLAYFIELD); + struct MenuPosInfo *busy = (game_status_last_screen == -1 ? + &init_last.busy_initial : + game_status == GAME_MODE_LOADING ? + &init_last.busy : + &init_last.busy_playfield); + static DelayCounter action_delay = { 0 }; int sync_frame = FrameCounter; int x, y; + action_delay.value = GameFrameDelay; + // prevent OS (Windows) from complaining about program not responding CheckQuitEvent(); - if (game_status != GAME_MODE_LOADING) + if (game_status != GAME_MODE_LOADING && only_when_loading) return; - if (image_initial[INITIAL_IMG_GLOBAL_BUSY].bitmap == NULL || window == NULL) + if (image_initial[graphic].bitmap == NULL || window == NULL) return; - if (!DelayReached(&action_delay, action_delay_value)) + if (!DelayReached(&action_delay)) return; - if (init_last.busy.x == -1) - init_last.busy.x = WIN_XSIZE / 2; - if (init_last.busy.y == -1) - init_last.busy.y = WIN_YSIZE / 2; + if (busy->x == -1) + busy->x = (game_status == GAME_MODE_LOADING ? WIN_XSIZE / 2 : SXSIZE / 2); + if (busy->y == -1) + busy->y = (game_status == GAME_MODE_LOADING ? WIN_YSIZE / 2 : SYSIZE / 2); - x = ALIGNED_TEXT_XPOS(&init_last.busy); - y = ALIGNED_TEXT_YPOS(&init_last.busy); + x = (game_status == GAME_MODE_LOADING ? 0 : SX) + ALIGNED_TEXT_XPOS(busy); + y = (game_status == GAME_MODE_LOADING ? 0 : SY) + ALIGNED_TEXT_YPOS(busy); - graphic_info = image_initial; // graphic == 0 => image_initial + graphic_info = image_initial; - if (sync_frame % image_initial[INITIAL_IMG_GLOBAL_BUSY].anim_delay == 0) + if (sync_frame % image_initial[graphic].anim_delay == 0) { Bitmap *src_bitmap; int src_x, src_y; @@ -352,7 +381,7 @@ void InitImageTextures(void) CreateImageTextures(texture_graphics[i]); } -static int getFontBitmapID(int font_nr) +static int getFontSpecialSuffix(void) { int special = -1; @@ -365,6 +394,13 @@ static int getFontBitmapID(int font_nr) else if (game_status == GAME_MODE_PSEUDO_TYPENAMES) special = GFX_SPECIAL_ARG_NAMES; + return special; +} + +static int getFontBitmapID(int font_nr) +{ + int special = getFontSpecialSuffix(); + if (special != -1) return font_info[font_nr].special_bitmap_id[special]; else @@ -382,6 +418,22 @@ static int getFontFromToken(char *token) return FONT_INITIAL_1; } +static char *getTokenFromFont(int font_nr) +{ + static char *token = NULL; + int special = getFontSpecialSuffix(); + + checked_free(token); + + if (special != -1) + token = getStringCat2(font_info[font_nr].token_name, + special_suffix_info[special].suffix); + else + token = getStringCopy(font_info[font_nr].token_name); + + return token; +} + static void InitFontGraphicInfo(void) { static struct FontBitmapInfo *font_bitmap_info = NULL; @@ -393,7 +445,7 @@ static void InitFontGraphicInfo(void) if (graphic_info == NULL) // still at startup phase { InitFontInfo(font_initial, NUM_INITIAL_FONTS, - getFontBitmapID, getFontFromToken); + getFontBitmapID, getFontFromToken, getTokenFromFont); return; } @@ -618,7 +670,7 @@ static void InitFontGraphicInfo(void) } InitFontInfo(font_bitmap_info, num_font_bitmaps, - getFontBitmapID, getFontFromToken); + getFontBitmapID, getFontFromToken, getTokenFromFont); } static void InitGlobalAnimGraphicInfo(void) @@ -1285,19 +1337,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; } @@ -1352,6 +1412,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; @@ -1381,8 +1442,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 @@ -1429,15 +1490,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) { @@ -1532,6 +1586,9 @@ static void set_graphic_parameters_ext(int graphic, int *parameter, // animation synchronized with global frame counter, not move position g->anim_global_sync = parameter[GFX_ARG_GLOBAL_SYNC]; + // animation synchronized with global anim frame counter, not move position + g->anim_global_anim_sync = parameter[GFX_ARG_GLOBAL_ANIM_SYNC]; + // optional element for cloning crumble graphics if (parameter[GFX_ARG_CRUMBLED_LIKE] != ARG_UNDEFINED_VALUE) g->crumbled_like = parameter[GFX_ARG_CRUMBLED_LIKE]; @@ -1592,7 +1649,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; @@ -1630,12 +1687,20 @@ 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]; g->active_yoffset = parameter[GFX_ARG_ACTIVE_YOFFSET]; g->pressed_xoffset = parameter[GFX_ARG_PRESSED_XOFFSET]; g->pressed_yoffset = parameter[GFX_ARG_PRESSED_YOFFSET]; + + // this is only used for drawing stacked global animations + g->stacked_xfactor = parameter[GFX_ARG_STACKED_XFACTOR]; + g->stacked_yfactor = parameter[GFX_ARG_STACKED_YFACTOR]; + g->stacked_xoffset = parameter[GFX_ARG_STACKED_XOFFSET]; + g->stacked_yoffset = parameter[GFX_ARG_STACKED_YOFFSET]; } static void set_graphic_parameters(int graphic) @@ -1723,6 +1788,8 @@ static void InitGraphicInfo(void) IMG_BACKGROUND_REQUEST, IMG_BACKGROUND, + IMG_BACKGROUND_LOADING_INITIAL, + IMG_BACKGROUND_LOADING, IMG_BACKGROUND_TITLE_INITIAL, IMG_BACKGROUND_TITLE, IMG_BACKGROUND_MAIN, @@ -1730,6 +1797,7 @@ static void InitGraphicInfo(void) IMG_BACKGROUND_LEVELS, IMG_BACKGROUND_LEVELNR, IMG_BACKGROUND_SCORES, + IMG_BACKGROUND_SCOREINFO, IMG_BACKGROUND_EDITOR, IMG_BACKGROUND_INFO, IMG_BACKGROUND_INFO_ELEMENTS, @@ -1911,6 +1979,16 @@ static void InitGraphicCompatibilityInfo(void) // process all images which default to same image as "global.door" if (strEqual(fi->default_filename, fi_global_door->default_filename)) { + // skip all images that are cloned from images that default to same + // image as "global.door", but that are redefined to something else + if (graphic_info[i].clone_from != -1) + { + int cloned_graphic = graphic_info[i].clone_from; + + if (getImageListEntryFromImageID(cloned_graphic)->redefined) + continue; + } + #if 0 Debug("init:InitGraphicCompatibilityInfo", "special treatment needed for token '%s'", fi->token); @@ -1923,6 +2001,70 @@ static void InitGraphicCompatibilityInfo(void) } } + // special compatibility handling for "Snake Bite" graphics set + if (strPrefix(leveldir_current->identifier, "snake_bite")) + { + Bitmap *bitmap = graphic_info[IMG_BACKGROUND_SCORES].bitmap; + + BlitBitmap(bitmap, bitmap, 18, 66, 32, 480, 50, 66); + BlitBitmap(bitmap, bitmap, 466, 66, 32, 480, 434, 66); + + ClearRectangle(bitmap, 2, 66, 32, 480); + ClearRectangle(bitmap, 514, 66, 32, 480); + } + + // special compatibility handling for "Jue" graphics sets (2007 and 2019) + boolean supports_score_info = (menu.draw_xoffset[GAME_MODE_SCOREINFO] != 0); + if (strPrefix(artwork.gfx_current_identifier, "jue") && !supports_score_info) + { + int font_title[] = + { + FONT_TITLE_1, + FONT_TITLE_2, + + -1 + }; + int font_text[] = + { + FONT_TEXT_1, + FONT_TEXT_2, + FONT_TEXT_3, + FONT_TEXT_4, + + -1 + }; + int mode_old = GAME_MODE_SCORES; + int mode_new = GAME_MODE_SCOREINFO; + int i, j; + + // adjust title screens on score info page + for (i = 0; font_title[i] != -1; i++) + { + struct FontInfo *fi = &font_info[font_title[i]]; + + fi->special_graphic[mode_new] = fi->special_graphic[mode_old]; + fi->special_bitmap_id[mode_new] = fi->special_bitmap_id[mode_old]; + } + + // adjust vertical text and button positions on scores page + for (i = 0; font_text[i] != -1; i++) + { + for (j = 0; j < 2; j++) + { + boolean jue0 = strEqual(artwork.gfx_current_identifier, "jue0"); + int font_nr = (j == 0 ? font_text[i] : FONT_ACTIVE(font_text[i])); + int font_bitmap_id = font_info[font_nr].special_bitmap_id[mode_old]; + int font_yoffset = (jue0 ? 10 : 5); + + gfx.font_bitmap_info[font_bitmap_id].draw_yoffset = font_yoffset; + } + } + + // adjust page offsets on score info page + menu.draw_xoffset[mode_new] = menu.draw_xoffset[mode_old]; + menu.draw_yoffset[mode_new] = menu.draw_yoffset[mode_old]; + } + InitGraphicCompatibilityInfo_Doors(); } @@ -2141,6 +2283,11 @@ static void InitSoundInfo(void) } set_sound_parameters(i, sound->parameter); + +#if 0 + Debug("init:InitSoundInfo", "loop mode: %d ['%s']", + sound_info[i].loop, sound->token); +#endif } free(sound_effect_properties); @@ -4131,6 +4278,7 @@ void InitElementPropertiesStatic(void) EL_BD_AMOEBA, EL_EMC_MAGIC_BALL, EL_EMC_ANDROID, + EL_MM_GRAY_BALL, -1 }; @@ -4893,6 +5041,9 @@ static void InitGlobal(void) global_anim_info[i].token_name = global_anim_name_info[i].token_name; } + // create hash to store URLs for global animations + anim_url_hash = newSetupFileHash(); + // create hash from image config list image_config_hash = newSetupFileHash(); for (i = 0; image_config[i].token != NULL; i++) @@ -5329,6 +5480,12 @@ static void InitSetup(void) if (setup.options.verbose) options.verbose = TRUE; + if (setup.options.debug) + options.debug = TRUE; + + if (!strEqual(setup.options.debug_mode, ARG_UNDEFINED_STRING)) + options.debug_mode = getStringCopy(setup.options.debug_mode); + if (setup.debug.show_frames_per_second) global.show_frames_per_second = TRUE; } @@ -5336,10 +5493,7 @@ static void InitSetup(void) static void InitGameInfo(void) { game.restart_level = FALSE; - game.restart_game_message = NULL; - game.request_active = FALSE; - game.request_active_or_moving = FALSE; game.use_masked_elements_initial = FALSE; } @@ -5542,7 +5696,6 @@ void InitGfxBuffers(void) } ReCreateBitmap(&bitmap_db_field, FXSIZE, FYSIZE); - ReCreateBitmap(&bitmap_db_panel, DXSIZE, DYSIZE); ReCreateBitmap(&bitmap_db_door_1, 3 * DXSIZE, DYSIZE); ReCreateBitmap(&bitmap_db_door_2, 3 * VXSIZE, VYSIZE); @@ -5562,6 +5715,7 @@ void InitGfxBuffers(void) InitGfxBuffers_EM(); InitGfxBuffers_SP(); + InitGfxBuffers_MM(); } static void InitGfx(void) @@ -5571,10 +5725,19 @@ static void InitGfx(void) char *filename_image_initial[NUM_INITIAL_IMAGES] = { NULL }; char *image_token[NUM_INITIAL_IMAGES] = { + CONFIG_TOKEN_GLOBAL_BUSY_INITIAL, CONFIG_TOKEN_GLOBAL_BUSY, + CONFIG_TOKEN_GLOBAL_BUSY_PLAYFIELD, + CONFIG_TOKEN_BACKGROUND, CONFIG_TOKEN_BACKGROUND_LOADING_INITIAL, CONFIG_TOKEN_BACKGROUND_LOADING }; + struct MenuPosInfo *init_busy[NUM_INITIAL_IMAGES_BUSY] = + { + &init.busy_initial, + &init.busy, + &init.busy_playfield + }; Bitmap *bitmap_font_initial = NULL; int parameter[NUM_INITIAL_IMAGES][NUM_GFX_ARGS]; int i, j, k; @@ -5631,10 +5794,6 @@ static void InitGfx(void) InitFontGraphicInfo(); - DrawProgramInfo(); - - DrawInitTextHead("Loading graphics"); - InitMenuDesignSettings_Static(); // initialize settings for initial images with default values @@ -5732,6 +5891,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++) @@ -5739,14 +5901,24 @@ static void InitGfx(void) graphic_info = graphic_info_last; + for (i = 0; i < NUM_INITIAL_IMAGES_BUSY; i++) + { + // set image size for busy animations + init_busy[i]->width = image_initial[i].width; + init_busy[i]->height = image_initial[i].height; + } + SetLoadingBackgroundImage(); 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; @@ -5854,17 +6026,14 @@ static void InitImages(void) print_timestamp_done("InitImages"); } -static void InitSound(char *identifier) +static void InitSound(void) { print_timestamp_init("InitSound"); - if (identifier == NULL) - identifier = artwork.snd_current->identifier; - // set artwork path to send it to the sound server process setLevelArtworkDir(artwork.snd_first); - InitReloadCustomSounds(identifier); + InitReloadCustomSounds(); print_timestamp_time("InitReloadCustomSounds"); ReinitializeSounds(); @@ -5873,17 +6042,14 @@ static void InitSound(char *identifier) print_timestamp_done("InitSound"); } -static void InitMusic(char *identifier) +static void InitMusic(void) { print_timestamp_init("InitMusic"); - if (identifier == NULL) - identifier = artwork.mus_current->identifier; - // set artwork path to send it to the sound server process setLevelArtworkDir(artwork.mus_first); - InitReloadCustomMusic(identifier); + InitReloadCustomMusic(); print_timestamp_time("InitReloadCustomMusic"); ReinitializeMusic(); @@ -6072,7 +6238,7 @@ static void InitOverrideArtwork(void) #endif } -static char *getNewArtworkIdentifier(int type) +static char *setNewArtworkIdentifier(int type) { static char *last_leveldir_identifier[3] = { NULL, NULL, NULL }; static char *last_artwork_identifier[3] = { NULL, NULL, NULL }; @@ -6137,6 +6303,7 @@ static char *getNewArtworkIdentifier(int type) // (we cannot compare string pointers here, so copy string content itself) setString(&last_artwork_identifier[type], artwork_current_identifier); + // ---------- set new artwork identifier ---------- *(ARTWORK_CURRENT_IDENTIFIER_PTR(artwork, type)) = artwork_current_identifier; // ---------- do not reload directly after starting ------------------------- @@ -6148,6 +6315,13 @@ static char *getNewArtworkIdentifier(int type) return artwork_new_identifier; } +static void InitArtworkIdentifier(void) +{ + setNewArtworkIdentifier(ARTWORK_TYPE_GRAPHICS); + setNewArtworkIdentifier(ARTWORK_TYPE_SOUNDS); + setNewArtworkIdentifier(ARTWORK_TYPE_MUSIC); +} + void ReloadCustomArtwork(int force_reload) { int last_game_status = game_status; // save current game status @@ -6164,9 +6338,9 @@ void ReloadCustomArtwork(int force_reload) AdjustGraphicsForEMC(); AdjustSoundsForEMC(); - gfx_new_identifier = getNewArtworkIdentifier(ARTWORK_TYPE_GRAPHICS); - snd_new_identifier = getNewArtworkIdentifier(ARTWORK_TYPE_SOUNDS); - mus_new_identifier = getNewArtworkIdentifier(ARTWORK_TYPE_MUSIC); + gfx_new_identifier = setNewArtworkIdentifier(ARTWORK_TYPE_GRAPHICS); + snd_new_identifier = setNewArtworkIdentifier(ARTWORK_TYPE_SOUNDS); + mus_new_identifier = setNewArtworkIdentifier(ARTWORK_TYPE_MUSIC); reload_needed = (gfx_new_identifier != NULL || force_reload_gfx || snd_new_identifier != NULL || force_reload_snd || @@ -6190,6 +6364,8 @@ void ReloadCustomArtwork(int force_reload) UPDATE_BUSY_STATE(); + InitMissingFileHash(); + if (gfx_new_identifier != NULL || force_reload_gfx) { #if 0 @@ -6207,13 +6383,13 @@ void ReloadCustomArtwork(int force_reload) if (snd_new_identifier != NULL || force_reload_snd) { - InitSound(snd_new_identifier); + InitSound(); print_timestamp_time("InitSound"); } if (mus_new_identifier != NULL || force_reload_mus) { - InitMusic(mus_new_identifier); + InitMusic(); print_timestamp_time("InitMusic"); } @@ -6288,7 +6464,7 @@ void DisplayExitMessage(char *format, va_list ap) sy += 3 * font_height; num_lines_printed = - DrawTextBuffer(sx, sy, program.log_filename[LOG_ERR_ID], font_2, + DrawTextBuffer(sx, sy, program.log_filename, font_2, line_length, line_length, max_lines, 0, BLIT_ON_BACKGROUND, TRUE, TRUE, FALSE); @@ -6301,8 +6477,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(); } @@ -6326,6 +6502,8 @@ void OpenAll(void) InitSimpleRandom(NEW_RANDOMIZE); InitBetterRandom(NEW_RANDOMIZE); + InitMissingFileHash(); + print_timestamp_time("[init global stuff]"); InitSetup(); @@ -6393,13 +6571,16 @@ void OpenAll(void) InitOverrideArtwork(); // needs to know current level directory print_timestamp_time("InitOverrideArtwork"); + InitArtworkIdentifier(); // needs to know current level directory + print_timestamp_time("InitArtworkIdentifier"); + InitImages(); // needs to know current level directory print_timestamp_time("InitImages"); - InitSound(NULL); // needs to know current level directory + InitSound(); // needs to know current level directory print_timestamp_time("InitSound"); - InitMusic(NULL); // needs to know current level directory + InitMusic(); // needs to know current level directory print_timestamp_time("InitMusic"); InitArtworkDone(); @@ -6484,14 +6665,13 @@ void OpenAll(void) static boolean WaitForApiThreads(void) { - unsigned int thread_delay = 0; - unsigned int thread_delay_value = 10000; + DelayCounter thread_delay = { 10000 }; if (program.api_thread_count == 0) 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); @@ -6501,7 +6681,7 @@ static boolean WaitForApiThreads(void) // wait for threads to finish (and fail on timeout) while (program.api_thread_count > 0) { - if (DelayReached(&thread_delay, thread_delay_value)) + if (DelayReached(&thread_delay)) { Error("failed waiting for threads - TIMEOUT");