added setting draw order and style for pointer-style global animations
[rocksndiamonds.git] / src / anim.c
index eccd018556eba250cf91c124ab34ad1190cdfabb..454389d573d4b2bd757fec251f758f8b4ceaf261 100644 (file)
@@ -230,6 +230,8 @@ static int anim_classes_last = ANIM_CLASS_NONE;
 
 static boolean drawing_to_fading_buffer = FALSE;
 
+static boolean handle_click = FALSE;
+
 
 // ============================================================================
 // generic animation frame calculation
@@ -534,6 +536,20 @@ static void InitGlobalAnimControls(void)
          anim->base = *part;
          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;
+       }
       }
 
       if (anim->num_parts > 0 || anim->has_base)
@@ -813,13 +829,24 @@ static void DrawGlobalAnimationsExt(int drawing_target, int drawing_stage)
 
 void DrawGlobalAnimations(int drawing_target, int drawing_stage)
 {
+  int last_cursor_mode_override = gfx.cursor_mode_override;
+
   if (drawing_stage == DRAW_GLOBAL_ANIM_STAGE_1)
+  {
     ResetGlobalAnim_Clickable();
 
+    gfx.cursor_mode_override = CURSOR_UNDEFINED;
+  }
+
   DrawGlobalAnimationsExt(drawing_target, drawing_stage);
 
   if (drawing_stage == DRAW_GLOBAL_ANIM_STAGE_2)
+  {
     ResetGlobalAnim_Clicked();
+  }
+
+  if (gfx.cursor_mode_override != last_cursor_mode_override)
+    SetMouseCursor(gfx.cursor_mode);
 }
 
 static boolean SetGlobalAnimPart_Viewport(struct GlobalAnimPartControlInfo *part)
@@ -850,12 +877,17 @@ static boolean SetGlobalAnimPart_Viewport(struct GlobalAnimPartControlInfo *part
   }
   else if (part->control_info.class == get_hash_from_key("pointer"))
   {
-    viewport_x = gfx.mouse_x + part->control_info.x;
-    viewport_y = gfx.mouse_y + part->control_info.y;
+    int mx = MIN(MAX(0, gfx.mouse_x), WIN_XSIZE - 1);
+    int my = MIN(MAX(0, gfx.mouse_y), WIN_YSIZE - 1);
+
+    viewport_x = mx + part->control_info.x;
+    viewport_y = my + part->control_info.y;
     viewport_width  = part->graphic_info.width;
     viewport_height = part->graphic_info.height;
 
     part->drawing_stage = DRAW_GLOBAL_ANIM_STAGE_2;
+
+    gfx.cursor_mode_override = CURSOR_NONE;
   }
   else if (part->control_info.class == get_hash_from_key("door_1"))
   {
@@ -1185,6 +1217,9 @@ static void HandleGlobalAnimEvent(struct GlobalAnimPartControlInfo *part,
 static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part,
                                 int state)
 {
+  if (handle_click && !part->clicked)
+    return state;
+
   struct GlobalAnimControlInfo *ctrl = &global_anim_ctrl[part->mode_nr];
   struct GlobalAnimMainControlInfo *anim = &ctrl->anim[part->anim_nr];
   struct GraphicInfo *g = &part->graphic_info;
@@ -1815,6 +1850,15 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, int clicked_event)
     }
   }
 
+  if (anything_clicked)
+  {
+    handle_click = TRUE;
+
+    HandleGlobalAnim(ANIM_CONTINUE, game_status);
+
+    handle_click = FALSE;
+  }
+
   return (anything_clicked || any_event_action);
 }