X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fcartoons.c;h=1d17518616808a94cd6b3471c9b5986802172668;hb=ec5f4027a019ebf435b41577ab1234849c77a059;hp=4423d2717871b9c1822c863d76a29831f422d336;hpb=2b783a2b7321f4a8d0b576a5e9a530c6ef320540;p=rocksndiamonds.git diff --git a/src/cartoons.c b/src/cartoons.c index 4423d271..1d175186 100644 --- a/src/cartoons.c +++ b/src/cartoons.c @@ -160,6 +160,38 @@ static int getGlobalAnimationPart(struct GlobalAnimMainControlInfo *anim) return part_nr; } +static int compareGlobalAnimPartControlInfo(const void *obj1, const void *obj2) +{ + const struct GlobalAnimPartControlInfo *o1 = + (struct GlobalAnimPartControlInfo *)obj1; + const struct GlobalAnimPartControlInfo *o2 = + (struct GlobalAnimPartControlInfo *)obj2; + int compare_result; + + if (o1->control_info.draw_order != o2->control_info.draw_order) + compare_result = o1->control_info.draw_order - o2->control_info.draw_order; + else + compare_result = o1->nr - o2->nr; + + return compare_result; +} + +static int compareGlobalAnimMainControlInfo(const void *obj1, const void *obj2) +{ + const struct GlobalAnimMainControlInfo *o1 = + (struct GlobalAnimMainControlInfo *)obj1; + const struct GlobalAnimMainControlInfo *o2 = + (struct GlobalAnimMainControlInfo *)obj2; + int compare_result; + + if (o1->control_info.draw_order != o2->control_info.draw_order) + compare_result = o1->control_info.draw_order - o2->control_info.draw_order; + else + compare_result = o1->nr - o2->nr; + + return compare_result; +} + static void PrepareBackbuffer() { if (game_status != GAME_MODE_PLAYING) @@ -382,6 +414,27 @@ void InitGlobalAnimControls() InitToonControls(); + /* sort all animations according to draw_order and animation number */ + for (m = 0; m < NUM_GAME_MODES; m++) + { + struct GlobalAnimControlInfo *ctrl = &global_anim_ctrl[m]; + + /* sort all main animations for this game mode */ + qsort(ctrl->anim, ctrl->num_anims, + sizeof(struct GlobalAnimMainControlInfo), + compareGlobalAnimMainControlInfo); + + for (a = 0; a < ctrl->num_anims; a++) + { + struct GlobalAnimMainControlInfo *anim = &ctrl->anim[a]; + + /* sort all animation parts for this main animation */ + qsort(anim->part, anim->num_parts, + sizeof(struct GlobalAnimPartControlInfo), + compareGlobalAnimPartControlInfo); + } + } + for (i = 0; i < NUM_GAME_MODES; i++) game_mode_anim_classes[i] = ANIM_CLASS_NONE; for (i = 0; game_mode_anim_classes_list[i].game_mode != -1; i++) @@ -780,7 +833,6 @@ void HandleGlobalAnim_Main(struct GlobalAnimMainControlInfo *anim, int action) { struct GlobalAnimPartControlInfo *part; struct GraphicInfo *c = &anim->control_info; - boolean skip = FALSE; #if 0 printf("::: HandleGlobalAnim_Main: %d, %d => %d\n", @@ -806,21 +858,19 @@ void HandleGlobalAnim_Main(struct GlobalAnimMainControlInfo *anim, int action) anim->state = ANIM_STATE_RESTART; anim->part_counter = 0; anim->active_part_nr = 0; - skip = TRUE; break; case ANIM_CONTINUE: if (anim->state == ANIM_STATE_INACTIVE) - skip = TRUE; + return; break; case ANIM_STOP: anim->state = ANIM_STATE_INACTIVE; - skip = TRUE; - break; + return; default: break; @@ -845,38 +895,35 @@ void HandleGlobalAnim_Main(struct GlobalAnimMainControlInfo *anim, int action) case ANIM_START: anim->state = ANIM_STATE_RUNNING; part->state = ANIM_STATE_RESTART; - skip = TRUE; break; case ANIM_CONTINUE: if (part->state == ANIM_STATE_INACTIVE) - skip = TRUE; + continue; break; case ANIM_STOP: part->state = ANIM_STATE_INACTIVE; - skip = TRUE; - break; + continue; default: break; } - if (skip) - continue; - part->state = HandleGlobalAnim_Part(part, part->state); + + // when animation mode is "once", stop after animation was played once + if (c->anim_mode & ANIM_ONCE && + part->state & ANIM_STATE_RESTART) + part->state = ANIM_STATE_INACTIVE; } return; } - if (skip) - return; - if (anim->state & ANIM_STATE_RESTART) // directly after restart anim->active_part_nr = getGlobalAnimationPart(anim); @@ -889,8 +936,9 @@ void HandleGlobalAnim_Main(struct GlobalAnimMainControlInfo *anim, int action) if (anim->state & ANIM_STATE_RESTART) anim->part_counter++; - if (anim->part_counter == anim->num_parts && - c->anim_mode & ANIM_ONCE) + // when animation mode is "once", stop after all animations were played once + if (c->anim_mode & ANIM_ONCE && + anim->part_counter == anim->num_parts) anim->state = ANIM_STATE_INACTIVE; }