#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)
int drawing_stage;
int state;
- int last_game_status;
+ int last_anim_status;
};
struct GlobalAnimMainControlInfo
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
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 */
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;
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++;
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)
{
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;
}
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)
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;