diff --git a/sc2/src/libs/input/sdl/input.c b/sc2/src/libs/input/sdl/input.c index 926a395b9..2df4f84ba 100644 --- a/sc2/src/libs/input/sdl/input.c +++ b/sc2/src/libs/input/sdl/input.c @@ -101,7 +101,7 @@ register_menu_controls (int index) { VCONTROL_GESTURE g; snprintf (buf, 39, "menu.%s.%d", menu_res_names[index], i); - if (!res_HasKey (buf)) + if (!res_IsString (buf)) break; VControl_ParseGesture (&g, res_GetString (buf)); VControl_AddGestureBinding (&g, (int *)&menu_vec[index]); @@ -126,7 +126,7 @@ register_flight_controls (void) { /* Copy in name */ snprintf (buf, 39, "keys.%d.name", i+1); - if (res_HasKey (buf)) + if (res_IsString (buf)) { strncpy (input_templates[i].name, res_GetString (buf), 29); input_templates[i].name[29] = '\0'; @@ -141,7 +141,7 @@ register_flight_controls (void) { VCONTROL_GESTURE *g = CONTROL_PTR(i, j, k); snprintf (buf, 39, "keys.%d.%s.%d", i+1, flight_res_names[j], k+1); - if (!res_HasKey (buf)) + if (!res_IsString (buf)) { g->type = VCONTROL_NONE; continue; diff --git a/sc2/src/libs/reslib.h b/sc2/src/libs/reslib.h index bf373159d..c184c1b66 100644 --- a/sc2/src/libs/reslib.h +++ b/sc2/src/libs/reslib.h @@ -102,6 +102,7 @@ extern DIRENTRY_REF LoadDirEntryTable (uio_DirHandle *dirHandle, BOOLEAN res_HasKey (const char *key); +BOOLEAN res_IsString (const char *key); const char *res_GetString (const char *key); void res_PutString (const char *key, const char *value); diff --git a/sc2/src/libs/resource/resinit.c b/sc2/src/libs/resource/resinit.c index a0007f859..fee9cd29e 100644 --- a/sc2/src/libs/resource/resinit.c +++ b/sc2/src/libs/resource/resinit.c @@ -318,13 +318,21 @@ InstallResTypeVectors (const char *resType, ResourceLoadFun *loadFun, } /* These replace the mapres.c calls and probably should be split out at some point. */ +BOOLEAN +res_IsString (const char *key) +{ + RESOURCE_INDEX idx = _get_current_index_header (); + ResourceDesc *desc = lookupResourceDesc (idx, key); + return desc && !strcmp(desc->vtable->resType, "STRING"); +} + const char * res_GetString (const char *key) { RESOURCE_INDEX idx = _get_current_index_header (); ResourceDesc *desc = lookupResourceDesc (idx, key); if (!desc || !desc->resdata.ptr || strcmp(desc->vtable->resType, "STRING")) - return NULL; + return ""; /* TODO: Work out exact STRING semantics, specifically, the lifetime of * the returned value. If caller is allowed to reference the returned * value forever, STRING has to be ref-counted. */ @@ -358,6 +366,14 @@ res_PutString (const char *key, const char *value) } } +BOOLEAN +res_IsInteger (const char *key) +{ + RESOURCE_INDEX idx = _get_current_index_header (); + ResourceDesc *desc = lookupResourceDesc (idx, key); + return desc && !strcmp(desc->vtable->resType, "INT32"); +} + int res_GetInteger (const char *key) { @@ -385,6 +401,14 @@ res_PutInteger (const char *key, int value) desc->resdata.num = value; } +BOOLEAN +res_IsBoolean (const char *key) +{ + RESOURCE_INDEX idx = _get_current_index_header (); + ResourceDesc *desc = lookupResourceDesc (idx, key); + return desc && !strcmp(desc->vtable->resType, "BOOLEAN"); +} + BOOLEAN res_GetBoolean (const char *key) { diff --git a/sc2/src/uqm.c b/sc2/src/uqm.c index 7c616892c..974325e0c 100644 --- a/sc2/src/uqm.c +++ b/sc2/src/uqm.c @@ -215,31 +215,31 @@ main (int argc, char *argv[]) // Fill in the options struct based on uqm.cfg LoadResourceIndex (configDir, "uqm.cfg", "config."); - if (res_HasKey ("config.reswidth")) + if (res_IsInteger ("config.reswidth")) { options.width = res_GetInteger ("config.reswidth"); } - if (res_HasKey ("config.resheight")) + if (res_IsInteger ("config.resheight")) { options.height = res_GetInteger ("config.resheight"); } - if (res_HasKey("config.keepaspectratio")) + if (res_IsBoolean("config.keepaspectratio")) { options.keepAspectRatio = res_GetBoolean ("config.keepaspectratio"); } - if (res_HasKey ("config.alwaysgl")) + if (res_IsBoolean ("config.alwaysgl")) { if (res_GetBoolean ("config.alwaysgl")) { options.gfxDriver = TFB_GFXDRIVER_SDL_OPENGL; } } - if (res_HasKey ("config.usegl")) + if (res_IsBoolean ("config.usegl")) { options.gfxDriver = res_GetBoolean ("config.usegl") ? TFB_GFXDRIVER_SDL_OPENGL : TFB_GFXDRIVER_SDL_PURE; } - if (res_HasKey ("config.scaler")) + if (res_IsString ("config.scaler")) { const char *arg = res_GetString ("config.scaler"); @@ -254,67 +254,67 @@ main (int argc, char *argv[]) else if (!strcmp (arg, "hq")) options.gfxFlags |= TFB_GFXFLAGS_SCALE_HQXX; } - if (res_HasKey ("config.scanlines") && + if (res_IsBoolean ("config.scanlines") && res_GetBoolean ("config.scanlines")) { options.gfxFlags |= TFB_GFXFLAGS_SCANLINES; } - if (res_HasKey ("config.fullscreen") && + if (res_IsBoolean ("config.fullscreen") && res_GetBoolean ("config.fullscreen")) { options.gfxFlags |= TFB_GFXFLAGS_FULLSCREEN; } - if (res_HasKey ("config.subtitles")) + if (res_IsBoolean ("config.subtitles")) { options.subTitles = res_GetBoolean ("config.subtitles"); } - if (res_HasKey ("config.textmenu")) + if (res_IsBoolean ("config.textmenu")) { options.whichMenu = res_GetBoolean ("config.textmenu") ? OPT_PC : OPT_3DO; } - if (res_HasKey ("config.textgradients")) + if (res_IsBoolean ("config.textgradients")) { options.whichFonts = res_GetBoolean ("config.textgradients") ? OPT_PC : OPT_3DO; } - if (res_HasKey ("config.iconicscan")) + if (res_IsBoolean ("config.iconicscan")) { options.whichCoarseScan = res_GetBoolean ("config.iconicscan") ? OPT_3DO : OPT_PC; } - if (res_HasKey ("config.smoothscroll")) + if (res_IsBoolean ("config.smoothscroll")) { options.smoothScroll = res_GetBoolean ("config.smoothscroll") ? OPT_3DO : OPT_PC; } - if (res_HasKey ("config.3domusic")) + if (res_IsBoolean ("config.3domusic")) { options.use3doMusic = res_GetBoolean ("config.3domusic"); } - if (res_HasKey ("config.remixmusic")) + if (res_IsBoolean ("config.remixmusic")) { options.usePrecursorsMusic = res_GetBoolean ("config.remixmusic"); } - if (res_HasKey ("config.3domovies")) + if (res_IsBoolean ("config.3domovies")) { options.whichIntro = res_GetBoolean ("config.3domovies") ? OPT_3DO : OPT_PC; } - if (res_HasKey ("config.showfps") && res_GetBoolean ("config.showfps")) + if (res_IsBoolean ("config.showfps") && res_GetBoolean ("config.showfps")) { options.gfxFlags |= TFB_GFXFLAGS_SHOWFPS; } - if (res_HasKey ("config.smoothmelee")) + if (res_IsBoolean ("config.smoothmelee")) { options.meleeScale = res_GetBoolean ("config.smoothmelee") ? TFB_SCALE_TRILINEAR : TFB_SCALE_STEP; } - if (res_HasKey ("config.positionalsfx")) + if (res_IsBoolean ("config.positionalsfx")) { options.stereoSFX = res_GetBoolean ("config.positionalsfx"); } - if (res_HasKey ("config.audiodriver")) + if (res_IsString ("config.audiodriver")) { const char *driverstr = res_GetString ("config.audiodriver"); if (!strcmp (driverstr, "openal")) @@ -335,7 +335,7 @@ main (int argc, char *argv[]) /* Can't figure it out, leave as initial default */ } } - if (res_HasKey ("config.audioquality")) + if (res_IsString ("config.audioquality")) { const char *qstr = res_GetString ("config.audioquality"); if (!strcmp (qstr, "low")) @@ -361,12 +361,12 @@ main (int argc, char *argv[]) /* Can't figure it out, leave as initial default */ } } - if (res_HasKey ("config.pulseshield")) + if (res_IsBoolean ("config.pulseshield")) { options.whichShield = res_GetBoolean ("config.pulseshield") ? OPT_3DO : OPT_PC; } - if (res_HasKey ("config.player1control")) + if (res_IsInteger ("config.player1control")) { PlayerControls[0] = res_GetInteger ("config.player1control"); /* This is an unsigned, so no < 0 check is necessary */ @@ -377,7 +377,7 @@ main (int argc, char *argv[]) PlayerControls[0] = CONTROL_TEMPLATE_KB_1; } } - if (res_HasKey ("config.player2control")) + if (res_IsInteger ("config.player2control")) { /* This is an unsigned, so no < 0 check is necessary */ PlayerControls[1] = res_GetInteger ("config.player2control"); @@ -388,17 +388,17 @@ main (int argc, char *argv[]) PlayerControls[1] = CONTROL_TEMPLATE_JOY_1; } } - if (res_HasKey ("config.musicvol")) + if (res_IsInteger ("config.musicvol")) { parseIntVolume (res_GetInteger ("config.musicvol"), &options.musicVolumeScale); } - if (res_HasKey ("config.sfxvol")) + if (res_IsInteger ("config.sfxvol")) { parseIntVolume (res_GetInteger ("config.sfxvol"), &options.sfxVolumeScale); } - if (res_HasKey ("config.speechvol")) + if (res_IsInteger ("config.speechvol")) { parseIntVolume (res_GetInteger ("config.speechvol"), &options.speechVolumeScale); diff --git a/sc2/src/uqm/setupmenu.c b/sc2/src/uqm/setupmenu.c index a2fa4071e..faaab5271 100644 --- a/sc2/src/uqm/setupmenu.c +++ b/sc2/src/uqm/setupmenu.c @@ -1183,7 +1183,7 @@ GetGlobalOptions (GLOBALOPTS *opts) break; } - if (res_HasKey ("config.alwaysgl")) + if (res_IsBoolean ("config.alwaysgl")) { if (res_GetBoolean ("config.alwaysgl")) {