From 63e5c13bfcc41ff01e1d691d2e33068b6d63b081 Mon Sep 17 00:00:00 2001 From: jsalmon3 <> Date: Sun, 16 Feb 2003 02:29:05 +0000 Subject: [PATCH] Updates to play sections --- src/game/intro.cpp | 2 +- src/include/sound.h | 37 +++++++- src/include/sound_server.h | 17 +--- src/sound/music.cpp | 12 +-- src/sound/script_sound.cpp | 179 ++++++++++++++++++++---------------- src/sound/sound.cpp | 6 ++ src/sound/sound_server.cpp | 11 ++- src/stratagus/mainloop.cpp | 4 +- src/stratagus/stratagus.cpp | 2 +- 9 files changed, 161 insertions(+), 109 deletions(-) diff --git a/src/game/intro.cpp b/src/game/intro.cpp index 1c7260221..be5839e86 100644 --- a/src/game/intro.cpp +++ b/src/game/intro.cpp @@ -434,7 +434,7 @@ global void ShowIntro(const Intro *intro) CallbackMusicOff(); StopMusic(); - PlaySection = PlaySectionBriefing; + CurrentPlaySection = PlaySectionBriefing; CDRomCheck(NULL); if( intro->VoiceFile[0] ) { PlayFile(intro->VoiceFile[0]); diff --git a/src/include/sound.h b/src/include/sound.h index cc6d97287..786ebb184 100644 --- a/src/include/sound.h +++ b/src/include/sound.h @@ -10,7 +10,7 @@ // /**@name sound.h - The sound header file. */ // -// (c) Copyright 1998-2002 by Lutz Sammer and Fabrice Rossi +// (c) Copyright 1998-2003 by Lutz Sammer and Fabrice Rossi // // FreeCraft is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published @@ -67,6 +67,35 @@ typedef struct _game_sound_ { SoundConfig OrcRescue; /// rescue units } GameSound; +typedef enum _play_section_type_ { + PlaySectionGame, /// Game + PlaySectionBriefing, /// Briefing + PlaySectionStats, /// Stats + PlaySectionMainMenu, /// Main menu +} PlaySectionType; + +typedef enum _play_section_order_ { + PlaySectionOrderAll, /// Sequential order + PlaySectionOrderRandom, /// Random order +} PlaySectionOrder; + +typedef struct _play_section_ { + char *Race; /// Race, NULL if for all races + PlaySectionType Type; /// Type + unsigned long CDTracks; /// Bit field of cd tracks. 32 enough? + PlaySectionOrder CDOrder; /// CD order + char **Files; /// Files + PlaySectionOrder FileOrder; /// File order +} PlaySection; + +typedef enum _cd_modes_ { + CDModeStopped = -1, /// Stopped + CDModeOff, /// Off + CDModeAll, /// All + CDModeRandom, /// Random + CDModeDefined, /// Defined +} CDModes; + /*---------------------------------------------------------------------------- -- Variables ----------------------------------------------------------------------------*/ @@ -83,6 +112,12 @@ extern GameSound GameSounds; /// Game sound configuration extern int PlayingMusic; /// flag true if playing music extern int CallbackMusic; /// flag true callback ccl if stops +extern PlaySection *PlaySections; /// Play sections +extern int NumPlaySections; /// Number of play sections +extern PlaySectionType CurrentPlaySection; /// Current play section type + +extern CDModes CDMode; /// CD mode + /*---------------------------------------------------------------------------- -- Functions ----------------------------------------------------------------------------*/ diff --git a/src/include/sound_server.h b/src/include/sound_server.h index a0b774d6b..d9aeb1e43 100644 --- a/src/include/sound_server.h +++ b/src/include/sound_server.h @@ -10,7 +10,7 @@ // /**@name sound_server.h - The sound server header file. */ // -// (c) Copyright 1998-2002 by Lutz Sammer and Fabrice Rossi +// (c) Copyright 1998-2003 by Lutz Sammer and Fabrice Rossi // // FreeCraft is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published @@ -234,21 +234,6 @@ extern unsigned AllocatedSoundMemory; extern unsigned CompressedSoundMemory; #endif - /// cd play mode, ":off" ":random" ":all" or ":defined" -enum _cd_mode_ { - CDModeStopped = -1, - CDModeOff, - CDModeAll, - CDModeRandom, - CDModeDefined, -} CDMode; - /// FIXME: docu -enum _play_section_ { - PlaySectionMainMenu, - PlaySectionGame, - PlaySectionStats, - PlaySectionBriefing, -} PlaySection; #if defined(USE_SDLCD) || defined(USE_LIBCDA) || defined(USE_CDDA) /// FIXME: docu extern int CDTrack; diff --git a/src/sound/music.cpp b/src/sound/music.cpp index 531146664..83f0e0265 100644 --- a/src/sound/music.cpp +++ b/src/sound/music.cpp @@ -10,7 +10,7 @@ // /**@name music.c - Background music support */ // -// (c) Copyright 2002 by Lutz Sammer +// (c) Copyright 2002-2003 by Lutz Sammer // // FreeCraft is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published @@ -355,7 +355,7 @@ global int PlayCDRom(int name) if (name == CDModeDefined) { CDMode = CDModeDefined; track = cd_current_track(); - if (PlaySection == PlaySectionStats) { + if (CurrentPlaySection == PlaySectionStats) { if (GameResult == GameVictory) { if (!ThisPlayer->Race && track != 8) { cd_play(8); @@ -369,20 +369,20 @@ global int PlayCDRom(int name) cd_play(17); } } - } else if (PlaySection == PlaySectionBriefing) { + } else if (CurrentPlaySection == PlaySectionBriefing) { if (!ThisPlayer->Race && track != 7) { cd_play(7); } else if (ThisPlayer->Race && track != 15) { cd_play(15); } - } else if ((PlaySection == PlaySectionMainMenu) && track != 15) { + } else if (CurrentPlaySection == PlaySectionMainMenu && track != 15) { cd_play(15); - } else if ((PlaySection == PlaySectionGame) && + } else if (CurrentPlaySection == PlaySectionGame && !ThisPlayer->Race && (track < 3 || track > 6)) { do CDTrack = (MyRand() % NumCDTracks) + 3; while (CDTrack < 3 || CDTrack > 7); cd_play(CDTrack); - } else if ((PlaySection == PlaySectionGame) && + } else if (CurrentPlaySection == PlaySectionGame && ThisPlayer->Race && (track < 10 || track > 14)) { do CDTrack = (MyRand() % NumCDTracks) + 9; while (CDTrack < 11 || CDTrack > 14); diff --git a/src/sound/script_sound.cpp b/src/sound/script_sound.cpp index 8d3c18437..4e0675528 100644 --- a/src/sound/script_sound.cpp +++ b/src/sound/script_sound.cpp @@ -10,7 +10,7 @@ // /**@name ccl_sound.c - The sound ccl functions. */ // -// (c) Copyright 1999-2002 by Lutz Sammer and Fabrice Rossi +// (c) Copyright 1999-2003 by Lutz Sammer and Fabrice Rossi // // FreeCraft is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published @@ -376,107 +376,128 @@ local SCM CclSetMusicVolume(SCM volume) local SCM CclSetCdMode(SCM mode) { #if defined(USE_SDLCD) || defined(USE_LIBCDA) || defined(USE_CDDA) - int cdmode; - char *str = gh_scm2newstr(mode, NULL); + CDModes cdmode; - if (!strcmp(str, "all")) { - cdmode = CDModeAll; - } else if (!strcmp(str, "random")) { - cdmode = CDModeRandom; - } else if (!strcmp(str, "defined")) { - cdmode = CDModeDefined; + if( gh_eq_p(mode,gh_symbol2scm("all")) ) { + cdmode=CDModeAll; + } else if( gh_eq_p(mode,gh_symbol2scm("random")) ) { + cdmode=CDModeRandom; + } else if( gh_eq_p(mode,gh_symbol2scm("defined")) ) { + cdmode=CDModeDefined; } else { - free(str); - return mode; + errl("Unsupported tag",mode); } - free(str); - PlayCDRom(cdmode); #endif return mode; } +/** +** Define play sections +*/ local SCM CclDefinePlaySections(SCM list) { - SCM value, sublist, sublist2, temp; - enum _race_ { racealliance, racemythical } race = -1; - enum _type_ { typegame, typebriefing, typestats, typemainmenu } type = -1; - enum _order_ { orderall, orderrandom } order = -1; - long tracks = 0; + SCM value; + SCM sublist; + PlaySection *p; int i; - char *filename; - while ( !gh_null_p(list) ) { - value = gh_car(list); - list = gh_cdr(list); - if (gh_eq_p(value, gh_symbol2scm("race"))) { - value = gh_car(list); - sublist = gh_cdr(list); - if (gh_eq_p(value, gh_symbol2scm("alliance"))) { - race = racealliance; - } else if (gh_eq_p(value, gh_symbol2scm("mythical"))) { - race = racemythical; + ++NumPlaySections; + PlaySections=realloc(PlaySections,NumPlaySections*sizeof(PlaySection)); + p=PlaySections+NumPlaySections-1; + memset(p,0,sizeof(PlaySection)); + + while( !gh_null_p(list) ) { + value=gh_car(list); + list=gh_cdr(list); + if( gh_eq_p(value,gh_symbol2scm("race")) ) { + value=gh_car(list); + list=gh_cdr(list); + p->Race=gh_scm2newstr(value,NULL); + } else if( gh_eq_p(value,gh_symbol2scm("type")) ) { + value=gh_car(list); + list=gh_cdr(list); + if( gh_eq_p(value, gh_symbol2scm("game")) ) { + p->Type=PlaySectionGame; + } else if( gh_eq_p(value,gh_symbol2scm("briefing")) ) { + p->Type=PlaySectionBriefing; + } else if( gh_eq_p(value,gh_symbol2scm("stats")) ) { + p->Type=PlaySectionStats; + } else if( gh_eq_p(value,gh_symbol2scm("main-menu")) ) { + p->Type=PlaySectionMainMenu; + } else { + errl("Unsupported tag",value); } - } - if (gh_eq_p(value, gh_symbol2scm("type"))) { - value = gh_car(list); - sublist = gh_cdr(list); - if (gh_eq_p(value, gh_symbol2scm("game"))) { - type = typegame; - } else if (gh_eq_p(value, gh_symbol2scm("briefing"))) { - type = typebriefing; - } else if (gh_eq_p(value, gh_symbol2scm("stats"))) { - type = typestats; - } else if (gh_eq_p(value, gh_symbol2scm("mainmenu"))) { - type = typemainmenu; - } - } - if (gh_eq_p(value, gh_symbol2scm("cd"))) { - sublist = gh_car(list); - list = gh_cdr(list); - while ( !gh_null_p(sublist) ) { - value = gh_car(sublist); - sublist = gh_cdr(sublist); - if (gh_eq_p(value, gh_symbol2scm("order"))) { - value = gh_car(list); - sublist = gh_cdr(sublist); - if (gh_eq_p(value, gh_symbol2scm("all"))) { - order = orderall; - } else if (gh_eq_p(value, gh_symbol2scm("random"))) { - order = orderrandom; + } else if( gh_eq_p(value,gh_symbol2scm("cd")) ) { + sublist=gh_car(list); + list=gh_cdr(list); + while( !gh_null_p(sublist) ) { + value=gh_car(sublist); + sublist=gh_cdr(sublist); + if( gh_eq_p(value,gh_symbol2scm("order")) ) { + value=gh_car(sublist); + sublist=gh_cdr(sublist); + if( gh_eq_p(value,gh_symbol2scm("all")) ) { + p->CDOrder=PlaySectionOrderAll; + } else if( gh_eq_p(value,gh_symbol2scm("random")) ) { + p->CDOrder=PlaySectionOrderRandom; + } else { + errl("Unsupported tag",value); } - } - if (gh_eq_p(value, gh_symbol2scm("tracks"))) { - value = gh_car(sublist); - sublist = gh_cdr(sublist); - for (i = 0; i < gh_vector_length(value); ++i) { - temp = gh_vector_ref(value, gh_int2scm(i)); - tracks = tracks | (1 << gh_scm2int(temp)); + } else if( gh_eq_p(value,gh_symbol2scm("tracks")) ) { + SCM temp; + + value=gh_car(sublist); + sublist=gh_cdr(sublist); + for( i=0; i<gh_vector_length(value); ++i ) { + temp=gh_vector_ref(value,gh_int2scm(i)); + p->CDTracks|=(1<<gh_scm2int(temp)); } + } else { + errl("Unsupported tag",value); } } - } - if (gh_eq_p(value, gh_symbol2scm("no-cd"))) { - sublist = gh_car(list); - list = gh_cdr(list); - while ( !gh_null_p(sublist) ) { - value = gh_car(sublist); - sublist = gh_cdr(sublist); - if (gh_eq_p(value, gh_symbol2scm("files"))) { - sublist2 = gh_car(sublist); - sublist = gh_cdr(sublist); - while ( !gh_null_p(sublist2) ) { - value = gh_car(sublist2); - sublist2 = gh_cdr(sublist2); - filename = gh_scm2newstr(value, NULL); - printf("file %s\n", filename); - free(filename); + } else if( gh_eq_p(value,gh_symbol2scm("no-cd")) ) { + sublist=gh_car(list); + list=gh_cdr(list); + while( !gh_null_p(sublist) ) { + value=gh_car(sublist); + sublist=gh_cdr(sublist); + if( gh_eq_p(value,gh_symbol2scm("order")) ) { + value=gh_car(sublist); + sublist=gh_cdr(sublist); + if( gh_eq_p(value,gh_symbol2scm("all")) ) { + p->FileOrder=PlaySectionOrderAll; + } else if( gh_eq_p(value,gh_symbol2scm("random")) ) { + p->FileOrder=PlaySectionOrderRandom; + } else { + errl("Unsupported tag",value); } + } else if( gh_eq_p(value,gh_symbol2scm("files")) ) { + SCM sublist2; + + sublist2=gh_car(sublist); + sublist=gh_cdr(sublist); + i=0; + while( !gh_null_p(sublist2) ) { + value=gh_car(sublist2); + sublist2=gh_cdr(sublist2); + ++i; + p->Files=realloc(p->Files,(i+1)*sizeof(char*)); + p->Files[i-1]=gh_scm2newstr(value,NULL); + p->Files[i]=NULL; + } + } else { + errl("Unsupported tag",value); } } + } else { + errl("Unsupported tag",value); } } + + return SCM_UNSPECIFIED; } /** diff --git a/src/sound/sound.cpp b/src/sound/sound.cpp index 842002c20..80082f97b 100644 --- a/src/sound/sound.cpp +++ b/src/sound/sound.cpp @@ -86,6 +86,12 @@ global GameSound GameSounds #endif ; +global PlaySection *PlaySections; /// Play sections +global int NumPlaySections; /// Number of play sections +global PlaySectionType CurrentPlaySection; /// Current play section + +global CDModes CDMode; /// CD mode + /*---------------------------------------------------------------------------- -- Functions ----------------------------------------------------------------------------*/ diff --git a/src/sound/sound_server.cpp b/src/sound/sound_server.cpp index 9cd14e207..828072cd7 100644 --- a/src/sound/sound_server.cpp +++ b/src/sound/sound_server.cpp @@ -11,7 +11,7 @@ /**@name sound_server.c - The sound server ** (hardware layer and so on) */ // -// (c) Copyright 1998-2002 by Lutz Sammer and Fabrice Rossi +// (c) Copyright 1998-2003 by Lutz Sammer and Fabrice Rossi // // FreeCraft is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published @@ -1269,20 +1269,25 @@ global void QuitSound(void) #endif // USE_SDLA } +/** +** FIXME: docu +*/ global void QuitCD(void) { #if defined(USE_SDLCD) - if (CDMode != CDModeOff && CDMode != CDModeStopped) + if (CDMode != CDModeOff && CDMode != CDModeStopped) { SDL_CDStop(CDRom); CDMode = CDModeStopped; + } if (CDMode != CDModeStopped) { SDL_CDClose(CDRom); CDMode = CDModeOff; } #elif defined(USE_LIBCDA) - if (CDMode != CDModeOff && CDMode != CDModeStopped) + if (CDMode != CDModeOff && CDMode != CDModeStopped) { cd_stop(); CDMode = CDModeStopped; + } if (CDMode == CDModeStopped) { cd_close(); cd_exit(); diff --git a/src/stratagus/mainloop.cpp b/src/stratagus/mainloop.cpp index 1a1bbaf21..1fb404ab9 100644 --- a/src/stratagus/mainloop.cpp +++ b/src/stratagus/mainloop.cpp @@ -639,7 +639,7 @@ global void GameMainLoop(void) MultiPlayerReplayEachCycle(); - PlaySection = PlaySectionGame; + CurrentPlaySection = PlaySectionGame; CDRomCheck(NULL); while( GameRunning ) { @@ -813,7 +813,7 @@ global void GameMainLoop(void) } if( GameResult==GameVictory || GameResult==GameDefeat ) { - PlaySection = PlaySectionStats; + CurrentPlaySection = PlaySectionStats; CDRomCheck(NULL); ShowStats(); } diff --git a/src/stratagus/stratagus.cpp b/src/stratagus/stratagus.cpp index d16ae7bf3..7b9b61ede 100644 --- a/src/stratagus/stratagus.cpp +++ b/src/stratagus/stratagus.cpp @@ -1122,7 +1122,7 @@ global void MenuLoop(char* filename, WorldMap* map) CleanModules(); CleanFonts(); - PlaySection = PlaySectionMainMenu; + CurrentPlaySection = PlaySectionMainMenu; LoadCcl(); // Reload the main config file