rnd-20030125-2-src
authorHolger Schemel <info@artsoft.org>
Sat, 25 Jan 2003 13:35:00 +0000 (14:35 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:40:00 +0000 (10:40 +0200)
src/conftime.h
src/game.c
src/libgame/system.h
src/libgame/toons.c
src/main.h
src/tools.c

index 93641032c90e2caa2da6da68d6d85d9b7146f47e..a0ec7636d588157ca15fae97418cf90a66e2641c 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "[2003-01-25 03:22]"
+#define COMPILE_DATE_STRING "[2003-01-25 14:33]"
index 09ea5e2ec74455bfe11eaf8e99f6ef2198c3d255..7f239043076b8a3eaceabd78469b603bd4e92a37 100644 (file)
@@ -89,6 +89,8 @@
 #define DOUBLE_PLAYER_SPEED(p) (HALVE_MOVE_DELAY((p)->move_delay_value))
 #define HALVE_PLAYER_SPEED(p)  (DOUBLE_MOVE_DELAY((p)->move_delay_value))
 
+#define        INIT_GFX_RANDOM()       (SimpleRND(1000000))
+
 /* game button identifiers */
 #define GAME_CTRL_ID_STOP              0
 #define GAME_CTRL_ID_PAUSE             1
 #define NUM_GAME_BUTTONS               6
 
 /* forward declaration for internal use */
+static void ResetGfxAnimation(int, int);
+
 static void InitBeltMovement(void);
 static void CloseAllOpenTimegates(void);
 static void CheckGravityMovement(struct PlayerInfo *);
@@ -115,9 +119,6 @@ static void HandleGameButtons(struct GadgetInfo *);
 
 static struct GadgetInfo *game_gadget[NUM_GAME_BUTTONS];
 
-#define IS_ANIMATED(g)         (graphic_info[g].anim_frames > 1)
-#define IS_LOOP_SOUND(s)       (sound_info[s].loop)
-
 
 /* ------------------------------------------------------------------------- */
 /* definition of elements that automatically change to other elements after  */
@@ -722,7 +723,7 @@ void InitGame()
 
       GfxFrame[x][y] = 0;
       GfxAction[x][y] = ACTION_DEFAULT;
-      GfxRandom[x][y] = SimpleRND(1000000);
+      GfxRandom[x][y] = INIT_GFX_RANDOM();
     }
   }
 
@@ -1251,6 +1252,25 @@ int NewHiScore()
   return position;
 }
 
