X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fanim.c;h=28af9c0027e8bcfc19d8285eab6abb5d14855bb1;hp=eccd018556eba250cf91c124ab34ad1190cdfabb;hb=5d31861d0469803eff9e76c6213464ac006236d7;hpb=56d8384fddc8e74f5327b28986f366927c3b2040 diff --git a/src/anim.c b/src/anim.c index eccd0185..28af9c00 100644 --- a/src/anim.c +++ b/src/anim.c @@ -230,6 +230,8 @@ static int anim_classes_last = ANIM_CLASS_NONE; static boolean drawing_to_fading_buffer = FALSE; +static boolean handle_click = FALSE; + // ============================================================================ // generic animation frame calculation @@ -534,6 +536,20 @@ static void InitGlobalAnimControls(void) anim->base = *part; anim->has_base = TRUE; } + + // apply special settings for pointer-style animations + if (part->control_info.class == get_hash_from_key("pointer")) + { + // force animation to be on top (must set anim and part control) + if (anim->control_info.draw_order == 0) + anim->control_info.draw_order = 1000000; + if (part->control_info.draw_order == 0) + part->control_info.draw_order = 1000000; + + // force animation to pass-through clicks (must set part control) + if (part->control_info.style == STYLE_DEFAULT) + part->control_info.style |= STYLE_PASSTHROUGH; + } } if (anim->num_parts > 0 || anim->has_base) @@ -813,13 +829,24 @@ static void DrawGlobalAnimationsExt(int drawing_target, int drawing_stage) void DrawGlobalAnimations(int drawing_target, int drawing_stage) { + int last_cursor_mode_override = gfx.cursor_mode_override; + if (drawing_stage == DRAW_GLOBAL_ANIM_STAGE_1) + { ResetGlobalAnim_Clickable(); + gfx.cursor_mode_override = CURSOR_UNDEFINED; + } + DrawGlobalAnimationsExt(drawing_target, drawing_stage); if (drawing_stage == DRAW_GLOBAL_ANIM_STAGE_2) + { ResetGlobalAnim_Clicked(); + } + + if (gfx.cursor_mode_override != last_cursor_mode_override) + SetMouseCursor(gfx.cursor_mode); } static boolean SetGlobalAnimPart_Viewport(struct GlobalAnimPartControlInfo *part) @@ -850,12 +877,24 @@ static boolean SetGlobalAnimPart_Viewport(struct GlobalAnimPartControlInfo *part } else if (part->control_info.class == get_hash_from_key("pointer")) { - viewport_x = gfx.mouse_x + part->control_info.x; - viewport_y = gfx.mouse_y + part->control_info.y; + int mx = MIN(MAX(0, gfx.mouse_x), WIN_XSIZE - 1); + int my = MIN(MAX(0, gfx.mouse_y), WIN_YSIZE - 1); + + // prevent displaying off-screen custom mouse cursor in upper left corner + if (gfx.mouse_x == POS_OFFSCREEN && + gfx.mouse_y == POS_OFFSCREEN) + mx = my = POS_OFFSCREEN; + + viewport_x = mx - part->control_info.x; + viewport_y = my - part->control_info.y; viewport_width = part->graphic_info.width; viewport_height = part->graphic_info.height; part->drawing_stage = DRAW_GLOBAL_ANIM_STAGE_2; + + // do not use global animation mouse pointer when reloading artwork + if (global.anim_status != GAME_MODE_LOADING) + gfx.cursor_mode_override = CURSOR_NONE; } else if (part->control_info.class == get_hash_from_key("door_1")) { @@ -899,7 +938,8 @@ static boolean SetGlobalAnimPart_Viewport(struct GlobalAnimPartControlInfo *part part->viewport_width = viewport_width; part->viewport_height = viewport_height; - changed = TRUE; + if (part->control_info.class != get_hash_from_key("pointer")) + changed = TRUE; } return changed; @@ -1118,7 +1158,7 @@ static void InitGlobalAnim_Triggered(struct GlobalAnimPartControlInfo *part, { struct GlobalAnimPartControlInfo *part2 = &anim2->part[part2_nr]; - if (part2->state != ANIM_STATE_RUNNING) + if (!(part2->state & ANIM_STATE_RUNNING)) continue; if (isClickablePart(part2, mask)) @@ -1185,6 +1225,9 @@ static void HandleGlobalAnimEvent(struct GlobalAnimPartControlInfo *part, static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, int state) { + if (handle_click && !part->clicked) + return state; + struct GlobalAnimControlInfo *ctrl = &global_anim_ctrl[part->mode_nr]; struct GlobalAnimMainControlInfo *anim = &ctrl->anim[part->anim_nr]; struct GraphicInfo *g = &part->graphic_info; @@ -1748,7 +1791,7 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, int clicked_event) if (!part->clickable) continue; - if (part->state != ANIM_STATE_RUNNING) + if (!(part->state & ANIM_STATE_RUNNING)) continue; // always handle "any" click events (clicking anywhere on screen) ... @@ -1815,6 +1858,15 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, int clicked_event) } } + if (anything_clicked) + { + handle_click = TRUE; + + HandleGlobalAnim(ANIM_CONTINUE, game_status); + + handle_click = FALSE; + } + return (anything_clicked || any_event_action); }