rnd-20091218-2-src
authorHolger Schemel <info@artsoft.org>
Fri, 18 Dec 2009 22:30:48 +0000 (23:30 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:58:13 +0000 (10:58 +0200)
* two-tile animations for moving or pushing should have 7 frames for
  normal speed, 15 frames for half speed etc. to display correct frames
* two-tile animations are also displayed correctly with different speed
  settings for the player (for pushing animations) or moving elements

ChangeLog
src/conftime.h
src/tools.c

index 7e4cc1e16175848b2b9289db8accb0268849bd58..0efd5105d46c4f606582d2f6397b7104944bb949 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -5,6 +5,10 @@
          non-black (i.e. opaque) background, the pushing graphics drawing order
          was changed to first draw the pushed element, then the player (maybe
          this should be controlled by an ".anim_mode" flag yet to be added)
+       * two-tile animations for moving or pushing should have 7 frames for
+         normal speed, 15 frames for half speed etc. to display correct frames
+       * two-tile animations are also displayed correctly with different speed
+         settings for the player (for pushing animations) or moving elements
 
 2009-12-16
        * added searching for template level (file "template.level") not only
index 7e97ba26a7cffb97e2f01a1ec5f11febc7f0be5d..51b9787de7d4b9321abecc9a5dc62cb7835f5e49 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "2009-12-18 00:11"
+#define COMPILE_DATE_STRING "2009-12-18 23:21"
index 1e58363c613b817616ca1e6265da1ff8f9bc389d..270b153c9579b5614a8a325ef2d05e9812c4465a 100644 (file)
@@ -1242,17 +1242,21 @@ inline static void DrawGraphicShiftedDouble(int x, int y, int dx, int dy,
   int y1 = y;
   int x2 = x + SIGN(dx);
   int y2 = y + SIGN(dy);
+#if 0
+  /* !!! DOES NOT WORK FOR SLOW MOVEMENT !!! */
+  int sync_frame = GfxFrame[LEVELX(x)][LEVELY(y)];
+#else
+  /* movement with two-tile animations must be sync'ed with movement position,
+     not with current GfxFrame (which can be higher when using slow movement) */
+  int anim_pos = (dx ? ABS(dx) : ABS(dy));
   int anim_frames = graphic_info[graphic].anim_frames;
-  /* !!! THIS ONLY REALLY WORKS WITH anim_frames == 7 (MOVEMENT FRAMES) !!! */
-  /* !!! (ELSE sync_frame DOES NOT START WITH 0 AND MOVEMENT LOOK WRONG !!! */
-  /* !!! (AND anim_frames == 15 FOR SLOW MOVEMENT AND SO ON)             !!! */
 #if 1
   /* (we also need anim_delay here for movement animations with less frames) */
   int anim_delay = graphic_info[graphic].anim_delay;
-  int anim_pos = (dx ? ABS(dx) : ABS(dy));
   int sync_frame = anim_pos * anim_frames * anim_delay / TILESIZE;
 #else
-  int sync_frame = (dx ? ABS(dx) : ABS(dy)) * anim_frames / TILESIZE;
+  int sync_frame = anim_pos * anim_frames / TILESIZE;
+#endif
 #endif
   boolean draw_start_tile = (cut_mode != CUT_ABOVE);   /* only for falling! */
   boolean draw_end_tile   = (cut_mode != CUT_BELOW);   /* only for falling! */
@@ -1261,7 +1265,18 @@ inline static void DrawGraphicShiftedDouble(int x, int y, int dx, int dy,
   frame = getGraphicAnimationFrame(graphic, sync_frame);
 
 #if 0
-  printf("::: %d [%d, %d]\n", frame, sync_frame, dy);
+#if 0
+  printf("::: %d, %d, %d => %d [%d]\n",
+        anim_pos, anim_frames, anim_delay, sync_frame, graphic);
+#else
+  printf("::: %d, %d => %d\n",
+        anim_pos, anim_frames, sync_frame);
+#endif
+#endif
+
+#if 0
+  printf("::: %d [%d, %d] [%d] [%d]\n", frame, sync_frame, dy,
+        GfxFrame[LEVELX(x)][LEVELY(y)], mask_mode);
 #endif
 
   /* check if movement start graphic inside screen area and should be drawn */
@@ -2475,7 +2490,7 @@ void DrawPlayerField(int x, int y)
   DrawPlayer(PLAYERINFO(x, y));
 }
 
-#define TEST_DRAW_PLAYER_OVER_PUSHED_ELEMENT   1
+#define DRAW_PLAYER_OVER_PUSHED_ELEMENT        1
 
 void DrawPlayer(struct PlayerInfo *player)
 {
@@ -2616,7 +2631,7 @@ void DrawPlayer(struct PlayerInfo *player)
     }
   }
 
-#if !TEST_DRAW_PLAYER_OVER_PUSHED_ELEMENT
+#if !DRAW_PLAYER_OVER_PUSHED_ELEMENT
   /* ----------------------------------------------------------------------- */
   /* draw player himself                                                     */
   /* ----------------------------------------------------------------------- */
@@ -2656,7 +2671,7 @@ void DrawPlayer(struct PlayerInfo *player)
   }
 #endif
 
-#if TEST_DRAW_PLAYER_OVER_PUSHED_ELEMENT
+#if DRAW_PLAYER_OVER_PUSHED_ELEMENT
   if (player->GfxPos)
   {
     if (move_dir == MV_LEFT || move_dir == MV_RIGHT)
@@ -2708,13 +2723,18 @@ void DrawPlayer(struct PlayerInfo *player)
       DrawLevelElement(next_jx, next_jy, Back[next_jx][next_jy]);
 
 #if 0
-    printf("::: %d, %d, %d [%d] [%d, %d, %d] [%d] [%d, %d]\n",
-          jx, px, player->GfxPos, player->is_pushing, dx, sxx, pxx,
-          IS_MOVING(jx, jy), graphic, frame);
+    printf("::: %d, %d, %d, %d [%d] [%d, %d, %d] [%d] [%d, %d] [%d, %d]\n",
+          jx, px, player->GfxPos, player->StepFrame,
+          player->is_pushing,
+          dx, sxx, pxx,
+          IS_MOVING(jx, jy),
+          graphic, frame,
+          GfxFrame[jx][jy], GfxFrame[next_jx][next_jy]);
 #endif
 
 #if 1
     /* do not draw (EM style) pushing animation when pushing is finished */
+    /* (two-tile animations usually do not contain start and end frame) */
     if (graphic_info[graphic].double_movement && !IS_MOVING(jx, jy))
       DrawLevelElement(next_jx, next_jy, Feld[next_jx][next_jy]);
     else
@@ -2727,7 +2747,7 @@ void DrawPlayer(struct PlayerInfo *player)
   }
 #endif
 
-#if TEST_DRAW_PLAYER_OVER_PUSHED_ELEMENT
+#if DRAW_PLAYER_OVER_PUSHED_ELEMENT
   /* ----------------------------------------------------------------------- */
   /* draw player himself                                                     */
   /* ----------------------------------------------------------------------- */