X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fanim.c;h=48393eb3141f320c38f1f58fe9c88afd7676a651;hp=861364d727e4606a7ff284cb9f0893eb85a0f7c9;hb=897c46a2720672a49ce6d0803b08eed23fd2dd90;hpb=f93552d6cd84e880ee73d4864018167aefc1bb79 diff --git a/src/anim.c b/src/anim.c index 861364d7..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, @@ -1073,8 +1091,8 @@ static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, part->anim_delay_counter = (c->anim_delay_fixed + GetSimpleRandom(c->anim_delay_random)); - part->init_event_state = GetGlobalAnimEventValue(c->init_event, 0); - part->anim_event_state = GetGlobalAnimEventValue(c->anim_event, 0); + part->init_event_state = (c->init_event != ANIM_EVENT_UNDEFINED); + part->anim_event_state = (c->anim_event != ANIM_EVENT_UNDEFINED); part->initial_anim_sync_frame = (g->anim_global_sync ? 0 : anim_sync_frame + part->init_delay_counter); @@ -1161,27 +1179,27 @@ static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, part->step_yoffset = c->step_yoffset; if (part->init_delay_counter == 0 && - part->init_event_state == ANIM_EVENT_NONE) + !part->init_event_state) PlayGlobalAnimSoundAndMusic(part); } if (part->clicked && - part->init_event_state != ANIM_EVENT_NONE) + part->init_event_state) { if (part->initial_anim_sync_frame > 0) part->initial_anim_sync_frame -= part->init_delay_counter - 1; part->init_delay_counter = 1; - part->init_event_state = ANIM_EVENT_NONE; + part->init_event_state = FALSE; part->clicked = FALSE; } if (part->clicked && - part->anim_event_state != ANIM_EVENT_NONE) + part->anim_event_state) { part->anim_delay_counter = 1; - part->anim_event_state = ANIM_EVENT_NONE; + part->anim_event_state = FALSE; part->clicked = FALSE; } @@ -1192,7 +1210,7 @@ static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, if (part->init_delay_counter == 0) { - part->init_event_state = ANIM_EVENT_NONE; + part->init_event_state = FALSE; PlayGlobalAnimSoundAndMusic(part); } @@ -1200,7 +1218,7 @@ static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, return ANIM_STATE_WAITING; } - if (part->init_event_state != ANIM_EVENT_NONE) + if (part->init_event_state) return ANIM_STATE_WAITING; // animation part is now running/visible and therefore clickable @@ -1213,7 +1231,7 @@ static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, (part->y >= part->viewport_height && part->step_yoffset >= 0)) { // do not wait for "anim" events for off-screen animations - part->anim_event_state = ANIM_EVENT_NONE; + part->anim_event_state = FALSE; // do not stop animation before "anim" or "post" counter are finished if (part->anim_delay_counter == 0 && @@ -1238,7 +1256,7 @@ static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, if (part->anim_delay_counter == 0) { - part->anim_event_state = ANIM_EVENT_NONE; + part->anim_event_state = FALSE; StopGlobalAnimSoundAndMusic(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;