improved MM graphics engine to support custom explosions of elements
[rocksndiamonds.git] / src / tools.c
index 66f3cf724129c0da00f63558e303a3a8228fadcd..351c36e43e820d421b7502cc08592265cb351c73 100644 (file)
@@ -775,7 +775,7 @@ void BackToFront(void)
     DrawFramesPerSecond();
 
   // remove playfield redraw before potentially merging with doors redraw
-  if (DrawingDeactivated(REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE))
+  if (DrawingDeactivated(REAL_SX, REAL_SY))
     redraw_mask &= ~REDRAW_FIELD;
 
   // redraw complete window if both playfield and (some) doors need redraw
@@ -1110,7 +1110,7 @@ static int getGlobalGameStatus(int status)
          status);
 }
 
-static Bitmap *getBitmapFromGraphicOrDefault(int graphic, int default_graphic)
+Bitmap *getBitmapFromGraphicOrDefault(int graphic, int default_graphic)
 {
   if (graphic == IMG_UNDEFINED)
     return NULL;
@@ -1492,6 +1492,8 @@ int getGraphicAnimationFrame(int graphic, int sync_frame)
   // animation synchronized with global frame counter, not move position
   if (graphic_info[graphic].anim_global_sync || sync_frame < 0)
     sync_frame = FrameCounter;
+  else if (graphic_info[graphic].anim_global_anim_sync)
+    sync_frame = getGlobalAnimSyncFrame();
 
   return getAnimationFrame(graphic_info[graphic].anim_frames,
                           graphic_info[graphic].anim_delay,
@@ -4603,7 +4605,7 @@ static int RequestHandleEvents(unsigned int req_state, int draw_buffer_game)
 
          case EVENT_KEYPRESS:
          {
-           Key key = GetEventKey((KeyEvent *)&event, TRUE);
+           Key key = GetEventKey((KeyEvent *)&event);
 
            switch (key)
            {
@@ -8203,10 +8205,6 @@ int map_element_RND_to_MM(int element_rnd)
          element_rnd <= EL_MM_RUNTIME_END ?
          EL_MM_RUNTIME_START_NATIVE + element_rnd - EL_MM_RUNTIME_START :
 
-         element_rnd >= EL_MM_DUMMY_START &&
-         element_rnd <= EL_MM_DUMMY_END ?
-         EL_MM_DUMMY_START_NATIVE + element_rnd - EL_MM_DUMMY_START :
-
          EL_MM_EMPTY_NATIVE);
 }
 
@@ -8232,10 +8230,6 @@ int map_element_MM_to_RND(int element_mm)
          element_mm <= EL_MM_RUNTIME_END_NATIVE ?
          EL_MM_RUNTIME_START + element_mm - EL_MM_RUNTIME_START_NATIVE :
 
-         element_mm >= EL_MM_DUMMY_START_NATIVE &&
-         element_mm <= EL_MM_DUMMY_END_NATIVE ?
-         EL_MM_DUMMY_START + element_mm - EL_MM_DUMMY_START_NATIVE :
-
          EL_EMPTY);
 }
 
@@ -8329,6 +8323,11 @@ int el2img_mm(int element_mm)
   return el2img(map_element_MM_to_RND(element_mm));
 }
 
+int el_act2img_mm(int element_mm, int action)
+{
+  return el_act2img(map_element_MM_to_RND(element_mm), action);
+}
+
 int el_act_dir2img(int element, int action, int direction)
 {
   element = GFX_ELEMENT(element);
@@ -8786,6 +8785,8 @@ void SetGfxAnimation_EM(struct GraphicInfo_EM *g_em,
 
   if (graphic_info[graphic].anim_global_sync)
     sync_frame = FrameCounter;
+  else if (graphic_info[graphic].anim_global_anim_sync)
+    sync_frame = getGlobalAnimSyncFrame();
   else if (IN_FIELD(x, y, MAX_LEV_FIELDX, MAX_LEV_FIELDY))
     sync_frame = GfxFrame[x][y];
   else
@@ -8845,6 +8846,8 @@ void getGraphicSourceObjectExt_EM(struct GraphicInfo_EM *g_em,
 
   if (graphic_info[graphic].anim_global_sync)
     sync_frame = FrameCounter;
+  else if (graphic_info[graphic].anim_global_anim_sync)
+    sync_frame = getGlobalAnimSyncFrame();
   else if (IN_FIELD(x, y, MAX_LEV_FIELDX, MAX_LEV_FIELDY))
     sync_frame = GfxFrame[x][y];
   else
@@ -9308,7 +9311,7 @@ void InitGraphicInfo_EM(void)
   }
 }
 
-static void CheckSaveEngineSnapshot_EM(byte action[MAX_PLAYERS], int frame,
+static void CheckSaveEngineSnapshot_EM(int frame,
                                       boolean any_player_moving,
                                       boolean any_player_snapping,
                                       boolean any_player_dropping)
@@ -9365,7 +9368,7 @@ static void CheckSaveEngineSnapshot_MM(boolean element_clicked,
   }
 }
 
-boolean CheckSingleStepMode_EM(byte action[MAX_PLAYERS], int frame,
+boolean CheckSingleStepMode_EM(int frame,
                               boolean any_player_moving,
                               boolean any_player_snapping,
                               boolean any_player_dropping)
@@ -9374,7 +9377,7 @@ boolean CheckSingleStepMode_EM(byte action[MAX_PLAYERS], int frame,
     if (frame == 7 && !any_player_dropping && FrameCounter > 6)
       TapeTogglePause(TAPE_TOGGLE_AUTOMATIC);
 
-  CheckSaveEngineSnapshot_EM(action, frame, any_player_moving,
+  CheckSaveEngineSnapshot_EM(frame, any_player_moving,
                             any_player_snapping, any_player_dropping);
 
   return tape.pausing;
@@ -9408,7 +9411,7 @@ void CheckSingleStepMode_MM(boolean element_clicked,
 }
 
 void getGraphicSource_SP(struct GraphicInfo_SP *g_sp,
-                        int graphic, int sync_frame, int x, int y)
+                        int graphic, int sync_frame)
 {
   int frame = getGraphicAnimationFrame(graphic, sync_frame);
 
@@ -9964,7 +9967,13 @@ void ChangeViewportPropertiesIfNeeded(void)
 
 void OpenURL(char *url)
 {
+#if SDL_VERSION_ATLEAST(2,0,14)
   SDL_OpenURL(url);
+#else
+  Warn("SDL_OpenURL(\"%s\") not supported by SDL %d.%d.%d!",
+       url, SDL_MAJOR_VERSION, SDL_MINOR_VERSION, SDL_PATCHLEVEL);
+  Warn("Please upgrade to at least SDL 2.0.14 for URL support!");
+#endif
 }
 
 void OpenURLFromHash(SetupFileHash *hash, int hash_key)