X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fanim.c;h=1389dc4e8815451aaa2a49d6d78190f841871e22;hp=3dd9a14394766938b2c762d0303e824c03eb53dc;hb=HEAD;hpb=d3bcf9a438f1d60468d934026eb66b2215628e63 diff --git a/src/anim.c b/src/anim.c index 3dd9a143..1389dc4e 100644 --- a/src/anim.c +++ b/src/anim.c @@ -34,6 +34,10 @@ #define NUM_GLOBAL_ANIM_PARTS_AND_TOONS MAX(NUM_GLOBAL_ANIM_PARTS_ALL, \ NUM_GLOBAL_TOON_PARTS) +#define MAX_GLOBAL_ANIM_LIST (NUM_GAME_MODES * \ + NUM_GLOBAL_ANIMS_AND_TOONS * \ + NUM_GLOBAL_ANIM_PARTS_AND_TOONS) + #define ANIM_CLASS_BIT_TITLE_INITIAL 0 #define ANIM_CLASS_BIT_TITLE 1 #define ANIM_CLASS_BIT_MAIN 2 @@ -115,7 +119,7 @@ struct GlobalAnimPartControlInfo struct GraphicInfo graphic_info; struct GraphicInfo control_info; - boolean class_playfield; + boolean class_playfield_or_door; int viewport_x; int viewport_y; @@ -137,6 +141,9 @@ struct GlobalAnimPartControlInfo int anim_delay_counter; int post_delay_counter; + int fade_delay_counter; + int fade_alpha; + boolean init_event_state; boolean anim_event_state; @@ -247,6 +254,8 @@ static void ResetGlobalAnim_Clickable(void); static void ResetGlobalAnim_Clicked(void); static struct GlobalAnimControlInfo global_anim_ctrl[NUM_GAME_MODES]; +static struct GlobalAnimPartControlInfo *global_anim_list[MAX_GLOBAL_ANIM_LIST]; +static int num_global_anim_list = 0; static unsigned int anim_sync_frame = 0; @@ -312,7 +321,7 @@ int getAnimationFrame(int num_frames, int delay, int mode, int start_frame, } else if (mode & ANIM_LEVEL_NR) // play frames by level number { - int level_pos = level_nr - leveldir_current->first_level; + int level_pos = level_nr - gfx.anim_first_level; frame = level_pos % num_frames; } @@ -352,38 +361,26 @@ static int getGlobalAnimationPart(struct GlobalAnimMainControlInfo *anim) static int compareGlobalAnimPartControlInfo(const void *obj1, const void *obj2) { const struct GlobalAnimPartControlInfo *o1 = - (struct GlobalAnimPartControlInfo *)obj1; + *(struct GlobalAnimPartControlInfo **)obj1; const struct GlobalAnimPartControlInfo *o2 = - (struct GlobalAnimPartControlInfo *)obj2; - int compare_result; - - if (o1->control_info.draw_order != o2->control_info.draw_order) - compare_result = o1->control_info.draw_order - o2->control_info.draw_order; - else - compare_result = o1->nr - o2->nr; - - return compare_result; -} - -static int compareGlobalAnimMainControlInfo(const void *obj1, const void *obj2) -{ - const struct GlobalAnimMainControlInfo *o1 = - (struct GlobalAnimMainControlInfo *)obj1; - const struct GlobalAnimMainControlInfo *o2 = - (struct GlobalAnimMainControlInfo *)obj2; + *(struct GlobalAnimPartControlInfo **)obj2; int compare_result; if (o1->control_info.draw_order != o2->control_info.draw_order) compare_result = o1->control_info.draw_order - o2->control_info.draw_order; + else if (o1->mode_nr != o2->mode_nr) + compare_result = o1->mode_nr - o2->mode_nr; + else if (o1->anim_nr != o2->anim_nr) + compare_result = o1->anim_nr - o2->anim_nr; else compare_result = o1->nr - o2->nr; return compare_result; } -static boolean isPausedOnPlayfield(struct GlobalAnimPartControlInfo *part) +static boolean isPausedOnPlayfieldOrDoor(struct GlobalAnimPartControlInfo *part) { - // only pause playfield animations when playing + // only pause playfield and door animations when playing if (game_status != GAME_MODE_PLAYING) return FALSE; @@ -391,12 +388,12 @@ static boolean isPausedOnPlayfield(struct GlobalAnimPartControlInfo *part) if (checkGameEnded()) return FALSE; - // only pause animations on playfield - if (!part->class_playfield) + // only pause animations on playfield and doors + if (!part->class_playfield_or_door) return FALSE; - // only pause animations when engine is paused or request dialog is open(ing) - if (!tape.pausing && !game.request_active_or_moving) + // only pause animations when engine is paused or request dialog is active + if (!tape.pausing && !game.request_active) return FALSE; return TRUE; @@ -601,18 +598,14 @@ static void InitGlobalAnimControls(void) anim->has_base = TRUE; } - // apply special settings for pointer-style animations + // apply special settings to 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; + // force pointer-style animations to be checked for clicks first + part->control_info.draw_order = 1000000; + + // force pointer-style animations to pass-through clicks + part->control_info.style |= STYLE_PASSTHROUGH; } } @@ -626,26 +619,18 @@ static void InitGlobalAnimControls(void) InitToonControls(); - // sort all animations according to draw_order and animation number + // create list of all animation parts + num_global_anim_list = 0; for (m = 0; m < NUM_GAME_MODES; m++) - { - struct GlobalAnimControlInfo *ctrl = &global_anim_ctrl[m]; - - // sort all main animations for this game mode - qsort(ctrl->anim, ctrl->num_anims, - sizeof(struct GlobalAnimMainControlInfo), - compareGlobalAnimMainControlInfo); + for (a = 0; a < global_anim_ctrl[m].num_anims; a++) + for (p = 0; p < global_anim_ctrl[m].anim[a].num_parts_all; p++) + global_anim_list[num_global_anim_list++] = + &global_anim_ctrl[m].anim[a].part[p]; - for (a = 0; a < ctrl->num_anims; a++) - { - struct GlobalAnimMainControlInfo *anim = &ctrl->anim[a]; - - // sort all animation parts for this main animation - qsort(anim->part, anim->num_parts, - sizeof(struct GlobalAnimPartControlInfo), - compareGlobalAnimPartControlInfo); - } - } + // sort list of all animation parts according to draw_order and number + qsort(global_anim_list, num_global_anim_list, + sizeof(struct GlobalAnimPartControlInfo *), + compareGlobalAnimPartControlInfo); for (i = 0; i < NUM_GAME_MODES; i++) game_mode_anim_classes[i] = ANIM_CLASS_NONE; @@ -735,6 +720,7 @@ static void BlitGlobalAnimation(struct GlobalAnimPartControlInfo *part, 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 alpha = (c->fade_mode & FADE_MODE_FADE ? part->fade_alpha : g->alpha); int x, y; for (y = 0; y < c->stacked_yfactor; y++) @@ -781,6 +767,8 @@ static void BlitGlobalAnimation(struct GlobalAnimPartControlInfo *part, dst_x += part->viewport_x; dst_y += part->viewport_y; + SetBitmapAlphaNextBlit(src_bitmap, alpha); + if (drawing_target == DRAW_TO_SCREEN) blit_screen(src_bitmap, src_x, src_y, width, height, dst_x, dst_y); @@ -795,8 +783,9 @@ static void DrawGlobalAnimationsExt(int drawing_target, int drawing_stage) { int game_mode_anim_action[NUM_GAME_MODES]; int mode_nr; + int i; - if (!setup.toons) + if (!setup.global_animations) return; if (drawing_stage == DRAW_GLOBAL_ANIM_STAGE_1 && @@ -894,89 +883,66 @@ static void DrawGlobalAnimationsExt(int drawing_target, int drawing_stage) if (global.anim_status == GAME_MODE_LOADING) return; - for (mode_nr = 0; mode_nr < NUM_GAME_MODES; mode_nr++) + for (i = 0; i < num_global_anim_list; i++) { - struct GlobalAnimControlInfo *ctrl = &global_anim_ctrl[mode_nr]; - int anim_nr; + struct GlobalAnimPartControlInfo *part = global_anim_list[i]; + struct GlobalAnimControlInfo *ctrl = &global_anim_ctrl[part->mode_nr]; + struct GlobalAnimMainControlInfo *anim = &ctrl->anim[part->anim_nr]; + struct GraphicInfo *g = &part->graphic_info; + Bitmap *src_bitmap; + int src_x, src_y; + int sync_frame; + int frame; + int last_anim_random_frame = gfx.anim_random_frame; + + if (!setup.toons && + part->graphic >= IMG_TOON_1 && + part->graphic <= IMG_TOON_20) + continue; // when preparing source fading buffer, only draw animations to be stopped if (drawing_target == DRAW_TO_FADE_SOURCE && - game_mode_anim_action[mode_nr] != ANIM_STOP) + game_mode_anim_action[part->mode_nr] != ANIM_STOP) continue; // when preparing target fading buffer, only draw animations to be started if (drawing_target == DRAW_TO_FADE_TARGET && - game_mode_anim_action[mode_nr] != ANIM_START) + game_mode_anim_action[part->mode_nr] != ANIM_START) continue; -#if 0 - if (mode_nr != GFX_SPECIAL_ARG_DEFAULT && - mode_nr != game_status) + if (!(anim->state & ANIM_STATE_RUNNING)) continue; -#endif - for (anim_nr = 0; anim_nr < ctrl->num_anims; anim_nr++) - { - struct GlobalAnimMainControlInfo *anim = &ctrl->anim[anim_nr]; - struct GraphicInfo *c = &anim->control_info; - int part_first, part_last; - int part_nr; - - if (!(anim->state & ANIM_STATE_RUNNING)) - continue; - - part_first = part_last = anim->active_part_nr; - - if (c->anim_mode & ANIM_ALL || anim->num_parts == 0) - { - int num_parts = anim->num_parts + (anim->has_base ? 1 : 0); - - part_first = 0; - part_last = num_parts - 1; - } - - for (part_nr = part_first; part_nr <= part_last; part_nr++) - { - struct GlobalAnimPartControlInfo *part = &anim->part[part_nr]; - struct GraphicInfo *g = &part->graphic_info; - Bitmap *src_bitmap; - int src_x, src_y; - int sync_frame; - int frame; - int last_anim_random_frame = gfx.anim_random_frame; - - if (!(part->state & ANIM_STATE_RUNNING)) - continue; + if (!(part->state & ANIM_STATE_RUNNING)) + continue; - if (part->drawing_stage != drawing_stage) - continue; + if (part->drawing_stage != drawing_stage) + continue; - // if game is paused, also pause playfield animations - if (isPausedOnPlayfield(part)) - part->initial_anim_sync_frame++; + // if game is paused, also pause playfield and door animations + if (isPausedOnPlayfieldOrDoor(part)) + part->initial_anim_sync_frame++; - sync_frame = anim_sync_frame - part->initial_anim_sync_frame; + sync_frame = anim_sync_frame - part->initial_anim_sync_frame; - // re-initialize random animation frame after animation delay - if (g->anim_mode == ANIM_RANDOM && - sync_frame % g->anim_delay == 0 && - sync_frame > 0) - part->anim_random_frame = GetSimpleRandom(g->anim_frames); + // re-initialize random animation frame after animation delay + if (g->anim_mode == ANIM_RANDOM && + sync_frame % g->anim_delay == 0 && + sync_frame > 0) + part->anim_random_frame = GetSimpleRandom(g->anim_frames); - gfx.anim_random_frame = part->anim_random_frame; + gfx.anim_random_frame = part->anim_random_frame; - frame = getAnimationFrame(g->anim_frames, g->anim_delay, - g->anim_mode, g->anim_start_frame, - sync_frame); + frame = getAnimationFrame(g->anim_frames, g->anim_delay, + g->anim_mode, g->anim_start_frame, + sync_frame); - gfx.anim_random_frame = last_anim_random_frame; + gfx.anim_random_frame = last_anim_random_frame; - getGlobalAnimGraphicSource(part->graphic, frame, &src_bitmap, - &src_x, &src_y); + getGlobalAnimGraphicSource(part->graphic, frame, &src_bitmap, + &src_x, &src_y); - BlitGlobalAnimation(part, src_bitmap, src_x, src_y, drawing_target); - } - } + BlitGlobalAnimation(part, src_bitmap, src_x, src_y, drawing_target); } if (drawing_target == DRAW_TO_FADE_TARGET) @@ -1028,7 +994,7 @@ static boolean SetGlobalAnimPart_Viewport(struct GlobalAnimPartControlInfo *part part->drawing_stage = DRAW_GLOBAL_ANIM_STAGE_1; - part->class_playfield = FALSE; + part->class_playfield_or_door = FALSE; if (part->control_info.class == get_hash_from_key("window") || part->control_info.class == get_hash_from_key("border")) @@ -1067,6 +1033,8 @@ static boolean SetGlobalAnimPart_Viewport(struct GlobalAnimPartControlInfo *part viewport_y = DY; viewport_width = DXSIZE; viewport_height = DYSIZE; + + part->class_playfield_or_door = TRUE; } else if (part->control_info.class == get_hash_from_key("door_2")) { @@ -1084,6 +1052,8 @@ static boolean SetGlobalAnimPart_Viewport(struct GlobalAnimPartControlInfo *part viewport_width = VXSIZE; viewport_height = VYSIZE; } + + part->class_playfield_or_door = TRUE; } else // default: "playfield" { @@ -1092,7 +1062,7 @@ static boolean SetGlobalAnimPart_Viewport(struct GlobalAnimPartControlInfo *part viewport_width = FULL_SXSIZE; viewport_height = FULL_SYSIZE; - part->class_playfield = TRUE; + part->class_playfield_or_door = TRUE; } if (viewport_x != part->viewport_x || @@ -1267,8 +1237,7 @@ static boolean isClickablePart(struct GlobalAnimPartControlInfo *part, int mask) return TRUE; } } - - if (part->anim_event_state) + else if (part->anim_event_state) { int num_anim_events = GetGlobalAnimEventValueCount(c->anim_event); @@ -1391,7 +1360,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 | ANIM_STATE_WAITING))) continue; if (isClickablePart(part2, mask)) @@ -1434,7 +1403,9 @@ static void InitGlobalAnim_Triggered(struct GlobalAnimPartControlInfo *part, } static void InitGlobalAnim_Triggered_ByCustomElement(int nr, int page, - int x, int y) + int x, int y, + int trigger_x, + int trigger_y) { struct GlobalAnimControlInfo *ctrl = &global_anim_ctrl[GAME_MODE_PLAYING]; @@ -1452,25 +1423,27 @@ static void InitGlobalAnim_Triggered_ByCustomElement(int nr, int page, { struct GlobalAnimPartControlInfo *part2 = &anim2->part[part2_nr]; - if (!(part2->state & ANIM_STATE_RUNNING)) + if (!(part2->state & (ANIM_STATE_RUNNING | ANIM_STATE_WAITING))) continue; if (isClickablePart(part2, mask) && !part2->triggered) { struct GraphicInfo *c = &part2->control_info; - if (c->position == POS_CE) + if (c->position == POS_CE || + c->position == POS_CE_TRIGGER) { - // may contain negative tile offset that is treated as "off-screen" - part2->x = 0; - part2->y = 0; - // store CE tile and offset position to handle scrolling - part2->tile_x = x; - part2->tile_y = y; + part2->tile_x = (c->position == POS_CE_TRIGGER ? trigger_x : x); + part2->tile_y = (c->position == POS_CE_TRIGGER ? trigger_y : y); part2->tile_xoffset = c->x; part2->tile_yoffset = c->y; + // set resulting animation position relative to CE tile position + // (but only for ".init_event", not ".anim_event" type events) + if (part2->init_event_state) + SetGlobalAnimPartTileXY(part2); + // restart animation (by using current sync frame) part2->initial_anim_sync_frame = anim_sync_frame; } @@ -1528,9 +1501,10 @@ static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, struct GraphicInfo *g = &part->graphic_info; struct GraphicInfo *c = &part->control_info; boolean viewport_changed = SetGlobalAnimPart_Viewport(part); + int alpha = (g->alpha != -1 ? g->alpha : SDL_ALPHA_OPAQUE); - // if game is paused, also pause playfield animations - if (isPausedOnPlayfield(part)) + // if game is paused, also pause playfield and door animations + if (isPausedOnPlayfieldOrDoor(part)) return state; if (viewport_changed) @@ -1564,6 +1538,18 @@ static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, if (part->anim_random_frame == -1) part->anim_random_frame = GetSimpleRandom(g->anim_frames); + if (c->fade_mode & FADE_MODE_FADE) + { + // when fading in screen, first frame is 100 % transparent or opaque + part->fade_delay_counter = c->fade_delay + 1; + part->fade_alpha = (c->fade_mode == FADE_MODE_FADE_IN ? 0 : alpha); + } + else + { + part->fade_delay_counter = 0; + part->fade_alpha = -1; + } + if (c->direction & MV_HORIZONTAL) { int pos_bottom = part->viewport_height - g->height; @@ -1777,6 +1763,14 @@ static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, return ANIM_STATE_WAITING; } + if (part->fade_delay_counter > 0) + { + part->fade_delay_counter--; + part->fade_alpha = alpha * (c->fade_mode == FADE_MODE_FADE_IN ? + c->fade_delay - part->fade_delay_counter : + part->fade_delay_counter) / c->fade_delay; + } + // special case to prevent expiring loop sounds when playing PlayGlobalAnimSoundIfLoop(part); @@ -1795,7 +1789,8 @@ static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, } #endif - if (c->position == POS_CE) + if (c->position == POS_CE || + c->position == POS_CE_TRIGGER) { SetGlobalAnimPartTileXY(part); } @@ -1926,9 +1921,13 @@ static void HandleGlobalAnim_Main(struct GlobalAnimMainControlInfo *anim, for (i = 0; i < num_parts; i++) anim->part[i].state = ANIM_STATE_INACTIVE; - // ... then set current animation parts to "running" + // ... then set current animation part to "running" ... part->state = ANIM_STATE_RUNNING; + // ... unless it is waiting for an initial event + if (part->init_event_state) + part->state = ANIM_STATE_WAITING; + anim->state = HandleGlobalAnim_Part(part, anim->state); if (anim->state & ANIM_STATE_RESTART) @@ -2044,29 +2043,17 @@ static boolean DoGlobalAnim_EventAction(struct GlobalAnimPartControlInfo *part) static void InitGlobalAnim_Clickable(void) { - int mode_nr; + int i; - for (mode_nr = 0; mode_nr < NUM_GAME_MODES; mode_nr++) + for (i = 0; i < num_global_anim_list; i++) { - struct GlobalAnimControlInfo *ctrl = &global_anim_ctrl[mode_nr]; - int anim_nr; + struct GlobalAnimPartControlInfo *part = global_anim_list[i]; - for (anim_nr = 0; anim_nr < ctrl->num_anims; anim_nr++) - { - struct GlobalAnimMainControlInfo *anim = &ctrl->anim[anim_nr]; - int part_nr; + if (part->triggered) + part->clicked = TRUE; - for (part_nr = 0; part_nr < anim->num_parts_all; part_nr++) - { - struct GlobalAnimPartControlInfo *part = &anim->part[part_nr]; - - if (part->triggered) - part->clicked = TRUE; - - part->triggered = FALSE; - part->clickable = FALSE; - } - } + part->triggered = FALSE; + part->clickable = FALSE; } } @@ -2080,103 +2067,93 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, int clicked_event) 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--) + // check animation parts in reverse draw order (to stop when clicked) + for (i = num_global_anim_list - 1; i >= 0; i--) { - struct GlobalAnimControlInfo *ctrl = &global_anim_ctrl[mode_nr]; - int anim_nr; + struct GlobalAnimPartControlInfo *part = global_anim_list[i]; - // check animations in reverse draw order (to stop when clicked) - for (anim_nr = ctrl->num_anims - 1; anim_nr >= 0; anim_nr--) - { - struct GlobalAnimMainControlInfo *anim = &ctrl->anim[anim_nr]; - int part_nr; - - // check animation parts in reverse draw order (to stop when clicked) - for (part_nr = anim->num_parts_all - 1; part_nr >= 0; part_nr--) - { - struct GlobalAnimPartControlInfo *part = &anim->part[part_nr]; + // if request dialog is active, only handle pointer-style animations + if (game.request_active && + part->control_info.class != get_hash_from_key("pointer")) + continue; - if (clicked_event == ANIM_CLICKED_RESET) - { - part->clicked = FALSE; + if (clicked_event == ANIM_CLICKED_RESET) + { + part->clicked = FALSE; - continue; - } + continue; + } - if (!part->clickable) - continue; + if (!part->clickable) + continue; - if (!(part->state & ANIM_STATE_RUNNING)) - continue; + if (!(part->state & ANIM_STATE_RUNNING)) + continue; - // always handle "any" click events (clicking anywhere on screen) ... - if (clicked_event == ANIM_CLICKED_PRESSED && - isClickablePart(part, ANIM_EVENT_ANY)) - { + // always handle "any" click events (clicking anywhere on screen) ... + if (clicked_event == ANIM_CLICKED_PRESSED && + isClickablePart(part, ANIM_EVENT_ANY)) + { #if DEBUG_ANIM_EVENTS - Debug("anim:InitGlobalAnim_Clicked", "%d.%d TRIGGERED BY ANY", - part->old_anim_nr + 1, part->old_nr + 1); + Debug("anim:InitGlobalAnim_Clicked", "%d.%d TRIGGERED BY ANY", + part->old_anim_nr + 1, part->old_nr + 1); #endif - anything_clicked = part->clicked = TRUE; - click_consumed |= clickConsumed(part); - } + anything_clicked = part->clicked = TRUE; + click_consumed |= clickConsumed(part); + } - // always handle "unclick:any" events (releasing anywhere on screen) ... - if (clicked_event == ANIM_CLICKED_RELEASED && - isClickablePart(part, ANIM_EVENT_UNCLICK_ANY)) - { + // always handle "unclick:any" events (releasing anywhere on screen) ... + if (clicked_event == ANIM_CLICKED_RELEASED && + isClickablePart(part, ANIM_EVENT_UNCLICK_ANY)) + { #if DEBUG_ANIM_EVENTS - Debug("anim:InitGlobalAnim_Clicked", "%d.%d TRIGGERED BY UNCLICK:ANY", - part->old_anim_nr + 1, part->old_nr + 1); + Debug("anim:InitGlobalAnim_Clicked", "%d.%d TRIGGERED BY UNCLICK:ANY", + part->old_anim_nr + 1, part->old_nr + 1); #endif - anything_clicked = part->clicked = TRUE; - click_consumed |= clickConsumed(part); - } + anything_clicked = part->clicked = TRUE; + click_consumed |= clickConsumed(part); + } - // ... but only handle the first (topmost) clickable animation - if (any_part_clicked) - continue; + // ... but only handle the first (topmost) clickable animation + if (any_part_clicked) + continue; - if (clicked_event == ANIM_CLICKED_PRESSED && - isClickedPart(part, mx, my, TRUE)) - { + if (clicked_event == ANIM_CLICKED_PRESSED && + isClickedPart(part, mx, my, TRUE)) + { #if 0 - Debug("anim:InitGlobalAnim_Clicked", "%d.%d CLICKED [%d]", - anim_nr, part_nr, part->control_info.anim_event_action); + Debug("anim:InitGlobalAnim_Clicked", "%d.%d CLICKED [%d]", + anim_nr, part_nr, part->control_info.anim_event_action); #endif - // after executing event action, ignore any further actions - if (!any_event_action && DoGlobalAnim_EventAction(part)) - any_event_action = TRUE; + // after executing event action, ignore any further actions + if (!any_event_action && DoGlobalAnim_EventAction(part)) + any_event_action = TRUE; - // determine if mouse clicks should be blocked from other animations - any_part_clicked |= clickConsumed(part); + // determine if mouse clicks should be blocked from other animations + any_part_clicked |= clickConsumed(part); - if (isClickablePart(part, ANIM_EVENT_SELF)) - { + if (isClickablePart(part, ANIM_EVENT_SELF)) + { #if DEBUG_ANIM_EVENTS - Debug("anim:InitGlobalAnim_Clicked", "%d.%d TRIGGERED BY SELF", - part->old_anim_nr + 1, part->old_nr + 1); + Debug("anim:InitGlobalAnim_Clicked", "%d.%d TRIGGERED BY SELF", + part->old_anim_nr + 1, part->old_nr + 1); #endif - anything_clicked = part->clicked = TRUE; - click_consumed |= clickConsumed(part); - } + anything_clicked = part->clicked = TRUE; + click_consumed |= clickConsumed(part); + } - // determine if mouse clicks should be blocked by this animation - click_consumed |= clickBlocked(part); + // determine if mouse clicks should be blocked by this animation + click_consumed |= clickBlocked(part); - // check if this click is defined to trigger other animations - InitGlobalAnim_Triggered(part, &click_consumed, &any_event_action, - ANIM_EVENT_CLICK, "CLICK"); - } - } + // check if this click is defined to trigger other animations + InitGlobalAnim_Triggered(part, &click_consumed, &any_event_action, + ANIM_EVENT_CLICK, "CLICK"); } } @@ -2259,12 +2236,13 @@ int getGlobalAnimSyncFrame(void) return anim_sync_frame; } -void HandleGlobalAnimEventByElementChange(int element, int page, int x, int y) +void HandleGlobalAnimEventByElementChange(int element, int page, int x, int y, + int trigger_x, int trigger_y) { if (!IS_CUSTOM_ELEMENT(element)) return; // custom element stored as 0 to 255, change page stored as 1 to 32 InitGlobalAnim_Triggered_ByCustomElement(element - EL_CUSTOM_START, page + 1, - x, y); + x, y, trigger_x, trigger_y); }