X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fanim.c;h=be6c98f6d4ee82587a1b3c0cd3b23ad18e3fcdd3;hp=eefb5a1dba076afd59842c4f05459dec1ab1e465;hb=3cc2ee99e57014c6962d26365e92bd3eac36a492;hpb=cc3e2f7d6ba6593e7c6aad77d63b14886096d066 diff --git a/src/anim.c b/src/anim.c index eefb5a1d..be6c98f6 100644 --- a/src/anim.c +++ b/src/anim.c @@ -19,6 +19,7 @@ #include "screens.h" +#define DEBUG_ANIM_DELAY 0 #define DEBUG_ANIM_EVENTS 0 @@ -209,6 +210,7 @@ struct AnimClassGameMode }; // forward declaration for internal use +static void DoGlobalAnim_DelayAction(struct GlobalAnimPartControlInfo *, int); static boolean DoGlobalAnim_EventAction(struct GlobalAnimPartControlInfo *); static void HandleGlobalAnim(int, int); static void DoAnimationExt(void); @@ -811,13 +813,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) @@ -854,6 +867,8 @@ static boolean SetGlobalAnimPart_Viewport(struct GlobalAnimPartControlInfo *part viewport_height = part->graphic_info.height; part->drawing_stage = DRAW_GLOBAL_ANIM_STAGE_2; + + gfx.cursor_mode_override = CURSOR_NONE; } else if (part->control_info.class == get_hash_from_key("door_1")) { @@ -1155,6 +1170,16 @@ static void InitGlobalAnim_Triggered(struct GlobalAnimPartControlInfo *part, } } +static void HandleGlobalAnimDelay(struct GlobalAnimPartControlInfo *part, + int delay_type, char *info_text) +{ +#if DEBUG_ANIM_DELAY + printf("::: %d.%d %s\n", part->old_anim_nr + 1, part->old_nr + 1, info_text); +#endif + + DoGlobalAnim_DelayAction(part, delay_type); +} + static void HandleGlobalAnimEvent(struct GlobalAnimPartControlInfo *part, int event_value, char *info_text) { @@ -1294,6 +1319,7 @@ static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, { PlayGlobalAnimSoundAndMusic(part); + HandleGlobalAnimDelay(part, ANIM_DELAY_INIT, "START [INIT_DELAY]"); HandleGlobalAnimEvent(part, ANIM_EVENT_START, "START [ANIM]"); } else @@ -1333,6 +1359,7 @@ static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, PlayGlobalAnimSoundAndMusic(part); + HandleGlobalAnimDelay(part, ANIM_DELAY_INIT, "START [INIT_DELAY]"); HandleGlobalAnimEvent(part, ANIM_EVENT_START, "START [ANIM]"); } @@ -1383,7 +1410,8 @@ static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, StopGlobalAnimSoundAndMusic(part); - HandleGlobalAnimEvent(part, ANIM_EVENT_END, "END [ANIM_DELAY/EVENT]"); + HandleGlobalAnimDelay(part, ANIM_DELAY_ANIM, "END [ANIM_DELAY]"); + HandleGlobalAnimEvent(part, ANIM_EVENT_END, "END [ANIM_DELAY/EVENT]"); part->post_delay_counter = (c->post_delay_fixed + GetSimpleRandom(c->post_delay_random)); @@ -1402,6 +1430,7 @@ static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, if (part->post_delay_counter == 0) { + HandleGlobalAnimDelay(part, ANIM_DELAY_POST, "END [POST_DELAY]"); HandleGlobalAnimEvent(part, ANIM_EVENT_POST, "END [POST_DELAY]"); return ANIM_STATE_RESTART; @@ -1633,14 +1662,31 @@ static void DoAnimationExt(void) #endif } +static void DoGlobalAnim_DelayAction(struct GlobalAnimPartControlInfo *part, + int delay_type) +{ + int delay_action = + (delay_type == ANIM_DELAY_INIT ? part->control_info.init_delay_action : + delay_type == ANIM_DELAY_ANIM ? part->control_info.anim_delay_action : + delay_type == ANIM_DELAY_POST ? part->control_info.post_delay_action : + ANIM_DELAY_ACTION_NONE); + + if (delay_action == ANIM_DELAY_ACTION_NONE) + return; + + PushUserEvent(USEREVENT_ANIM_DELAY_ACTION, delay_action, 0); +} + static boolean DoGlobalAnim_EventAction(struct GlobalAnimPartControlInfo *part) { - int anim_event_action = part->control_info.anim_event_action; + int event_action = (part->init_event_state ? + part->control_info.init_event_action : + part->control_info.anim_event_action); - if (anim_event_action == -1) + if (event_action == ANIM_EVENT_ACTION_NONE) return FALSE; - PushUserEvent(USEREVENT_ANIM_EVENT_ACTION, anim_event_action, 0); + PushUserEvent(USEREVENT_ANIM_EVENT_ACTION, event_action, 0); // check if further actions are allowed to be executed if (part->control_info.style & STYLE_MULTIPLE_ACTIONS)