X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fcartoons.c;h=d77c476422197fcda110a66dd80bb9e0ef282d7c;hb=c85a859528058e8a3592d9da1c38164005c5aba0;hp=035c9d7e2f123b2c6ba9f9107c94a002e867e3ca;hpb=5133ddcefba9bf010336d0e36519d3f84c30f3fb;p=rocksndiamonds.git diff --git a/src/cartoons.c b/src/cartoons.c index 035c9d7e..d77c4764 100644 --- a/src/cartoons.c +++ b/src/cartoons.c @@ -32,17 +32,14 @@ struct GlobalAnimPartControlInfo int x, y; int step_xoffset, step_yoffset; - boolean restart; - boolean waiting; - boolean running; - 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; }; struct GlobalAnimMainControlInfo @@ -61,11 +58,9 @@ struct GlobalAnimMainControlInfo boolean has_base; - boolean restart; - boolean waiting; - boolean running; + int init_delay_counter; - unsigned int init_delay, init_delay_value; + int state; }; struct GlobalAnimControlInfo @@ -185,12 +180,9 @@ static void InitToonControls() anim->has_base = FALSE; - anim->restart = FALSE; - anim->waiting = FALSE; - anim->running = FALSE; + anim->init_delay_counter = 0; - anim->init_delay = 0; - anim->init_delay_value = 0; + anim->state = ANIM_STATE_INACTIVE; part_nr = 0; @@ -215,16 +207,11 @@ static void InitToonControls() part->control_info.x = ARG_UNDEFINED_VALUE; part->control_info.y = ARG_UNDEFINED_VALUE; - part->restart = FALSE; - part->waiting = FALSE; - part->running = FALSE; - - 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; + part->state = ANIM_STATE_INACTIVE; + anim->num_parts++; part_nr++; } @@ -274,12 +261,9 @@ void InitGlobalAnimControls() anim->has_base = FALSE; - anim->restart = FALSE; - anim->waiting = FALSE; - anim->running = FALSE; + anim->init_delay_counter = 0; - anim->init_delay = 0; - anim->init_delay_value = 0; + anim->state = ANIM_STATE_INACTIVE; part_nr = 0; @@ -306,16 +290,11 @@ void InitGlobalAnimControls() part->graphic_info = graphic_info[graphic]; part->control_info = graphic_info[control]; - part->restart = FALSE; - part->waiting = FALSE; - part->running = FALSE; - - 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; + part->state = ANIM_STATE_INACTIVE; + if (p < GLOBAL_ANIM_ID_PART_BASE) { anim->num_parts++; @@ -367,7 +346,7 @@ void DrawGlobalAnim() int part_first, part_last; int part_nr; - if (!anim->running) + if (!(anim->state & ANIM_STATE_RUNNING)) continue; part_first = part_last = anim->active_part_nr; @@ -395,7 +374,7 @@ void DrawGlobalAnim() int sync_frame; int frame; - if (!part->running) + if (!(part->state & ANIM_STATE_RUNNING)) continue; if (part->x < 0) @@ -437,18 +416,23 @@ void DrawGlobalAnim() } } -boolean HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, - boolean restart) +int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, int state) { struct GraphicInfo *g = &part->graphic_info; struct GraphicInfo *c = &part->control_info; - if (restart) + if (state & ANIM_STATE_RESTART) { 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_counter = + (c->init_delay_fixed + GetSimpleRandom(c->init_delay_random)); + + part->anim_delay_counter = + (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_counter); if (c->direction & MV_HORIZONTAL) { @@ -524,19 +508,48 @@ boolean HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, part->step_yoffset = c->step_yoffset; } + if (part->init_delay_counter > 0) + { + part->init_delay_counter--; + + 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 TRUE; + return ANIM_STATE_RESTART; + + if (part->anim_delay_counter > 0) + { + part->anim_delay_counter--; - if (part->step_frames_value != ARG_UNDEFINED_VALUE && - part->step_frames >= part->step_frames_value) - return TRUE; + 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)) - return FALSE; + return ANIM_STATE_RUNNING; #if 0 { @@ -553,16 +566,13 @@ boolean HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, part->x += part->step_xoffset; part->y += part->step_yoffset; - part->step_frames++; - - return FALSE; + return ANIM_STATE_RUNNING; } 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 @@ -577,16 +587,16 @@ void HandleGlobalAnim_Main(struct GlobalAnimMainControlInfo *anim, int action) action == ANIM_CONTINUE ? "ANIM_CONTINUE" : action == ANIM_STOP ? "ANIM_STOP" : "(should not happen)"), anim->nr, - anim->restart, anim->waiting, anim->running, + anim->state & ANIM_STATE_RESTART, + anim->state & ANIM_STATE_WAITING, + anim->state & ANIM_STATE_RUNNING, anim->num_parts); #endif switch (action) { case ANIM_START: - anim->restart = TRUE; - anim->waiting = FALSE; - anim->running = FALSE; + anim->state = ANIM_STATE_RESTART; anim->part_counter = 0; anim->active_part_nr = 0; skip = TRUE; @@ -594,17 +604,13 @@ void HandleGlobalAnim_Main(struct GlobalAnimMainControlInfo *anim, int action) break; case ANIM_CONTINUE: - if (!anim->restart && - !anim->waiting && - !anim->running) + if (anim->state == ANIM_STATE_INACTIVE) skip = TRUE; break; case ANIM_STOP: - anim->restart = FALSE; - anim->waiting = FALSE; - anim->running = FALSE; + anim->state = ANIM_STATE_INACTIVE; skip = TRUE; break; @@ -626,32 +632,24 @@ 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) { case ANIM_START: - anim->running = TRUE; - - part->restart = TRUE; - part->waiting = FALSE; - part->running = FALSE; + anim->state = ANIM_STATE_RUNNING; + part->state = ANIM_STATE_RESTART; skip = TRUE; break; case ANIM_CONTINUE: - if (!part->restart && - !part->waiting && - !part->running) + if (part->state == ANIM_STATE_INACTIVE) skip = TRUE; break; case ANIM_STOP: - part->restart = FALSE; - part->waiting = FALSE; - part->running = FALSE; + part->state = ANIM_STATE_INACTIVE; skip = TRUE; break; @@ -663,48 +661,7 @@ void HandleGlobalAnim_Main(struct GlobalAnimMainControlInfo *anim, int action) if (skip) continue; - if (part->restart) - { -#if 0 - printf("::: RESTART %d.%d\n", part->anim_nr, part->nr); -#endif - - if (!part->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->waiting = TRUE; - } - - 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->waiting = FALSE; - part->running = TRUE; - } - -#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->restart = HandleGlobalAnim_Part(part, part->restart); - - if (part->restart) - part->running = FALSE; + part->state = HandleGlobalAnim_Part(part, part->state); } return; @@ -713,43 +670,17 @@ void HandleGlobalAnim_Main(struct GlobalAnimMainControlInfo *anim, int action) if (skip) return; - if (anim->restart && !anim->waiting) // 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->restart) - { - if (!anim->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->waiting = TRUE; - } + part->state = ANIM_STATE_RUNNING; - if (!DelayReachedExt(&part->init_delay, part->init_delay_value, - anim_sync_frame)) - return; - - anim->waiting = FALSE; - anim->running = TRUE; - } - - part->running = TRUE; - - anim->restart = HandleGlobalAnim_Part(part, anim->restart); - - if (anim->restart) - { - anim->running = FALSE; + anim->state = HandleGlobalAnim_Part(part, anim->state); + if (anim->state & ANIM_STATE_RESTART) anim->part_counter++; - } } void HandleGlobalAnim_Mode(struct GlobalAnimControlInfo *ctrl, int action)