X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Ftoons.c;h=01229f019b0b7285fe295fdc135bce184504246a;hb=1c3065c351ef8a8637af5540dea2b39c1d86e80f;hp=5c0d4444fbae5f68d1268d5b717ceaa924662251;hpb=7119b5d2e756b1ab23818ea39d19aece0563bab0;p=rocksndiamonds.git diff --git a/src/libgame/toons.c b/src/libgame/toons.c index 5c0d4444..01229f01 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,6 +81,19 @@ int getAnimationFrame(int num_frames, int delay, int mode, int start_frame, /* toon animation functions */ /* ========================================================================= */ +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 : + strcmp(direction, "right") == 0 ? MV_RIGHT : + strcmp(direction, "up") == 0 ? MV_UP : + strcmp(direction, "down") == 0 ? MV_DOWN : MV_NO_MOVING); +} + void InitToonScreen(Bitmap *save_buffer, void (*update_function)(void), void (*prepare_backbuffer_function)(void), @@ -154,11 +167,12 @@ boolean AnimateToon(int toon_nr, boolean restart) struct ToonInfo *anim = &screen_info.toons[toon_nr]; Bitmap *anim_bitmap = screen_info.toons[toon_nr].bitmap; GC anim_clip_gc = anim_bitmap->stored_clip_gc; + int direction = get_toon_direction(anim->direction); if (restart) { - horiz_move = (anim->direction & (ANIMDIR_LEFT | ANIMDIR_RIGHT)); - vert_move = (anim->direction & (ANIMDIR_UP | ANIMDIR_DOWN)); + horiz_move = (direction & (MV_LEFT | MV_RIGHT)); + vert_move = (direction & (MV_UP | MV_DOWN)); anim_delay_value = anim->step_delay * screen_info.frame_delay_value; frame = getAnimationFrame(anim->anim_frames, anim->anim_delay, @@ -167,16 +181,20 @@ boolean AnimateToon(int toon_nr, boolean restart) if (horiz_move) { - if (anim->position == ANIMPOS_UP) + int pos_bottom = screen_info.height - anim->height; + + if (strcmp(anim->position, "top") == 0) pos_y = 0; - else if (anim->position == ANIMPOS_DOWN) - pos_y = screen_info.height - anim->height; - else if (anim->position == ANIMPOS_UPPER) - pos_y = SimpleRND((screen_info.height - anim->height) / 2); + else if (strcmp(anim->position, "bottom") == 0) + pos_y = pos_bottom; + else if (strcmp(anim->position, "upper") == 0) + pos_y = SimpleRND(pos_bottom / 2); + else if (strcmp(anim->position, "lower") == 0) + pos_y = pos_bottom / 2 + SimpleRND(pos_bottom / 2); else - pos_y = SimpleRND(screen_info.height - anim->height); + pos_y = SimpleRND(pos_bottom); - if (anim->direction == ANIMDIR_RIGHT) + if (direction == MV_RIGHT) { delta_x = anim->step_offset; pos_x = -anim->width + delta_x; @@ -186,18 +204,21 @@ boolean AnimateToon(int toon_nr, boolean restart) delta_x = -anim->step_offset; pos_x = screen_info.width + delta_x; } + delta_y = 0; } else { - if (anim->position == ANIMPOS_LEFT) + int pos_right = screen_info.width - anim->width; + + if (strcmp(anim->position, "left") == 0) pos_x = 0; - else if (anim->position == ANIMPOS_RIGHT) - pos_x = screen_info.width - anim->width; + else if (strcmp(anim->position, "right") == 0) + pos_x = pos_right; else - pos_x = SimpleRND(screen_info.width - anim->width); + pos_x = SimpleRND(pos_right); - if (anim->direction == ANIMDIR_DOWN) + if (direction == MV_DOWN) { delta_y = anim->step_offset; pos_y = -anim->height + delta_y; @@ -207,6 +228,7 @@ boolean AnimateToon(int toon_nr, boolean restart) delta_y = -anim->step_offset; pos_y = screen_info.width + delta_y; } + delta_x = 0; } } @@ -296,6 +318,10 @@ 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: @@ -338,7 +364,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()