X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fanim.c;h=eff54726df41f52f94f54ea3b203408fe5cb38fc;hb=108c5907f746e25316e76b3c94daf6a8ae85b66b;hp=1fb0672e2e50138d0b46674b6999e25cb43d7196;hpb=4c3c742532e3bee341c909bad60fc417c7c8ed23;p=rocksndiamonds.git diff --git a/src/anim.c b/src/anim.c index 1fb0672e..eff54726 100644 --- a/src/anim.c +++ b/src/anim.c @@ -636,10 +636,12 @@ void InitGlobalAnimations(void) InitGlobalAnimControls(); } -static void BlitGlobalAnimation(struct GraphicInfo *g, Bitmap *src_bitmap, - int src_x, int src_y, int width, int height, - int dst_x, int dst_y, int drawing_target) +static void BlitGlobalAnimation(struct GlobalAnimPartControlInfo *part, + Bitmap *src_bitmap, int src_x0, int src_y0, + int drawing_target) { + struct GraphicInfo *g = &part->graphic_info; + struct GraphicInfo *c = &part->control_info; void (*blit_bitmap)(Bitmap *, Bitmap *, int, int, int, int, int, int) = (g->draw_masked ? BlitBitmapMasked : BlitBitmap); void (*blit_screen)(Bitmap *, int, int, int, int, int, int) = @@ -647,13 +649,60 @@ static void BlitGlobalAnimation(struct GraphicInfo *g, Bitmap *src_bitmap, Bitmap *fade_bitmap = (drawing_target == DRAW_TO_FADE_SOURCE ? gfx.fade_bitmap_source : drawing_target == DRAW_TO_FADE_TARGET ? gfx.fade_bitmap_target : NULL); + int x, y; - if (drawing_target == DRAW_TO_SCREEN) - blit_screen(src_bitmap, src_x, src_y, width, height, - dst_x, dst_y); - else - blit_bitmap(src_bitmap, fade_bitmap, src_x, src_y, width, height, - dst_x, dst_y); + for (y = 0; y < c->stacked_yfactor; y++) + { + for (x = 0; x < c->stacked_xfactor; x++) + { + int src_x = src_x0; + int src_y = src_y0; + int dst_x = part->x + x * (g->width + c->stacked_xoffset); + int dst_y = part->y + y * (g->height + c->stacked_yoffset); + int cut_x = 0; + int cut_y = 0; + int width = g->width; + int height = g->height; + + if (dst_x < 0) + { + width += dst_x; + cut_x = -dst_x; + dst_x = 0; + } + else if (dst_x > part->viewport_width - g->width) + { + width -= (dst_x - (part->viewport_width - g->width)); + } + + if (dst_y < 0) + { + height += dst_y; + cut_y = -dst_y; + dst_y = 0; + } + else if (dst_y > part->viewport_height - g->height) + { + height -= (dst_y - (part->viewport_height - g->height)); + } + + if (width <= 0 || height <= 0) + continue; + + src_x += cut_x; + src_y += cut_y; + + dst_x += part->viewport_x; + dst_y += part->viewport_y; + + if (drawing_target == DRAW_TO_SCREEN) + blit_screen(src_bitmap, src_x, src_y, width, height, + dst_x, dst_y); + else + blit_bitmap(src_bitmap, fade_bitmap, src_x, src_y, width, height, + dst_x, dst_y); + } + } } static void DrawGlobalAnimationsExt(int drawing_target, int drawing_stage) @@ -802,12 +851,6 @@ static void DrawGlobalAnimationsExt(int drawing_target, int drawing_stage) struct GraphicInfo *g = &part->graphic_info; Bitmap *src_bitmap; int src_x, src_y; - int width = g->width; - int height = g->height; - int dst_x = part->x; - int dst_y = part->y; - int cut_x = 0; - int cut_y = 0; int sync_frame; int frame; int last_anim_random_frame = gfx.anim_random_frame; @@ -818,30 +861,6 @@ static void DrawGlobalAnimationsExt(int drawing_target, int drawing_stage) if (part->drawing_stage != drawing_stage) continue; - if (part->x < 0) - { - dst_x = 0; - width += part->x; - cut_x = -part->x; - } - else if (part->x > part->viewport_width - g->width) - width -= (part->x - (part->viewport_width - g->width)); - - if (part->y < 0) - { - dst_y = 0; - height += part->y; - cut_y = -part->y; - } - else if (part->y > part->viewport_height - g->height) - height -= (part->y - (part->viewport_height - g->height)); - - if (width <= 0 || height <= 0) - continue; - - dst_x += part->viewport_x; - dst_y += part->viewport_y; - sync_frame = anim_sync_frame - part->initial_anim_sync_frame; // re-initialize random animation frame after animation delay @@ -861,11 +880,7 @@ static void DrawGlobalAnimationsExt(int drawing_target, int drawing_stage) getGlobalAnimGraphicSource(part->graphic, frame, &src_bitmap, &src_x, &src_y); - src_x += cut_x; - src_y += cut_y; - - BlitGlobalAnimation(g, src_bitmap, src_x, src_y, width, height, - dst_x, dst_y, drawing_target); + BlitGlobalAnimation(part, src_bitmap, src_x, src_y, drawing_target); } } } @@ -946,7 +961,7 @@ static boolean SetGlobalAnimPart_Viewport(struct GlobalAnimPartControlInfo *part viewport_width = part->graphic_info.width; viewport_height = part->graphic_info.height; - part->drawing_stage = DRAW_GLOBAL_ANIM_STAGE_2; + part->drawing_stage = DRAW_GLOBAL_ANIM_STAGE_3; // do not use global animation mouse pointer when reloading artwork if (global.anim_status != GAME_MODE_LOADING) @@ -1154,34 +1169,54 @@ static boolean isClickablePart(struct GlobalAnimPartControlInfo *part, int mask) return FALSE; } -static boolean isClickedPart(struct GlobalAnimPartControlInfo *part, - int mx, int my, boolean clicked) +static boolean isInsidePartStacked(struct GlobalAnimPartControlInfo *part, + int mx, int my) { struct GraphicInfo *g = &part->graphic_info; + struct GraphicInfo *c = &part->control_info; int part_x = part->viewport_x + part->x; int part_y = part->viewport_y + part->y; int part_width = g->width; int part_height = g->height; + int x, y; + for (y = 0; y < c->stacked_yfactor; y++) + { + for (x = 0; x < c->stacked_xfactor; x++) + { + int part_stacked_x = part_x + x * (part_width + c->stacked_xoffset); + int part_stacked_y = part_y + y * (part_height + c->stacked_yoffset); + + if (mx >= part_stacked_x && + mx < part_stacked_x + part_width && + my >= part_stacked_y && + my < part_stacked_y + part_height) + return TRUE; + } + } + + return FALSE; +} + +static boolean isClickedPart(struct GlobalAnimPartControlInfo *part, + int mx, int my, boolean clicked) +{ // check if mouse click was detected at all if (!clicked) return FALSE; - // check if mouse click is inside the animation part's viewport + // check if mouse click is outside the animation part's viewport if (mx < part->viewport_x || mx >= part->viewport_x + part->viewport_width || my < part->viewport_y || my >= part->viewport_y + part->viewport_height) return FALSE; - // check if mouse click is inside the animation part's graphic - if (mx < part_x || - mx >= part_x + part_width || - my < part_y || - my >= part_y + part_height) - return FALSE; + // check if mouse click is inside the animation part's (stacked) graphic + if (isInsidePartStacked(part, mx, my)) + return TRUE; - return TRUE; + return FALSE; } static boolean clickBlocked(struct GlobalAnimPartControlInfo *part) @@ -1962,6 +1997,18 @@ static void ResetGlobalAnim_Clicked(void) InitGlobalAnim_Clicked(-1, -1, ANIM_CLICKED_RESET); } +void RestartGlobalAnimsByStatus(int status) +{ + int anim_status_last = global.anim_status; + + global.anim_status = status; + + // force restarting global animations by changed global animation status + SDLRedrawWindow(); + + global.anim_status = anim_status_last; +} + boolean HandleGlobalAnimClicks(int mx, int my, int button, boolean force_click) { static boolean click_consumed = FALSE;