fixed setting (and maybe inheriting) draw order for global animations
[rocksndiamonds.git] / src / init.c
index f07be1d395e341c05e9b0dc7ac0c796e49cea4f5..45945dcd2d2f7868056be394ef789c4b34bf293c 100644 (file)
@@ -110,14 +110,14 @@ static int copy_properties[][5] =
 static int get_graphic_parameter_value(char *, char *, int);
 
 
-static Bitmap *getLoadingBackgroundBitmap(int graphic)
+static int getLoadingBackgroundImage(int graphic)
 {
-  return getBitmapFromGraphicOrDefault(graphic, INITIAL_IMG_BACKGROUND);
+  return getImageFromGraphicOrDefault(graphic, INITIAL_IMG_BACKGROUND);
 }
 
 static void SetLoadingWindowBackgroundImage(int graphic)
 {
-  SetWindowBackgroundBitmap(getLoadingBackgroundBitmap(graphic));
+  SetBackgroundImage(getLoadingBackgroundImage(graphic), REDRAW_ALL);
 }
 
 static void SetLoadingBackgroundImage(void)
@@ -381,7 +381,7 @@ void InitImageTextures(void)
     CreateImageTextures(texture_graphics[i]);
 }
 
-static int getFontBitmapID(int font_nr)
+static int getFontSpecialSuffix(void)
 {
   int special = -1;
 
@@ -394,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
@@ -411,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;
@@ -422,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;
   }
@@ -647,7 +670,7 @@ static void InitFontGraphicInfo(void)
   }
 
   InitFontInfo(font_bitmap_info, num_font_bitmaps,
-              getFontBitmapID, getFontFromToken);
+              getFontBitmapID, getFontFromToken, getTokenFromFont);
 }
 
 static void InitGlobalAnimGraphicInfo(void)
@@ -699,14 +722,23 @@ static void InitGlobalAnimGraphicInfo(void)
     struct GraphicInfo *g = &graphic_info[graphic];
     struct FileInfo *image = getImageListEntryFromImageID(graphic);
     char **parameter_raw = image->parameter;
-    int p = GFX_ARG_DRAW_MASKED;
-    int draw_masked = get_graphic_parameter_value(parameter_raw[p],
-                                                 image_config_suffix[p].token,
-                                                 image_config_suffix[p].type);
+    int p1 = GFX_ARG_DRAW_MASKED;
+    int p2 = GFX_ARG_DRAW_ORDER;
+    int draw_masked = get_graphic_parameter_value(parameter_raw[p1],
+                                                 image_config_suffix[p1].token,
+                                                 image_config_suffix[p1].type);
+    int draw_order = get_graphic_parameter_value(parameter_raw[p2],
+                                                image_config_suffix[p2].token,
+                                                image_config_suffix[p2].type);
 
     // if ".draw_masked" parameter is undefined, use default value "TRUE"
     if (draw_masked == ARG_UNDEFINED_VALUE)
       g->draw_masked = TRUE;
+
+    // if ".draw_order" parameter is undefined, set back to "undefined"
+    // (used to be able to inherit draw order from main animation later)
+    if (draw_order == ARG_UNDEFINED_VALUE)
+      g->draw_order = ARG_UNDEFINED_VALUE;
   }
 
 #if 0
@@ -1314,19 +1346,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;
 }
 
@@ -1381,6 +1421,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;
@@ -1410,8 +1451,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
@@ -1458,15 +1499,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)
     {
@@ -1624,7 +1658,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;
 
@@ -1632,6 +1666,10 @@ static void set_graphic_parameters_ext(int graphic, int *parameter,
   if (parameter[GFX_ARG_DRAW_MASKED] != ARG_UNDEFINED_VALUE)
     g->draw_masked = parameter[GFX_ARG_DRAW_MASKED];
 
+  // use a different default value for global animations (corrected later)
+  if (graphic >= IMG_GLOBAL_ANIM_1 && graphic <= IMG_GLOBAL_ANIM_32)
+    g->draw_order = ARG_UNDEFINED_VALUE;
+
   // used for toon animations and global animations
   if (parameter[GFX_ARG_DRAW_ORDER] != ARG_UNDEFINED_VALUE)
     g->draw_order = parameter[GFX_ARG_DRAW_ORDER];
@@ -1662,12 +1700,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)
@@ -2250,6 +2296,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);
@@ -5442,6 +5493,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;
 }
@@ -5449,10 +5506,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;
 }
@@ -5655,7 +5709,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);
 
@@ -5675,6 +5728,7 @@ void InitGfxBuffers(void)
 
   InitGfxBuffers_EM();
   InitGfxBuffers_SP();
+  InitGfxBuffers_MM();
 }
 
 static void InitGfx(void)
@@ -5753,10 +5807,6 @@ static void InitGfx(void)
 
   InitFontGraphicInfo();
 
-  DrawProgramInfo();
-
-  DrawInitTextHead("Loading graphics");
-
   InitMenuDesignSettings_Static();
 
   // initialize settings for initial images with default values
@@ -5854,6 +5904,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++)
@@ -5872,10 +5925,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;
@@ -6421,7 +6477,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);