X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Ftoons.c;h=5dc74a99f6ad5d779ca30d2c01671404add0b0e1;hb=ee0895b12e544444db37febb1242bcc8a72d6ad8;hp=84a21c2569d2ce89cb8ebc537eac39aec2d7d329;hpb=f22f670b327fa0e074a4ef0889585a33afb7f8a3;p=rocksndiamonds.git diff --git a/src/libgame/toons.c b/src/libgame/toons.c index 84a21c25..5dc74a99 100644 --- a/src/libgame/toons.c +++ b/src/libgame/toons.c @@ -35,31 +35,37 @@ int getAnimationFrame(int num_frames, int delay, int mode, int start_frame, sync_frame += start_frame * delay; - if (mode & ANIM_LOOP) /* normal, looping animation */ + if (mode & ANIM_LOOP) /* looping animation */ { frame = (sync_frame % (delay * num_frames)) / delay; } - else if (mode & ANIM_LINEAR) /* normal, non-looping animation */ + else if (mode & ANIM_LINEAR) /* linear (non-looping) animation */ { frame = sync_frame / delay; if (frame > num_frames - 1) frame = num_frames - 1; } - else if (mode & ANIM_PINGPONG) /* use border frames once */ + else if (mode & ANIM_PINGPONG) /* oscillate (border frames once) */ { int max_anim_frames = 2 * num_frames - 2; frame = (sync_frame % (delay * max_anim_frames)) / delay; frame = (frame < num_frames ? frame : max_anim_frames - frame); } - else if (mode & ANIM_PINGPONG2) /* use border frames twice */ + else if (mode & ANIM_PINGPONG2) /* oscillate (border frames twice) */ { int max_anim_frames = 2 * num_frames; frame = (sync_frame % (delay * max_anim_frames)) / delay; frame = (frame < num_frames ? frame : max_anim_frames - frame - 1); } + else if (mode & ANIM_RANDOM) /* play frames in random order */ + { + /* note: expect different frames for the same delay cycle! */ + + frame = SimpleRND(num_frames); + } if (mode & ANIM_REVERSE) /* use reverse animation direction */ frame = num_frames - frame - 1; @@ -78,7 +84,8 @@ void InitToonScreen(Bitmap *save_buffer, boolean (*redraw_needed_function)(void), struct ToonInfo *toons, int num_toons, int startx, int starty, - int width, int height) + int width, int height, + int frame_delay_value) { screen_info.save_buffer = save_buffer; screen_info.update_function = update_function; @@ -90,6 +97,7 @@ void InitToonScreen(Bitmap *save_buffer, screen_info.starty = starty; screen_info.width = width; screen_info.height = height; + screen_info.frame_delay_value = frame_delay_value; } void DrawAnim(Bitmap *toon_bitmap, GC toon_clip_gc, @@ -148,7 +156,7 @@ boolean AnimateToon(int toon_nr, boolean restart) { horiz_move = (anim->direction & (ANIMDIR_LEFT | ANIMDIR_RIGHT)); vert_move = (anim->direction & (ANIMDIR_UP | ANIMDIR_DOWN)); - anim_delay_value = anim->move_delay; + anim_delay_value = anim->move_delay * screen_info.frame_delay_value; frame = getAnimationFrame(anim->anim_frames, anim->anim_delay, anim->anim_mode, anim->start_frame,