X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fanim.c;h=3e2f1222ee1bc82b0ced39b0f20c0313cef0203a;hb=77c74cbf7569a65f71e004fab915a8b6ee73cbed;hp=454389d573d4b2bd757fec251f758f8b4ceaf261;hpb=2d12b56bd6b64aa3008deae1e1d0ef5755a6bc80;p=rocksndiamonds.git diff --git a/src/anim.c b/src/anim.c index 454389d5..3e2f1222 100644 --- a/src/anim.c +++ b/src/anim.c @@ -242,6 +242,9 @@ int getAnimationFrame(int num_frames, int delay, int mode, int start_frame, { int frame = 0; + if (delay < 1) // delay must be at least 1 + delay = 1; + sync_frame += start_frame * delay; if (mode & ANIM_LOOP) // looping animation @@ -880,14 +883,21 @@ static boolean SetGlobalAnimPart_Viewport(struct GlobalAnimPartControlInfo *part int mx = MIN(MAX(0, gfx.mouse_x), WIN_XSIZE - 1); int my = MIN(MAX(0, gfx.mouse_y), WIN_YSIZE - 1); - viewport_x = mx + part->control_info.x; - viewport_y = my + part->control_info.y; + // 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; - gfx.cursor_mode_override = CURSOR_NONE; + // 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")) { @@ -931,7 +941,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; @@ -1126,7 +1137,7 @@ static boolean clickConsumed(struct GlobalAnimPartControlInfo *part) } static void InitGlobalAnim_Triggered(struct GlobalAnimPartControlInfo *part, - boolean *anything_clicked, + boolean *click_consumed, boolean *any_event_action, int event_value, char *info_text) { @@ -1150,13 +1161,13 @@ 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)) { part2->triggered = TRUE; - *anything_clicked = clickConsumed(part); // click was on "part"! + *click_consumed |= clickConsumed(part); // click was on "part"! #if DEBUG_ANIM_EVENTS printf("::: => %d.%d TRIGGERED BY %s OF %d.%d\n", @@ -1206,11 +1217,11 @@ static void HandleGlobalAnimEvent(struct GlobalAnimPartControlInfo *part, printf("::: %d.%d %s\n", part->old_anim_nr + 1, part->old_nr + 1, info_text); #endif - boolean anything_clicked = FALSE; + boolean click_consumed = FALSE; boolean any_event_action = FALSE; // check if this event is defined to trigger other animations - InitGlobalAnim_Triggered(part, &anything_clicked, &any_event_action, + InitGlobalAnim_Triggered(part, &click_consumed, &any_event_action, event_value, info_text); } @@ -1751,10 +1762,12 @@ static void InitGlobalAnim_Clickable(void) static boolean InitGlobalAnim_Clicked(int mx, int my, int clicked_event) { + boolean click_consumed = FALSE; boolean anything_clicked = FALSE; boolean any_part_clicked = FALSE; boolean any_event_action = FALSE; int mode_nr; + int i; // check game modes in reverse draw order (to stop when clicked) for (mode_nr = NUM_GAME_MODES - 1; mode_nr >= 0; mode_nr--) @@ -1783,7 +1796,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) ... @@ -1795,8 +1808,8 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, int clicked_event) part->old_anim_nr + 1, part->old_nr + 1); #endif - part->clicked = TRUE; - anything_clicked = clickConsumed(part); + anything_clicked = part->clicked = TRUE; + click_consumed |= clickConsumed(part); } // always handle "unclick:any" events (releasing anywhere on screen) ... @@ -1808,8 +1821,8 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, int clicked_event) part->old_anim_nr + 1, part->old_nr + 1); #endif - part->clicked = TRUE; - anything_clicked = clickConsumed(part); + anything_clicked = part->clicked = TRUE; + click_consumed |= clickConsumed(part); } // ... but only handle the first (topmost) clickable animation @@ -1829,7 +1842,7 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, int clicked_event) any_event_action = TRUE; // determine if mouse clicks should be blocked from other animations - any_part_clicked = clickConsumed(part); + any_part_clicked |= clickConsumed(part); if (isClickablePart(part, ANIM_EVENT_SELF)) { @@ -1838,12 +1851,12 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, int clicked_event) part->old_anim_nr + 1, part->old_nr + 1); #endif - part->clicked = TRUE; - anything_clicked = clickConsumed(part); + anything_clicked = part->clicked = TRUE; + click_consumed |= clickConsumed(part); } // check if this click is defined to trigger other animations - InitGlobalAnim_Triggered(part, &anything_clicked, &any_event_action, + InitGlobalAnim_Triggered(part, &click_consumed, &any_event_action, ANIM_EVENT_CLICK, "CLICK"); } } @@ -1854,12 +1867,16 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, int clicked_event) { handle_click = TRUE; - HandleGlobalAnim(ANIM_CONTINUE, game_status); + for (i = 0; i < NUM_GAME_MODES; i++) + HandleGlobalAnim(ANIM_CONTINUE, i); handle_click = FALSE; + + // prevent ignoring release event if processed within same game frame + StopProcessingEvents(); } - return (anything_clicked || any_event_action); + return (click_consumed || any_event_action); } static void ResetGlobalAnim_Clickable(void)