1 // ============================================================================
2 // Artsoft Retro-Game Library
3 // ----------------------------------------------------------------------------
4 // (c) 1995-2014 by Artsoft Entertainment
7 // http://www.artsoft.org/
8 // ----------------------------------------------------------------------------
10 // ============================================================================
16 /* ========================================================================= */
17 /* generic animation frame calculation */
18 /* ========================================================================= */
20 int getAnimationFrame(int num_frames, int delay, int mode, int start_frame,
25 sync_frame += start_frame * delay;
27 if (mode & ANIM_LOOP) /* looping animation */
29 frame = (sync_frame % (delay * num_frames)) / delay;
31 else if (mode & ANIM_LINEAR) /* linear (non-looping) animation */
33 frame = sync_frame / delay;
35 if (frame > num_frames - 1)
36 frame = num_frames - 1;
38 else if (mode & ANIM_PINGPONG) /* oscillate (border frames once) */
40 int max_anim_frames = (num_frames > 1 ? 2 * num_frames - 2 : 1);
42 frame = (sync_frame % (delay * max_anim_frames)) / delay;
43 frame = (frame < num_frames ? frame : max_anim_frames - frame);
45 else if (mode & ANIM_PINGPONG2) /* oscillate (border frames twice) */
47 int max_anim_frames = 2 * num_frames;
49 frame = (sync_frame % (delay * max_anim_frames)) / delay;
50 frame = (frame < num_frames ? frame : max_anim_frames - frame - 1);
52 else if (mode & ANIM_RANDOM) /* play frames in random order */
54 /* note: expect different frames for the same delay cycle! */
56 if (gfx.anim_random_frame < 0)
57 frame = GetSimpleRandom(num_frames);
59 frame = gfx.anim_random_frame % num_frames;
61 else if (mode & (ANIM_CE_VALUE | ANIM_CE_SCORE | ANIM_CE_DELAY))
63 frame = sync_frame % num_frames;
66 if (mode & ANIM_REVERSE) /* use reverse animation direction */
67 frame = num_frames - frame - 1;