diff --git a/sc2/ChangeLog b/sc2/ChangeLog index 971ad1201..446068979 100644 --- a/sc2/ChangeLog +++ b/sc2/ChangeLog @@ -1,4 +1,5 @@ Changes towards version 0.7: +- Added a Remix option to the setup menu - Michael - Addon zips can live in content/addons directly - Michael - 3DO music separated into an addon pack - Michael - Major change in resource index scheme - Michael diff --git a/sc2/content/lbm/setupmenu.txt b/sc2/content/lbm/setupmenu.txt index a41568f62..65f4a503e 100644 --- a/sc2/content/lbm/setupmenu.txt +++ b/sc2/content/lbm/setupmenu.txt @@ -21,7 +21,7 @@ Font Style Scan Style Scroll Style Subtitles -Music Format +3DO Remixes Display Cutscenes Show FPS @@ -33,6 +33,7 @@ Slave Shields Player One Player Two Control Set +UQM Remixes #(CAT_0_OPTS) 320x240 @@ -183,8 +184,8 @@ Do not subtitle alien speech. Show subtitles for alien speech. #(CAT_9_OPTS) -PC -3do +Disabled +Enabled #(CAT_9_OPT_0_DESC) Uses the music from the Original PC version. @@ -407,6 +408,19 @@ Select the control template to edit. Select the control template to edit. +#(CAT_21_OPTS) +Disabled +Enabled + +#(CAT_21_OPT_0_DESC) +Do not load the Precursors Remix Pack. +Requires a restart of UQM to take effect. + +#(CAT_21_OPT_1_DESC) +Overrides PC or 3do soundtrack with the +modern soundtrack written by The Precursors. +Requires a restart of UQM to take effect. + #(SLIDERS) Music Volume SFX Volume diff --git a/sc2/src/options.c b/sc2/src/options.c index fec1a7aa6..b50cccfda 100644 --- a/sc2/src/options.c +++ b/sc2/src/options.c @@ -38,7 +38,6 @@ #include -int optWhichMusic; int optWhichCoarseScan; int optWhichMenu; int optWhichFonts; @@ -48,6 +47,8 @@ int optSmoothScroll; int optMeleeScale; const char **optAddons; +BOOLEAN opt3doMusic; +BOOLEAN optPrecursorsMusic; BOOLEAN optSubtitles; BOOLEAN optStereoSFX; BOOLEAN optKeepAspectRatio; @@ -401,45 +402,56 @@ mountDirZips (uio_MountHandle *contentHandle, uio_DirHandle *dirHandle, const ch uio_DirList_free (dirList); } -void -prepareAddons (const char **addons) +BOOLEAN +loadAddon (const char *addon) { - uio_DirHandle *addonsDir; - + uio_DirHandle *addonsDir, *addonDir; + uio_DirList *indices; + addonsDir = uio_openDirRelative (contentDir, "addons", 0); if (addonsDir == NULL) { // No addon dir found. log_add (log_Warning, "Warning: There's no 'addons' " "directory in the 'content' directory;\n\t'--addon' " "options are ignored."); - return; + return FALSE; } + addonDir = uio_openDirRelative (addonsDir, addon, 0); + if (addonDir == NULL) + { + log_add (log_Warning, "Warning: Addon '%s' not found", addon); + uio_closeDir (addonsDir); + return FALSE; + } + + indices = uio_getDirList (addonDir, "", ".rmp$", + match_MATCH_REGEX); + + if (indices != NULL) + { + int i; + + for (i = 0; i < indices->numNames; i++) + { + res_LoadFilename (addonDir, indices->names[i]); + } + } + uio_DirList_free (indices); + uio_closeDir (addonDir); + uio_closeDir (addonsDir); + return TRUE; +} + + + +void +prepareAddons (const char **addons) +{ for (; *addons != NULL; addons++) { - uio_DirList *indices; - uio_DirHandle *addonDir; - - addonDir = uio_openDirRelative (addonsDir, *addons, 0); - if (addonDir == NULL) + if (!loadAddon (*addons)) { - log_add (log_Warning, "Warning: Addon '%s' not found", *addons); - continue; + break; } - - indices = uio_getDirList (addonDir, "", ".rmp$", - match_MATCH_REGEX); - - if (indices != NULL) - { - int i; - - for (i = 0; i < indices->numNames; i++) - { - res_LoadFilename (addonDir, indices->names[i]); - } - } - uio_DirList_free (indices); - uio_closeDir (addonDir); } - uio_closeDir (addonsDir); } diff --git a/sc2/src/options.h b/sc2/src/options.h index 23ae5eb82..1e63922a8 100644 --- a/sc2/src/options.h +++ b/sc2/src/options.h @@ -30,7 +30,6 @@ #define OPT_PC 0x02 #define OPT_ALL 0xFF -extern int optWhichMusic; extern int optWhichCoarseScan; extern int optWhichMenu; extern int optWhichFonts; @@ -39,6 +38,8 @@ extern int optWhichShield; extern int optSmoothScroll; extern int optMeleeScale; +extern BOOLEAN opt3doMusic; +extern BOOLEAN optPrecursorsMusic; extern BOOLEAN optSubtitles; extern BOOLEAN optStereoSFX; extern BOOLEAN optKeepAspectRatio; @@ -71,5 +72,7 @@ void prepareMeleeDir (void); void prepareSaveDir (void); void prepareAddons (const char **addons); +BOOLEAN loadAddon (const char *addon); + #endif diff --git a/sc2/src/sc2code/setup.c b/sc2/src/sc2code/setup.c index a31fcd022..02769bc4c 100644 --- a/sc2/src/sc2code/setup.c +++ b/sc2/src/sc2code/setup.c @@ -115,10 +115,15 @@ LoadKernel (int argc, char *argv[]) if (hResIndex == 0) return FALSE; - /* TODO: This code must die once addons are convenient to use. */ - if (optWhichMusic == OPT_3DO) + /* Load addons demanded by the current configuration. */ + if (opt3doMusic) { - res_LoadFilename (contentDir, "addons/3domusic/3domusic.rmp"); + loadAddon ("3domusic"); + } + + if (optPrecursorsMusic) + { + loadAddon ("remix"); } /* Now load the rest of the addons, in order. */ diff --git a/sc2/src/sc2code/setupmenu.c b/sc2/src/sc2code/setupmenu.c index cb2054a4d..31f32f542 100644 --- a/sc2/src/sc2code/setupmenu.c +++ b/sc2/src/sc2code/setupmenu.c @@ -71,7 +71,7 @@ static void clear_control (WIDGET_CONTROLENTRY *widget); #endif #define MENU_COUNT 8 -#define CHOICE_COUNT 21 +#define CHOICE_COUNT 22 #define SLIDER_COUNT 3 #define BUTTON_COUNT 10 #define LABEL_COUNT 4 @@ -94,7 +94,7 @@ typedef int (*HANDLER)(WIDGET *, int); static int choice_widths[CHOICE_COUNT] = { 3, 2, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 3, 3, 2, 3, 3, - 3 }; + 3, 2 }; static HANDLER button_handlers[BUTTON_COUNT] = { quit_main_menu, quit_sub_menu, do_graphics, do_engine, @@ -102,7 +102,7 @@ static HANDLER button_handlers[BUTTON_COUNT] = { do_keyconfig }; static int menu_sizes[MENU_COUNT] = { - 7, 5, 6, 9, 2, 5, + 7, 5, 7, 9, 2, 5, #ifdef HAVE_OPENGL 5, #else @@ -137,6 +137,7 @@ static WIDGET *audio_widgets[] = { (WIDGET *)(&sliders[2]), (WIDGET *)(&choices[14]), (WIDGET *)(&choices[9]), + (WIDGET *)(&choices[21]), (WIDGET *)(&buttons[1]) }; static WIDGET *engine_widgets[] = { @@ -370,7 +371,7 @@ SetDefaults (void) choices[6].selected = opts.cscan; choices[7].selected = opts.scroll; choices[8].selected = opts.subtitles; - choices[9].selected = opts.music; + choices[9].selected = opts.music3do; choices[10].selected = opts.fullscreen; choices[11].selected = opts.intro; choices[12].selected = opts.fps; @@ -382,6 +383,7 @@ SetDefaults (void) choices[18].selected = opts.player1; choices[19].selected = opts.player2; choices[20].selected = 0; + choices[21].selected = opts.musicremix; sliders[0].value = opts.musicvol; sliders[1].value = opts.sfxvol; @@ -401,7 +403,7 @@ PropagateResults (void) opts.cscan = choices[6].selected; opts.scroll = choices[7].selected; opts.subtitles = choices[8].selected; - opts.music = choices[9].selected; + opts.music3do = choices[9].selected; opts.fullscreen = choices[10].selected; opts.intro = choices[11].selected; opts.fps = choices[12].selected; @@ -412,6 +414,7 @@ PropagateResults (void) opts.shield = choices[17].selected; opts.player1 = choices[18].selected; opts.player2 = choices[19].selected; + opts.musicremix = choices[21].selected; opts.musicvol = sliders[0].value; opts.sfxvol = sliders[1].value; @@ -1081,7 +1084,8 @@ GetGlobalOptions (GLOBALOPTS *opts) OPTVAL_PC : OPTVAL_3DO; opts->stereo = optStereoSFX ? OPTVAL_ENABLED : OPTVAL_DISABLED; /* These values are read in, but won't change during a run. */ - opts->music = (optWhichMusic == OPT_3DO) ? OPTVAL_3DO : OPTVAL_PC; + opts->music3do = opt3doMusic ? OPTVAL_ENABLED : OPTVAL_DISABLED; + opts->musicremix = optPrecursorsMusic ? OPTVAL_ENABLED : OPTVAL_DISABLED; switch (snddriver) { case audio_DRIVER_OPENAL: opts->adriver = OPTVAL_OPENAL; @@ -1311,7 +1315,8 @@ SetGlobalOptions (GLOBALOPTS *opts) res_PutBoolean ("config.iconicscan", opts->cscan == OPTVAL_3DO); res_PutBoolean ("config.smoothscroll", opts->scroll == OPTVAL_3DO); - res_PutBoolean ("config.3domusic", opts->music == OPTVAL_3DO); + res_PutBoolean ("config.3domusic", opts->music3do == OPTVAL_ENABLED); + res_PutBoolean ("config.remixmusic", opts->musicremix == OPTVAL_ENABLED); res_PutBoolean ("config.3domovies", opts->intro == OPTVAL_3DO); res_PutBoolean ("config.showfps", opts->fps == OPTVAL_ENABLED); res_PutBoolean ("config.smoothmelee", opts->meleezoom == OPTVAL_3DO); diff --git a/sc2/src/sc2code/setupmenu.h b/sc2/src/sc2code/setupmenu.h index 3667020dd..257b74508 100644 --- a/sc2/src/sc2code/setupmenu.h +++ b/sc2/src/sc2code/setupmenu.h @@ -74,8 +74,8 @@ typedef struct globalopts_struct { OPT_DRIVERTYPE driver; OPT_ADRIVERTYPE adriver; OPT_AQUALITYTYPE aquality; - OPT_ENABLABLE fullscreen, subtitles, scanlines, fps, stereo; - OPT_CONSOLETYPE music, menu, text, cscan, scroll, intro, meleezoom, shield; + OPT_ENABLABLE fullscreen, subtitles, scanlines, fps, stereo, music3do, musicremix; + OPT_CONSOLETYPE menu, text, cscan, scroll, intro, meleezoom, shield; CONTROL_TEMPLATE player1, player2; int speechvol, musicvol, sfxvol; } GLOBALOPTS; diff --git a/sc2/src/starcon2.c b/sc2/src/starcon2.c index d8e9edd8b..dd04e98b9 100644 --- a/sc2/src/starcon2.c +++ b/sc2/src/starcon2.c @@ -74,7 +74,8 @@ struct options_struct { int numAddons; int gammaSet; float gamma; - int whichMusic; + BOOLEAN use3doMusic; + BOOLEAN usePrecursorsMusic; int whichCoarseScan; int whichMenu; int whichFonts; @@ -123,7 +124,8 @@ main (int argc, char *argv[]) /* .numAddons = */ 0, /* .gammaSet = */ 0, /* .gamma = */ 0.0f, - /* .whichMusic = */ OPT_3DO, + /* .use3doMusic = */ TRUE, + /* .usePrecursorsMusic = */ FALSE, /* .whichCoarseScan = */ OPT_PC, /* .whichMenu = */ OPT_PC, /* .whichFont = */ OPT_PC, @@ -270,7 +272,11 @@ main (int argc, char *argv[]) } if (res_HasKey ("config.3domusic")) { - options.whichMusic = res_GetBoolean ("config.3domusic") ? OPT_3DO : OPT_PC; + options.use3doMusic = res_GetBoolean ("config.3domusic"); + } + if (res_HasKey ("config.remixmusic")) + { + options.usePrecursorsMusic = res_GetBoolean ("config.remixmusic"); } if (res_HasKey ("config.3domovies")) { @@ -405,7 +411,8 @@ main (int argc, char *argv[]) soundflags = options.soundFlags; // Fill in global variables: - optWhichMusic = options.whichMusic; + opt3doMusic = options.use3doMusic; + optPrecursorsMusic = options.usePrecursorsMusic; optWhichCoarseScan = options.whichCoarseScan; optWhichMenu = options.whichMenu; optWhichFonts = options.whichFonts; @@ -512,7 +519,6 @@ static struct option longOptions[] = {"speechvol", 1, NULL, 'T'}, {"audioquality", 1, NULL, 'q'}, {"nosubtitles", 0, NULL, 'u'}, - {"music", 1, NULL, 'm'}, {"gamma", 1, NULL, 'g'}, {"logfile", 1, NULL, 'l'}, {"intro", 1, NULL, 'i'}, @@ -728,14 +734,6 @@ parseOptions (int argc, char *argv[], struct options_struct *options) case 'u': options->subTitles = FALSE; break; - case 'm': - { - if (Check_PC_3DO_opt (optarg, OPT_PC | OPT_3DO, - optionIndex >= 0 ? longOptions[optionIndex].name : "m", - &options->whichMusic) == -1) - badArg = TRUE; - break; - } case 'g': { int result = parseFloatOption (optarg, &options->gamma, @@ -1019,8 +1017,6 @@ usage (FILE *out, const struct options_struct *defaultOptions) #endif log_add (log_User, "The following options can take either '3do' or 'pc' " "as an option:"); - log_add (log_User, " -m, --music : Music version (default %s)", - PC_3DO_optString (defaultOptions->whichMusic)); log_add (log_User, " -i, --intro : Intro/ending version (default %s)", PC_3DO_optString (defaultOptions->whichIntro)); log_add (log_User, " --cscan : coarse-scan display, pc=text, "