From: Holger Schemel Date: Sat, 30 Mar 2002 21:14:23 +0000 (+0100) Subject: rnd-20020330-4-src X-Git-Tag: 2.1.0^2~75 X-Git-Url: https://git.artsoft.org/?a=commitdiff_plain;h=1446af0fb66276d75bd2ce82d368292283e555aa;p=rocksndiamonds.git rnd-20020330-4-src --- diff --git a/src/cartoons.c b/src/cartoons.c index 19f6cac2..cf5a0736 100644 --- a/src/cartoons.c +++ b/src/cartoons.c @@ -16,23 +16,7 @@ #include "tools.h" -static void HandleAnimation(int); -static boolean AnimateToon(int, boolean); -static void DrawAnim(Bitmap *, GC, int, int, int, int, int, int, int, int); - -struct AnimInfo -{ - int width, height; - int src_x, src_y; - int frames; - int frames_per_second; - int stepsize; - boolean pingpong; - int direction; - int position; -}; - -/* values for cartoon figures */ +/* values for toon definition */ #define NUM_TOONS 18 #define DWARF_XSIZE 40 @@ -74,490 +58,260 @@ struct AnimInfo #define GAMETOON_FPS 20 #define GAMETOON_STEPSIZE 4 -#define ANIMDIR_LEFT 1 -#define ANIMDIR_RIGHT 2 -#define ANIMDIR_UP 4 -#define ANIMDIR_DOWN 8 - -#define ANIMPOS_ANY 0 -#define ANIMPOS_LEFT 1 -#define ANIMPOS_RIGHT 2 -#define ANIMPOS_UP 4 -#define ANIMPOS_DOWN 8 -#define ANIMPOS_UPPER 16 - -#define ANIM_START 0 -#define ANIM_CONTINUE 1 -#define ANIM_STOP 2 - -void InitAnimation() -{ - HandleAnimation(ANIM_START); -} - -void StopAnimation() +struct ToonInfo toons[NUM_TOONS] = { - HandleAnimation(ANIM_STOP); -} - -void DoAnimation() -{ - HandleAnimation(ANIM_CONTINUE); -} - -void HandleAnimation(int mode) -{ - static unsigned long animstart_delay = -1; - static unsigned long animstart_delay_value = 0; - static boolean anim_restart = TRUE; - static boolean reset_delay = TRUE; - static int toon_nr = 0; - int draw_mode; - - if (!setup.toons) - return; - - switch(mode) { - case ANIM_START: - anim_restart = TRUE; - reset_delay = TRUE; - - /* Fill empty backbuffer for animation functions */ - if (setup.direct_draw && game_status == PLAYING) - { - int xx,yy; - - SetDrawtoField(DRAW_BACKBUFFER); - - for(xx=0; xxstored_clip_gc; - - if (restart) + PIX_TOONS, + CLOWN_XSIZE, CLOWN_YSIZE, + CLOWN_X, CLOWN_Y, + CLOWN_FRAMES, + CLOWN_FPS, + CLOWN_STEPSIZE, + ANIM_NORMAL, + ANIMDIR_UP, + ANIMPOS_ANY + }, { - horiz_move = (anim->direction & (ANIMDIR_LEFT | ANIMDIR_RIGHT)); - vert_move = (anim->direction & (ANIMDIR_UP | ANIMDIR_DOWN)); - anim_delay_value = 1000/anim->frames_per_second; - frame = 0; - - if (horiz_move) - { - if (anim->position==ANIMPOS_UP) - pos_y = 0; - else if (anim->position==ANIMPOS_DOWN) - pos_y = FULL_SYSIZE-anim->height; - else if (anim->position==ANIMPOS_UPPER) - pos_y = SimpleRND((FULL_SYSIZE-anim->height)/2); - else - pos_y = SimpleRND(FULL_SYSIZE-anim->height); - - if (anim->direction==ANIMDIR_RIGHT) - { - delta_x = anim->stepsize; - pos_x = -anim->width+delta_x; - } - else - { - delta_x = -anim->stepsize; - pos_x = FULL_SXSIZE+delta_x; - } - delta_y = 0; - } - else - { - if (anim->position==ANIMPOS_LEFT) - pos_x = 0; - else if (anim->position==ANIMPOS_RIGHT) - pos_x = FULL_SXSIZE-anim->width; - else - pos_x = SimpleRND(FULL_SXSIZE-anim->width); - - if (anim->direction==ANIMDIR_DOWN) - { - delta_y = anim->stepsize; - pos_y = -anim->height+delta_y; - } - else - { - delta_y = -anim->stepsize; - pos_y = FULL_SYSIZE+delta_y; - } - delta_x = 0; - } - } - - if (pos_x <= -anim->width - anim->stepsize || - pos_x >= FULL_SXSIZE + anim->stepsize || - pos_y <= -anim->height - anim->stepsize || - pos_y >= FULL_SYSIZE + anim->stepsize) - return(TRUE); - - if (!DelayReached(&anim_delay, anim_delay_value)) + PIX_TOONS, + BIRD_XSIZE, BIRD_YSIZE, + BIRD1_X, BIRD1_Y, + BIRD_FRAMES, + BIRD_FPS, + BIRD_STEPSIZE, + ANIM_OSCILLATE, + ANIMDIR_RIGHT, + ANIMPOS_UPPER + }, + { + PIX_TOONS, + BIRD_XSIZE, BIRD_YSIZE, + BIRD2_X, BIRD2_Y, + BIRD_FRAMES, + BIRD_FPS, + BIRD_STEPSIZE, + ANIM_OSCILLATE, + ANIMDIR_LEFT, + ANIMPOS_UPPER + }, + { + PIX_HEROES, + GAMETOON_XSIZE, GAMETOON_YSIZE, + ((GFX_SPIELER1_LEFT - GFX_START_ROCKSHEROES) % HEROES_PER_LINE)*TILEX, + ((GFX_SPIELER1_LEFT - GFX_START_ROCKSHEROES) / HEROES_PER_LINE)*TILEY, + GAMETOON_FRAMES_4, + GAMETOON_FPS, + GAMETOON_STEPSIZE, + ANIM_NORMAL, + ANIMDIR_LEFT, + ANIMPOS_DOWN + }, + { + PIX_HEROES, + GAMETOON_XSIZE, GAMETOON_YSIZE, + ((GFX_SPIELER1_RIGHT - GFX_START_ROCKSHEROES) % HEROES_PER_LINE)*TILEX, + ((GFX_SPIELER1_RIGHT - GFX_START_ROCKSHEROES) / HEROES_PER_LINE)*TILEY, + GAMETOON_FRAMES_4, + GAMETOON_FPS, + GAMETOON_STEPSIZE, + ANIM_NORMAL, + ANIMDIR_RIGHT, + ANIMPOS_DOWN + }, + { + PIX_HEROES, + GAMETOON_XSIZE, GAMETOON_YSIZE, + ((GFX_PINGUIN_LEFT - GFX_START_ROCKSHEROES) % HEROES_PER_LINE)*TILEX, + ((GFX_PINGUIN_LEFT - GFX_START_ROCKSHEROES) / HEROES_PER_LINE)*TILEY, + GAMETOON_FRAMES_4, + GAMETOON_FPS, + GAMETOON_STEPSIZE, + ANIM_NORMAL, + ANIMDIR_LEFT, + ANIMPOS_DOWN + }, + { + PIX_HEROES, + GAMETOON_XSIZE, GAMETOON_YSIZE, + ((GFX_PINGUIN_RIGHT - GFX_START_ROCKSHEROES) % HEROES_PER_LINE)*TILEX, + ((GFX_PINGUIN_RIGHT - GFX_START_ROCKSHEROES) / HEROES_PER_LINE)*TILEY, + GAMETOON_FRAMES_4, + GAMETOON_FPS, + GAMETOON_STEPSIZE, + ANIM_NORMAL, + ANIMDIR_RIGHT, + ANIMPOS_DOWN + }, + { + PIX_HEROES, + GAMETOON_XSIZE, GAMETOON_YSIZE, + ((GFX_MOLE_LEFT - GFX_START_ROCKSHEROES) % HEROES_PER_LINE)*TILEX, + ((GFX_MOLE_LEFT - GFX_START_ROCKSHEROES) / HEROES_PER_LINE)*TILEY, + GAMETOON_FRAMES_4, + GAMETOON_FPS, + GAMETOON_STEPSIZE, + ANIM_NORMAL, + ANIMDIR_LEFT, + ANIMPOS_DOWN + }, + { + PIX_HEROES, + GAMETOON_XSIZE, GAMETOON_YSIZE, + ((GFX_MOLE_RIGHT - GFX_START_ROCKSHEROES) % HEROES_PER_LINE)*TILEX, + ((GFX_MOLE_RIGHT - GFX_START_ROCKSHEROES) / HEROES_PER_LINE)*TILEY, + GAMETOON_FRAMES_4, + GAMETOON_FPS, + GAMETOON_STEPSIZE, + ANIM_NORMAL, + ANIMDIR_RIGHT, + ANIMPOS_DOWN + }, { - if ((game_status == HELPSCREEN || - (game_status == MAINMENU && redraw_mask & REDRAW_MICROLEVEL)) - && !restart) - DrawAnim(anim_bitmap, anim_clip_gc, - src_x + cut_x, src_y + cut_y, width, height, - REAL_SX + dest_x, REAL_SY + dest_y, pad_x, pad_y); + PIX_HEROES, + GAMETOON_XSIZE, GAMETOON_YSIZE, + ((GFX_SCHWEIN_LEFT - GFX_START_ROCKSHEROES) % HEROES_PER_LINE)*TILEX, + ((GFX_SCHWEIN_LEFT - GFX_START_ROCKSHEROES) / HEROES_PER_LINE)*TILEY, + GAMETOON_FRAMES_4, + GAMETOON_FPS, + GAMETOON_STEPSIZE, + ANIM_NORMAL, + ANIMDIR_LEFT, + ANIMPOS_DOWN + }, + { + PIX_HEROES, + GAMETOON_XSIZE, GAMETOON_YSIZE, + ((GFX_SCHWEIN_RIGHT - GFX_START_ROCKSHEROES) % HEROES_PER_LINE)*TILEX, + ((GFX_SCHWEIN_RIGHT - GFX_START_ROCKSHEROES) / HEROES_PER_LINE)*TILEY, + GAMETOON_FRAMES_4, + GAMETOON_FPS, + GAMETOON_STEPSIZE, + ANIM_NORMAL, + ANIMDIR_RIGHT, + ANIMPOS_DOWN + }, + { + PIX_HEROES, + GAMETOON_XSIZE, GAMETOON_YSIZE, + ((GFX_DRACHE_LEFT - GFX_START_ROCKSHEROES) % HEROES_PER_LINE)*TILEX, + ((GFX_DRACHE_LEFT - GFX_START_ROCKSHEROES) / HEROES_PER_LINE)*TILEY, + GAMETOON_FRAMES_4, + GAMETOON_FPS, + GAMETOON_STEPSIZE, + ANIM_NORMAL, + ANIMDIR_LEFT, + ANIMPOS_DOWN + }, + { + PIX_HEROES, + GAMETOON_XSIZE, GAMETOON_YSIZE, + ((GFX_DRACHE_RIGHT - GFX_START_ROCKSHEROES) % HEROES_PER_LINE)*TILEX, + ((GFX_DRACHE_RIGHT - GFX_START_ROCKSHEROES) / HEROES_PER_LINE)*TILEY, + GAMETOON_FRAMES_4, + GAMETOON_FPS, + GAMETOON_STEPSIZE, + ANIM_NORMAL, + ANIMDIR_RIGHT, + ANIMPOS_DOWN + }, + { + PIX_HEROES, + GAMETOON_XSIZE, GAMETOON_YSIZE, + ((GFX_SONDE - GFX_START_ROCKSHEROES) % HEROES_PER_LINE)*TILEX, + ((GFX_SONDE - GFX_START_ROCKSHEROES) / HEROES_PER_LINE)*TILEY, + GAMETOON_FRAMES_8, + GAMETOON_FPS, + GAMETOON_STEPSIZE, + ANIM_NORMAL, + ANIMDIR_LEFT, + ANIMPOS_ANY + }, + { + PIX_HEROES, + GAMETOON_XSIZE, GAMETOON_YSIZE, + ((GFX_SONDE - GFX_START_ROCKSHEROES) % HEROES_PER_LINE)*TILEX, + ((GFX_SONDE - GFX_START_ROCKSHEROES) / HEROES_PER_LINE)*TILEY, + GAMETOON_FRAMES_8, + GAMETOON_FPS, + GAMETOON_STEPSIZE, + ANIM_NORMAL, + ANIMDIR_RIGHT, + ANIMPOS_ANY + }, +}; - return(FALSE); - } +static void PrepareBackbuffer() +{ + /* Fill empty backbuffer for animation functions */ + if (setup.direct_draw && game_status == PLAYING) + { + int xx,yy; - if (pos_x<-anim->width) - pos_x = -anim->width; - else if (pos_x>FULL_SXSIZE) - pos_x = FULL_SXSIZE; - if (pos_y<-anim->height) - pos_y = -anim->height; - else if (pos_y>FULL_SYSIZE) - pos_y = FULL_SYSIZE; + SetDrawtoField(DRAW_BACKBUFFER); - pad_x = (horiz_move ? anim->stepsize : 0); - pad_y = (vert_move ? anim->stepsize : 0); - src_x = anim->src_x + frame * anim->width; - src_y = anim->src_y; - dest_x = pos_x; - dest_y = pos_y; - cut_x = cut_y = 0; - width = anim->width; - height = anim->height; + for(xx=0; xxFULL_SXSIZE-anim->width) - width -= (pos_x - (FULL_SXSIZE-anim->width)); - if (pos_y<0) + if (setup.soft_scrolling && game_status == PLAYING) { - dest_y = 0; - height += pos_y; - cut_y = -pos_y; - } - else if (pos_y>FULL_SYSIZE-anim->height) - height -= (pos_y - (FULL_SYSIZE-anim->height)); + int fx = FX, fy = FY; - DrawAnim(anim_bitmap,anim_clip_gc, - src_x+cut_x,src_y+cut_y, width,height, - REAL_SX+dest_x,REAL_SY+dest_y, pad_x,pad_y); + fx += (ScreenMovDir & (MV_LEFT|MV_RIGHT) ? ScreenGfxPos : 0); + fy += (ScreenMovDir & (MV_UP|MV_DOWN) ? ScreenGfxPos : 0); - pos_x += delta_x; - pos_y += delta_y; - frame += frame_step; - - if (frame<0 || frame>=anim->frames) - { - if (anim->pingpong) - { - frame_step *= -1; - frame = (frame<0 ? 1 : anim->frames-2); - } - else - frame = (frame<0 ? anim->frames-1 : 0); + BlitBitmap(fieldbuffer, backbuffer, fx,fy, SXSIZE,SYSIZE, SX,SY); } - - return(FALSE); } -void DrawAnim(Bitmap *toon_bitmap, GC toon_clip_gc, - int src_x, int src_y, int width, int height, - int dest_x, int dest_y, int pad_x, int pad_y) +boolean ToonNeedsRedraw() { - int buf_x = DOOR_GFX_PAGEX3, buf_y = DOOR_GFX_PAGEY1; - -#if 1 - /* special method to avoid flickering interference with BackToFront() */ - BlitBitmap(backbuffer, pix[PIX_DB_DOOR], 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, dest_x-src_x, dest_y-src_y); - BlitBitmapMasked(toon_bitmap, backbuffer, - src_x, src_y, width, height, dest_x, dest_y); - BlitBitmap(backbuffer, window, dest_x-pad_x, dest_y-pad_y, - width+2*pad_x, height+2*pad_y, dest_x-pad_x, dest_y-pad_y); - BackToFront(); - BlitBitmap(pix[PIX_DB_DOOR], 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, pix[PIX_DB_DOOR], 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, pix[PIX_DB_DOOR], - src_x, src_y, width, height, buf_x+pad_x, buf_y+pad_y); - BlitBitmap(pix[PIX_DB_DOOR], window, buf_x, buf_y, - width+2*pad_x, height+2*pad_y, dest_x-pad_x, dest_y-pad_y); -#endif + return (game_status == HELPSCREEN || + (game_status == MAINMENU && + ((redraw_mask & REDRAW_MICROLEVEL) || + (redraw_mask & REDRAW_MICROLABEL)))); +} - FlushDisplay(); +void InitToons() +{ + InitToonScreen(pix, pix[PIX_DB_DOOR], + BackToFront, PrepareBackbuffer, ToonNeedsRedraw, + toons, NUM_TOONS, + REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE); } diff --git a/src/cartoons.h b/src/cartoons.h index 4e004671..0cfd8c12 100644 --- a/src/cartoons.h +++ b/src/cartoons.h @@ -14,8 +14,6 @@ #ifndef CARTOONS_H #define CARTOONS_H -void InitAnimation(void); -void StopAnimation(void); -void DoAnimation(void); +void InitToons(void); #endif diff --git a/src/init.c b/src/init.c index 2ddbbcd5..f4a7f1ae 100644 --- a/src/init.c +++ b/src/init.c @@ -23,6 +23,7 @@ #include "files.h" #include "network.h" #include "netserv.h" +#include "cartoons.h" static char *image_filename[NUM_PICTURES] = { @@ -38,13 +39,12 @@ static char *image_filename[NUM_PICTURES] = "RocksFont3.pcx" }; -static void InitPlayerInfo(void); static void InitSetup(void); +static void InitPlayerInfo(void); static void InitLevelInfo(void); static void InitNetworkServer(void); static void InitSound(void); static void InitGfx(void); -static void InitCustomGraphics(void); static void InitGfxBackground(void); static void InitGadgets(void); static void InitElementProperties(void); @@ -87,9 +87,9 @@ void OpenAll(void) InitLevelInfo(); InitGadgets(); /* needs to know number of level series */ - InitCustomGraphics(); - InitGfxBackground(); + InitToons(); + DrawMainMenu(); InitNetworkServer(); @@ -339,49 +339,6 @@ void InitGfx() InitTileClipmasks(); } -void LoadCustomGraphics() -{ -#if 0 - int i; - - for(i=0; i/graphics */ - filename = getPath2(getUserDataDir(), GRAPHICS_DIRECTORY); - if (access(dir, F_OK) == 0) - { - } - - - - -(leveldir_current->user_defined ? - getUserLevelDir("") : - options.level_directory), - leveldir_current->fullpath, - basename); - - - - filename = getPath3((leveldir_current->user_defined ? - getUserLevelDir("") : - options.level_directory), - leveldir_current->fullpath, - basename); -#endif -} - void InitGfxBackground() { int x, y; diff --git a/src/libgame/Makefile b/src/libgame/Makefile index 07159642..a79475a4 100644 --- a/src/libgame/Makefile +++ b/src/libgame/Makefile @@ -8,6 +8,7 @@ SRCS = system.c \ text.c \ sound.c \ joystick.c \ + toons.c \ pcx.c \ image.c \ random.c \ @@ -22,6 +23,7 @@ OBJS = system.o \ text.o \ sound.o \ joystick.o \ + toons.o \ pcx.o \ image.o \ random.o \ diff --git a/src/libgame/libgame.h b/src/libgame/libgame.h index d16c32bf..f7c67bb8 100644 --- a/src/libgame/libgame.h +++ b/src/libgame/libgame.h @@ -24,6 +24,7 @@ #include "text.h" #include "sound.h" #include "joystick.h" +#include "toons.h" #include "image.h" #include "pcx.h" #include "setup.h" diff --git a/src/libgame/toons.c b/src/libgame/toons.c new file mode 100644 index 00000000..2546975b --- /dev/null +++ b/src/libgame/toons.c @@ -0,0 +1,305 @@ +/*********************************************************** +* Artsoft Retro-Game Library * +*----------------------------------------------------------* +* (c) 1995-2002 Artsoft Entertainment * +* Holger Schemel * +* Detmolder Strasse 189 * +* 33604 Bielefeld * +* Germany * +* e-mail: info@artsoft.org * +*----------------------------------------------------------* +* toons.c * +***********************************************************/ + +#include "toons.h" +#include "misc.h" + + +/* values for toon animation */ +#define ANIM_START 0 +#define ANIM_CONTINUE 1 +#define ANIM_STOP 2 + + +static struct ToonScreenInfo screen_info; + +void InitToonScreen(Bitmap **toon_bitmap_array, + Bitmap *save_buffer, + void (*update_function)(void), + void (*prepare_backbuffer_function)(void), + boolean (*redraw_needed_function)(void), + struct ToonInfo *toons, int num_toons, + int startx, int starty, + int width, int height) +{ + screen_info.toon_bitmap_array = toon_bitmap_array; + screen_info.save_buffer = save_buffer; + screen_info.update_function = update_function; + screen_info.prepare_backbuffer_function = prepare_backbuffer_function; + screen_info.redraw_needed_function = redraw_needed_function; + screen_info.toons = toons; + screen_info.num_toons = num_toons; + screen_info.startx = startx; + screen_info.starty = starty; + screen_info.width = width; + screen_info.height = height; +} + +void DrawAnim(Bitmap *toon_bitmap, GC toon_clip_gc, + int src_x, int src_y, int width, int height, + int dest_x, int dest_y, int pad_x, int pad_y) +{ + 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); + SetClipOrigin(toon_bitmap, toon_clip_gc, dest_x-src_x, dest_y-src_y); + BlitBitmapMasked(toon_bitmap, backbuffer, + src_x, src_y, width, height, dest_x, dest_y); + BlitBitmap(backbuffer, window, dest_x-pad_x, dest_y-pad_y, + width+2*pad_x, height+2*pad_y, dest_x-pad_x, dest_y-pad_y); + + screen_info.update_function(); + + 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(); +} + +boolean AnimateToon(int toon_nr, boolean restart) +{ + static int pos_x = 0, pos_y = 0; + static int delta_x = 0, delta_y = 0; + static int frame = 0, frame_step = 1; + static boolean horiz_move, vert_move; + static unsigned long anim_delay = 0; + static unsigned long anim_delay_value = 0; + static int width,height; + static int pad_x,pad_y; + static int cut_x,cut_y; + static int src_x, src_y; + static int dest_x, dest_y; + + struct ToonInfo *anim = &screen_info.toons[toon_nr]; + int bitmap_nr = screen_info.toons[toon_nr].bitmap_nr; + Bitmap *anim_bitmap = screen_info.toon_bitmap_array[bitmap_nr]; + GC anim_clip_gc = anim_bitmap->stored_clip_gc; + + if (restart) + { + horiz_move = (anim->direction & (ANIMDIR_LEFT | ANIMDIR_RIGHT)); + vert_move = (anim->direction & (ANIMDIR_UP | ANIMDIR_DOWN)); + anim_delay_value = 1000/anim->frames_per_second; + frame = 0; + + if (horiz_move) + { + if (anim->position == ANIMPOS_UP) + 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 + pos_y = SimpleRND(screen_info.height - anim->height); + + if (anim->direction == ANIMDIR_RIGHT) + { + delta_x = anim->stepsize; + pos_x = -anim->width + delta_x; + } + else + { + delta_x = -anim->stepsize; + pos_x = screen_info.width + delta_x; + } + delta_y = 0; + } + else + { + if (anim->position == ANIMPOS_LEFT) + pos_x = 0; + else if (anim->position == ANIMPOS_RIGHT) + pos_x = screen_info.width - anim->width; + else + pos_x = SimpleRND(screen_info.width - anim->width); + + if (anim->direction == ANIMDIR_DOWN) + { + delta_y = anim->stepsize; + pos_y = -anim->height + delta_y; + } + else + { + delta_y = -anim->stepsize; + 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) + return TRUE; + + if (!DelayReached(&anim_delay, anim_delay_value)) + { + if (screen_info.redraw_needed_function() && !restart) + DrawAnim(anim_bitmap, anim_clip_gc, + src_x + cut_x, src_y + cut_y, + width, height, + screen_info.startx + dest_x, + screen_info.starty + dest_y, + pad_x, pad_y); + + return FALSE; + } + + if (pos_x < -anim->width) + pos_x = -anim->width; + else if (pos_x > screen_info.width) + pos_x = screen_info.width; + if (pos_y < -anim->height) + pos_y = -anim->height; + 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); + src_x = anim->src_x + frame * anim->width; + src_y = anim->src_y; + dest_x = pos_x; + dest_y = pos_y; + cut_x = cut_y = 0; + width = anim->width; + height = anim->height; + + if (pos_x<0) + { + dest_x = 0; + width += pos_x; + cut_x = -pos_x; + } + else if (pos_x > screen_info.width - anim->width) + width -= (pos_x - (screen_info.width - anim->width)); + + if (pos_y<0) + { + dest_y = 0; + height += pos_y; + cut_y = -pos_y; + } + else if (pos_y > screen_info.height - anim->height) + height -= (pos_y - (screen_info.height - anim->height)); + + DrawAnim(anim_bitmap, anim_clip_gc, + src_x + cut_x, src_y + cut_y, + width, height, + screen_info.startx + dest_x, + screen_info.starty + dest_y, + pad_x, pad_y); + + pos_x += delta_x; + pos_y += delta_y; + frame += frame_step; + + if (frame<0 || frame>=anim->frames) + { + if (anim->pingpong) + { + frame_step *= -1; + frame = (frame<0 ? 1 : anim->frames-2); + } + else + frame = (frame<0 ? anim->frames-1 : 0); + } + + return FALSE; +} + +void HandleAnimation(int mode) +{ + static unsigned long animstart_delay = -1; + static unsigned long animstart_delay_value = 0; + static boolean anim_restart = TRUE; + static boolean reset_delay = TRUE; + static int toon_nr = 0; + int draw_mode; + + if (!setup.toons) + return; + + switch(mode) + { + case ANIM_START: + screen_info.prepare_backbuffer_function(); + anim_restart = TRUE; + reset_delay = TRUE; + + return; + + case ANIM_CONTINUE: + break; + + case ANIM_STOP: + 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; + + return; + + default: + break; + } + + if (reset_delay) + { + animstart_delay = Counter(); + animstart_delay_value = SimpleRND(3000); + reset_delay = FALSE; + } + + if (anim_restart) + { + if (!DelayReached(&animstart_delay, animstart_delay_value)) + return; + + toon_nr = SimpleRND(screen_info.num_toons); + } + + anim_restart = reset_delay = AnimateToon(toon_nr,anim_restart); +} + +void InitAnimation() +{ + HandleAnimation(ANIM_START); +} + +void StopAnimation() +{ + HandleAnimation(ANIM_STOP); +} + +void DoAnimation() +{ + HandleAnimation(ANIM_CONTINUE); +} diff --git a/src/libgame/toons.h b/src/libgame/toons.h new file mode 100644 index 00000000..f090b4d2 --- /dev/null +++ b/src/libgame/toons.h @@ -0,0 +1,68 @@ +/*********************************************************** +* Artsoft Retro-Game Library * +*----------------------------------------------------------* +* (c) 1995-2002 Artsoft Entertainment * +* Holger Schemel * +* Detmolder Strasse 189 * +* 33604 Bielefeld * +* Germany * +* e-mail: info@artsoft.org * +*----------------------------------------------------------* +* toons.h * +***********************************************************/ + +#ifndef TOONS_H +#define TOONS_H + +#include "system.h" + + +/* values for toon animation */ +#define ANIMDIR_LEFT 1 +#define ANIMDIR_RIGHT 2 +#define ANIMDIR_UP 4 +#define ANIMDIR_DOWN 8 + +#define ANIMPOS_ANY 0 +#define ANIMPOS_LEFT 1 +#define ANIMPOS_RIGHT 2 +#define ANIMPOS_UP 4 +#define ANIMPOS_DOWN 8 +#define ANIMPOS_UPPER 16 + + +struct ToonScreenInfo +{ + Bitmap **toon_bitmap_array; + Bitmap *save_buffer; + void (*update_function)(void); + void (*prepare_backbuffer_function)(void); + boolean (*redraw_needed_function)(void); + + struct ToonInfo *toons; + int num_toons; + + int startx, starty; + int width, height; +}; + +struct ToonInfo +{ + int bitmap_nr; + int width, height; + int src_x, src_y; + int frames; + int frames_per_second; + int stepsize; + boolean pingpong; + int direction; + int position; +}; + + +void InitToonScreen(); +void InitAnimation(void); +void StopAnimation(void); +void DoAnimation(void); + +#endif /* TOONS_H */ diff --git a/src/screens.c b/src/screens.c index 61d6d94e..0f313c85 100644 --- a/src/screens.c +++ b/src/screens.c @@ -1478,8 +1478,10 @@ void HandleGenericSetupScreen(int mx, int my, int dx, int dy, int button) void (*menu_callback_function)(void) = setup_info[y].value; menu_callback_function(); + break; /* absolutely needed because 'setup_info' has changed! */ } } + return; }