int init_delay_counter;
int state;
+
+ int last_state, last_active_part_nr;
};
struct GlobalAnimControlInfo
return ANIM_STATE_WAITING;
}
+ // check if moving animation has left the visible screen area
if ((part->x <= -g->width && part->step_xoffset <= 0) ||
(part->x >= part->viewport_width && part->step_xoffset >= 0) ||
(part->y <= -g->height && part->step_yoffset <= 0) ||
(part->y >= part->viewport_height && part->step_yoffset >= 0))
- return ANIM_STATE_RESTART;
+ {
+ // do not stop animation before "anim" or "post" counter are finished
+ if (part->anim_delay_counter == 0 &&
+ part->post_delay_counter == 0)
+ {
+ part->post_delay_counter =
+ (c->post_delay_fixed + GetSimpleRandom(c->post_delay_random));
+
+ if (part->post_delay_counter > 0)
+ return ANIM_STATE_RUNNING;
+
+ return ANIM_STATE_RESTART;
+ }
+ }
if (part->anim_delay_counter > 0)
{
if (part->post_delay_counter > 0)
return ANIM_STATE_RUNNING;
+ // additional state "RUNNING" required to not skip drawing last frame
return ANIM_STATE_RESTART | ANIM_STATE_RUNNING;
}
}
{
struct GlobalAnimPartControlInfo *part;
struct GraphicInfo *c = &anim->control_info;
+ int state, active_part_nr;
#if 0
printf("::: HandleGlobalAnim_Main: %d, %d => %d\n",
switch (action)
{
case ANIM_START:
- anim->state = ANIM_STATE_RESTART;
+ anim->state = anim->last_state = ANIM_STATE_RESTART;
+ anim->active_part_nr = anim->last_active_part_nr = 0;
anim->part_counter = 0;
- anim->active_part_nr = 0;
break;
if (anim->state == ANIM_STATE_INACTIVE)
return;
+ anim->state = anim->last_state;
+ anim->active_part_nr = anim->last_active_part_nr;
+
break;
case ANIM_STOP:
part->state = ANIM_STATE_INACTIVE;
}
+ anim->last_state = anim->state;
+ anim->last_active_part_nr = anim->active_part_nr;
+
return;
}
if (c->anim_mode & ANIM_ONCE &&
anim->part_counter == anim->num_parts)
anim->state = ANIM_STATE_INACTIVE;
+
+ state = anim->state;
+ active_part_nr = anim->active_part_nr;
+
+ // while the animation parts are pausing (waiting or inactive), play the base
+ // (main) animation; this corresponds to the "boring player animation" logic
+ // (!!! KLUDGE WARNING: I THINK THIS IS A MESS THAT SHOULD BE CLEANED UP !!!)
+ if (anim->has_base)
+ {
+ if (anim->state == ANIM_STATE_WAITING ||
+ anim->state == ANIM_STATE_INACTIVE)
+ {
+ anim->active_part_nr = anim->num_parts; // part nr of base animation
+ part = &anim->part[anim->active_part_nr];
+
+ if (anim->state != anim->last_state)
+ part->state = ANIM_STATE_RESTART;
+
+ anim->state = ANIM_STATE_RUNNING;
+ part->state = HandleGlobalAnim_Part(part, part->state);
+ }
+ }
+
+ anim->last_state = state;
+ anim->last_active_part_nr = active_part_nr;
}
void HandleGlobalAnim_Mode(struct GlobalAnimControlInfo *ctrl, int action)