X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fcartoons.c;h=d77c476422197fcda110a66dd80bb9e0ef282d7c;hb=c85a859528058e8a3592d9da1c38164005c5aba0;hp=3eb9eed80048b4b85b3566b8538bf1bfd5854ea3;hpb=318b206738798ebedc9e314af56f3602b00c0dde;p=rocksndiamonds.git diff --git a/src/cartoons.c b/src/cartoons.c index 3eb9eed8..d77c4764 100644 --- a/src/cartoons.c +++ b/src/cartoons.c @@ -33,12 +33,11 @@ struct GlobalAnimPartControlInfo int step_xoffset, step_yoffset; unsigned int initial_anim_sync_frame; - unsigned int step_frames, step_frames_value; unsigned int step_delay, step_delay_value; - unsigned int init_delay, init_delay_value; - unsigned int anim_delay, anim_delay_value; - unsigned int post_delay, post_delay_value; + int init_delay_counter; + int anim_delay_counter; + int post_delay_counter; int state; }; @@ -59,7 +58,7 @@ struct GlobalAnimMainControlInfo boolean has_base; - unsigned int init_delay, init_delay_value; + int init_delay_counter; int state; }; @@ -181,8 +180,7 @@ static void InitToonControls() anim->has_base = FALSE; - anim->init_delay = 0; - anim->init_delay_value = 0; + anim->init_delay_counter = 0; anim->state = ANIM_STATE_INACTIVE; @@ -209,9 +207,6 @@ static void InitToonControls() part->control_info.x = ARG_UNDEFINED_VALUE; part->control_info.y = ARG_UNDEFINED_VALUE; - part->step_frames = 0; - part->step_frames_value = graphic_info[control].step_frames; - part->step_delay = 0; part->step_delay_value = graphic_info[control].step_delay; @@ -266,8 +261,7 @@ void InitGlobalAnimControls() anim->has_base = FALSE; - anim->init_delay = 0; - anim->init_delay_value = 0; + anim->init_delay_counter = 0; anim->state = ANIM_STATE_INACTIVE; @@ -296,9 +290,6 @@ void InitGlobalAnimControls() part->graphic_info = graphic_info[graphic]; part->control_info = graphic_info[control]; - part->step_frames = 0; - part->step_frames_value = graphic_info[control].step_frames; - part->step_delay = 0; part->step_delay_value = graphic_info[control].step_delay; @@ -355,7 +346,7 @@ void DrawGlobalAnim() int part_first, part_last; int part_nr; - if (anim->state != ANIM_STATE_RUNNING) + if (!(anim->state & ANIM_STATE_RUNNING)) continue; part_first = part_last = anim->active_part_nr; @@ -383,7 +374,7 @@ void DrawGlobalAnim() int sync_frame; int frame; - if (part->state != ANIM_STATE_RUNNING) + if (!(part->state & ANIM_STATE_RUNNING)) continue; if (part->x < 0) @@ -434,13 +425,14 @@ int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, int state) { ResetDelayCounterExt(&part->step_delay, anim_sync_frame); - part->init_delay_value = + part->init_delay_counter = (c->init_delay_fixed + GetSimpleRandom(c->init_delay_random)); - part->initial_anim_sync_frame = - (g->anim_global_sync ? 0 : anim_sync_frame + part->init_delay_value); + part->anim_delay_counter = + (c->anim_delay_fixed + GetSimpleRandom(c->anim_delay_random)); - part->step_frames = 0; + part->initial_anim_sync_frame = + (g->anim_global_sync ? 0 : anim_sync_frame + part->init_delay_counter); if (c->direction & MV_HORIZONTAL) { @@ -516,9 +508,9 @@ int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, int state) part->step_yoffset = c->step_yoffset; } - if (part->init_delay_value > 0) + if (part->init_delay_counter > 0) { - part->init_delay_value--; + part->init_delay_counter--; return ANIM_STATE_WAITING; } @@ -529,9 +521,31 @@ int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, int state) (part->y >= FULL_SYSIZE && part->step_yoffset >= 0)) return ANIM_STATE_RESTART; - if (part->step_frames_value != ARG_UNDEFINED_VALUE && - part->step_frames >= part->step_frames_value) - return ANIM_STATE_RESTART; + if (part->anim_delay_counter > 0) + { + part->anim_delay_counter--; + + if (part->anim_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 | ANIM_STATE_RUNNING; + } + } + + if (part->post_delay_counter > 0) + { + part->post_delay_counter--; + + if (part->post_delay_counter == 0) + return ANIM_STATE_RESTART; + + return ANIM_STATE_WAITING; + } if (!DelayReachedExt(&part->step_delay, part->step_delay_value, anim_sync_frame)) @@ -552,8 +566,6 @@ int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, int state) part->x += part->step_xoffset; part->y += part->step_yoffset; - part->step_frames++; - return ANIM_STATE_RUNNING; } @@ -646,34 +658,10 @@ void HandleGlobalAnim_Main(struct GlobalAnimMainControlInfo *anim, int action) break; } -#if 0 - printf("::: LOOPING ...\n"); -#endif - if (skip) continue; -#if 0 - printf("::: DO PART (1) %d.%d [%d, %d, %d] [%d] [%d / %d]\n", - part->anim_nr, part->nr, - part->state & ANIM_STATE_RESTART, - part->state & ANIM_STATE_WAITING, - part->state & ANIM_STATE_RUNNING, - anim->state & ANIM_STATE_RUNNING, - part->step_frames, part->step_frames_value); -#endif - part->state = HandleGlobalAnim_Part(part, part->state); - -#if 0 - printf("::: DO PART (2) %d.%d [%d, %d, %d] [%d] [%d / %d]\n", - part->anim_nr, part->nr, - part->state & ANIM_STATE_RESTART, - part->state & ANIM_STATE_WAITING, - part->state & ANIM_STATE_RUNNING, - anim->state & ANIM_STATE_RUNNING, - part->step_frames, part->step_frames_value); -#endif } return; @@ -682,7 +670,7 @@ void HandleGlobalAnim_Main(struct GlobalAnimMainControlInfo *anim, int action) if (skip) return; - if (anim->state == ANIM_STATE_RESTART) // directly after restart + if (anim->state & ANIM_STATE_RESTART) // directly after restart anim->active_part_nr = getGlobalAnimationPart(anim); part = &anim->part[anim->active_part_nr]; @@ -691,7 +679,7 @@ void HandleGlobalAnim_Main(struct GlobalAnimMainControlInfo *anim, int action) anim->state = HandleGlobalAnim_Part(part, anim->state); - if (anim->state == ANIM_STATE_RESTART) + if (anim->state & ANIM_STATE_RESTART) anim->part_counter++; }