+static void ResetRandomAnimationValue(int x, int y)
+{
+  int element = Feld[x][y];
+  int graphic = el2img(element);
+
+  /* reset random value not until one full delay cycle has reached */
+  if (ANIM_MODE(graphic) == ANIM_RANDOM &&
+      GfxFrame[x][y] > ANIM_DELAY(graphic))
+    GfxRandom[x][y] = INIT_GFX_RANDOM();
+}
+
+static void ResetGfxAnimation(int x, int y)
+{
+  ResetRandomAnimationValue(x, y);
+
+  GfxFrame[x][y] = 0;
+  GfxAction[x][y] = ACTION_DEFAULT;
+}
+
 void InitMovingField(int x, int y, int direction)
 {
   int element = Feld[x][y];
@@ -1258,7 +1278,7 @@ void InitMovingField(int x, int y, int direction)
   int newy = y + (direction == MV_UP   ? -1 : direction == MV_DOWN  ? +1 : 0);
 
   if (!JustStopped[x][y] || direction != MovDir[x][y])
-    GfxFrame[x][y] = 0;
+    ResetGfxAnimation(x, y);
 
   MovDir[x][y] = direction;
   MovDir[newx][newy] = direction;
@@ -4338,7 +4358,8 @@ static void ChangeElement(int x, int y)
   if (MovDelay[x][y] == 0)             /* initialize element change */
   {
     MovDelay[x][y] = changing_element[element].change_delay + 1;
-    GfxFrame[x][y] = 0;
+
+    ResetGfxAnimation(x, y);
 
     if (changing_element[element].pre_change_function)
       changing_element[element].pre_change_function(x, y);
@@ -4357,7 +4378,8 @@ static void ChangeElement(int x, int y)
   else                                 /* finish element change */
   {
     Feld[x][y] = changing_element[element].next_element;
-    GfxFrame[x][y] = 0;
+
+    ResetGfxAnimation(x, y);
 
     DrawLevelField(x, y);
 
@@ -4649,6 +4671,10 @@ void GameActions()
     element = Feld[x][y];
     graphic = el2img(element);
 
+    if (ANIM_MODE(graphic) == ANIM_RANDOM &&
+       IS_NEW_FRAME(GfxFrame[x][y], graphic))
+      ResetRandomAnimationValue(x, y);
+
     SetRandomAnimationValue(x, y);
 
     if (IS_INACTIVE(element))
@@ -6417,7 +6443,8 @@ boolean PlaceBomb(struct PlayerInfo *player)
     Store[jx][jy] = element;
 
   MovDelay[jx][jy] = 96;
-  GfxFrame[jx][jy] = 0;
+
+  ResetGfxAnimation(jx, jy);
 
   if (player->dynamite)
   {
index 0b014e8c268cb239312806696c03dce1db370c2a..a08edfc63a3719c2d05f6e1093028410e7066f0d 100644 (file)
@@ -318,7 +318,7 @@ struct FontInfo
 
 struct AnimInfo
 {
-  int simple_random_value;
+  int random_frame;
 };
 
 struct JoystickInfo
index 8ecc0d5d6672b1a1181fc4fab9f279763bcaba35..a45720be956da67a4aa81847c1b931376cd485d1 100644 (file)
@@ -64,7 +64,10 @@ int getAnimationFrame(int num_frames, int delay, int mode, int start_frame,
   {
     /* note: expect different frames for the same delay cycle! */
 
-    frame = anim.simple_random_value % num_frames;
+    if (anim.random_frame < 0)
+      frame = SimpleRND(num_frames);
+    else
+      frame = anim.random_frame % num_frames;
   }
 
   if (mode & ANIM_REVERSE)             /* use reverse animation direction */
index 637d0f6eb75b86e0edf5b313fb701ea00e3078e9..3fc93b732c3d53bb42eb0ec031db182c63505c66 100644 (file)
 
 #define PLAYER_NR_GFX(g,i)     ((g) + i * (IMG_PLAYER2 - IMG_PLAYER1))
 
+#define ANIM_FRAMES(g)         (graphic_info[g].anim_frames)
+#define ANIM_DELAY(g)          (graphic_info[g].anim_delay)
+#define ANIM_MODE(g)           (graphic_info[g].anim_mode)
+
+#define IS_ANIMATED(g)         (ANIM_FRAMES(g) > 1)
+#define IS_NEW_FRAME(f, g)     ((f) % ANIM_DELAY(g) == 0)
+
+#define IS_LOOP_SOUND(s)       (sound_info[s].loop)
+
 
 #if 0
 
index 7e24e5016f0ac0dc049e8e2154ae62b1bdddef33..9f42b57dc2b327852133807a0ce230e2c4b77f06 100644 (file)
@@ -457,7 +457,7 @@ static int getGraphicAnimationPhase(int frames, int delay, int mode)
 
 void SetRandomAnimationValue(int x, int y)
 {
-  anim.simple_random_value = GfxRandom[x][y];
+  anim.random_frame = GfxRandom[x][y];
 }
 
 inline int getGraphicAnimationFrame(int graphic, int sync_frame)
@@ -484,18 +484,18 @@ 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)
@@ -529,7 +529,7 @@ boolean DrawLevelElementAnimation(int x, int y, int element)
 
 inline void ContinueLevelGraphicAnimation(int x, int y, int graphic)
 {
-  if (GfxFrame[x][y] % graphic_info[graphic].anim_delay != 0)
+  if (!IS_NEW_FRAME(GfxFrame[x][y], graphic))
     return;
 
   DrawGraphicAnimation(SCREENX(x), SCREENY(y), graphic);