added initially setting artwork identifier
[rocksndiamonds.git] / src / init.c
index 8b0d8ef39600de69f49b8916bea19047334d759c..136abe6a8717dea9a65db8d3c2358a543645d629 100644 (file)
 #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_BACKGROUND_LOADING_INITIAL 2
-#define INITIAL_IMG_BACKGROUND_LOADING         3
+#define INITIAL_IMG_GLOBAL_BUSY_PLAYFIELD      2
 
-#define NUM_INITIAL_IMAGES                     4
+#define NUM_INITIAL_IMAGES_BUSY                        3
+
+#define INITIAL_IMG_BACKGROUND_LOADING_INITIAL 3
+#define INITIAL_IMG_BACKGROUND_LOADING         4
+
+#define NUM_INITIAL_IMAGES                     5
 
 
 static struct FontBitmapInfo font_initial[NUM_INITIAL_FONTS];
@@ -120,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)
@@ -148,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;
 
@@ -1922,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);
@@ -1934,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();
 }
 
@@ -4904,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++)
@@ -5584,9 +5669,16 @@ 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_playfield
+  };
   Bitmap *bitmap_font_initial = NULL;
   int parameter[NUM_INITIAL_IMAGES][NUM_GFX_ARGS];
   int i, j, k;
@@ -5751,6 +5843,13 @@ 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);
@@ -6084,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 };
@@ -6149,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 -------------------------
@@ -6160,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
@@ -6176,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 ||
@@ -6202,6 +6309,8 @@ void ReloadCustomArtwork(int force_reload)
 
   UPDATE_BUSY_STATE();
 
+  InitMissingFileHash();
+
   if (gfx_new_identifier != NULL || force_reload_gfx)
   {
 #if 0
@@ -6338,6 +6447,8 @@ void OpenAll(void)
   InitSimpleRandom(NEW_RANDOMIZE);
   InitBetterRandom(NEW_RANDOMIZE);
 
+  InitMissingFileHash();
+
   print_timestamp_time("[init global stuff]");
 
   InitSetup();
@@ -6405,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");