X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Ftoons.c;h=d6d1c4cf95229fb1d7cabba3f3818e84de9771d1;hb=ed5a795f1fd2d48a1372d46c06d86d2faab7e3c4;hp=94c72152c2890d0461b849675d8fd18672033265;hpb=0548cd8fd0353c19608df8a7079fc2c39cc4ce27;p=rocksndiamonds.git diff --git a/src/libgame/toons.c b/src/libgame/toons.c index 94c72152..d6d1c4cf 100644 --- a/src/libgame/toons.c +++ b/src/libgame/toons.c @@ -1,7 +1,7 @@ /*********************************************************** * Artsoft Retro-Game Library * *----------------------------------------------------------* -* (c) 1995-2002 Artsoft Entertainment * +* (c) 1995-2006 Artsoft Entertainment * * Holger Schemel * * Detmolder Strasse 189 * * 33604 Bielefeld * @@ -48,7 +48,7 @@ int getAnimationFrame(int num_frames, int delay, int mode, int start_frame, } else if (mode & ANIM_PINGPONG) /* oscillate (border frames once) */ { - int max_anim_frames = 2 * num_frames - 2; + int max_anim_frames = (num_frames > 1 ? 2 * num_frames - 2 : 1); frame = (sync_frame % (delay * max_anim_frames)) / delay; frame = (frame < num_frames ? frame : max_anim_frames - frame); @@ -64,10 +64,14 @@ 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) - frame = SimpleRND(num_frames); + if (gfx.anim_random_frame < 0) + frame = GetSimpleRandom(num_frames); else - frame = anim.random_frame % num_frames; + frame = gfx.anim_random_frame % num_frames; + } + else if (mode & (ANIM_CE_VALUE | ANIM_CE_SCORE | ANIM_CE_DELAY)) + { + frame = sync_frame % num_frames; } if (mode & ANIM_REVERSE) /* use reverse animation direction */ @@ -81,16 +85,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 int get_toon_direction(char *direction_string_raw) { - static char *direction = NULL; + char *direction_string = getStringToLower(direction_string_raw); + int direction = (strEqual(direction_string, "left") ? MV_LEFT : + strEqual(direction_string, "right") ? MV_RIGHT : + strEqual(direction_string, "up") ? MV_UP : + strEqual(direction_string, "down") ? MV_DOWN : + MV_NONE); - setString(&direction, getStringToLower(direction_raw)); + free(direction_string); - 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); + return direction; } void InitToonScreen(Bitmap *save_buffer, @@ -121,7 +127,6 @@ void DrawAnim(Bitmap *toon_bitmap, GC toon_clip_gc, { int buf_x = DOOR_GFX_PAGEX3, buf_y = DOOR_GFX_PAGEY1; -#if 1 /* special method to avoid flickering interference with BackToFront() */ BlitBitmap(backbuffer, screen_info.save_buffer, dest_x-pad_x, dest_y-pad_y, width+2*pad_x, height+2*pad_y, buf_x, buf_y); @@ -135,16 +140,6 @@ void DrawAnim(Bitmap *toon_bitmap, GC toon_clip_gc, BlitBitmap(screen_info.save_buffer, backbuffer, buf_x, buf_y, width+2*pad_x, height+2*pad_y, dest_x-pad_x, dest_y-pad_y); -#else - /* normal method, causing flickering interference with BackToFront() */ - BlitBitmap(backbuffer, screen_info.save_buffer, dest_x-pad_x, dest_y-pad_y, - width+2*pad_x, height+2*pad_y, buf_x, buf_y); - SetClipOrigin(toon_bitmap,toon_clip_gc, buf_x-src_x+pad_x,buf_y-src_y+pad_y); - BlitBitmapMasked(toon_bitmap, screen_info.save_buffer, - src_x, src_y, width, height, buf_x+pad_x, buf_y+pad_y); - BlitBitmap(screen_info.save_buffer, window, buf_x, buf_y, - width+2*pad_x, height+2*pad_y, dest_x-pad_x, dest_y-pad_y); -#endif FlushDisplay(); } @@ -182,16 +177,16 @@ boolean AnimateToon(int toon_nr, boolean restart) { int pos_bottom = screen_info.height - anim->height; - if (strcmp(anim->position, "top") == 0) + if (strEqual(anim->position, "top")) pos_y = 0; - else if (strcmp(anim->position, "bottom") == 0) + else if (strEqual(anim->position, "bottom")) 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 if (strEqual(anim->position, "upper")) + pos_y = GetSimpleRandom(pos_bottom / 2); + else if (strEqual(anim->position, "lower")) + pos_y = pos_bottom / 2 + GetSimpleRandom(pos_bottom / 2); else - pos_y = SimpleRND(pos_bottom); + pos_y = GetSimpleRandom(pos_bottom); if (direction == MV_RIGHT) { @@ -210,12 +205,12 @@ boolean AnimateToon(int toon_nr, boolean restart) { int pos_right = screen_info.width - anim->width; - if (strcmp(anim->position, "left") == 0) + if (strEqual(anim->position, "left")) pos_x = 0; - else if (strcmp(anim->position, "right") == 0) + else if (strEqual(anim->position, "right")) pos_x = pos_right; else - pos_x = SimpleRND(pos_right); + pos_x = GetSimpleRandom(pos_right); if (direction == MV_DOWN) { @@ -309,12 +304,12 @@ void HandleAnimation(int mode) { static unsigned long animstart_delay = -1; static unsigned long animstart_delay_value = 0; + static boolean anim_running = FALSE; static boolean anim_restart = TRUE; static boolean reset_delay = TRUE; static int toon_nr = 0; - int draw_mode; - if (!setup.toons) + if (!setup.toons || screen_info.num_toons == 0) return; /* this may happen after reloading graphics and redefining "num_toons" */ @@ -325,22 +320,30 @@ void HandleAnimation(int mode) { case ANIM_START: screen_info.prepare_backbuffer_function(); + + anim_running = TRUE; anim_restart = TRUE; reset_delay = TRUE; return; case ANIM_CONTINUE: + if (!anim_running) + return; + break; case ANIM_STOP: - redraw_mask |= (REDRAW_FIELD | REDRAW_FROM_BACKBUFFER); + if (anim_running) + { +#if 1 + redraw_mask |= (REDRAW_FIELD | REDRAW_FROM_BACKBUFFER); - /* Redraw background even when in direct drawing mode */ - draw_mode = setup.direct_draw; - setup.direct_draw = FALSE; - screen_info.update_function(); - setup.direct_draw = draw_mode; + screen_info.update_function(); +#endif + + anim_running = FALSE; + } return; @@ -351,7 +354,7 @@ void HandleAnimation(int mode) if (reset_delay) { animstart_delay = Counter(); - animstart_delay_value = SimpleRND(3000); + animstart_delay_value = GetSimpleRandom(3000); reset_delay = FALSE; } @@ -360,7 +363,7 @@ void HandleAnimation(int mode) if (!DelayReached(&animstart_delay, animstart_delay_value)) return; - toon_nr = SimpleRND(screen_info.num_toons); + toon_nr = GetSimpleRandom(screen_info.num_toons); } anim_restart = reset_delay = AnimateToon(toon_nr, anim_restart);