rnd-20030823-2-src
[rocksndiamonds.git] / src / libgame / toons.c
index c8c71e3a96c6f7ac6323ae12dea69b10c1197a75..f2684b4034d626e097f77319f2172d2b8d83f9df 100644 (file)
@@ -64,10 +64,10 @@ int getAnimationFrame(int num_frames, int delay, int mode, int start_frame,
   {
     /* note: expect different frames for the same delay cycle! */
 
-    if (anim.random_frame < 0)
+    if (gfx.anim_random_frame < 0)
       frame = SimpleRND(num_frames);
     else
-      frame = anim.random_frame % num_frames;
+      frame = gfx.anim_random_frame % num_frames;
   }
 
   if (mode & ANIM_REVERSE)             /* use reverse animation direction */
@@ -85,6 +85,7 @@ static int get_toon_direction(char *direction_raw)
 {
   static char *direction = NULL;
 
+  /* !!! MEMORY LEAK HERE! FIX IT! !!! */
   setString(&direction, getStringToLower(direction_raw));
 
   return (strcmp(direction, "left")  == 0 ? MV_LEFT :
@@ -309,6 +310,7 @@ void HandleAnimation(int mode)
 {
   static unsigned long animstart_delay = -1;
   static unsigned long animstart_delay_value = 0;
+  static boolean anim_running = FALSE;
   static boolean anim_restart = TRUE;
   static boolean reset_delay = TRUE;
   static int toon_nr = 0;
@@ -317,16 +319,25 @@ void HandleAnimation(int mode)
   if (!setup.toons)
     return;
 
+  /* this may happen after reloading graphics and redefining "num_toons" */
+  if (toon_nr >= screen_info.num_toons)
+    anim_restart = TRUE;
+
   switch(mode)
   {
     case ANIM_START:
       screen_info.prepare_backbuffer_function();
+
+      anim_running = TRUE;
       anim_restart = TRUE;
       reset_delay = TRUE;
 
       return;
 
     case ANIM_CONTINUE:
+      if (!anim_running)
+       return;
+
       break;
 
     case ANIM_STOP:
@@ -338,6 +349,8 @@ void HandleAnimation(int mode)
       screen_info.update_function();
       setup.direct_draw = draw_mode;
 
+      anim_running = FALSE;
+
       return;
 
     default:
@@ -359,7 +372,7 @@ void HandleAnimation(int mode)
     toon_nr = SimpleRND(screen_info.num_toons);
   }
 
-  anim_restart = reset_delay = AnimateToon(toon_nr,anim_restart);
+  anim_restart = reset_delay = AnimateToon(toon_nr, anim_restart);
 }
 
 void InitAnimation()