X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Ftoons.c;h=5c0d4444fbae5f68d1268d5b717ceaa924662251;hb=7119b5d2e756b1ab23818ea39d19aece0563bab0;hp=84a21c2569d2ce89cb8ebc537eac39aec2d7d329;hpb=f22f670b327fa0e074a4ef0889585a33afb7f8a3;p=rocksndiamonds.git diff --git a/src/libgame/toons.c b/src/libgame/toons.c index 84a21c25..5c0d4444 100644 --- a/src/libgame/toons.c +++ b/src/libgame/toons.c @@ -35,31 +35,40 @@ 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! */ + + if (anim.random_frame < 0) + frame = SimpleRND(num_frames); + else + frame = anim.random_frame % num_frames; + } if (mode & ANIM_REVERSE) /* use reverse animation direction */ frame = num_frames - frame - 1; @@ -78,7 +87,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 +100,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,10 +159,10 @@ 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->step_delay * screen_info.frame_delay_value; frame = getAnimationFrame(anim->anim_frames, anim->anim_delay, - anim->anim_mode, anim->start_frame, + anim->anim_mode, anim->anim_start_frame, animation_frame_counter++); if (horiz_move) @@ -167,12 +178,12 @@ boolean AnimateToon(int toon_nr, boolean restart) if (anim->direction == ANIMDIR_RIGHT) { - delta_x = anim->stepsize; + delta_x = anim->step_offset; pos_x = -anim->width + delta_x; } else { - delta_x = -anim->stepsize; + delta_x = -anim->step_offset; pos_x = screen_info.width + delta_x; } delta_y = 0; @@ -188,22 +199,22 @@ boolean AnimateToon(int toon_nr, boolean restart) if (anim->direction == ANIMDIR_DOWN) { - delta_y = anim->stepsize; + delta_y = anim->step_offset; pos_y = -anim->height + delta_y; } else { - delta_y = -anim->stepsize; + delta_y = -anim->step_offset; pos_y = screen_info.width + delta_y; } delta_x = 0; } } - if (pos_x <= -anim->width - anim->stepsize || - pos_x >= screen_info.width + anim->stepsize || - pos_y <= -anim->height - anim->stepsize || - pos_y >= screen_info.height + anim->stepsize) + if (pos_x <= -anim->width - anim->step_offset || + pos_x >= screen_info.width + anim->step_offset || + pos_y <= -anim->height - anim->step_offset || + pos_y >= screen_info.height + anim->step_offset) return TRUE; if (!DelayReached(&anim_delay, anim_delay_value)) @@ -228,8 +239,8 @@ boolean AnimateToon(int toon_nr, boolean restart) else if (pos_y > screen_info.height) pos_y = screen_info.height; - pad_x = (horiz_move ? anim->stepsize : 0); - pad_y = (vert_move ? anim->stepsize : 0); + pad_x = (horiz_move ? anim->step_offset : 0); + pad_y = (vert_move ? anim->step_offset : 0); src_x = anim->src_x + frame * anim->width; src_y = anim->src_y; dest_x = pos_x; @@ -267,7 +278,7 @@ boolean AnimateToon(int toon_nr, boolean restart) pos_y += delta_y; frame = getAnimationFrame(anim->anim_frames, anim->anim_delay, - anim->anim_mode, anim->start_frame, + anim->anim_mode, anim->anim_start_frame, animation_frame_counter++); return FALSE;