X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fanim.c;h=48393eb3141f320c38f1f58fe9c88afd7676a651;hp=4ea38b41afbb98bbd52e2566cb95ee3226e84b45;hb=897c46a2720672a49ce6d0803b08eed23fd2dd90;hpb=8595dda36644bace0fb1d2c4bf8fbc9bbf1244b3 diff --git a/src/anim.c b/src/anim.c index 4ea38b41..48393eb3 100644 --- a/src/anim.c +++ b/src/anim.c @@ -990,25 +990,43 @@ static void PlayGlobalAnimSoundIfLoop(struct GlobalAnimPartControlInfo *part) PlayGlobalAnimSound(part); } -static boolean isClickablePart(struct GlobalAnimPartControlInfo *part, int mask) +static boolean checkGlobalAnimEvent(int anim_event, int mask) { - struct GraphicInfo *c = &part->control_info; - int trigger_mask = ANIM_EVENT_ANIM_MASK | ANIM_EVENT_PART_MASK; - int mask_anim_only = mask & ANIM_EVENT_ANIM_MASK; - int init_event = GetGlobalAnimEventValue(c->init_event, 0); - int anim_event = GetGlobalAnimEventValue(c->anim_event, 0); + int mask_anim_only = mask & ~ANIM_EVENT_PART_MASK; if (mask & ANIM_EVENT_ANY) - return (init_event & ANIM_EVENT_ANY || - anim_event & ANIM_EVENT_ANY); + return (anim_event & ANIM_EVENT_ANY); else if (mask & ANIM_EVENT_SELF) - return (init_event & ANIM_EVENT_SELF || - anim_event & ANIM_EVENT_SELF); + return (anim_event & ANIM_EVENT_SELF); else - return ((init_event & trigger_mask) == mask || - (anim_event & trigger_mask) == mask || - (init_event & trigger_mask) == mask_anim_only || - (anim_event & trigger_mask) == mask_anim_only); + return (anim_event == mask || + anim_event == mask_anim_only); +} + +static boolean isClickablePart(struct GlobalAnimPartControlInfo *part, int mask) +{ + struct GraphicInfo *c = &part->control_info; + int num_init_events = GetGlobalAnimEventValueCount(c->init_event); + int num_anim_events = GetGlobalAnimEventValueCount(c->anim_event); + int i; + + for (i = 0; i < num_init_events; i++) + { + int init_event = GetGlobalAnimEventValue(c->init_event, i); + + if (checkGlobalAnimEvent(init_event, mask)) + return TRUE; + } + + for (i = 0; i < num_anim_events; i++) + { + int anim_event = GetGlobalAnimEventValue(c->anim_event, i); + + if (checkGlobalAnimEvent(anim_event, mask)) + return TRUE; + } + + return FALSE; } static boolean isClickedPart(struct GlobalAnimPartControlInfo *part, @@ -1599,7 +1617,7 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, boolean clicked) // check if this click is defined to trigger other animations int gic_anim_nr = part->old_anim_nr + 1; // X as in "anim_X" int gic_part_nr = part->old_nr + 1; // Y as in "part_Y" - int mask = gic_anim_nr << ANIM_EVENT_ANIM_BIT; + int mask = ANIM_EVENT_CLICK | (gic_anim_nr << ANIM_EVENT_ANIM_BIT); if (!part->is_base) mask |= gic_part_nr << ANIM_EVENT_PART_BIT;