X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=9b972e7df955a0557e9876d2c413142ab35859eb;hb=3fd727f8ab7628eaab0be7de31658d7d468d6c8d;hp=328ad13e2188ee8aabc5328a4ea30452a4d1f0f5;hpb=632b8ce3e7c946dc6d5e9d1f93a1a8dcb38e510c;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index 328ad13e..9b972e7d 100644 --- a/src/tools.c +++ b/src/tools.c @@ -768,26 +768,29 @@ void DrawPlayer(struct PlayerInfo *player) MarkTileDirty(sx,sy); } -void DrawGraphicAnimationExt(int x, int y, int graphic, int mask_mode) +void DrawGraphicAnimationExt(DrawBuffer *dst_bitmap, int x, int y, + int graphic, int mask_mode) { - if (IN_SCR_FIELD(x, y) && - (FrameCounter % new_graphic_info[graphic].anim_delay) == 0) - { - int frame = getGraphicAnimationFrame(graphic, -1); + int frame = getGraphicAnimationFrame(graphic, -1); - if (mask_mode == USE_MASKING) - DrawGraphicThruMask(x, y, graphic, frame); - else - DrawGraphic(x, y, graphic, frame); - } + if (mask_mode == USE_MASKING) + DrawGraphicThruMaskExt(dst_bitmap, x, y, graphic, frame); + else + DrawGraphicExt(dst_bitmap, x, y, graphic, frame); } 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 +#if 0 void getOldGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y) { if (graphic >= 0 && graphic_info[graphic].bitmap != NULL) @@ -876,7 +879,7 @@ void DrawGraphic(int x, int y, int graphic, int frame) MarkTileDirty(x, y); } -#if 1 +#if 0 void DrawOldGraphicExt(DrawBuffer *dst_bitmap, int x, int y, int graphic) { Bitmap *src_bitmap; @@ -966,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; @@ -1292,6 +1306,12 @@ inline static int getGfxAction(int x, int y) gfx_action = GfxAction[x][y]; #endif +#if DEBUG + if (gfx_action < 0) + printf("getGfxAction: THIS SHOULD NEVER HAPPEN: GfxAction[%d][%d] == %d\n", + x, y, gfx_action); +#endif + return gfx_action; } @@ -1299,11 +1319,23 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element, int cut_mode, int mask_mode) { int ux = LEVELX(x), uy = LEVELY(y); - int move_dir = MovDir[ux][uy]; - int move_pos = getFramePosition(ux, uy); - int gfx_action = getGfxAction(ux, uy); - int graphic = el_dir_act2img(element, move_dir, gfx_action); - int frame = getGraphicAnimationFrame(graphic, move_pos); + int graphic; + int frame; + + if (IN_LEV_FIELD(ux, uy)) + { + int move_dir = MovDir[ux][uy]; + int move_pos = getFramePosition(ux, uy); + int gfx_action = getGfxAction(ux, uy); + + graphic = el_dir_act2img(element, move_dir, gfx_action); + frame = getGraphicAnimationFrame(graphic, move_pos); + } + else + { + graphic = el2img(element); + frame = getGraphicAnimationFrame(graphic, 0); + } if (element == EL_WALL_GROWING) { @@ -1683,6 +1715,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; @@ -2219,10 +2262,17 @@ unsigned int MoveDoor(unsigned int door_state) { stepsize = 20; door_delay_value = 0; + StopSound(SND_MENU_DOOR_OPENING); StopSound(SND_MENU_DOOR_CLOSING); } + if (global.autoplay_leveldir) + { + door_state |= DOOR_NO_DELAY; + door_state &= ~DOOR_CLOSE_ALL; + } + if (door_state & DOOR_ACTION) { if (!(door_state & DOOR_NO_DELAY)) @@ -2241,7 +2291,8 @@ unsigned int MoveDoor(unsigned int door_state) Bitmap *bitmap = new_graphic_info[IMG_MENU_DOOR].bitmap; GC gc = bitmap->stored_clip_gc; - WaitUntilDelayReached(&door_delay, door_delay_value); + if (!(door_state & DOOR_NO_DELAY)) + WaitUntilDelayReached(&door_delay, door_delay_value); if (door_state & DOOR_ACTION_1) { @@ -2533,6 +2584,14 @@ void CreateToolButtons() } } +void FreeToolButtons() +{ + int i; + + for (i=0; i