rnd-20030126-1-src
[rocksndiamonds.git] / src / tools.c
index c67561320bc43da6b4552d4ebac636bc904efc0f..9f42b57dc2b327852133807a0ce230e2c4b77f06 100644 (file)
@@ -455,6 +455,11 @@ static int getGraphicAnimationPhase(int frames, int delay, int mode)
   return phase;
 }
 
+void SetRandomAnimationValue(int x, int y)
+{
+  anim.random_frame = GfxRandom[x][y];
+}
+
 inline int getGraphicAnimationFrame(int graphic, int sync_frame)
 {
   /* animation synchronized with global frame counter, not move position */
@@ -479,26 +484,31 @@ inline void DrawGraphicAnimationExt(DrawBuffer *dst_bitmap, int x, int y,
     DrawGraphicExt(dst_bitmap, x, y, graphic, frame);
 }
 
-inline boolean checkDrawGraphicAnimation(int x, int y, int graphic)
+inline boolean checkDrawGraphicAnimation(int sx, int sy, int graphic)
 {
-  int lx = LEVELX(x), ly = LEVELY(y);
+  int lx = LEVELX(sx), ly = LEVELY(sy);
 
-  return (IN_SCR_FIELD(x, y) &&
-         GfxFrame[lx][ly] % graphic_info[graphic].anim_delay == 0);
+  return (IN_SCR_FIELD(sx, sy) && IS_NEW_FRAME(GfxFrame[lx][ly], graphic));
 }
 
-inline boolean checkDrawLevelGraphicAnimation(int x, int y, int graphic)
+inline boolean checkDrawLevelGraphicAnimation(int lx, int ly, int graphic)
 {
-  return (IN_SCR_FIELD(SCREENX(x), SCREENY(y)) &&
-         GfxFrame[x][y] % graphic_info[graphic].anim_delay == 0);
+  int sx = SCREENX(lx), sy = SCREENY(ly);
+
+  return (IN_SCR_FIELD(sx, sy) && IS_NEW_FRAME(GfxFrame[lx][ly], graphic));
 }
 
 inline boolean DrawGraphicAnimation(int x, int y, int graphic)
 {
   int lx = LEVELX(x), ly = LEVELY(y);
 
+#if 0
   if (!checkDrawGraphicAnimation(x, y, graphic))
     return FALSE;
+#else
+  if (!IN_SCR_FIELD(x, y))
+    return FALSE;
+#endif
 
   DrawGraphicAnimationExt(drawto_field, FX + x * TILEX, FY + y * TILEY,
                          graphic, GfxFrame[lx][ly], NO_MASKING);
@@ -517,6 +527,19 @@ boolean DrawLevelElementAnimation(int x, int y, int element)
   return DrawGraphicAnimation(SCREENX(x), SCREENY(y), el2img(element));
 }
 
+inline void ContinueLevelGraphicAnimation(int x, int y, int graphic)
+{
+  if (!IS_NEW_FRAME(GfxFrame[x][y], graphic))
+    return;
+
+  DrawGraphicAnimation(SCREENX(x), SCREENY(y), graphic);
+}
+
+void ContinueLevelElementAnimation(int x, int y, int element)
+{
+  ContinueLevelGraphicAnimation(x, y, el2img(element));
+}
+
 void DrawAllPlayers()
 {
   int i;
@@ -1173,6 +1196,8 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element,
     int move_pos = getFramePosition(ux, uy);
     int gfx_action = getGfxAction(ux, uy);
 
+    SetRandomAnimationValue(ux, uy);
+
     graphic = el_dir_act2img(element, move_dir, gfx_action);
     frame = getGraphicAnimationFrame(graphic, move_pos);
   }