X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fcartoons.c;h=2e0743646589c34105146d28404cc9c217b415c8;hb=afe0b7e62d2f17ad2fc32aafd930d48d4f61a017;hp=9b80de87e3ed2685a6da1247c970b6cb37f3c856;hpb=cea1ea492e56f8816aa76b3d59ae44c4f3b73339;p=rocksndiamonds.git diff --git a/src/cartoons.c b/src/cartoons.c index 9b80de87..2e074364 100644 --- a/src/cartoons.c +++ b/src/cartoons.c @@ -24,17 +24,27 @@ #define NUM_GLOBAL_ANIM_PARTS_AND_TOONS MAX(NUM_GLOBAL_ANIM_PARTS_ALL, \ NUM_GLOBAL_TOON_PARTS) -#define ANIM_CLASS_BIT_SUBMENU 0 -#define ANIM_CLASS_BIT_MENU 1 -#define ANIM_CLASS_BIT_TOONS 2 +#define ANIM_CLASS_BIT_TITLE_INITIAL 0 +#define ANIM_CLASS_BIT_TITLE 1 +#define ANIM_CLASS_BIT_SUBMENU 2 +#define ANIM_CLASS_BIT_MENU 3 +#define ANIM_CLASS_BIT_TOONS 4 -#define NUM_ANIM_CLASSES 3 +#define NUM_ANIM_CLASSES 5 #define ANIM_CLASS_NONE 0 +#define ANIM_CLASS_TITLE_INITIAL (1 << ANIM_CLASS_BIT_TITLE_INITIAL) +#define ANIM_CLASS_TITLE (1 << ANIM_CLASS_BIT_TITLE) #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) +#define ANIM_CLASS_TOONS_MENU (ANIM_CLASS_TOONS | \ + ANIM_CLASS_MENU) + +#define ANIM_CLASS_TOONS_MENU_SUBMENU (ANIM_CLASS_TOONS | \ + ANIM_CLASS_MENU | \ + ANIM_CLASS_SUBMENU) struct GlobalAnimPartControlInfo { @@ -42,7 +52,9 @@ struct GlobalAnimPartControlInfo int anim_nr; int mode_nr; + int sound; int graphic; + struct GraphicInfo graphic_info; struct GraphicInfo control_info; @@ -104,14 +116,24 @@ struct GameModeAnimClass int class; } game_mode_anim_classes_list[] = { - { 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 } + { GAME_MODE_TITLE_INITIAL_1, ANIM_CLASS_TITLE_INITIAL }, + { GAME_MODE_TITLE_INITIAL_2, ANIM_CLASS_TITLE_INITIAL }, + { GAME_MODE_TITLE_INITIAL_3, ANIM_CLASS_TITLE_INITIAL }, + { GAME_MODE_TITLE_INITIAL_4, ANIM_CLASS_TITLE_INITIAL }, + { GAME_MODE_TITLE_INITIAL_5, ANIM_CLASS_TITLE_INITIAL }, + { GAME_MODE_TITLE_1, ANIM_CLASS_TITLE }, + { GAME_MODE_TITLE_2, ANIM_CLASS_TITLE }, + { GAME_MODE_TITLE_3, ANIM_CLASS_TITLE }, + { GAME_MODE_TITLE_4, ANIM_CLASS_TITLE }, + { GAME_MODE_TITLE_5, ANIM_CLASS_TITLE }, + { GAME_MODE_LEVELS, ANIM_CLASS_TOONS_MENU_SUBMENU }, + { GAME_MODE_LEVELNR, ANIM_CLASS_TOONS_MENU_SUBMENU }, + { GAME_MODE_INFO, ANIM_CLASS_TOONS_MENU_SUBMENU }, + { GAME_MODE_SETUP, ANIM_CLASS_TOONS_MENU_SUBMENU }, + { GAME_MODE_MAIN, ANIM_CLASS_TOONS_MENU }, + { GAME_MODE_SCORES, ANIM_CLASS_TOONS }, + + { -1, -1 } }; struct AnimClassGameMode @@ -120,11 +142,13 @@ struct AnimClassGameMode int game_mode; } anim_class_game_modes_list[] = { - { ANIM_CLASS_BIT_SUBMENU, GAME_MODE_PSEUDO_SUBMENU }, - { ANIM_CLASS_BIT_MENU, GAME_MODE_PSEUDO_MENU }, - { ANIM_CLASS_BIT_TOONS, GAME_MODE_PSEUDO_TOONS }, + { ANIM_CLASS_BIT_TITLE_INITIAL, GAME_MODE_TITLE_INITIAL }, + { ANIM_CLASS_BIT_TITLE, GAME_MODE_TITLE }, + { 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 */ @@ -319,7 +343,7 @@ void InitGlobalAnimControls() { int i, m, a, p; int mode_nr, anim_nr, part_nr; - int graphic, control; + int sound, graphic, control; anim_sync_frame = 0; @@ -367,6 +391,7 @@ void InitGlobalAnimControls() { struct GlobalAnimPartControlInfo *part = &anim->part[part_nr]; + sound = global_anim_info[a].sound[p][m]; graphic = global_anim_info[a].graphic[p][m]; control = global_anim_info[ctrl_id].graphic[p][m]; @@ -379,9 +404,15 @@ void InitGlobalAnimControls() m, a, p, mode_nr, anim_nr, part_nr, control); #endif +#if 0 + printf("::: mode == %d, anim = %d, part = %d [%d, %d, %d] [%d]\n", + m, a, p, mode_nr, anim_nr, part_nr, sound); +#endif + part->nr = part_nr; part->anim_nr = anim_nr; part->mode_nr = mode_nr; + part->sound = sound; part->graphic = graphic; part->graphic_info = graphic_info[graphic]; part->control_info = graphic_info[control]; @@ -677,6 +708,44 @@ boolean SetGlobalAnimPart_Viewport(struct GlobalAnimPartControlInfo *part) return changed; } +void PlayGlobalAnimSound(struct GlobalAnimPartControlInfo *part) +{ + int sound = part->sound; + + if (sound == SND_UNDEFINED) + return; + + if ((!setup.sound_simple && !IS_LOOP_SOUND(sound)) || + (!setup.sound_loops && IS_LOOP_SOUND(sound))) + return; + + // !!! TODO: ADD STEREO POSITION FOR MOVING ANIMATIONS !!! + if (IS_LOOP_SOUND(sound)) + PlaySoundLoop(sound); + else + PlaySound(sound); + +#if 0 + printf("::: PLAY %d.%d.%d: %d\n", + part->anim_nr, part->nr, part->mode_nr, sound); +#endif +} + +void StopGlobalAnimSound(struct GlobalAnimPartControlInfo *part) +{ + int sound = part->sound; + + if (sound == SND_UNDEFINED) + return; + + StopSound(sound); + +#if 0 + printf("::: STOP %d.%d.%d: %d\n", + part->anim_nr, part->nr, part->mode_nr, sound); +#endif +} + int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, int state) { struct GraphicInfo *g = &part->graphic_info; @@ -771,12 +840,18 @@ int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, int state) part->step_xoffset = c->step_xoffset; if (c->step_yoffset != ARG_UNDEFINED_VALUE) part->step_yoffset = c->step_yoffset; + + if (part->init_delay_counter == 0) + PlayGlobalAnimSound(part); } if (part->init_delay_counter > 0) { part->init_delay_counter--; + if (part->init_delay_counter == 0) + PlayGlobalAnimSound(part); + return ANIM_STATE_WAITING; } @@ -790,12 +865,15 @@ int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, int state) if (part->anim_delay_counter == 0 && part->post_delay_counter == 0) { + StopGlobalAnimSound(part); + part->post_delay_counter = (c->post_delay_fixed + GetSimpleRandom(c->post_delay_random)); if (part->post_delay_counter > 0) return ANIM_STATE_RUNNING; + // drawing last frame not needed here -- animation not visible anymore return ANIM_STATE_RESTART; } } @@ -806,6 +884,8 @@ int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, int state) if (part->anim_delay_counter == 0) { + StopGlobalAnimSound(part); + part->post_delay_counter = (c->post_delay_fixed + GetSimpleRandom(c->post_delay_random)); @@ -894,6 +974,14 @@ void HandleGlobalAnim_Main(struct GlobalAnimMainControlInfo *anim, int action) case ANIM_STOP: anim->state = ANIM_STATE_INACTIVE; + { + int num_parts = anim->num_parts + (anim->has_base ? 1 : 0); + int i; + + for (i = 0; i < num_parts; i++) + StopGlobalAnimSound(&anim->part[i]); + } + return; default: