diff --git a/polymer/eduke32/Apple/StartupWinController.game.m b/polymer/eduke32/Apple/StartupWinController.game.m index bed7be605..e9d203456 100644 --- a/polymer/eduke32/Apple/StartupWinController.game.m +++ b/polymer/eduke32/Apple/StartupWinController.game.m @@ -6,6 +6,8 @@ #include "duke3d.h" #include "game.h" #undef GetTime +#include "common.h" +#include "common_game.h" #include "build.h" #include "compat.h" #include "baselayer.h" @@ -416,7 +418,7 @@ int startwin_run(void) settings.channels = ud.config.NumChannels; settings.forcesetup = ud.config.ForceSetup; // settings.game = gametype; - strncpy(settings.selectedgrp, defaultduke3dgrp, BMAX_PATH); + strncpy(settings.selectedgrp, G_GrpFile(), BMAX_PATH); [startwin setupRunMode]; @@ -437,7 +439,8 @@ int startwin_run(void) ud.config.NumBits = settings.bitspersample; ud.config.NumChannels = settings.channels; ud.config.ForceSetup = settings.forcesetup; - strncpy(defaultduke3dgrp, settings.selectedgrp, BMAX_PATH); + clearGrpNamePtr(); + g_grpNamePtr = dup_filename(settings.selectedgrp); // gametype = settings.game; } diff --git a/polymer/eduke32/build/include/build.h b/polymer/eduke32/build/include/build.h index f468fa7e4..8f216cb0f 100644 --- a/polymer/eduke32/build/include/build.h +++ b/polymer/eduke32/build/include/build.h @@ -798,7 +798,8 @@ int32_t md_loadmodel(const char *fn); int32_t md_setmisc(int32_t modelid, float scale, int32_t shadeoff, float zadd, float yoffset, int32_t flags); // int32_t md_tilehasmodel(int32_t tilenume, int32_t pal); -extern char defsfilename[BMAX_PATH]; +extern char *G_DefaultDefFile(void); +extern char *G_DefFile(void); extern char *g_defNamePtr; extern char **g_defModules; diff --git a/polymer/eduke32/build/src/build.c b/polymer/eduke32/build/src/build.c index ba00dd60a..04970c1b2 100644 --- a/polymer/eduke32/build/src/build.c +++ b/polymer/eduke32/build/src/build.c @@ -619,7 +619,7 @@ int32_t app_main(int32_t argc, const char **argv) Bstrcpy(kensig,"Uses BUILD technology by Ken Silverman"); initcrc(); - if (!loaddefinitionsfile(g_defNamePtr)) + if (!loaddefinitionsfile(G_DefFile())) initprintf("Definitions file loaded.\n"); for (i=0; i < g_defModulesNum; ++i) diff --git a/polymer/eduke32/build/src/defs.c b/polymer/eduke32/build/src/defs.c index 2bbd29013..857ecfdc8 100644 --- a/polymer/eduke32/build/src/defs.c +++ b/polymer/eduke32/build/src/defs.c @@ -264,7 +264,7 @@ static int32_t defsparser(scriptfile *script) } case T_INCLUDEDEFAULT: { - defsparser_include(defsfilename, script, cmdtokptr); + defsparser_include(G_DefaultDefFile(), script, cmdtokptr); break; } case T_DEFINE: diff --git a/polymer/eduke32/source/astub.c b/polymer/eduke32/source/astub.c index 9947ec143..2115ca044 100644 --- a/polymer/eduke32/source/astub.c +++ b/polymer/eduke32/source/astub.c @@ -32,6 +32,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "names.h" #include "common.h" +#include "common_game.h" #include "mapster32.h" #include "keys.h" @@ -67,12 +68,6 @@ static char levelname[BMAX_PATH]; // static char *startwin_labeltext = "Starting Mapster32..."; static char setupfilename[BMAX_PATH] = "mapster32.cfg"; -char defsfilename[BMAX_PATH] = "duke3d.def"; -static char defaultduke3dgrp[BMAX_PATH] = "duke3d.grp"; -// g_defNamePtr can ONLY point to one of: defsfilename, malloc'd block (all -// length BMAX_PATH) -char *g_defNamePtr = defsfilename; - int32_t fixmaponsave_sprites = 1; static int32_t fixmaponsave_walls = 0; static int32_t lastsave = -180*60; @@ -82,32 +77,6 @@ static int32_t spnoclip=1; static char *default_tiles_cfg = "tiles.cfg"; static int32_t pathsearchmode_oninit; -// Sound in Mapster32 -static char defaultgamecon[2][BMAX_PATH] = { "eduke.con", "game.con" }; - -static void clearDefNamePtr(void) -{ - if (g_defNamePtr != defsfilename) - Bfree(g_defNamePtr); - // g_defNamePtr assumed to be assigned to right after -} - -char * defaultgameconfile(void) -{ - int32_t script; // scriptfile *script; - - script = kopen4load(defaultgamecon[0],0); // script = scriptfile_fromfile(defaultgamecon[0]); - - if (script >= 0) - return defaultgamecon[0]; - - return defaultgamecon[1]; -} - -static const char *gamecon = "\0"; -static int32_t g_skipDefaultCons = 0; -static int32_t g_skipDefaultDefs = 0; // primarily for NAM/WWII GI appeasement - char **g_scriptModules = NULL; int32_t g_scriptModulesNum = 0; char **g_defModules = NULL; @@ -8598,7 +8567,8 @@ static void G_CheckCommandLine(int32_t argc, const char **argv) { if (argc > i+1) { - Bstrncpyz(defaultduke3dgrp, argv[i+1], sizeof(defaultduke3dgrp)); + clearGrpNamePtr(); + g_grpNamePtr = dup_filename(argv[i+1]); COPYARG(i); COPYARG(i+1); i++; @@ -8606,15 +8576,6 @@ static void G_CheckCommandLine(int32_t argc, const char **argv) i++; continue; } - if (!Bstrcasecmp(c+1,"nam")) - { - Bstrcpy(defaultduke3dgrp, "nam.grp"); - Bstrcpy(defsfilename, "nam.def"); - Bstrcpy(defaultgamecon[0], "nam.con"); - COPYARG(i); - i++; - continue; - } if (!Bstrcasecmp(c+1,"namesfile")) { g_namesFileName = argv[i+1]; @@ -8665,11 +8626,23 @@ static void G_CheckCommandLine(int32_t argc, const char **argv) i++; continue; } + if (!Bstrcasecmp(c+1,"nam")) + { + g_gameType = GAMEFLAG_NAM; + COPYARG(i); + i++; + continue; + } + if (!Bstrcasecmp(c+1,"napalm")) + { + g_gameType = GAMEFLAG_NAM|GAMEFLAG_NAPALM; + COPYARG(i); + i++; + continue; + } if (!Bstrcasecmp(c+1,"ww2gi")) { - Bstrcpy(defaultduke3dgrp, "ww2gi.grp"); - Bstrcpy(defaultgamecon[0], "ww2gi.con"); - Bstrcpy(defsfilename, "ww2gi.def"); + g_gameType = GAMEFLAG_WW2GI; COPYARG(i); i++; continue; @@ -8732,7 +8705,6 @@ static void G_CheckCommandLine(int32_t argc, const char **argv) { clearDefNamePtr(); g_defNamePtr = dup_filename(c); - g_skipDefaultDefs = 1; COPYARG(i); initprintf("Using DEF file \"%s\".\n",g_defNamePtr); } @@ -8754,11 +8726,12 @@ static void G_CheckCommandLine(int32_t argc, const char **argv) case 'x': case 'X': c++; - if (!*c) break; - gamecon = c; - g_skipDefaultCons = 1; - COPYARG(i); - initprintf("Using CON file \"%s\".\n",gamecon); + if (*c) + { + clearScriptNamePtr(); + g_scriptNamePtr = dup_filename(c); + initprintf("Using CON file \"%s\".\n",g_scriptNamePtr); + } break; } } @@ -8778,16 +8751,15 @@ static void G_CheckCommandLine(int32_t argc, const char **argv) COPYARG(i); clearDefNamePtr(); g_defNamePtr = dup_filename(argv[i++]); - g_skipDefaultDefs = 1; initprintf("Using DEF file \"%s\".\n",g_defNamePtr); continue; } else if (!Bstrcasecmp(k,".con")) { COPYARG(i); - gamecon = argv[i++]; - g_skipDefaultCons = 1; - initprintf("Using CON file \"%s\".\n",gamecon); + clearScriptNamePtr(); + g_scriptNamePtr = dup_filename(argv[i++]); + initprintf("Using CON file \"%s\".\n",g_scriptNamePtr); continue; } } @@ -9680,7 +9652,7 @@ int32_t parsegroupfiles(scriptfile *script) break; case T_INCLUDEDEFAULT: { - parsegroupfiles_include(defsfilename, script, cmdtokptr); + parsegroupfiles_include(G_DefaultDefFile(), script, cmdtokptr); break; } break; @@ -10120,7 +10092,7 @@ static int32_t parseconsounds(scriptfile *script) } case T_INCLUDEDEFAULT: { - parseconsounds_include(defaultgameconfile(), script, cmdtokptr); + parseconsounds_include(G_DefaultConFile(), script, cmdtokptr); break; } case T_DEFINE: @@ -10367,41 +10339,45 @@ int32_t ExtInit(void) } { - const char *grpNamePtr = defaultduke3dgrp; - // JBF 20031220: Because it's annoying renaming GRP files whenever I want to test different game data - if (getenv("DUKE3DGRP")) + // (CODEDUP game.c) + if (g_grpNamePtr == NULL) { - grpNamePtr = getenv("DUKE3DGRP"); - initprintf("Using \"%s\" as main GRP file\n", grpNamePtr); + const char *cp = getenv("DUKE3DGRP"); + if (cp) + { + clearGrpNamePtr(); + g_grpNamePtr = dup_filename(cp); + initprintf("Using \"%s\" as main GRP file\n", g_grpNamePtr); + } } - i = initgroupfile(grpNamePtr); + const char *grpfile = G_GrpFile(); + + i = initgroupfile(grpfile); if (!NoAutoLoad) { G_LoadGroupsInDir("autoload"); if (i != -1) - G_DoAutoload(grpNamePtr); + G_DoAutoload(grpfile); } } // (CODEDUP game.c) + if (g_defNamePtr == NULL) { const char *tmpptr = getenv("DUKE3DDEF"); if (tmpptr) { + clearDefNamePtr(); g_defNamePtr = dup_filename(tmpptr); - g_skipDefaultDefs = 1; initprintf("Using \"%s\" as definitions file\n", g_defNamePtr); } } - if (g_skipDefaultDefs == 0) - if (g_defNamePtr != defsfilename) - Bstrcpy(g_defNamePtr, defsfilename); // it MAY have changed, with NAM/WWII GI - loadgroupfiles(g_defNamePtr); // the defs are actually loaded in app_main in build.c + loadgroupfiles(G_DefFile()); // the defs are actually loaded in app_main in build.c { struct strllist *s; @@ -11156,10 +11132,7 @@ void ExtCheckKeys(void) { g_numsounds = 0; - if (g_skipDefaultCons == 0) - loadconsounds(defaultgameconfile()); - else - loadconsounds(gamecon); + loadconsounds(G_ConFile()); if (g_numsounds > 0) { diff --git a/polymer/eduke32/source/common.c b/polymer/eduke32/source/common.c index eecd4f7f6..94e952c21 100644 --- a/polymer/eduke32/source/common.c +++ b/polymer/eduke32/source/common.c @@ -3,13 +3,143 @@ // #include "compat.h" +#include "build.h" #include "scriptfile.h" #include "cache1d.h" #include "kplib.h" #include "baselayer.h" #include "common.h" +#include "common_game.h" +int32_t g_gameType = 0; + +// grp/con/def handling + +char *defaultgamegrp[GAMECOUNT] = { "DUKE3D.GRP", "NAM.GRP", "NAPALM.GRP", "WW2GI.GRP" }; +char *defaultdeffilename[GAMECOUNT] = { "duke3d.def", "nam.def", "napalm.def", "ww2gi.def" }; +char *defaultconfilename = "GAME.CON"; +char *defaultgameconfilename[GAMECOUNT] = { "EDUKE.CON", "NAM.CON", "NAPALM.CON", "WW2GI.CON" }; + +// g_grpNamePtr can ONLY point to a malloc'd block (length BMAX_PATH) +char *g_grpNamePtr = NULL; +// g_defNamePtr can ONLY point to a malloc'd block (length BMAX_PATH) +char *g_defNamePtr = NULL; +// g_scriptNamePtr can ONLY point to a malloc'd block (length BMAX_PATH) +char *g_scriptNamePtr = NULL; + + +void clearGrpNamePtr(void) +{ + if (g_grpNamePtr != NULL) + Bfree(g_grpNamePtr); + // g_grpNamePtr assumed to be assigned to right after +} + +void clearDefNamePtr(void) +{ + if (g_defNamePtr != NULL) + Bfree(g_defNamePtr); + // g_defNamePtr assumed to be assigned to right after +} + +void clearScriptNamePtr(void) +{ + if (g_scriptNamePtr != NULL) + Bfree(g_scriptNamePtr); + // g_scriptNamePtr assumed to be assigned to right after +} + +char *G_DefaultGrpFile(void) +{ + if (DUKE) + return defaultgamegrp[GAME_DUKE]; + // order is important for the following three because GAMEFLAG_NAM overlaps all + else if (NAPALM) + return defaultgamegrp[GAME_NAPALM]; + else if (WW2GI) + return defaultgamegrp[GAME_WW2GI]; + else if (NAM) + return defaultgamegrp[GAME_NAM]; + + return defaultgamegrp[0]; +} +char *G_DefaultDefFile(void) +{ + if (DUKE) + return defaultdeffilename[GAME_DUKE]; + else if (WW2GI) + return defaultdeffilename[GAME_WW2GI]; + else if (NAPALM) + { + if ((kopen4load(defaultdeffilename[GAME_NAPALM],0) < 0) && (kopen4load(defaultdeffilename[GAME_NAM],0) >= 0)) + return defaultdeffilename[GAME_NAM]; // NAM/Napalm Sharing + else + return defaultdeffilename[GAME_NAPALM]; + } + else if (NAM) + { + if ((kopen4load(defaultdeffilename[GAME_NAM],0) < 0) && (kopen4load(defaultdeffilename[GAME_NAPALM],0) >= 0)) + return defaultdeffilename[GAME_NAPALM]; // NAM/Napalm Sharing + else + return defaultdeffilename[GAME_NAM]; + } + + return defaultdeffilename[0]; +} +char *G_DefaultConFile(void) +{ + if (DUKE && (kopen4load(defaultgameconfilename[GAME_DUKE],0) >= 0)) + return defaultgameconfilename[GAME_DUKE]; + else if (WW2GI && (kopen4load(defaultgameconfilename[GAME_WW2GI],0) >= 0)) + return defaultgameconfilename[GAME_WW2GI]; + else if (NAPALM) + { + if (kopen4load(defaultgameconfilename[GAME_NAPALM],0) < 0) + { + if (kopen4load(defaultgameconfilename[GAME_NAM],0) >= 0) + return defaultgameconfilename[GAME_NAM]; // NAM/Napalm Sharing + } + else + return defaultgameconfilename[GAME_NAPALM]; + } + else if (NAM) + { + if (kopen4load(defaultgameconfilename[GAME_NAM],0) < 0) + { + if (kopen4load(defaultgameconfilename[GAME_NAPALM],0) >= 0) + return defaultgameconfilename[GAME_NAPALM]; // NAM/Napalm Sharing + } + else + return defaultgameconfilename[GAME_NAM]; + } + + return defaultconfilename; +} + +char *G_GrpFile(void) +{ + if (g_grpNamePtr == NULL) + return G_DefaultGrpFile(); + else + return g_grpNamePtr; +} +char *G_DefFile(void) +{ + if (g_defNamePtr == NULL) + return G_DefaultDefFile(); + else + return g_defNamePtr; +} +char *G_ConFile(void) +{ + if (g_scriptNamePtr == NULL) + return G_DefaultConFile(); + else + return g_scriptNamePtr; +} + +////////// struct strllist *CommandPaths, *CommandGrps; diff --git a/polymer/eduke32/source/common_game.h b/polymer/eduke32/source/common_game.h new file mode 100644 index 000000000..deaac226f --- /dev/null +++ b/polymer/eduke32/source/common_game.h @@ -0,0 +1,48 @@ +// +// Definitions of common game-only data structures/functions +// (and declarations of data appearing in both) +// for EDuke32 and Mapster32 +// + +#ifndef EDUKE32_COMMON_GAME_H_ +#define EDUKE32_COMMON_GAME_H_ + +#define GAMEFLAG_DUKE 0x00000001 +#define GAMEFLAG_NAM 0x00000002 +#define GAMEFLAG_NAPALM 0x00000004 +#define GAMEFLAG_WW2GI 0x00000008 + +extern int32_t g_gameType; + +#define DUKE (g_gameType & GAMEFLAG_DUKE) +#define NAM (g_gameType & GAMEFLAG_NAM) +#define NAPALM (g_gameType & GAMEFLAG_NAPALM) +#define WW2GI (g_gameType & GAMEFLAG_WW2GI) + +enum Games_t { + GAME_DUKE = 0, + GAME_NAM, + GAME_NAPALM, + GAME_WW2GI, + GAMECOUNT +}; + +extern char *defaultgamegrp[GAMECOUNT]; +extern char *defaultdeffilename[GAMECOUNT]; +extern char *defaultconfilename; +extern char *defaultgameconfilename[GAMECOUNT]; + +extern char *g_grpNamePtr; +extern char *g_scriptNamePtr; + +extern char *G_DefaultGrpFile(void); +extern char *G_GrpFile(void); + +extern char *G_DefaultConFile(void); +extern char *G_ConFile(void); + +extern void clearGrpNamePtr(void); +extern void clearDefNamePtr(void); +extern void clearScriptNamePtr(void); + +#endif diff --git a/polymer/eduke32/source/config.c b/polymer/eduke32/source/config.c index 9ea9153d3..e96662175 100644 --- a/polymer/eduke32/source/config.c +++ b/polymer/eduke32/source/config.c @@ -31,6 +31,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "baselayer.h" #include "duke3d.h" #include "game.h" +#include "common_game.h" #include "scriplib.h" #include "osd.h" #include "osdcmds.h" @@ -267,7 +268,7 @@ void CONFIG_SetDefaults(void) ud.config.CheckForUpdates = 1; if (g_rtsNamePtr == NULL) - Bstrcpy(ud.rtsname, defaultrtsfilename); + Bstrcpy(ud.rtsname, G_DefaultRtsFile()); Bstrcpy(szPlayerName, "Duke"); Bstrcpy(ud.ridecule[0], "An inspiration for birth control."); @@ -686,7 +687,7 @@ int32_t CONFIG_ReadSetup(void) } // #endif - if (!Bstrcmp(defaultduke3dgrp,"duke3d.grp")) + if (g_grpNamePtr != NULL && !Bstrcmp(g_grpNamePtr,defaultgamegrp[0])) SCRIPT_GetString(ud.config.scripthandle, "Setup","SelectedGRP",&g_grpNamePtr[0]); if (!NAM) diff --git a/polymer/eduke32/source/duke3d.h b/polymer/eduke32/source/duke3d.h index 08077bfde..2b54581d1 100644 --- a/polymer/eduke32/source/duke3d.h +++ b/polymer/eduke32/source/duke3d.h @@ -52,17 +52,10 @@ extern "C" { #define VERSION "2.0.0devel" #define HEAD2 APPNAME" "VERSION -#define GAME_DUKE 0 -#define GAME_NAM 1 -#define GAME_WW2 2 - #define VOLUMEALL (g_Shareware == 0) #define PLUTOPAK (g_scriptVersion == 14) #define VOLUMEONE (g_Shareware == 1) -#define NAM (g_gameType & GAME_NAM) -#define WW2GI (g_gameType & GAME_WW2) - // increase by 3, because atomic GRP adds 1, and Shareware adds 2 #define BYTEVERSION_JF 243 @@ -106,6 +99,7 @@ extern "C" { // so that debugging with valgrind --smc-check=none is possible: //#define DEBUG_VALGRIND_NO_SMC +#include "common_game.h" #include "namesdyn.h" #include "function.h" #include "macros.h" diff --git a/polymer/eduke32/source/game.c b/polymer/eduke32/source/game.c index a17beadab..6fc92607c 100644 --- a/polymer/eduke32/source/game.c +++ b/polymer/eduke32/source/game.c @@ -52,6 +52,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "anim.h" #include "demo.h" #include "common.h" +#include "common_game.h" #ifdef LUNATIC # include "lunatic.h" @@ -106,9 +107,6 @@ uint8_t *basepaltable[BASEPALCOUNT] = { palette, water_pal, slime_pal, dre_alms, int8_t g_noFloorPal[MAXPALOOKUPS]; // 1 if sprite pal should not be taken over from floor pal -static int32_t g_skipDefaultCons = 0; -static int32_t g_skipDefaultDefs = 0; // primarily for NAM/WWII GI appeasement - int32_t voting = -1; int32_t vote_map = -1, vote_episode = -1; @@ -116,47 +114,14 @@ static int32_t g_Debug = 0; static int32_t g_noLogoAnim = 0; static int32_t g_noLogo = 0; -char defaultduke3dgrp[BMAX_PATH] = "duke3d.grp"; -char defsfilename[BMAX_PATH] = "duke3d.def"; -static char defaultconfilename[2][BMAX_PATH] = { "EDUKE.CON", "GAME.CON" }; -const char *defaultrtsfilename = "DUKE.RTS"; +const char *defaultrtsfilename[GAMECOUNT] = { "DUKE.RTS", "NAM.RTS", "NAPALM.RTS", "WW2GI.RTS" }; -// g_grpNamePtr can ONLY point to one of: defaultduke3dgrp, malloc'd block (all -// length BMAX_PATH) -char *g_grpNamePtr = defaultduke3dgrp; -// g_defNamePtr can ONLY point to one of: defsfilename, malloc'd block (all -// length BMAX_PATH) -char *g_defNamePtr = defsfilename; -// g_scriptNamePtr can ONLY point to defaultconfilename[0] OR to malloc'd block -// (all length BMAX_PATH) -static char *g_scriptNamePtr = defaultconfilename[0]; // g_gameNamePtr can point to one of: grpfiles[].name (string literal), string // literal, malloc'd block (XXX: possible leak) const char *g_gameNamePtr = NULL; // g_rtsNamePtr can point to an argv[] element const char *g_rtsNamePtr = NULL; -void clearGrpNamePtr(void) -{ - if (g_grpNamePtr != defaultduke3dgrp) - Bfree(g_grpNamePtr); - // g_grpNamePtr assumed to be assigned to right after -} - -void clearDefNamePtr(void) -{ - if (g_defNamePtr != defsfilename) - Bfree(g_defNamePtr); - // g_defNamePtr assumed to be assigned to right after -} - -static void clearScriptNamePtr(void) -{ - if (g_scriptNamePtr != defaultconfilename[0]) - Bfree(g_scriptNamePtr); - // g_scriptNamePtr assumed to be assigned to right after -} - char **g_scriptModules = NULL; int32_t g_scriptModulesNum = 0; char **g_defModules = NULL; @@ -174,7 +139,6 @@ El_State g_ElState; extern int32_t lastvisinc; int32_t g_Shareware = 0; -int32_t g_gameType = 0; #define MAXUSERQUOTES 6 int32_t quotebot, quotebotgoal; @@ -239,16 +203,28 @@ int32_t kopen4loadfrommod(const char *filename, char searchfirst) return r; } -char *defaultconfile(void) +const char *G_DefaultRtsFile(void) { - int32_t i; + if (DUKE) + return defaultrtsfilename[GAME_DUKE]; + else if (WW2GI) + return defaultrtsfilename[GAME_WW2GI]; + else if (NAPALM) + { + if ((kopen4load(defaultrtsfilename[GAME_NAPALM],0) < 0) && (kopen4load(defaultrtsfilename[GAME_NAM],0) >= 0)) + return defaultrtsfilename[GAME_NAM]; // NAM/Napalm Sharing + else + return defaultrtsfilename[GAME_NAPALM]; + } + else if (NAM) + { + if ((kopen4load(defaultrtsfilename[GAME_NAM],0) < 0) && (kopen4load(defaultrtsfilename[GAME_NAPALM],0) >= 0)) + return defaultrtsfilename[GAME_NAPALM]; // NAM/Napalm Sharing + else + return defaultrtsfilename[GAME_NAM]; + } - i = kopen4load(defaultconfilename[0],0); - - if (i >= 0) - return defaultconfilename[0]; - - return defaultconfilename[1]; + return defaultrtsfilename[0]; } enum gametokens @@ -8158,7 +8134,8 @@ static void G_ShowParameterHelp(void) "-mh [file.def]\tInclude an additional definitions module\n" "-mx [file.con]\tInclude an additional CON script module\n" "-m\t\tDisable monsters\n" - "-nam\t\tRun in NAM/NAPALM compatibility mode\n" + "-nam\t\tRun in NAM compatibility mode\n" + "-napalm\t\tRun in Napalm compatibility mode\n" "-rts [file.rts]\tLoad a custom Remote Ridicule sound bank\n" "-r\t\tRecord demo\n" "-s#\t\tSet skill level (1-4)\n" @@ -8172,7 +8149,7 @@ static void G_ShowParameterHelp(void) #endif "-u#########\tUser's favorite weapon order (default: 3425689071)\n" "-v#\t\tWarp to volume #, see -l\n" - "-ww2gi\t\tRun in WW2GI compatibility mode\n" + "-ww2gi\t\tRun in WWII GI compatibility mode\n" "-x[game.con]\tLoad custom CON script\n" "-#\t\tLoad and run a game from slot # (0-9)\n" // "\n-?/--help\tDisplay this help message and exit\n" @@ -8390,7 +8367,7 @@ static int32_t parsedefinitions_game(scriptfile *script, int32_t preload) } case T_INCLUDEDEFAULT: { - parsedefinitions_game_include(defsfilename, script, cmdtokptr, preload); + parsedefinitions_game_include(G_DefaultDefFile(), script, cmdtokptr, preload); break; } case T_NOAUTOLOAD: @@ -8747,7 +8724,8 @@ static void G_CheckCommandLine(int32_t argc, const char **argv) { if (argc > i+1) { - Bstrcpy(defaultduke3dgrp,argv[i+1]); + clearGrpNamePtr(); + g_grpNamePtr = dup_filename(argv[i+1]); i++; } i++; @@ -8755,21 +8733,19 @@ static void G_CheckCommandLine(int32_t argc, const char **argv) } if (!Bstrcasecmp(c+1,"nam")) { - Bstrcpy(defaultduke3dgrp, "nam.grp"); - Bstrcpy(defsfilename, "nam.def"); - // Bstrcpy(g_defNamePtr, "nam.def"); - Bstrcpy(defaultconfilename[0], "nam.con"); - g_gameType = GAME_NAM; + g_gameType = GAMEFLAG_NAM; + i++; + continue; + } + if (!Bstrcasecmp(c+1,"napalm")) + { + g_gameType = GAMEFLAG_NAM|GAMEFLAG_NAPALM; i++; continue; } if (!Bstrcasecmp(c+1,"ww2gi")) { - Bstrcpy(defaultduke3dgrp, "ww2gi.grp"); - Bstrcpy(defsfilename, "ww2gi.def"); - // Bstrcpy(g_defNamePtr, "ww2gi.def"); - Bstrcpy(defaultconfilename[0], "ww2gi.con"); - g_gameType = GAME_WW2; + g_gameType = GAMEFLAG_WW2GI; i++; continue; } @@ -9039,7 +9015,6 @@ static void G_CheckCommandLine(int32_t argc, const char **argv) { clearDefNamePtr(); g_defNamePtr = dup_filename(c); - g_skipDefaultDefs = 1; initprintf("Using DEF file \"%s\".\n",g_defNamePtr); } break; @@ -9164,7 +9139,6 @@ static void G_CheckCommandLine(int32_t argc, const char **argv) { clearScriptNamePtr(); g_scriptNamePtr = dup_filename(c); - g_skipDefaultCons = 1; initprintf("Using CON file \"%s\".\n",g_scriptNamePtr); } break; @@ -9212,7 +9186,6 @@ static void G_CheckCommandLine(int32_t argc, const char **argv) { clearScriptNamePtr(); g_scriptNamePtr = dup_filename(argv[i++]); - g_skipDefaultCons = 1; initprintf("Using CON file \"%s\".\n",g_scriptNamePtr); continue; } @@ -9220,7 +9193,6 @@ static void G_CheckCommandLine(int32_t argc, const char **argv) { clearDefNamePtr(); g_defNamePtr = dup_filename(argv[i++]); - g_skipDefaultDefs = 1; initprintf("Using DEF file \"%s\".\n",g_defNamePtr); continue; } @@ -9515,27 +9487,16 @@ static void G_CompileScripts(void) labelcode = (int32_t *)§or[0]; // V8: 4096*40/4 = 40960 V7: 1024*40/4 = 10240 labeltype = (int32_t *)&wall[0]; // V8: 16384*32/4 = 131072 V7: 8192*32/4 = 65536 - Bcorrectfilename(g_scriptNamePtr,0); + if (g_scriptNamePtr != NULL) + Bcorrectfilename(g_scriptNamePtr,0); + // if we compile for a V7 engine wall[] should be used for label names since it's bigger pathsearchmode = 1; - if (g_skipDefaultCons == 0) - { - const char *cp = defaultconfile(); - if (cp != g_scriptNamePtr) - Bsprintf(g_scriptNamePtr, "%s", cp); - } - C_Compile(g_scriptNamePtr); + + C_Compile(G_ConFile()); if (g_loadFromGroupOnly) // g_loadFromGroupOnly is true only when compiling fails and internal defaults are utilized - { - if (g_skipDefaultCons == 0) - { - const char *cp = defaultconfile(); - if (cp != g_scriptNamePtr) - Bsprintf(g_scriptNamePtr, "%s", cp); - } - C_Compile(g_scriptNamePtr); - } + C_Compile(G_ConFile()); if ((uint32_t)g_numLabels > MAXSPRITES*sizeof(spritetype)/64) // see the arithmetic above for why G_GameExit("Error: too many labels defined!"); @@ -10073,6 +10034,8 @@ int32_t app_main(int32_t argc, const char **argv) i = CONFIG_ReadSetup(); + // CODEDUP astub.c + if (g_grpNamePtr == NULL) { const char *cp = getenv("DUKE3DGRP"); if (cp) @@ -10145,7 +10108,7 @@ int32_t app_main(int32_t argc, const char **argv) ScanGroups(); { - // try and identify the 'defaultduke3dgrp' in the set of GRPs. + // try and identify the 'defaultgamegrp' in the set of GRPs. // if it is found, set up the environment accordingly for the game it represents. // if it is not found, choose the first GRP from the list struct grpfile *fg, *first = NULL; @@ -10156,7 +10119,7 @@ int32_t app_main(int32_t argc, const char **argv) if (i == NUMGRPFILES) continue; // unrecognised grp file fg->game = grpfiles[i].game; if (!first) first = fg; - if (!Bstrcasecmp(fg->name, defaultduke3dgrp)) + if (!Bstrcasecmp(fg->name, G_DefaultGrpFile())) { g_gameType = grpfiles[i].game; g_gameNamePtr = grpfiles[i].name; @@ -10165,7 +10128,11 @@ int32_t app_main(int32_t argc, const char **argv) } if (!fg && first) { - Bstrcpy(defaultduke3dgrp, first->name); + if (g_grpNamePtr == NULL) + { + clearGrpNamePtr(); + g_grpNamePtr = dup_filename(first->name); + } g_gameType = first->game; g_gameNamePtr = grpfiles[0].name; } @@ -10187,15 +10154,8 @@ int32_t app_main(int32_t argc, const char **argv) if (WW2GI || NAM) { - // overwrite the default GRP and CON so that if the user chooses - // something different, they get what they asked for - Bstrcpy(defaultduke3dgrp, WW2GI ? "ww2gi.grp" : "nam.grp"); - Bstrcpy(defsfilename, WW2GI ? "ww2gi.def" : "nam.def"); - // Bstrcpy(g_defNamePtr, WW2GI ? "ww2gi.def" : "nam.def"); - Bstrcpy(defaultconfilename[0], WW2GI ? "ww2gi.con" : "nam.con"); - - Bstrcpy(GametypeNames[0],"GRUNTMATCH (SPAWN)"); - Bstrcpy(GametypeNames[2],"GRUNTMATCH (NO SPAWN)"); + Bstrcpy(GametypeNames[0],"GruntMatch (Spawn)"); + Bstrcpy(GametypeNames[2],"GruntMatch (No Spawn)"); } if (g_modDir[0] != '/') @@ -10302,40 +10262,40 @@ CLEAN_DIRECTORY: } #endif - if ((i = initgroupfile(g_grpNamePtr)) == -1) - initprintf("Warning: could not find main data file \"%s\"!\n",g_grpNamePtr); - else - initprintf("Using \"%s\" as main game data file.\n", g_grpNamePtr); - - if (!g_noAutoLoad && !ud.config.NoAutoLoad) { - G_LoadGroupsInDir("autoload"); + const char *grpfile = G_GrpFile(); - if (i != -1) - G_DoAutoload(g_grpNamePtr); + if ((i = initgroupfile(grpfile)) == -1) + initprintf("Warning: could not find main data file \"%s\"!\n",grpfile); + else + initprintf("Using \"%s\" as main game data file.\n", grpfile); + + if (!g_noAutoLoad && !ud.config.NoAutoLoad) + { + G_LoadGroupsInDir("autoload"); + + if (i != -1) + G_DoAutoload(grpfile); + } } if (g_modDir[0] != '/') G_LoadGroupsInDir(g_modDir); // CODEDUP astub.c + if (g_defNamePtr == NULL) { const char *tmpptr = getenv("DUKE3DDEF"); if (tmpptr) { clearDefNamePtr(); g_defNamePtr = dup_filename(tmpptr); - g_skipDefaultDefs = 1; initprintf("Using \"%s\" as definitions file\n", g_defNamePtr); } } - if (g_skipDefaultDefs == 0) - if (g_defNamePtr != defsfilename) - Bstrcpy(g_defNamePtr, defsfilename); // it MAY have changed, with NAM/WWII GI - flushlogwindow = 0; - loaddefinitions_game(g_defNamePtr, TRUE); + loaddefinitions_game(G_DefFile(), TRUE); // flushlogwindow = 1; { @@ -10417,10 +10377,13 @@ CLEAN_DIRECTORY: if (quitevent) return 4; - if (!loaddefinitionsfile(g_defNamePtr)) { - initprintf("Definitions file \"%s\" loaded.\n",g_defNamePtr); - loaddefinitions_game(g_defNamePtr, FALSE); + char *defsfile = G_DefFile(); + if (!loaddefinitionsfile(defsfile)) + { + initprintf("Definitions file \"%s\" loaded.\n",defsfile); + loaddefinitions_game(defsfile, FALSE); + } } for (i=0; i < g_defModulesNum; ++i) @@ -10449,18 +10412,15 @@ CLEAN_DIRECTORY: playerswhenstarted = ud.multimode; ud.last_level = 0; + // the point of this block is to avoid overwriting the default in the cfg while asserting our selection if (g_rtsNamePtr == NULL && - (!Bstrcasecmp(ud.rtsname,defaultrtsfilename) || - !Bstrcasecmp(ud.rtsname,"WW2GI.RTS") || - !Bstrcasecmp(ud.rtsname,"NAM.RTS"))) + (!Bstrcasecmp(ud.rtsname,defaultrtsfilename[GAME_DUKE]) || + !Bstrcasecmp(ud.rtsname,defaultrtsfilename[GAME_WW2GI]) || + !Bstrcasecmp(ud.rtsname,defaultrtsfilename[GAME_NAM]) || + !Bstrcasecmp(ud.rtsname,defaultrtsfilename[GAME_NAPALM]))) { // ud.last_level is used as a flag here to reset the string to default after load - if (WW2GI) - ud.last_level = (Bstrcpy(ud.rtsname, "WW2GI.RTS") == ud.rtsname); - else if (NAM) - ud.last_level = (Bstrcpy(ud.rtsname, "NAM.RTS") == ud.rtsname); - else - ud.last_level = (Bstrcpy(ud.rtsname, defaultrtsfilename) == ud.rtsname); + ud.last_level = (Bstrcpy(ud.rtsname, G_DefaultRtsFile()) == ud.rtsname); } RTS_Init(ud.rtsname); @@ -10469,7 +10429,7 @@ CLEAN_DIRECTORY: initprintf("Using RTS file \"%s\".\n",ud.rtsname); if (ud.last_level) - Bstrcpy(ud.rtsname, defaultrtsfilename); + Bstrcpy(ud.rtsname, defaultrtsfilename[0]); ud.last_level = -1; diff --git a/polymer/eduke32/source/game.h b/polymer/eduke32/source/game.h index 370055346..24b2c7de0 100644 --- a/polymer/eduke32/source/game.h +++ b/polymer/eduke32/source/game.h @@ -178,17 +178,19 @@ extern cactype cac[]; // this is checked against http://eduke32.com/VERSION extern const char *s_buildDate; -extern char *g_grpNamePtr; -extern char *g_defNamePtr; extern const char *g_gameNamePtr; extern const char *g_rtsNamePtr; + extern char **g_scriptModules; extern int32_t g_scriptModulesNum; + extern char CheatStrings[][MAXCHEATLEN]; extern char boardfilename[BMAX_PATH], currentboardfilename[BMAX_PATH]; extern char boardfilename[BMAX_PATH]; -extern char defaultduke3dgrp[BMAX_PATH]; -extern const char *defaultrtsfilename; + +extern const char *defaultrtsfilename[GAMECOUNT]; +extern const char *G_DefaultRtsFile(void); + extern char g_modDir[BMAX_PATH]; extern char g_modDir[BMAX_PATH]; extern char inputloc; @@ -209,7 +211,6 @@ extern int32_t g_cameraDistance; extern int32_t g_crosshairSum; extern int32_t g_doQuickSave; extern int32_t g_forceWeaponChoice; -extern int32_t g_gameType; extern int32_t g_levelTextTime; extern int32_t g_noSetup; extern int32_t g_quitDeadline; @@ -242,9 +243,6 @@ extern user_defs ud; //extern int32_t g_yax_smoothratio; -void clearDefNamePtr(void); -void clearGrpNamePtr(void); - int32_t A_CheckInventorySprite(spritetype *s); int32_t A_InsertSprite(int32_t whatsect,int32_t s_x,int32_t s_y,int32_t s_z,int32_t s_pn,int32_t s_s,int32_t s_xr,int32_t s_yr,int32_t s_a,int32_t s_ve,int32_t s_zv,int32_t s_ow,int32_t s_ss); int32_t A_Spawn(int32_t j,int32_t pn); @@ -255,7 +253,6 @@ int32_t G_PrintGameText(int32_t f,int32_t tile,int32_t x,int32_t y,const char *t int32_t GetTime(void); int32_t _EnterText(int32_t small,int32_t x,int32_t y,char *t,int32_t dalen,int32_t c); int32_t kopen4loadfrommod(const char *filename,char searchfirst); -char * defaultconfile(void); int32_t minitext_(int32_t x,int32_t y,const char *t,int32_t s,int32_t p,int32_t sb); int32_t mpgametext(int32_t y,const char *t,int32_t s,int32_t dabits); int32_t startwin_run(void); diff --git a/polymer/eduke32/source/gamedef.c b/polymer/eduke32/source/gamedef.c index e84712969..127df5b11 100644 --- a/polymer/eduke32/source/gamedef.c +++ b/polymer/eduke32/source/gamedef.c @@ -26,6 +26,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "gameexec.h" #include "savegame.h" #include "common.h" +#include "common_game.h" #include "osd.h" @@ -2529,7 +2530,7 @@ static int32_t C_ParseCommand(int32_t loop) case CON_INCLUDEDEFAULT: C_SkipComments(); - C_Include(defaultconfile()); + C_Include(G_DefaultConFile()); continue; case CON_AI: @@ -5776,7 +5777,7 @@ void C_Compile(const char *filenam) "version of Duke Nukem 3D: Atomic Edition immediately for only $5.99 through our partnership with GOG.com.\n\n" "Not a typo; it's less than 6 bucks. Get Duke now?\n\n" "(Clicking yes will bring you to our web store)", - g_grpNamePtr,g_grpNamePtr); + G_GrpFile(),G_GrpFile()); if (wm_ynbox("Important - Duke Nukem 3D not found - EDuke32","%s",tempbuf)) { @@ -5799,7 +5800,7 @@ void C_Compile(const char *filenam) Bsprintf(tempbuf,"Duke Nukem 3D game data was not found. A valid copy of \"%s\" or other compatible data is needed to run EDuke32.\n" "You can find \"%s\" in the 'DN3DINST' or 'ATOMINST' directory on your Duke Nukem 3D installation CD-ROM.\n\n" "EDuke32 will now close.", - g_grpNamePtr,g_grpNamePtr); + G_GrpFile(),G_GrpFile()); G_GameExit(tempbuf); #endif } diff --git a/polymer/eduke32/source/gamevars.c b/polymer/eduke32/source/gamevars.c index 2c0a24585..b0965fc81 100644 --- a/polymer/eduke32/source/gamevars.c +++ b/polymer/eduke32/source/gamevars.c @@ -21,6 +21,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. //------------------------------------------------------------------------- #include "duke3d.h" +#include "common_game.h" #include "gamevars.h" #include "gamedef.h" #include "osd.h" diff --git a/polymer/eduke32/source/grpscan.c b/polymer/eduke32/source/grpscan.c index 1410be3e7..38f157fa8 100644 --- a/polymer/eduke32/source/grpscan.c +++ b/polymer/eduke32/source/grpscan.c @@ -28,18 +28,19 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "crc32.h" #include "duke3d.h" +#include "common_game.h" #include "grpscan.h" struct grpfile grpfiles[NUMGRPFILES] = { - { "Duke Nukem 3D", 0xBBC9CE44, 26524524, GAME_DUKE, NULL }, - { "Duke Nukem 3D: Atomic Edition", 0xF514A6AC, 44348015, GAME_DUKE, NULL }, - { "Duke Nukem 3D: Atomic Edition", 0xFD3DCFF1, 44356548, GAME_DUKE, NULL }, - { "Duke Nukem 3D Shareware", 0x983AD923, 11035779, GAME_DUKE, NULL }, - { "Duke Nukem 3D Mac Shareware", 0xC5F71561, 10444391, GAME_DUKE, NULL }, - { "NAM", 0x75C1F07B, 43448927, GAME_NAM, NULL }, - { "Napalm", 0x3DE1589A, 44365728, GAME_NAM, NULL }, - { "WW2GI", 0x907B82BF, 77939508, GAME_WW2|GAME_NAM, NULL }, + { "Duke Nukem 3D", 0xBBC9CE44, 26524524, GAMEFLAG_DUKE, NULL }, + { "Duke Nukem 3D: Atomic Edition", 0xF514A6AC, 44348015, GAMEFLAG_DUKE, NULL }, + { "Duke Nukem 3D: Atomic Edition", 0xFD3DCFF1, 44356548, GAMEFLAG_DUKE, NULL }, + { "Duke Nukem 3D Shareware", 0x983AD923, 11035779, GAMEFLAG_DUKE, NULL }, + { "Duke Nukem 3D Mac Shareware", 0xC5F71561, 10444391, GAMEFLAG_DUKE, NULL }, + { "NAM", 0x75C1F07B, 43448927, GAMEFLAG_NAM, NULL }, + { "Napalm", 0x3DE1589A, 44365728, GAMEFLAG_NAM|GAMEFLAG_NAPALM, NULL }, + { "WWII GI", 0x907B82BF, 77939508, GAMEFLAG_WW2GI|GAMEFLAG_NAM, NULL }, }; struct grpfile *foundgrps = NULL; @@ -68,10 +69,10 @@ static int32_t LoadGroupsCache(void) while (!scriptfile_eof(script)) { - if (scriptfile_getstring(script, &fname)) break; // filename - if (scriptfile_getnumber(script, &fsize)) break; // filesize - if (scriptfile_getnumber(script, &fmtime)) break; // modification time - if (scriptfile_getnumber(script, &fcrcval)) break; // crc checksum + if (scriptfile_getstring(script, &fname)) break; // filename + if (scriptfile_getnumber(script, &fsize)) break; // filesize + if (scriptfile_getnumber(script, &fmtime)) break; // modification time + if (scriptfile_getnumber(script, &fcrcval)) break; // crc checksum fg = Bcalloc(1, sizeof(struct grpcache)); fg->next = grpcache; @@ -130,12 +131,12 @@ int32_t ScanGroups(void) if (fg) { - if (findfrompath(sidx->name, &fn)) continue; // failed to resolve the filename + if (findfrompath(sidx->name, &fn)) continue; // failed to resolve the filename if (Bstat(fn, &st)) { Bfree(fn); continue; - } // failed to stat the file + } // failed to stat the file Bfree(fn); if (fg->size == st.st_size && fg->mtime == st.st_mtime) { diff --git a/polymer/eduke32/source/menus.c b/polymer/eduke32/source/menus.c index e0464d888..c82c8ea98 100644 --- a/polymer/eduke32/source/menus.c +++ b/polymer/eduke32/source/menus.c @@ -33,6 +33,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "demo.h" #include "crc32.h" #include "common.h" +#include "common_game.h" #include diff --git a/polymer/eduke32/source/player.c b/polymer/eduke32/source/player.c index 07a7189bb..251716d4a 100644 --- a/polymer/eduke32/source/player.c +++ b/polymer/eduke32/source/player.c @@ -21,6 +21,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. //------------------------------------------------------------------------- #include "duke3d.h" +#include "common_game.h" #include "osd.h" #include "player.h" #include "demo.h" diff --git a/polymer/eduke32/source/startgtk.game.c b/polymer/eduke32/source/startgtk.game.c index 5f5f00e7b..bf1603b66 100644 --- a/polymer/eduke32/source/startgtk.game.c +++ b/polymer/eduke32/source/startgtk.game.c @@ -33,6 +33,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "game.h" #include "common.h" +#include "common_game.h" #define RDR_POLYMOST 3 // sould be defined elsewhere #define RDR_POLYMER 4 // sould be defined elsewhere @@ -886,7 +887,7 @@ int32_t startwin_run(void) settings.custommoddir = g_modDir; settings.forcesetup = ud.config.ForceSetup; settings.game = g_gameType; - Bstrncpyz(settings.selectedgrp, g_grpNamePtr, BMAX_PATH); + Bstrncpyz(settings.selectedgrp, G_GrpFile(), BMAX_PATH); if (ud.config.NoAutoLoad) settings.autoload = FALSE; else settings.autoload = TRUE; #ifdef POLYMER diff --git a/polymer/eduke32/source/startwin.game.c b/polymer/eduke32/source/startwin.game.c index 9bbaf96bc..34c765f95 100644 --- a/polymer/eduke32/source/startwin.game.c +++ b/polymer/eduke32/source/startwin.game.c @@ -46,6 +46,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "game.h" #include "common.h" +#include "common_game.h" #define TAB_CONFIG 0 // #define TAB_GAME 1 @@ -738,7 +739,7 @@ int32_t startwin_run(void) settings.usejoy = ud.config.UseJoystick; settings.game = g_gameType; // settings.crcval = 0; - Bstrncpyz(settings.selectedgrp, g_grpNamePtr, BMAX_PATH); + Bstrncpyz(settings.selectedgrp, G_GrpFile(), BMAX_PATH); settings.gamedir = g_modDir; PopulateForm(-1);