added support for synchronized random animation mode for game panel
[rocksndiamonds.git] / src / game.c
index dafe7cbfc56f3c67706a06989e63ba845da56c94..c4819c1190a382a0d52d8a7962cc4dd34415275e 100644 (file)
@@ -2251,6 +2251,7 @@ static void UpdateGameControlValues(void)
                level.game_engine_type == GAME_ENGINE_TYPE_MM ?
                MM_HEALTH(game_mm.laser_overload_value) :
                game.health);
+  int sync_random_frame = INIT_GFX_RANDOM();   // random, but synchronized
 
   UpdatePlayfieldElementCount();
 
@@ -2515,11 +2516,13 @@ static void UpdateGameControlValues(void)
        int last_anim_random_frame = gfx.anim_random_frame;
        int element = gpc->value;
        int graphic = el2panelimg(element);
+       int init_gfx_random = (graphic_info[graphic].anim_global_sync ?
+                              sync_random_frame : INIT_GFX_RANDOM());
 
        if (gpc->value != gpc->last_value)
        {
          gpc->gfx_frame = 0;
-         gpc->gfx_random = INIT_GFX_RANDOM();
+         gpc->gfx_random = init_gfx_random;
        }
        else
        {
@@ -2527,7 +2530,7 @@ static void UpdateGameControlValues(void)
 
          if (ANIM_MODE(graphic) == ANIM_RANDOM &&
              IS_NEXT_FRAME(gpc->gfx_frame, graphic))
-           gpc->gfx_random = INIT_GFX_RANDOM();
+           gpc->gfx_random = init_gfx_random;
        }
 
        if (ANIM_MODE(graphic) == ANIM_RANDOM)
@@ -2536,8 +2539,7 @@ static void UpdateGameControlValues(void)
        if (ANIM_MODE(graphic) == ANIM_CE_SCORE)
          gpc->gfx_frame = element_info[element].collect_score;
 
-       gpc->frame = getGraphicAnimationFrame(el2panelimg(gpc->value),
-                                             gpc->gfx_frame);
+       gpc->frame = getGraphicAnimationFrame(graphic, gpc->gfx_frame);
 
        if (ANIM_MODE(graphic) == ANIM_RANDOM)
          gfx.anim_random_frame = last_anim_random_frame;
@@ -2549,11 +2551,13 @@ static void UpdateGameControlValues(void)
       {
        int last_anim_random_frame = gfx.anim_random_frame;
        int graphic = gpc->graphic;
+       int init_gfx_random = (graphic_info[graphic].anim_global_sync ?
+                              sync_random_frame : INIT_GFX_RANDOM());
 
        if (gpc->value != gpc->last_value)
        {
          gpc->gfx_frame = 0;
-         gpc->gfx_random = INIT_GFX_RANDOM();
+         gpc->gfx_random = init_gfx_random;
        }
        else
        {
@@ -2561,7 +2565,7 @@ static void UpdateGameControlValues(void)
 
          if (ANIM_MODE(graphic) == ANIM_RANDOM &&
              IS_NEXT_FRAME(gpc->gfx_frame, graphic))
-           gpc->gfx_random = INIT_GFX_RANDOM();
+           gpc->gfx_random = init_gfx_random;
        }
 
        if (ANIM_MODE(graphic) == ANIM_RANDOM)