X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=136abe6a8717dea9a65db8d3c2358a543645d629;hb=ac9feee5631d3725a6d7b75b065c8be33a22d4b5;hp=a79bd5bbb2b9483ae0a3a0a5a91e03d0bed69606;hpb=1e7efe72121a22a3eed6412f08fd1718287e2952;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index a79bd5bb..136abe6a 100644 --- a/src/init.c +++ b/src/init.c @@ -36,18 +36,20 @@ #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_LOADING_INITIAL "background.LOADING_INITIAL" #define CONFIG_TOKEN_BACKGROUND_LOADING "background.LOADING" #define INITIAL_IMG_GLOBAL_BUSY_INITIAL 0 #define INITIAL_IMG_GLOBAL_BUSY 1 +#define INITIAL_IMG_GLOBAL_BUSY_PLAYFIELD 2 -#define NUM_INITIAL_IMAGES_BUSY 2 +#define NUM_INITIAL_IMAGES_BUSY 3 -#define INITIAL_IMG_BACKGROUND_LOADING_INITIAL 2 -#define INITIAL_IMG_BACKGROUND_LOADING 3 +#define INITIAL_IMG_BACKGROUND_LOADING_INITIAL 3 +#define INITIAL_IMG_BACKGROUND_LOADING 4 -#define NUM_INITIAL_IMAGES 4 +#define NUM_INITIAL_IMAGES 5 static struct FontBitmapInfo font_initial[NUM_INITIAL_FONTS]; @@ -123,25 +125,28 @@ static void SetLoadingBackgroundImage(void) 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 = (game_status_last_screen == -1 ? INITIAL_IMG_GLOBAL_BUSY_INITIAL : - INITIAL_IMG_GLOBAL_BUSY); + 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 : - &init_last.busy); + game_status == GAME_MODE_LOADING ? + &init_last.busy : + &init_last.busy_playfield); static unsigned int action_delay = 0; unsigned int action_delay_value = GameFrameDelay; int sync_frame = FrameCounter; int x, y; - // 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[graphic].bitmap == NULL || window == NULL) @@ -151,12 +156,12 @@ static void DrawInitAnim(void) return; if (busy->x == -1) - busy->x = WIN_XSIZE / 2; + busy->x = (game_status == GAME_MODE_LOADING ? WIN_XSIZE / 2 : SXSIZE / 2); if (busy->y == -1) - busy->y = WIN_YSIZE / 2; + busy->y = (game_status == GAME_MODE_LOADING ? WIN_YSIZE / 2 : SYSIZE / 2); - x = ALIGNED_TEXT_XPOS(busy); - y = ALIGNED_TEXT_YPOS(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; @@ -1925,6 +1930,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); @@ -1937,6 +1952,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(leveldir_current->graphics_set, "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(leveldir_current->graphics_set, "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(); } @@ -4907,6 +4986,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++) @@ -5587,13 +5669,15 @@ static void InitGfx(void) { CONFIG_TOKEN_GLOBAL_BUSY_INITIAL, CONFIG_TOKEN_GLOBAL_BUSY, + CONFIG_TOKEN_GLOBAL_BUSY_PLAYFIELD, CONFIG_TOKEN_BACKGROUND_LOADING_INITIAL, CONFIG_TOKEN_BACKGROUND_LOADING }; struct MenuPosInfo *init_busy[NUM_INITIAL_IMAGES_BUSY] = { &init.busy_initial, - &init.busy + &init.busy, + &init.busy_playfield }; Bitmap *bitmap_font_initial = NULL; int parameter[NUM_INITIAL_IMAGES][NUM_GFX_ARGS]; @@ -6099,7 +6183,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 }; @@ -6164,6 +6248,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 ------------------------- @@ -6175,6 +6260,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 @@ -6191,9 +6283,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 || @@ -6217,6 +6309,8 @@ void ReloadCustomArtwork(int force_reload) UPDATE_BUSY_STATE(); + InitMissingFileHash(); + if (gfx_new_identifier != NULL || force_reload_gfx) { #if 0 @@ -6353,6 +6447,8 @@ void OpenAll(void) InitSimpleRandom(NEW_RANDOMIZE); InitBetterRandom(NEW_RANDOMIZE); + InitMissingFileHash(); + print_timestamp_time("[init global stuff]"); InitSetup(); @@ -6420,6 +6516,9 @@ 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");