X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Ftoons.c;h=048696f6cd365fb4322959f5d7da4fcced91bfed;hb=7a821f79cb735d048869b503279c402800afa44a;hp=c8c71e3a96c6f7ac6323ae12dea69b10c1197a75;hpb=29fc833ae1b5e46a429a9fa82098e8ad94f6f400;p=rocksndiamonds.git diff --git a/src/libgame/toons.c b/src/libgame/toons.c index c8c71e3a..048696f6 100644 --- a/src/libgame/toons.c +++ b/src/libgame/toons.c @@ -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 */ @@ -81,16 +81,18 @@ int getAnimationFrame(int num_frames, int delay, int mode, int start_frame, /* toon animation functions */ /* ========================================================================= */ -static int get_toon_direction(char *direction_raw) +static int get_toon_direction(char *direction_string_raw) { - static char *direction = NULL; + char *direction_string = getStringToLower(direction_string_raw); + int direction = (strcmp(direction_string, "left") == 0 ? MV_LEFT : + strcmp(direction_string, "right") == 0 ? MV_RIGHT : + strcmp(direction_string, "up") == 0 ? MV_UP : + strcmp(direction_string, "down") == 0 ? MV_DOWN : + MV_NO_MOVING); - setString(&direction, getStringToLower(direction_raw)); + free(direction_string); - return (strcmp(direction, "left") == 0 ? MV_LEFT : - strcmp(direction, "right") == 0 ? MV_RIGHT : - strcmp(direction, "up") == 0 ? MV_UP : - strcmp(direction, "down") == 0 ? MV_DOWN : MV_NO_MOVING); + return direction; } void InitToonScreen(Bitmap *save_buffer, @@ -309,6 +311,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 +320,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 +350,8 @@ void HandleAnimation(int mode) screen_info.update_function(); setup.direct_draw = draw_mode; + anim_running = FALSE; + return; default: @@ -359,7 +373,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()