fixed setting (and maybe inheriting) draw order for global animations
[rocksndiamonds.git] / src / anim.c
index 7f50b28bc84f902145e61c3f0f3b57174b6d1e13..0cb2023d85b6b21f1eb0f14bcf551f352942ace2 100644 (file)
@@ -315,7 +315,7 @@ int getAnimationFrame(int num_frames, int delay, int mode, int start_frame,
   }
   else if (mode & ANIM_LEVEL_NR)       // play frames by level number
   {
-    int level_pos = level_nr - leveldir_current->first_level;
+    int level_pos = level_nr - gfx.anim_first_level;
 
     frame = level_pos % num_frames;
   }
@@ -360,10 +360,8 @@ static int compareGlobalAnimPartControlInfo(const void *obj1, const void *obj2)
     (struct GlobalAnimPartControlInfo *)obj2;
   int compare_result;
 
-  if (o1->control_info.draw_order != o2->control_info.draw_order)
-    compare_result = o1->control_info.draw_order - o2->control_info.draw_order;
-  else
-    compare_result = o1->nr - o2->nr;
+  // do not sort animations parts by draw order (as it would be confusing)
+  compare_result = o1->nr - o2->nr;
 
   return compare_result;
 }
@@ -537,6 +535,10 @@ static void InitGlobalAnimControls(void)
 
       anim->state = ANIM_STATE_INACTIVE;
 
+      // if draw order is undefined, set to default value "0"
+      if (anim->control_info.draw_order == ARG_UNDEFINED_VALUE)
+       anim->control_info.draw_order = 0;
+
       part_nr = 0;
 
       for (p = 0; p < NUM_GLOBAL_ANIM_PARTS_ALL; p++)
@@ -604,19 +606,14 @@ static void InitGlobalAnimControls(void)
          anim->has_base = TRUE;
        }
 
-       // apply special settings for pointer-style animations
-       if (part->control_info.class == get_hash_from_key("pointer"))
-       {
-         // force animation to be on top (must set anim and part control)
-         if (anim->control_info.draw_order == 0)
-           anim->control_info.draw_order = 1000000;
-         if (part->control_info.draw_order == 0)
-           part->control_info.draw_order = 1000000;
-
-         // force animation to pass-through clicks (must set part control)
-         if (part->control_info.style == STYLE_DEFAULT)
-           part->control_info.style |= STYLE_PASSTHROUGH;
-       }
+       // force pointer-style animations to pass-through clicks
+       if (part->control_info.class == get_hash_from_key("pointer") &&
+           part->control_info.style == STYLE_DEFAULT)
+         part->control_info.style |= STYLE_PASSTHROUGH;
+
+       // if draw order is undefined, inherit it from main animation
+       if (part->control_info.draw_order == ARG_UNDEFINED_VALUE)
+         part->control_info.draw_order = anim->control_info.draw_order;
       }
 
       if (anim->num_parts > 0 || anim->has_base)
@@ -2122,7 +2119,8 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, int clicked_event)
   int mode_nr;
   int i;
 
-  for (mode_nr = 0; mode_nr < NUM_GAME_MODES; mode_nr++)
+  // check game modes in reverse draw order (to stop when clicked)
+  for (mode_nr = NUM_GAME_MODES - 1; mode_nr >= 0; mode_nr--)
   {
     struct GlobalAnimControlInfo *ctrl = &global_anim_ctrl[mode_nr];
     int anim_nr;