fixed setting (and maybe inheriting) draw order for global animations
[rocksndiamonds.git] / src / init.c
index 4407567a3299729d09233cf4897bb5a20d81c74e..45945dcd2d2f7868056be394ef789c4b34bf293c 100644 (file)
@@ -722,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
@@ -1337,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;
 }
 
@@ -1404,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;
@@ -1433,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
@@ -1481,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)
     {
@@ -1647,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;
 
@@ -1655,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];
@@ -1685,6 +1700,8 @@ 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];
@@ -5489,9 +5506,7 @@ static void InitSetup(void)
 static void InitGameInfo(void)
 {
   game.restart_level = FALSE;
-
   game.request_active = FALSE;
-  game.request_active_or_moving = FALSE;
 
   game.use_masked_elements_initial = FALSE;
 }
@@ -5889,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++)
@@ -5913,6 +5931,7 @@ static void InitGfx(void)
   InitGfxDrawGlobalAnimFunction(DrawGlobalAnimations);
   InitGfxDrawGlobalBorderFunction(DrawMaskedBorderToTarget);
   InitGfxDrawTileCursorFunction(DrawTileCursor);
+  InitGfxDrawEnvelopeRequestFunction(DrawEnvelopeRequestToScreen);
 
   gfx.fade_border_source_status = global.border_status;
   gfx.fade_border_target_status = global.border_status;