X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fcartoons.c;h=4797420cfaba5e0284c1b066cf9371cc849298a3;hb=ea925ed1065e3211c36c9bb2a56a5dbe760c208d;hp=0048d4b750ef5ade66587144b2a3431df63b3a87;hpb=f78f30b84a0345ea31b30c5bd95e338c9d9ebd4b;p=rocksndiamonds.git diff --git a/src/cartoons.c b/src/cartoons.c index 0048d4b7..4797420c 100644 --- a/src/cartoons.c +++ b/src/cartoons.c @@ -24,12 +24,14 @@ #define NUM_GLOBAL_ANIM_PARTS_AND_TOONS MAX(NUM_GLOBAL_ANIM_PARTS_ALL, \ NUM_GLOBAL_TOON_PARTS) -#define ANIM_CLASS_BIT_MENU 0 -#define ANIM_CLASS_BIT_TOONS 1 +#define ANIM_CLASS_BIT_SUBMENU 0 +#define ANIM_CLASS_BIT_MENU 1 +#define ANIM_CLASS_BIT_TOONS 2 -#define NUM_ANIM_CLASSES 2 +#define NUM_ANIM_CLASSES 3 #define ANIM_CLASS_NONE 0 +#define ANIM_CLASS_SUBMENU (1 << ANIM_CLASS_BIT_SUBMENU) #define ANIM_CLASS_MENU (1 << ANIM_CLASS_BIT_MENU) #define ANIM_CLASS_TOONS (1 << ANIM_CLASS_BIT_TOONS) @@ -62,7 +64,7 @@ struct GlobalAnimPartControlInfo int drawing_stage; int state; - int last_game_status; + int last_anim_status; }; struct GlobalAnimMainControlInfo @@ -100,14 +102,14 @@ struct GameModeAnimClass int class; } game_mode_anim_classes_list[] = { - { GAME_MODE_MAIN, ANIM_CLASS_TOONS | ANIM_CLASS_MENU }, - { GAME_MODE_LEVELS, ANIM_CLASS_TOONS | ANIM_CLASS_MENU }, - { GAME_MODE_LEVELNR, ANIM_CLASS_TOONS | ANIM_CLASS_MENU }, - { GAME_MODE_INFO, ANIM_CLASS_TOONS | ANIM_CLASS_MENU }, - { GAME_MODE_SETUP, ANIM_CLASS_TOONS | ANIM_CLASS_MENU }, - { GAME_MODE_SCORES, ANIM_CLASS_TOONS }, - - { -1, -1 } + { GAME_MODE_LEVELS, ANIM_CLASS_TOONS | ANIM_CLASS_MENU | ANIM_CLASS_SUBMENU }, + { GAME_MODE_LEVELNR,ANIM_CLASS_TOONS | ANIM_CLASS_MENU | ANIM_CLASS_SUBMENU }, + { GAME_MODE_INFO, ANIM_CLASS_TOONS | ANIM_CLASS_MENU | ANIM_CLASS_SUBMENU }, + { GAME_MODE_SETUP, ANIM_CLASS_TOONS | ANIM_CLASS_MENU | ANIM_CLASS_SUBMENU }, + { GAME_MODE_MAIN, ANIM_CLASS_TOONS | ANIM_CLASS_MENU }, + { GAME_MODE_SCORES, ANIM_CLASS_TOONS }, + + { -1, -1 } }; struct AnimClassGameMode @@ -116,10 +118,11 @@ struct AnimClassGameMode int game_mode; } anim_class_game_modes_list[] = { - { ANIM_CLASS_BIT_MENU, GAME_MODE_PSEUDO_MENU }, - { ANIM_CLASS_BIT_TOONS, GAME_MODE_PSEUDO_TOONS }, + { ANIM_CLASS_BIT_SUBMENU, GAME_MODE_PSEUDO_SUBMENU }, + { ANIM_CLASS_BIT_MENU, GAME_MODE_PSEUDO_MENU }, + { ANIM_CLASS_BIT_TOONS, GAME_MODE_PSEUDO_TOONS }, - { -1, -1 } + { -1, -1 } }; /* forward declaration for internal use */ @@ -136,7 +139,7 @@ static unsigned int anim_sync_frame_delay_value = GAME_FRAME_DELAY; static int game_mode_anim_classes[NUM_GAME_MODES]; static int anim_class_game_modes[NUM_ANIM_CLASSES]; -static int game_status_last = GAME_MODE_DEFAULT; +static int anim_status_last = GAME_MODE_DEFAULT; static int anim_classes_last = ANIM_CLASS_NONE; @@ -269,7 +272,7 @@ static void InitToonControls() part->step_delay_value = graphic_info[control].step_delay; part->state = ANIM_STATE_INACTIVE; - part->last_game_status = -1; + part->last_anim_status = -1; anim->num_parts++; part_nr++; @@ -355,7 +358,7 @@ void InitGlobalAnimControls() part->step_delay_value = graphic_info[control].step_delay; part->state = ANIM_STATE_INACTIVE; - part->last_game_status = -1; + part->last_anim_status = -1; if (p < GLOBAL_ANIM_ID_PART_BASE) { @@ -391,7 +394,7 @@ void InitGlobalAnimControls() anim_class_game_modes[anim_class_game_modes_list[i].class_bit] = anim_class_game_modes_list[i].game_mode; - game_status_last = GAME_MODE_LOADING; + anim_status_last = GAME_MODE_LOADING; anim_classes_last = ANIM_CLASS_NONE; } @@ -402,48 +405,56 @@ void InitGlobalAnimations() void DrawGlobalAnimExt(int drawing_stage) { - int anim_classes = game_mode_anim_classes[game_status]; int mode_nr; - int i; - // start or stop global animations by change of game mode - // (special handling of animations for "current screen" and "all screens") - if (game_status != game_status_last) + if (global.anim_status != anim_status_last) { + boolean before_fading = (global.anim_status == GAME_MODE_PSEUDO_FADING); + boolean after_fading = (anim_status_last == GAME_MODE_PSEUDO_FADING); + int anim_classes_next = game_mode_anim_classes[global.anim_status_next]; + int i; + + // ---------- part 1 ------------------------------------------------------ + // start or stop global animations by change of game mode + // (special handling of animations for "current screen" and "all screens") + // stop animations for last screen - HandleGlobalAnim(ANIM_STOP, game_status_last); + HandleGlobalAnim(ANIM_STOP, anim_status_last); // start animations for current screen - HandleGlobalAnim(ANIM_START, game_status); + HandleGlobalAnim(ANIM_START, global.anim_status); // start animations for all screens after loading new artwork set - if (game_status_last == GAME_MODE_LOADING) + if (anim_status_last == GAME_MODE_LOADING) HandleGlobalAnim(ANIM_START, GAME_MODE_DEFAULT); - game_status_last = game_status; - } + // ---------- part 2 ------------------------------------------------------ + // start or stop global animations by change of animation class + // (generic handling of animations for "class of screens") - // start or stop global animations by change of animation class - // (generic handling of animations for "class of screens") - if (anim_classes != anim_classes_last) - { for (i = 0; i < NUM_ANIM_CLASSES; i++) { int anim_class_check = (1 << i); int anim_class_game_mode = anim_class_game_modes[i]; int anim_class_last = anim_classes_last & anim_class_check; - int anim_class = anim_classes & anim_class_check; + int anim_class_next = anim_classes_next & anim_class_check; - if (anim_class_last && !anim_class) + // stop animations for changed screen class before fading to new screen + if (before_fading && anim_class_last && !anim_class_next) HandleGlobalAnim(ANIM_STOP, anim_class_game_mode); - else if (!anim_class_last && anim_class) + + // start animations for changed screen class after fading to new screen + if (after_fading && !anim_class_last && anim_class_next) HandleGlobalAnim(ANIM_START, anim_class_game_mode); } - anim_classes_last = anim_classes; + if (after_fading) + anim_classes_last = anim_classes_next; + + anim_status_last = global.anim_status; } - if (!setup.toons || game_status == GAME_MODE_LOADING) + if (!setup.toons || global.anim_status == GAME_MODE_LOADING) return; if (drawing_stage == DRAW_GLOBAL_ANIM_STAGE_1) @@ -553,10 +564,10 @@ boolean SetGlobalAnimPart_Viewport(struct GlobalAnimPartControlInfo *part) int viewport_height; boolean changed = FALSE; - if (part->last_game_status == game_status) + if (part->last_anim_status == global.anim_status) return FALSE; - part->last_game_status = game_status; + part->last_anim_status = global.anim_status; part->drawing_stage = DRAW_GLOBAL_ANIM_STAGE_1;