X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Ftoons.c;h=c8c71e3a96c6f7ac6323ae12dea69b10c1197a75;hb=29fc833ae1b5e46a429a9fa82098e8ad94f6f400;hp=8ecc0d5d6672b1a1181fc4fab9f279763bcaba35;hpb=c5ee7e4524f10322894b2547337e4c973a80a552;p=rocksndiamonds.git diff --git a/src/libgame/toons.c b/src/libgame/toons.c index 8ecc0d5d..c8c71e3a 100644 --- a/src/libgame/toons.c +++ b/src/libgame/toons.c @@ -64,7 +64,10 @@ int getAnimationFrame(int num_frames, int delay, int mode, int start_frame, { /* note: expect different frames for the same delay cycle! */ - frame = anim.simple_random_value % num_frames; + if (anim.random_frame < 0) + frame = SimpleRND(num_frames); + else + frame = anim.random_frame % num_frames; } if (mode & ANIM_REVERSE) /* use reverse animation direction */ @@ -78,6 +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 char *direction = NULL; + + 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), @@ -151,67 +166,76 @@ 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)); - anim_delay_value = anim->move_delay * screen_info.frame_delay_value; + 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, - anim->anim_mode, anim->start_frame, + anim->anim_mode, anim->anim_start_frame, animation_frame_counter++); 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->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; } 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->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)) @@ -236,8 +260,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; @@ -275,7 +299,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;