X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=e241c79adb289bdb3fe69614687019ebf79a8aed;hb=c6f9fba81fc59eff4b6b454dff92adecd28a7ad5;hp=fed92762a5c67701cefcf9d6da900ee2d97e729a;hpb=0cc009fd5d7fe4084e2b1312749003093b3b4047;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index fed92762..e241c79a 100644 --- a/src/tools.c +++ b/src/tools.c @@ -32,7 +32,6 @@ #define NUM_TOOL_BUTTONS 7 /* forward declaration for internal use */ -static int getGraphicAnimationPhase(int, int, int); static void UnmapToolButtons(); static void HandleToolButtons(struct GadgetInfo *); @@ -384,6 +383,39 @@ void ClearWindow() redraw_mask |= REDRAW_FIELD; } +static int getGraphicAnimationPhase(int frames, int delay, int mode) +{ + int phase; + + if (mode & ANIM_PINGPONG) + { + int max_anim_frames = 2 * frames - 2; + + phase = (FrameCounter % (delay * max_anim_frames)) / delay; + phase = (phase < frames ? phase : max_anim_frames - phase); + } + else + phase = (FrameCounter % (delay * frames)) / delay; + + if (mode & ANIM_REVERSE) + phase = -phase; + + return phase; +} + +inline int getGraphicAnimationFrame(int graphic, int sync_frame) +{ + /* animation synchronized with global frame counter, not move position */ + if (new_graphic_info[graphic].anim_global_sync || sync_frame < 0) + sync_frame = FrameCounter; + + return getAnimationFrame(new_graphic_info[graphic].anim_frames, + new_graphic_info[graphic].anim_delay, + new_graphic_info[graphic].anim_mode, + new_graphic_info[graphic].anim_start_frame, + sync_frame); +} + void MarkTileDirty(int x, int y) { int xx = redraw_x1 + x; @@ -700,18 +732,23 @@ void DrawPlayer(struct PlayerInfo *player) if (player_is_moving && last_element == EL_EXPLOSION) { - int frame = Frame[last_jx][last_jy]; - int delay = 2; + int stored = Store[last_jx][last_jy]; + int graphic = (game.emulation != EMU_SUPAPLEX ? IMG_EXPLOSION : + stored == EL_SP_INFOTRON ? IMG_SP_EXPLOSION_INFOTRON : + IMG_SP_EXPLOSION); + int delay = (game.emulation == EMU_SUPAPLEX ? 3 : 2); + int phase = Frame[last_jx][last_jy] - 1; + int frame = getGraphicAnimationFrame(graphic, phase - delay); - if (frame > 2) - DrawGraphicThruMask(SCREENX(last_jx), SCREENY(last_jy), GFX_EXPLOSION, - ((frame - 1) / delay - 1)); + if (phase >= delay) + DrawGraphicThruMask(SCREENX(last_jx), SCREENY(last_jy), graphic, frame); } /* draw elements that stay over the player */ /* handle the field the player is leaving ... */ if (player_is_moving && IS_OVER_PLAYER(last_element)) DrawLevelField(last_jx, last_jy); + /* ... and the field the player is entering */ if (IS_OVER_PLAYER(element)) DrawLevelField(jx, jy); @@ -731,101 +768,26 @@ void DrawPlayer(struct PlayerInfo *player) MarkTileDirty(sx,sy); } -static int getGraphicAnimationPhase(int frames, int delay, int mode) +void DrawGraphicAnimationExt(DrawBuffer *dst_bitmap, int x, int y, + int graphic, int mask_mode) { - int phase; - - if (mode & ANIM_PINGPONG) - { - int max_anim_frames = 2 * frames - 2; + int frame = getGraphicAnimationFrame(graphic, -1); - phase = (FrameCounter % (delay * max_anim_frames)) / delay; - phase = (phase < frames ? phase : max_anim_frames - phase); - } + if (mask_mode == USE_MASKING) + DrawGraphicThruMaskExt(dst_bitmap, x, y, graphic, frame); else - phase = (FrameCounter % (delay * frames)) / delay; - - if (mode & ANIM_REVERSE) - phase = -phase; - - return phase; + DrawGraphicExt(dst_bitmap, x, y, graphic, frame); } -int getGraphicAnimationFrame(int graphic, int sync_frame) -{ - int num_frames = new_graphic_info[graphic].anim_frames; - int delay = new_graphic_info[graphic].anim_delay; - int mode = new_graphic_info[graphic].anim_mode; - int frame = 0; - - /* animation synchronized with global frame counter, not move position */ - if (new_graphic_info[graphic].anim_global_sync || sync_frame < 0) - sync_frame = FrameCounter; - - sync_frame += new_graphic_info[graphic].anim_start_frame * delay; - - if (mode & ANIM_LOOP) /* normal, looping animation */ - { - frame = (sync_frame % (delay * num_frames)) / delay; - } - else if (mode & ANIM_LINEAR) /* normal, non-looping animation */ - { - frame = sync_frame / delay; - - if (frame > num_frames - 1) - frame = num_frames - 1; - } - else if (mode & ANIM_PINGPONG) /* use border frames once */ - { - int max_anim_frames = 2 * num_frames - 2; - - frame = (sync_frame % (delay * max_anim_frames)) / delay; - frame = (frame < num_frames ? frame : max_anim_frames - frame); - } - else if (mode & ANIM_PINGPONG2) /* use border frames twice */ - { - int max_anim_frames = 2 * num_frames; - - frame = (sync_frame % (delay * max_anim_frames)) / delay; - frame = (frame < num_frames ? frame : max_anim_frames - frame - 1); - } - - if (mode & ANIM_REVERSE) /* use reverse animation direction */ - frame = num_frames - frame - 1; - - return frame; -} - -void DrawGraphicAnimationExt(int x, int y, int graphic, int mask_mode) -{ -#if 0 - int delay = new_graphic_info[graphic].anim_delay; - - if (!(FrameCounter % delay) && IN_SCR_FIELD(SCREENX(x), SCREENY(y))) -#else - if (IN_SCR_FIELD(SCREENX(x), SCREENY(y))) -#endif - { - int frame = getGraphicAnimationFrame(graphic, -1); - - if (mask_mode == USE_MASKING) - DrawGraphicThruMask(SCREENX(x), SCREENY(y), graphic, frame); - else - DrawGraphic(SCREENX(x), SCREENY(y), graphic, frame); - } -} - -#if 0 -void DrawOldGraphicAnimation(int x, int y, int graphic, - int frames, int delay, int mode) -{ - DrawGraphicAnimationExt(x, y, graphic, frames, delay, mode, NO_MASKING); -} -#endif - void DrawGraphicAnimation(int x, int y, int graphic) { - DrawGraphicAnimationExt(x, y, graphic, NO_MASKING); + if (!IN_SCR_FIELD(x, y) || + (FrameCounter % new_graphic_info[graphic].anim_delay) != 0) + return; + + DrawGraphicAnimationExt(drawto_field, FX + x * TILEX, FY + y * TILEY, + graphic, NO_MASKING); + MarkTileDirty(x, y); } #if 1 @@ -841,54 +803,67 @@ void getOldGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y) graphic <= GFX_END_ROCKSELEMENTS) { graphic -= GFX_START_ROCKSELEMENTS; - *bitmap = pix[PIX_ELEMENTS]; + *bitmap = new_graphic_info[IMG_OLD_PIX_ELEMENTS].bitmap; *x = (graphic % GFX_PER_LINE) * TILEX; *y = (graphic / GFX_PER_LINE) * TILEY; } else if (graphic >= GFX_START_ROCKSHEROES && graphic <= GFX_END_ROCKSHEROES) { graphic -= GFX_START_ROCKSHEROES; - *bitmap = pix[PIX_HEROES]; + *bitmap = new_graphic_info[IMG_OLD_PIX_HEROES].bitmap; *x = (graphic % HEROES_PER_LINE) * TILEX; *y = (graphic / HEROES_PER_LINE) * TILEY; } else if (graphic >= GFX_START_ROCKSSP && graphic <= GFX_END_ROCKSSP) { graphic -= GFX_START_ROCKSSP; - *bitmap = pix[PIX_SP]; + *bitmap = new_graphic_info[IMG_OLD_PIX_SP].bitmap; *x = (graphic % SP_PER_LINE) * TILEX; *y = (graphic / SP_PER_LINE) * TILEY; } else if (graphic >= GFX_START_ROCKSDC && graphic <= GFX_END_ROCKSDC) { graphic -= GFX_START_ROCKSDC; - *bitmap = pix[PIX_DC]; + *bitmap = new_graphic_info[IMG_OLD_PIX_DC].bitmap; *x = (graphic % DC_PER_LINE) * TILEX; *y = (graphic / DC_PER_LINE) * TILEY; } else if (graphic >= GFX_START_ROCKSMORE && graphic <= GFX_END_ROCKSMORE) { graphic -= GFX_START_ROCKSMORE; - *bitmap = pix[PIX_MORE]; + *bitmap = new_graphic_info[IMG_OLD_PIX_MORE].bitmap; *x = (graphic % MORE_PER_LINE) * TILEX; *y = (graphic / MORE_PER_LINE) * TILEY; } else if (graphic >= GFX_START_ROCKSFONT && graphic <= GFX_END_ROCKSFONT) { graphic -= GFX_START_ROCKSFONT; - *bitmap = pix[PIX_FONT_EM]; + *bitmap = new_graphic_info[IMG_OLD_PIX_FONT_EM].bitmap; *x = (graphic % FONT_CHARS_PER_LINE) * TILEX; *y = (graphic / FONT_CHARS_PER_LINE) * TILEY; } else { - *bitmap = pix[PIX_SP]; + *bitmap = new_graphic_info[IMG_OLD_PIX_SP].bitmap; *x = 0; *y = 0; } } #endif +void getGraphicSource(int graphic, int frame, Bitmap **bitmap, int *x, int *y) +{ + Bitmap *src_bitmap = new_graphic_info[graphic].bitmap; + int offset_x = new_graphic_info[graphic].offset_x; + int offset_y = new_graphic_info[graphic].offset_y; + int src_x = new_graphic_info[graphic].src_x + frame * offset_x; + int src_y = new_graphic_info[graphic].src_y + frame * offset_y; + + *bitmap = src_bitmap; + *x = src_x; + *y = src_y; +} + void DrawGraphic(int x, int y, int graphic, int frame) { #if DEBUG @@ -904,6 +879,7 @@ void DrawGraphic(int x, int y, int graphic, int frame) MarkTileDirty(x, y); } +#if 0 void DrawOldGraphicExt(DrawBuffer *dst_bitmap, int x, int y, int graphic) { Bitmap *src_bitmap; @@ -912,10 +888,17 @@ void DrawOldGraphicExt(DrawBuffer *dst_bitmap, int x, int y, int graphic) getOldGraphicSource(graphic, &src_bitmap, &src_x, &src_y); BlitBitmap(src_bitmap, dst_bitmap, src_x, src_y, TILEX, TILEY, x, y); } +#endif void DrawGraphicExt(DrawBuffer *dst_bitmap, int x, int y, int graphic, int frame) { +#if 1 + Bitmap *src_bitmap; + int src_x, src_y; + + getGraphicSource(graphic, frame, &src_bitmap, &src_x, &src_y); +#else Bitmap *src_bitmap = new_graphic_info[graphic].bitmap; int src_x = new_graphic_info[graphic].src_x; int src_y = new_graphic_info[graphic].src_y; @@ -924,6 +907,7 @@ void DrawGraphicExt(DrawBuffer *dst_bitmap, int x, int y, int graphic, src_x += frame * offset_x; src_y += frame * offset_y; +#endif BlitBitmap(src_bitmap, dst_bitmap, src_x, src_y, TILEX, TILEY, x, y); } @@ -947,8 +931,16 @@ void DrawGraphicThruMask(int x, int y, int graphic, int frame) void DrawGraphicThruMaskExt(DrawBuffer *d, int dest_x, int dest_y, int graphic, int frame) { - Bitmap *src_bitmap = new_graphic_info[graphic].bitmap; +#if 1 + Bitmap *src_bitmap; + int src_x, src_y; + GC drawing_gc; + + getGraphicSource(graphic, frame, &src_bitmap, &src_x, &src_y); + drawing_gc = src_bitmap->stored_clip_gc; +#else GC drawing_gc = src_bitmap->stored_clip_gc; + Bitmap *src_bitmap = new_graphic_info[graphic].bitmap; int src_x = new_graphic_info[graphic].src_x; int src_y = new_graphic_info[graphic].src_y; int offset_x = new_graphic_info[graphic].offset_x; @@ -957,6 +949,8 @@ void DrawGraphicThruMaskExt(DrawBuffer *d, int dest_x, int dest_y, int graphic, src_x += frame * offset_x; src_y += frame * offset_y; +#endif + SetClipOrigin(src_bitmap, drawing_gc, dest_x - src_x, dest_y - src_y); BlitBitmapMasked(src_bitmap, d, src_x, src_y, TILEX, TILEY, dest_x, dest_y); } @@ -975,6 +969,17 @@ void getMiniGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y) int src_x = mini_startx + new_graphic_info[graphic].src_x / 2; int src_y = mini_starty + new_graphic_info[graphic].src_y / 2; + if (src_x + MINI_TILEX > src_bitmap->width || + src_y + MINI_TILEY > src_bitmap->height) + { + /* graphic of desired size seems not to be contained in this image; + dirty workaround: get it from the middle of the normal sized image */ + + getGraphicSource(graphic, 0, &src_bitmap, &src_x, &src_y); + src_x += (TILEX / 2 - MINI_TILEX / 2); + src_y += (TILEY / 2 - MINI_TILEY / 2); + } + *bitmap = src_bitmap; *x = src_x; *y = src_y; @@ -1692,6 +1697,17 @@ void getMicroGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y) int src_x = mini_startx + new_graphic_info[graphic].src_x / 8; int src_y = mini_starty + new_graphic_info[graphic].src_y / 8; + if (src_x + MICRO_TILEX > src_bitmap->width || + src_y + MICRO_TILEY > src_bitmap->height) + { + /* graphic of desired size seems not to be contained in this image; + dirty workaround: get it from the middle of the normal sized image */ + + getGraphicSource(graphic, 0, &src_bitmap, &src_x, &src_y); + src_x += (TILEX / 2 - MICRO_TILEX / 2); + src_y += (TILEY / 2 - MICRO_TILEY / 2); + } + *bitmap = src_bitmap; *x = src_x; *y = src_y; @@ -1930,7 +1946,7 @@ boolean Request(char *text, unsigned int req_state) CloseDoor(DOOR_CLOSE_1); /* save old door content */ - BlitBitmap(pix[PIX_DB_DOOR], pix[PIX_DB_DOOR], + BlitBitmap(bitmap_db_door, bitmap_db_door, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE, DOOR_GFX_PAGEX2, DOOR_GFX_PAGEY1); @@ -1987,7 +2003,7 @@ boolean Request(char *text, unsigned int req_state) } /* copy request gadgets to door backbuffer */ - BlitBitmap(drawto, pix[PIX_DB_DOOR], + BlitBitmap(drawto, bitmap_db_door, DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1); @@ -2133,7 +2149,7 @@ boolean Request(char *text, unsigned int req_state) if (!(req_state & REQ_STAY_CLOSED) && (old_door_state & DOOR_OPEN_1)) { - BlitBitmap(pix[PIX_DB_DOOR], pix[PIX_DB_DOOR], + BlitBitmap(bitmap_db_door, bitmap_db_door, DOOR_GFX_PAGEX2,DOOR_GFX_PAGEY1, DXSIZE,DYSIZE, DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY1); OpenDoor(DOOR_OPEN_1); @@ -2159,7 +2175,7 @@ unsigned int OpenDoor(unsigned int door_state) if (door_state & DOOR_COPY_BACK) { - BlitBitmap(pix[PIX_DB_DOOR], pix[PIX_DB_DOOR], + BlitBitmap(bitmap_db_door, bitmap_db_door, DOOR_GFX_PAGEX2, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE + VYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1); door_state &= ~DOOR_COPY_BACK; @@ -2174,9 +2190,9 @@ unsigned int CloseDoor(unsigned int door_state) { unsigned int new_door_state; - BlitBitmap(backbuffer, pix[PIX_DB_DOOR], + BlitBitmap(backbuffer, bitmap_db_door, DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1); - BlitBitmap(backbuffer, pix[PIX_DB_DOOR], + BlitBitmap(backbuffer, bitmap_db_door, VX, VY, VXSIZE, VYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY2); new_door_state = MoveDoor(door_state); @@ -2247,7 +2263,7 @@ unsigned int MoveDoor(unsigned int door_state) for(x=start; x<=DXSIZE; x+=stepsize) { - Bitmap *bitmap = pix[PIX_DOOR]; + Bitmap *bitmap = new_graphic_info[IMG_MENU_DOOR].bitmap; GC gc = bitmap->stored_clip_gc; WaitUntilDelayReached(&door_delay, door_delay_value); @@ -2257,7 +2273,7 @@ unsigned int MoveDoor(unsigned int door_state) int i = (door_state & DOOR_OPEN_1 ? DXSIZE-x : x); int j = (DXSIZE - i) / 3; - BlitBitmap(pix[PIX_DB_DOOR], drawto, + BlitBitmap(bitmap_db_door, drawto, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1 + i/2, DXSIZE,DYSIZE - i/2, DX, DY); @@ -2300,7 +2316,7 @@ unsigned int MoveDoor(unsigned int door_state) int i = (door_state & DOOR_OPEN_2 ? VXSIZE - x : x); int j = (VXSIZE - i) / 3; - BlitBitmap(pix[PIX_DB_DOOR], drawto, + BlitBitmap(bitmap_db_door, drawto, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY2 + i/2, VXSIZE, VYSIZE - i/2, VX, VY); @@ -2352,7 +2368,7 @@ unsigned int MoveDoor(unsigned int door_state) void DrawSpecialEditorDoor() { /* draw bigger toolbox window */ - BlitBitmap(pix[PIX_DOOR], drawto, + BlitBitmap(new_graphic_info[IMG_MENU_DOOR].bitmap, drawto, DOOR_GFX_PAGEX7, 0, 108, 56, EX - 4, EY - 12); redraw_mask |= REDRAW_ALL; @@ -2361,7 +2377,7 @@ void DrawSpecialEditorDoor() void UndrawSpecialEditorDoor() { /* draw normal tape recorder window */ - BlitBitmap(pix[PIX_BACK], drawto, + BlitBitmap(new_graphic_info[IMG_MENU_BACK].bitmap, drawto, 562, 344, 108, 56, EX - 4, EY - 12); redraw_mask |= REDRAW_ALL; @@ -2490,7 +2506,7 @@ void CreateToolButtons() for (i=0; i graphic %d -- probably crashing now...", - element, graphic_NEW); + element, graphic); #endif - return graphic_NEW; -#else - - switch(element) - { - case EL_BD_BUTTERFLY: return IMG_BD_BUTTERFLY; - case EL_BD_FIREFLY: return IMG_BD_FIREFLY; - case EL_SP_ELECTRON: return IMG_SP_ELECTRON; - - default: - break; - } - - return IMG_EMPTY; -#endif + return graphic; } int el_dir2img(int element, int direction)