X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fcartoons.c;h=efe9ebcdb7c5b0e59e1e9d6d65440f8b039d24e2;hp=9d5642f02ff4502273cb35f0b38f2c2f41d8fcdc;hb=d84b80f3e24a3b3e5537d7636ea2ad9809612214;hpb=f15e4ecc5482d13e8249f3a0aa7e32c0b565f9e5 diff --git a/src/cartoons.c b/src/cartoons.c index 9d5642f0..efe9ebcd 100644 --- a/src/cartoons.c +++ b/src/cartoons.c @@ -33,7 +33,6 @@ 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; @@ -209,9 +208,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; @@ -296,9 +292,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 +348,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 +376,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,8 +427,14 @@ int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, int state) { ResetDelayCounterExt(&part->step_delay, anim_sync_frame); - part->initial_anim_sync_frame = (g->anim_global_sync ? 0 : anim_sync_frame); - part->step_frames = 0; + part->init_delay_value = + (c->init_delay_fixed + GetSimpleRandom(c->init_delay_random)); + + part->anim_delay_value = + (c->anim_delay_fixed + GetSimpleRandom(c->anim_delay_random)); + + part->initial_anim_sync_frame = + (g->anim_global_sync ? 0 : anim_sync_frame + part->init_delay_value); if (c->direction & MV_HORIZONTAL) { @@ -511,15 +510,26 @@ int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, int state) part->step_yoffset = c->step_yoffset; } + if (part->init_delay_value > 0) + { + part->init_delay_value--; + + return ANIM_STATE_WAITING; + } + if ((part->x <= -g->width && part->step_xoffset <= 0) || (part->x >= FULL_SXSIZE && part->step_xoffset >= 0) || (part->y <= -g->height && part->step_yoffset <= 0) || (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_value > 0) + { + part->anim_delay_value--; + + if (part->anim_delay_value == 0) + return ANIM_STATE_RESTART | ANIM_STATE_RUNNING; + } if (!DelayReachedExt(&part->step_delay, part->step_delay_value, anim_sync_frame)) @@ -540,8 +550,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; } @@ -549,7 +557,6 @@ void HandleGlobalAnim_Main(struct GlobalAnimMainControlInfo *anim, int action) { struct GlobalAnimPartControlInfo *part; struct GraphicInfo *c = &anim->control_info; - struct GraphicInfo *cp; boolean skip = FALSE; #if 0 @@ -609,7 +616,6 @@ void HandleGlobalAnim_Main(struct GlobalAnimMainControlInfo *anim, int action) for (i = 0; i < num_parts; i++) { part = &anim->part[i]; - cp = &part->control_info; switch (action) { @@ -639,43 +645,6 @@ void HandleGlobalAnim_Main(struct GlobalAnimMainControlInfo *anim, int action) if (skip) continue; - if (part->state & ANIM_STATE_RESTART) - { -#if 0 - printf("::: RESTART %d.%d\n", part->anim_nr, part->nr); -#endif - - if (!(part->state & ANIM_STATE_WAITING)) - { -#if 0 - printf("::: WAITING %d.%d\n", part->anim_nr, part->nr); -#endif - - ResetDelayCounterExt(&part->init_delay, anim_sync_frame); - - part->init_delay_value = - (cp->init_delay_fixed + GetSimpleRandom(cp->init_delay_random)); - - part->state |= ANIM_STATE_WAITING; - } - - if (!DelayReachedExt(&part->init_delay, part->init_delay_value, - anim_sync_frame)) - return; - -#if 0 - printf("::: RUNNING %d.%d\n", part->anim_nr, part->nr); -#endif - - part->state = ANIM_STATE_RESTART | ANIM_STATE_RUNNING; - } - -#if 0 - printf("::: DO PART %d.%d [%d, %d, %d] [%d]\n", part->anim_nr, part->nr, - part->restart, part->waiting, part->running, - anim->running); -#endif - part->state = HandleGlobalAnim_Part(part, part->state); } @@ -685,37 +654,16 @@ 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]; - if (anim->state & ANIM_STATE_RESTART) - { - if (!(anim->state & ANIM_STATE_WAITING)) - { - cp = &part->control_info; - - ResetDelayCounterExt(&part->init_delay, anim_sync_frame); - - part->init_delay_value = - (cp->init_delay_fixed + GetSimpleRandom(cp->init_delay_random)); - - anim->state |= ANIM_STATE_WAITING; - } - - if (!DelayReachedExt(&part->init_delay, part->init_delay_value, - anim_sync_frame)) - return; - - anim->state = ANIM_STATE_RESTART | ANIM_STATE_RUNNING; - } - part->state = ANIM_STATE_RUNNING; anim->state = HandleGlobalAnim_Part(part, anim->state); - if (anim->state == ANIM_STATE_RESTART) + if (anim->state & ANIM_STATE_RESTART) anim->part_counter++; }