- cleanup of the old file system initialization.

The real fun part is yet to come, i.e. removing the remaining dependencies on the old file system code.
This commit is contained in:
Christoph Oelckers 2019-11-01 19:25:42 +01:00
parent 24edfbe03b
commit 2d7c0e26d2
30 changed files with 335 additions and 1402 deletions

View file

@ -770,6 +770,7 @@ set (PCH_SOURCES
common/gamecontrol.cpp common/gamecontrol.cpp
common/inputstate.cpp common/inputstate.cpp
common/searchpaths.cpp common/searchpaths.cpp
common/initfs.cpp
common/2d/v_2ddrawer.cpp common/2d/v_2ddrawer.cpp
common/2d/v_draw.cpp common/2d/v_draw.cpp

View file

@ -69,6 +69,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include "warp.h" #include "warp.h"
#include "weapon.h" #include "weapon.h"
#include "gameconfigfile.h" #include "gameconfigfile.h"
#include "gamecontrol.h"
#include "m_argv.h"
#ifdef _WIN32 #ifdef _WIN32
# include <shellapi.h> # include <shellapi.h>
@ -83,9 +85,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
BEGIN_BLD_NS BEGIN_BLD_NS
extern const char* G_DefaultDefFile(void);
extern const char* G_DefFile(void);
int32_t gNoSetup = 0, gCommandSetup = 0; int32_t gNoSetup = 0, gCommandSetup = 0;
INPUT_MODE gInputMode; INPUT_MODE gInputMode;
@ -164,11 +163,6 @@ enum gametokens
int blood_globalflags; int blood_globalflags;
void app_crashhandler(void)
{
// NUKE-TODO:
}
void G_Polymer_UnInit(void) void G_Polymer_UnInit(void)
{ {
// NUKE-TODO: // NUKE-TODO:
@ -1262,8 +1256,6 @@ int app_main()
ScanINIFiles(); ScanINIFiles();
G_LoadGroups();
initprintf("Initializing OSD...\n"); initprintf("Initializing OSD...\n");
OSD_SetVersion("Blood", 10, 0); OSD_SetVersion("Blood", 10, 0);
@ -2116,7 +2108,7 @@ int loaddefinitions_game(const char *fileName, int32_t firstPass)
if (pScript) if (pScript)
parsedefinitions_game(pScript, firstPass); parsedefinitions_game(pScript, firstPass);
for (char const * m : g_defModules) for (auto & m : *userConfig.AddDefs)
parsedefinitions_game_include(m, NULL, "null", firstPass); parsedefinitions_game_include(m, NULL, "null", firstPass);
if (pScript) if (pScript)
@ -2254,22 +2246,17 @@ void sndPlaySpecialMusicOrNothing(int nMusic)
extern void faketimerhandler(); extern void faketimerhandler();
extern int app_main(); extern int app_main();
extern void app_crashhandler(void);
bool validate_hud(int layout); bool validate_hud(int layout);
void set_hud_layout(int layout); void set_hud_layout(int layout);
void set_hud_scale(int scale); void set_hud_scale(int scale);
int32_t GetTime(); int32_t GetTime();
GameInterface Interface = { GameInterface Interface = {
TICRATE,
faketimerhandler, faketimerhandler,
app_main, app_main,
validate_hud, validate_hud,
set_hud_layout, set_hud_layout,
set_hud_scale, set_hud_scale,
app_crashhandler,
G_DefaultDefFile,
G_DefFile,
}; };
END_BLD_NS END_BLD_NS

View file

@ -53,36 +53,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
BEGIN_BLD_NS BEGIN_BLD_NS
// g_grpNamePtr can ONLY point to a malloc'd block (length BMAX_PATH)
char *g_grpNamePtr = NULL;
void clearGrpNamePtr(void)
{
Bfree(g_grpNamePtr);
// g_grpNamePtr assumed to be assigned to right after
}
const char *G_DefaultGrpFile(void)
{
return "blood.rff";
}
const char *G_DefaultDefFile(void)
{
return "blood.def";
}
const char *G_GrpFile(void)
{
return (g_grpNamePtr == NULL) ? G_DefaultGrpFile() : g_grpNamePtr;
}
const char *G_DefFile(void)
{
return (g_defNamePtr == NULL) ? G_DefaultDefFile() : g_defNamePtr;
}
void G_SetupGlobalPsky(void) void G_SetupGlobalPsky(void)
{ {
int skyIdx = 0; int skyIdx = 0;
@ -103,109 +73,6 @@ void G_SetupGlobalPsky(void)
} }
int32_t g_groupFileHandle;
struct strllist* CommandGrps;
static int32_t G_TryLoadingGrp(char const * const grpfile)
{
int32_t i;
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);
return i;
}
void G_LoadGroups()
{
if (g_modDir[0] != '/')
{
char cwd[BMAX_PATH];
FString g_rootDir = progdir + g_modDir;
addsearchpath(g_rootDir);
// addsearchpath(mod_dir);
char path[BMAX_PATH];
if (getcwd(cwd, BMAX_PATH))
{
Bsnprintf(path, sizeof(path), "%s/%s", cwd, g_modDir);
if (!Bstrcmp(g_rootDir, path))
{
if (addsearchpath(path) == -2)
if (Bmkdir(path, S_IRWXU) == 0)
addsearchpath(path);
}
}
}
const char *grpfile = G_GrpFile();
G_TryLoadingGrp(grpfile);
if (G_AllowAutoload())
{
G_LoadGroupsInDir("autoload");
//if (i != -1)
// G_DoAutoload(grpfile);
}
if (g_modDir[0] != '/')
G_LoadGroupsInDir(g_modDir);
if (g_defNamePtr == NULL)
{
const char *tmpptr = getenv("BLOODDEF");
if (tmpptr)
{
clearDefNamePtr();
g_defNamePtr = dup_filename(tmpptr);
initprintf("Using \"%s\" as definitions file\n", g_defNamePtr);
}
}
loaddefinitions_game(BLOODWIDESCREENDEF, TRUE);
loaddefinitions_game(G_DefFile(), TRUE);
}
//////////
// loads all group (grp, zip, pk3/4) files in the given directory
void G_LoadGroupsInDir(const char *dirname)
{
static const char *extensions[] = { "*.grp", "*.zip", "*.ssi", "*.pk3", "*.pk4" };
char buf[BMAX_PATH];
fnlist_t fnlist = FNLIST_INITIALIZER;
for (auto & extension : extensions)
{
BUILDVFS_FIND_REC *rec;
fnlist_getnames(&fnlist, dirname, extension, -1, 0);
for (rec=fnlist.findfiles; rec; rec=rec->next)
{
Bsnprintf(buf, sizeof(buf), "%s/%s", dirname, rec->name);
initprintf("Using group file \"%s\".\n", buf);
initgroupfile(buf);
}
fnlist_clearnames(&fnlist);
}
}
void G_DoAutoload(const char *dirname)
{
char buf[BMAX_PATH];
Bsnprintf(buf, sizeof(buf), "autoload/%s", dirname);
G_LoadGroupsInDir(buf);
}
////////// //////////
#ifdef FORMAT_UPGRADE_ELIGIBLE #ifdef FORMAT_UPGRADE_ELIGIBLE

View file

@ -509,18 +509,10 @@ enum searchpathtypes_t {
if (alpha < 0) { blend = -alpha; alpha = 0; orientation |= RS_TRANS1; } \ if (alpha < 0) { blend = -alpha; alpha = 0; orientation |= RS_TRANS1; } \
} while (0) } while (0)
extern char *g_grpNamePtr;
extern int loaddefinitions_game(const char *fn, int32_t preload); extern int loaddefinitions_game(const char *fn, int32_t preload);
extern void G_AddSearchPaths(void);
extern void G_ExtInit(void); extern void G_ExtInit(void);
void G_LoadGroupsInDir(const char *dirname);
void G_DoAutoload(const char *dirname);
extern void G_LoadGroups();
extern void G_SetupGlobalPsky(void); extern void G_SetupGlobalPsky(void);
#define G_ModDirSnprintf(buf, size, basename, ...) \ #define G_ModDirSnprintf(buf, size, basename, ...) \

View file

@ -228,18 +228,11 @@ int32_t baselayer_init();
struct GameInterface struct GameInterface
{ {
int TicRate;
void (*faketimerhandler)(); void (*faketimerhandler)();
int (*app_main)(); int (*app_main)();
bool (*validate_hud)(int); bool (*validate_hud)(int);
void (*set_hud_layout)(int size); void (*set_hud_layout)(int size);
void (*set_hud_scale)(int size); void (*set_hud_scale)(int size);
// These will later be removed.
void (*app_crashhandler)();
const char* (*DefaultDefFile)();
const char* (*DefFile)();
}; };
extern GameInterface* gi; extern GameInterface* gi;

View file

@ -1332,10 +1332,6 @@ 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_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); // int32_t md_tilehasmodel(int32_t tilenume, int32_t pal);
extern char *g_defNamePtr;
extern GrowArray<char *> g_defModules;
#ifdef HAVE_CLIPSHAPE_FEATURE #ifdef HAVE_CLIPSHAPE_FEATURE
extern GrowArray<char *> g_clipMapFiles; extern GrowArray<char *> g_clipMapFiles;
#endif #endif

View file

@ -52,7 +52,6 @@ extern const char *s_buildRev;
extern const char *s_buildTimestamp; extern const char *s_buildTimestamp;
//// FUNCTIONS //// FUNCTIONS
extern void clearDefNamePtr(void);
void G_AddDef(const char *buffer); void G_AddDef(const char *buffer);
void G_AddDefModule(const char *buffer); void G_AddDefModule(const char *buffer);

View file

@ -11,19 +11,8 @@
#include "vfs.h" #include "vfs.h"
#include "../../glbackend/glbackend.h" #include "../../glbackend/glbackend.h"
GrowArray<char*> g_defModules;
// def/clipmap handling // def/clipmap handling
// g_defNamePtr can ONLY point to a malloc'd block (length BMAX_PATH)
char *g_defNamePtr = NULL;
void clearDefNamePtr(void)
{
Xfree(g_defNamePtr);
// g_defNamePtr assumed to be assigned to right after
}
#ifdef HAVE_CLIPSHAPE_FEATURE #ifdef HAVE_CLIPSHAPE_FEATURE
GrowArray<char *> g_clipMapFiles; GrowArray<char *> g_clipMapFiles;
#endif #endif
@ -42,18 +31,6 @@ void SetClipshapes()
#endif #endif
} }
void G_AddDef(const char *buffer)
{
clearDefNamePtr();
g_defNamePtr = dup_filename(buffer);
initprintf("Using DEF file \"%s\".\n",g_defNamePtr);
}
void G_AddDefModule(const char *buffer)
{
g_defModules.append(Xstrdup(buffer));
}
#ifdef HAVE_CLIPSHAPE_FEATURE #ifdef HAVE_CLIPSHAPE_FEATURE
void G_AddClipMap(const char *buffer) void G_AddClipMap(const char *buffer)
{ {

View file

@ -18,6 +18,8 @@
#include "colmatch.h" #include "colmatch.h"
#include "textures.h" #include "textures.h"
#include "bitmap.h" #include "bitmap.h"
#include "m_argv.h"
#include "gamecontrol.h"
#ifdef USE_OPENGL #ifdef USE_OPENGL
# include "hightile.h" # include "hightile.h"
@ -327,7 +329,7 @@ static int32_t defsparser(scriptfile *script)
} }
case T_INCLUDEDEFAULT: case T_INCLUDEDEFAULT:
{ {
defsparser_include(gi->DefaultDefFile(), script, cmdtokptr); defsparser_include(G_DefaultDefFile(), script, cmdtokptr);
break; break;
} }
case T_DEFINE: case T_DEFINE:
@ -3414,7 +3416,7 @@ int32_t loaddefinitionsfile(const char *fn)
defsparser(script); defsparser(script);
} }
for (char const * m : g_defModules) for (auto& m : *userConfig.AddDefs)
defsparser_include(m, NULL, NULL); defsparser_include(m, NULL, NULL);
g_logFlushWindow = f; g_logFlushWindow = f;

View file

@ -8277,8 +8277,6 @@ void engineUnInit(void)
DO_FREE_AND_NULL(multipsky); DO_FREE_AND_NULL(multipsky);
DO_FREE_AND_NULL(multipskytile); DO_FREE_AND_NULL(multipskytile);
pskynummultis = 0; pskynummultis = 0;
DO_FREE_AND_NULL(g_defNamePtr);
} }

View file

@ -380,9 +380,11 @@ static void sighandler(int signum)
// usleep(15000000); // usleep(15000000);
#endif #endif
attach_debugger_here(); attach_debugger_here();
gi->app_crashhandler(); std::terminate();
uninitsystem(); // NOTE: It is not safe to call any of this from a signal handler!
Bexit(EXIT_FAILURE); //gi->app_crashhandler();
//uninitsystem();
//Bexit(EXIT_FAILURE);
} }
} }
#endif #endif

View file

@ -125,7 +125,7 @@ int FileSystem::InitMultipleFiles (TArray<FString> &filenames, const TArray<FStr
for (int i = 0; i < NumLookupModes; i++) for (int i = 0; i < NumLookupModes; i++)
{ {
FirstFileIndex[i] = &Hashes[i * 2 * NumEntries]; FirstFileIndex[i] = &Hashes[i * 2 * NumEntries];
NextFileIndex[i] = &Hashes[(i+1) * 2 * NumEntries]; NextFileIndex[i] = &Hashes[(i * 2 + 1) * NumEntries];
} }
InitHashChains (); InitHashChains ();
FileInfo.ShrinkToFit(); FileInfo.ShrinkToFit();
@ -418,10 +418,11 @@ void FileSystem::InitHashChains (void)
{ {
hash = int(lump->LumpName[l]) % NumEntries; hash = int(lump->LumpName[l]) % NumEntries;
} }
else if (lump->ResourceId > 0) else if (l == (int)ELookupMode::IdWithType && lump->ResourceId > 0)
{ {
hash = int(lump->ResourceId) % NumEntries; hash = int(lump->ResourceId) % NumEntries;
} }
else continue;
NextFileIndex[l][hash] = FirstFileIndex[l][hash]; NextFileIndex[l][hash] = FirstFileIndex[l][hash];
FirstFileIndex[l][hash] = i; FirstFileIndex[l][hash] = i;
} }

View file

@ -219,7 +219,7 @@ FResourceFile *FResourceFile::DoOpenResourceFile(const char *filename, FileReade
for(size_t i = 0; i < countof(funcs) - containeronly; i++) for(size_t i = 0; i < countof(funcs) - containeronly; i++)
{ {
FResourceFile *resfile = funcs[i](filename, file, quiet); FResourceFile *resfile = funcs[i](filename, file, quiet);
if (resfile != NULL && resfile->Open(quiet)) return resfile; if (resfile != NULL) return resfile;
} }
return NULL; return NULL;
} }

View file

@ -1,3 +1,4 @@
#include <filesystem>
#include "gamecontrol.h" #include "gamecontrol.h"
#include "tarray.h" #include "tarray.h"
#include "zstring.h" #include "zstring.h"
@ -14,10 +15,12 @@
#include "control.h" #include "control.h"
#include "m_argv.h" #include "m_argv.h"
#include "rts.h" #include "rts.h"
#include "printf.h"
InputState inputState; InputState inputState;
void SetClipshapes(); void SetClipshapes();
int ShowStartupWindow(TArray<GrpEntry> &); int ShowStartupWindow(TArray<GrpEntry> &);
void InitFileSystem(TArray<GrpEntry>&);
int globalShadeDiv; int globalShadeDiv;
struct GameFuncNameDesc struct GameFuncNameDesc
@ -194,7 +197,7 @@ void UserConfig::ProcessOptions()
gamegrp = "WW2GI.GRP"; gamegrp = "WW2GI.GRP";
} }
v = Args->CheckValue("-gamegrp"); // Although it says 'grp', this will take a directory as well v = Args->CheckValue("-gamegrp");
if (v) if (v)
{ {
gamegrp = v; gamegrp = v;
@ -267,9 +270,9 @@ void UserConfig::ProcessOptions()
} }
else else
{ {
// Trying to emulate Build. This means to treat RFF special as lowest priority, then all GRPs and then all directories. // Trying to emulate Build. This means to treat RFF files as lowest priority, then all GRPs and then all directories.
// This is only for people depending on lauchers. Since the semantics are so crappy it is strongly recommended to // This is only for people depending on lauchers. Since the semantics are so crappy it is strongly recommended to
// use -file instead which gives the user full control about the order in which things are added. // use -file instead which gives the user full control over the order in which things are added.
// For single mods this is no problem but don't even think about loading more stuff consistently... // For single mods this is no problem but don't even think about loading more stuff consistently...
static const char* grps[] = { "-g", "-grp", nullptr }; static const char* grps[] = { "-g", "-grp", nullptr };
@ -354,7 +357,7 @@ int CONFIG_Init()
SetClipshapes(); SetClipshapes();
// This must be done before initializing any data, so doing it late in the startup process won't work. // This must be done before initializing any data, so doing it late in the startup process won't work.
if (CONTROL_Startup(controltype_keyboardandmouse, BGetTime, gi->TicRate)) if (CONTROL_Startup(controltype_keyboardandmouse, BGetTime, 120))
{ {
return 1; return 1;
} }
@ -365,27 +368,84 @@ int CONFIG_Init()
// Startup dialog must be presented here so that everything can be set up before reading the keybinds. // Startup dialog must be presented here so that everything can be set up before reading the keybinds.
auto groups = GrpScan(); auto groups = GrpScan();
int groupno = ShowStartupWindow(groups); if (groups.Size() == 0)
if (groupno == -1) return 0;
auto &group = groups[groupno];
GrpEntry* dependency = nullptr;
if (group.FileInfo.dependencyCRC != 0)
{ {
for (auto& dep : groups) // Abort if no game data found.
{ I_Error("Unable to find any game data. Please verify your settings.");
if (dep.FileInfo.CRC == group.FileInfo.dependencyCRC) }
{
dependency = &dep; decltype(groups) usedgroups;
break;
} int groupno = -1;
}
// If the user has specified a file name, let's see if we know it.
//
if (userConfig.gamegrp)
{
std::filesystem::path gpath = std::filesystem::u8path(userConfig.gamegrp.GetChars());
int g = 0;
for (auto& grp : groups)
{
std::filesystem::path fpath = std::filesystem::u8path(grp.FileName.GetChars());
std::error_code err;
if (std::filesystem::equivalent(gpath, fpath, err))
{
break;
}
g++;
}
groupno = g;
}
if (groupno == -1 || userConfig.setupstate == 1)
groupno = ShowStartupWindow(groups);
if (groupno == -1) return 0;
auto &group = groups[groupno];
// Now filter out the data we actually need and delete the rest.
usedgroups.Push(group);
auto crc = group.FileInfo.dependencyCRC;
for (auto& dep : groups)
{
if (dep.FileInfo.CRC == crc)
{
usedgroups.Insert(0, dep); // Order from least dependent to most dependent, which is the loading order of data.
}
}
groups.Reset();
FString selectedScript;
FString selectedDef;
for (auto& ugroup : usedgroups)
{
// For CONs the command line has priority, aside from that, the last one wins. For Blood this handles INIs - the rules are the same.
if (ugroup.FileInfo.scriptname.IsNotEmpty()) selectedScript = ugroup.FileInfo.scriptname;
if (ugroup.FileInfo.defname.IsNotEmpty()) selectedDef = ugroup.FileInfo.defname;
// CVAR has priority. This also overwrites the global variable each time. Init here is lazy so this is ok.
if (ugroup.FileInfo.rtsname.IsNotEmpty() && **rtsname == 0) RTS_Init(ugroup.FileInfo.rtsname);
// For the game filter the last non-empty one wins.
if (ugroup.FileInfo.gamefilter.IsNotEmpty()) LumpFilter = ugroup.FileInfo.gamefilter;
g_gameType |= ugroup.FileInfo.flags;
}
if (userConfig.DefaultCon.IsEmpty()) userConfig.DefaultCon = selectedScript;
if (userConfig.DefaultDef.IsEmpty()) userConfig.DefaultDef = selectedDef;
// This can only happen with a custom game that does not define any filter.
// In this case take the display name and strip all whitespace and invaliid path characters from it.
if (LumpFilter.IsEmpty())
{
LumpFilter = usedgroups.Last().FileInfo.name;
LumpFilter.StripChars(".:/\\<>?\"*| \t\r\n");
} }
LumpFilter = group.FileInfo.gamefilter;
if (LumpFilter.IsEmpty() && dependency) LumpFilter = dependency->FileInfo.gamefilter;
currentGame = LumpFilter; currentGame = LumpFilter;
currentGame.Truncate(currentGame.IndexOf(".")); currentGame.Truncate(currentGame.IndexOf("."));
CheckFrontend(group.FileInfo.flags); CheckFrontend(g_gameType);
G_ReadConfig(currentGame); G_ReadConfig(currentGame);
if (!GameConfig->IsInitialized()) if (!GameConfig->IsInitialized())
@ -418,6 +478,7 @@ int CONFIG_Init()
CONTROL_ClearAssignments(); CONTROL_ClearAssignments();
CONFIG_InitMouseAndController(); CONFIG_InitMouseAndController();
CONFIG_SetGameControllerDefaultsStandard(); CONFIG_SetGameControllerDefaultsStandard();
InitFileSystem(usedgroups);
return gi->app_main(); return gi->app_main();
} }
@ -1599,3 +1660,4 @@ int osdcmd_unbind(osdcmdptr_t parm)
return OSDCMD_SHOWHELP; return OSDCMD_SHOWHELP;
} }

View file

@ -140,7 +140,6 @@ struct GrpInfo
{ {
FString name; FString name;
FString scriptname; FString scriptname;
FString dirname;
FString defname; FString defname;
FString rtsname; FString rtsname;
FString gamefilter; FString gamefilter;
@ -148,6 +147,8 @@ struct GrpInfo
uint32_t dependencyCRC = 0; uint32_t dependencyCRC = 0;
size_t size = 0; size_t size = 0;
int flags = 0; int flags = 0;
bool loaddirectory = false;
TArray<FString> mustcontain;
TArray<FString> loadfiles; TArray<FString> loadfiles;
TArray<FString> loadart; TArray<FString> loadart;
}; };
@ -160,5 +161,10 @@ struct GrpEntry
GrpInfo FileInfo; GrpInfo FileInfo;
uint32_t FileIndex; uint32_t FileIndex;
}; };
extern int g_gameType;
const char* G_DefaultDefFile(void);
const char* G_DefFile(void);
const char* G_DefaultConFile(void);
const char* G_ConFile(void);
TArray<GrpEntry> GrpScan(); TArray<GrpEntry> GrpScan();

View file

@ -465,7 +465,6 @@ CUSTOM_CVAR(String, rtsname, "", CVAR_ARCHIVE | CVAR_USERINFO)
#if 0 #if 0
// These will be redone once the resource management has been swapped out. // These will be redone once the resource management has been swapped out.
//GameConfig->SetValueForKey("Setup", "SelectedGRP", g_grpNamePtr);
//GameConfig->SetValueForKey("Setup", "ModDir", &g_modDir[0]); //GameConfig->SetValueForKey("Setup", "ModDir", &g_modDir[0]);
#endif #endif

View file

@ -36,10 +36,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include "printf.h" #include "printf.h"
#include "common.h" #include "common.h"
#include "gamecontrol.h" #include "gamecontrol.h"
#include "filesystem/filesystem.h"
namespace fs = std::filesystem; namespace fs = std::filesystem;
int g_gameType;
fs::path AbsolutePath(const char* path) fs::path AbsolutePath(const char* path)
@ -534,9 +536,21 @@ struct FileEntry
TArray<FileEntry> CollectAllFilesInSearchPath() TArray<FileEntry> CollectAllFilesInSearchPath()
{ {
uint32_t index = 0;
TArray<FileEntry> filelist; TArray<FileEntry> filelist;
if (userConfig.gamegrp.IsNotEmpty())
{
// If the user specified a file on the command line, insert that first, if found.
FileReader fr;
if (fr.OpenFile(userConfig.gamegrp))
{
FileEntry fe = { userConfig.gamegrp, (uintmax_t)fr.GetLength(), 0, 0, index++ };
filelist.Push(fe);
}
}
auto paths = CollectSearchPaths(); auto paths = CollectSearchPaths();
int index = 0;
for(auto &path : paths) for(auto &path : paths)
{ {
auto fpath = fs::u8path(path.GetChars()); auto fpath = fs::u8path(path.GetChars());
@ -682,8 +696,8 @@ static TArray<GrpInfo> ParseGrpInfo(const char *fn, FileReader &fr, TMap<FString
} }
else if (sc.Compare("loaddirectory")) else if (sc.Compare("loaddirectory"))
{ {
sc.MustGetToken(TK_StringConst); // Only load the directory, but not the file.
grp.dirname = sc.String; grp.loaddirectory = true;
} }
else if (sc.Compare("defname")) else if (sc.Compare("defname"))
{ {
@ -764,15 +778,23 @@ static TArray<GrpInfo> ParseGrpInfo(const char *fn, FileReader &fr, TMap<FString
} }
while (sc.CheckToken('|')); while (sc.CheckToken('|'));
} }
else if (sc.Compare("loadgrp")) else if (sc.Compare("mustcontain"))
{ {
do do
{ {
sc.MustGetToken(TK_StringConst); sc.MustGetToken(TK_StringConst);
grp.loadfiles.Push(sc.String); grp.mustcontain.Push(sc.String);
} }
while (sc.CheckToken(',')); while (sc.CheckToken(','));
} }
else if (sc.Compare("loadgrp"))
{
do
{
sc.MustGetToken(TK_StringConst);
grp.loadfiles.Push(sc.String);
} while (sc.CheckToken(','));
}
else if (sc.Compare("loadart")) else if (sc.Compare("loadart"))
{ {
do do
@ -1005,3 +1027,90 @@ TArray<GrpEntry> GrpScan()
} }
return foundGames; return foundGames;
} }
//==========================================================================
//
// Fallback in case nothing got defined.
// Also used by 'includedefault' which forces this to be statically defined
// (and which shouldn't be used to begin with because there are no default DEFs!)
//
//==========================================================================
const char* G_DefaultDefFile(void)
{
if (g_gameType & GAMEFLAG_BLOOD)
return "blood.def";
if (g_gameType & GAMEFLAG_DUKE)
return "duke3d.def";
if (g_gameType & GAMEFLAG_RRRA)
return "rrra.def";
if (g_gameType & GAMEFLAG_RR)
return "rr.def";
if (g_gameType & GAMEFLAG_WW2GI)
return "ww2gi.def";
if (g_gameType & GAMEFLAG_SW)
return "sw.def";
if (g_gameType & GAMEFLAG_NAM)
return fileSystem.FindFile("nam.def") ? "nam.def" : "napalm.def";
if (g_gameType & GAMEFLAG_NAPALM)
return fileSystem.FindFile("napalm.def") ? "napalm.def" : "nam.def";
return "duke3d.def";
}
const char* G_DefFile(void)
{
return userConfig.DefaultDef.IsNotEmpty() ? userConfig.DefaultDef.GetChars() : G_DefaultDefFile();
}
//==========================================================================
//
// Fallback in case nothing got defined.
// Also used by 'includedefault' which forces this to be statically defined
//
//==========================================================================
const char* G_DefaultConFile(void)
{
if (g_gameType & GAMEFLAG_BLOOD)
return "blood.ini"; // Blood doesn't have CON files but the common code treats its INI files the same, so return that here.
if (g_gameType & GAMEFLAG_WW2GI)
{
if (fileSystem.FindFile("ww2gi.con")) return "ww2gi.con";
}
if (g_gameType & GAMEFLAG_SW)
return nullptr; // SW has no scripts of any kind (todo: Make Blood's INI files usable here for map definitions)
if (g_gameType & GAMEFLAG_NAM)
{
if (fileSystem.FindFile("nam.def")) return "nam.def";
if (fileSystem.FindFile("napalm.def")) return "napalm.def";
}
if (g_gameType & GAMEFLAG_NAPALM)
{
if (fileSystem.FindFile("napalm.def")) return "napalm.def";
if (fileSystem.FindFile("nam.def")) return "nam.def";
}
// the other games only use game.con.
return "game.con";
}
const char* G_ConFile(void)
{
return userConfig.DefaultCon.IsNotEmpty() ? userConfig.DefaultCon.GetChars() : G_DefaultConFile();
}

View file

@ -81,6 +81,7 @@ public:
FArgs(int argc, FString *argv); FArgs(int argc, FString *argv);
FArgs &operator=(const FArgs &other); FArgs &operator=(const FArgs &other);
const FString& operator[](size_t index) { return Argv[index]; }
void AppendArg(FString arg); void AppendArg(FString arg);
void AppendArgs(int argc, const FString *argv); void AppendArgs(int argc, const FString *argv);

View file

@ -23,83 +23,6 @@
BEGIN_DUKE_NS BEGIN_DUKE_NS
struct grpfile_t const *g_selectedGrp;
int32_t g_gameType = GAMEFLAG_DUKE;
int g_addonNum = 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;
// grp/con handling
static const char *defaultconfilename = "GAME.CON";
#ifndef EDUKE32_STANDALONE
static const char *defaultgamegrp[GAMECOUNT] = { "DUKE3D.GRP", "NAM.GRP", "NAPALM.GRP", "WW2GI.GRP" };
static const char *defaultdeffilename[GAMECOUNT] = { "duke3d.def", "nam.def", "napalm.def", "ww2gi.def" };
static const char *defaultgameconfilename[GAMECOUNT] = { "EDUKE.CON", "NAM.CON", "NAPALM.CON", "WW2GI.CON" };
#endif
const char *G_DefaultGrpFile(void)
{
return "(none)"; // must be define in GRPINFO.
}
const char *G_DefaultDefFile(void)
{
// Todo: Get from the selected game record.
return "DUKE3D.DEF";
}
const char *G_DefaultConFile(void)
{
// Todo: Get from the selected game record.
#ifndef EDUKE32_STANDALONE
if (DUKE && testkopen(defaultgameconfilename[GAME_DUKE],0))
return defaultgameconfilename[GAME_DUKE];
else if (WW2GI && testkopen(defaultgameconfilename[GAME_WW2GI],0))
return defaultgameconfilename[GAME_WW2GI];
else if (NAPALM)
{
if (!testkopen(defaultgameconfilename[GAME_NAPALM],0))
{
if (testkopen(defaultgameconfilename[GAME_NAM],0))
return defaultgameconfilename[GAME_NAM]; // NAM/NAPALM Sharing
}
else
return defaultgameconfilename[GAME_NAPALM];
}
else if (NAM)
{
if (!testkopen(defaultgameconfilename[GAME_NAM],0))
{
if (testkopen(defaultgameconfilename[GAME_NAPALM],0))
return defaultgameconfilename[GAME_NAPALM]; // NAM/NAPALM Sharing
}
else
return defaultgameconfilename[GAME_NAM];
}
#endif
return defaultconfilename;
}
const char* G_GrpFile(void)
{
return userConfig.gamegrp.IsNotEmpty() ? userConfig.gamegrp.GetChars() : G_DefaultGrpFile();
}
const char* G_DefFile(void)
{
return userConfig.DefaultDef.IsNotEmpty() ? userConfig.DefaultDef.GetChars() : G_DefaultDefFile();
}
const char* G_ConFile(void)
{
return userConfig.DefaultCon.IsNotEmpty() ? userConfig.DefaultCon.GetChars() : G_DefaultConFile();
}
//////////
// Set up new-style multi-psky handling. // Set up new-style multi-psky handling.
void G_InitMultiPsky(int CLOUDYOCEAN__DYN, int MOONSKY1__DYN, int BIGORBIT1__DYN, int LA__DYN) void G_InitMultiPsky(int CLOUDYOCEAN__DYN, int MOONSKY1__DYN, int BIGORBIT1__DYN, int LA__DYN)
{ {
@ -179,177 +102,6 @@ void G_SetupGlobalPsky(void)
g_pskyidx = skyIdx; g_pskyidx = skyIdx;
} }
//////////
//char g_modDir[BMAX_PATH] = "/";
static void G_LoadAddon(void);
int32_t g_groupFileHandle;
struct strllist* CommandGrps;
static int32_t G_TryLoadingGrp(char const * const grpfile)
{
int32_t i;
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);
return i;
}
static int32_t G_LoadGrpDependencyChain(grpfile_t const * const grp)
{
if (!grp)
return -1;
if (grp->type->dependency && grp->type->dependency != grp->type->crcval)
G_LoadGrpDependencyChain(FindGroup(grp->type->dependency));
int32_t const i = G_TryLoadingGrp(grp->filename);
if (grp->type->postprocessing)
grp->type->postprocessing(i);
return i;
}
void G_LoadGroups()
{
if (g_modDir[0] != '/')
{
char cwd[BMAX_PATH];
FString g_rootDir = progdir + g_modDir;
addsearchpath(g_rootDir);
// addsearchpath(mod_dir);
char path[BMAX_PATH];
if (buildvfs_getcwd(cwd, BMAX_PATH))
{
Bsnprintf(path, sizeof(path), "%s/%s", cwd, g_modDir);
if (!Bstrcmp(g_rootDir, path))
{
addsearchpath(path);
}
}
}
if (g_addonNum)
G_LoadAddon();
const char *grpfile;
int32_t i;
if ((i = G_LoadGrpDependencyChain(g_selectedGrp)) != -1)
{
grpfile = g_selectedGrp->filename;
//clearGrpNamePtr();
//g_grpNamePtr = dup_filename(grpfile);
grpinfo_t const * const type = g_selectedGrp->type;
g_gameType = type->game;
g_gameNamePtr = type->name;
//if (type->scriptname && g_scriptNamePtr == NULL)
// g_scriptNamePtr = dup_filename(type->scriptname);
if (type->defname && g_defNamePtr == NULL)
g_defNamePtr = dup_filename(type->defname);
if (type->rtsname)
RTS_Init(type->rtsname);
}
else
{
grpfile = G_GrpFile();
i = G_TryLoadingGrp(grpfile);
}
if (G_AllowAutoload())
{
G_LoadGroupsInDir("autoload");
if (i != -1)
G_DoAutoload(grpfile);
}
if (g_modDir[0] != '/')
G_LoadGroupsInDir(g_modDir);
loaddefinitions_game(G_DefFile(), TRUE);
}
static void G_LoadAddon(void)
{
#ifndef EDUKE32_STANDALONE
int32_t crc = 0; // compiler-happy
switch (g_addonNum)
{
case ADDON_DUKEDC:
crc = DUKEDC_CRC;
break;
case ADDON_NWINTER:
crc = DUKENW_CRC;
break;
case ADDON_CARIBBEAN:
crc = DUKECB_CRC;
break;
}
if (!crc) return;
grpfile_t const * const grp = FindGroup(crc);
if (grp)
g_selectedGrp = grp;
#endif
}
//////////
// loads all group (grp, zip, pk3/4) files in the given directory
void G_LoadGroupsInDir(const char *dirname)
{
static const char *extensions[] = { "*.grp", "*.zip", "*.ssi", "*.pk3", "*.pk4" };
char buf[BMAX_PATH];
fnlist_t fnlist = FNLIST_INITIALIZER;
for (auto & extension : extensions)
{
CACHE1D_FIND_REC *rec;
fnlist_getnames(&fnlist, dirname, extension, -1, 0);
for (rec=fnlist.findfiles; rec; rec=rec->next)
{
Bsnprintf(buf, sizeof(buf), "%s/%s", dirname, rec->name);
initprintf("Using group file \"%s\".\n", buf);
initgroupfile(buf);
}
fnlist_clearnames(&fnlist);
}
}
void G_DoAutoload(const char *dirname)
{
char buf[BMAX_PATH];
Bsnprintf(buf, sizeof(buf), "autoload/%s", dirname);
G_LoadGroupsInDir(buf);
}
////////// //////////

View file

@ -16,11 +16,6 @@
BEGIN_DUKE_NS BEGIN_DUKE_NS
extern struct grpfile_t const *g_selectedGrp;
extern int32_t g_gameType;
extern int g_addonNum;
#define DUKE (g_gameType & GAMEFLAG_DUKE) #define DUKE (g_gameType & GAMEFLAG_DUKE)
#define NAM (g_gameType & GAMEFLAG_NAM) #define NAM (g_gameType & GAMEFLAG_NAM)
#define NAPALM (g_gameType & GAMEFLAG_NAPALM) #define NAPALM (g_gameType & GAMEFLAG_NAPALM)
@ -38,12 +33,6 @@ enum Games_t {
GAMECOUNT GAMECOUNT
}; };
enum searchpathtypes_t {
SEARCHPATH_REMOVE = 1<<0,
SEARCHPATH_NAM = 1<<1,
SEARCHPATH_WW2GI = 1<<2,
};
typedef enum basepal_ { typedef enum basepal_ {
BASEPAL = 0, BASEPAL = 0,
WATERPAL, WATERPAL,
@ -65,16 +54,7 @@ typedef enum basepal_ {
#define OSD_ERROR OSDTEXT_DARKRED OSDTEXT_BRIGHT #define OSD_ERROR OSDTEXT_DARKRED OSDTEXT_BRIGHT
extern const char *g_gameNamePtr;
extern const char *G_DefaultGrpFile(void);
extern const char *G_GrpFile(void);
extern const char *G_DefaultConFile(void);
extern const char *G_ConFile(void);
extern int loaddefinitions_game(const char *fn, int32_t preload); extern int loaddefinitions_game(const char *fn, int32_t preload);
extern int32_t g_groupFileHandle;
////////// //////////
@ -83,19 +63,6 @@ extern void G_SetupGlobalPsky(void);
////////// //////////
extern void G_AddSearchPaths(void);
extern void G_LoadGroups();
extern const char * G_GetInstallPath(int32_t insttype);
//////////
void G_LoadGroupsInDir(const char *dirname);
void G_DoAutoload(const char *dirname);
//////////
extern void G_LoadLookups(void); extern void G_LoadLookups(void);
////////// //////////

View file

@ -45,6 +45,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include "gamecvars.h" #include "gamecvars.h"
#include "gameconfigfile.h" #include "gameconfigfile.h"
#include "printf.h" #include "printf.h"
#include "m_argv.h"
#include "filesystem/filesystem.h" #include "filesystem/filesystem.h"
#include "vfs.h" #include "vfs.h"
@ -73,17 +74,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
BEGIN_DUKE_NS BEGIN_DUKE_NS
extern const char* G_DefaultDefFile(void);
extern const char* G_DefFile(void);
int32_t g_quitDeadline = 0; int32_t g_quitDeadline = 0;
#ifdef LUNATIC
camera_t g_camera;
#else
int32_t g_cameraDistance = 0, g_cameraClock = 0; int32_t g_cameraDistance = 0, g_cameraClock = 0;
#endif
static int32_t g_quickExit; static int32_t g_quickExit;
char boardfilename[BMAX_PATH] = {0}, currentboardfilename[BMAX_PATH] = {0}; char boardfilename[BMAX_PATH] = {0}, currentboardfilename[BMAX_PATH] = {0};
@ -5656,7 +5649,7 @@ int loaddefinitions_game(const char *fileName, int32_t firstPass)
if (pScript) if (pScript)
parsedefinitions_game(pScript, firstPass); parsedefinitions_game(pScript, firstPass);
for (char const * m : g_defModules) for (auto& m : *userConfig.AddDefs)
parsedefinitions_game_include(m, NULL, "null", firstPass); parsedefinitions_game_include(m, NULL, "null", firstPass);
if (pScript) if (pScript)
@ -6146,16 +6139,6 @@ static int G_EndOfLevel(void)
return 1; return 1;
} }
void app_crashhandler(void)
{
G_CloseDemoWrite();
#if !defined LUNATIC
VM_ScriptInfo(insptr, 64);
#endif
G_GameQuit();
}
void G_MaybeAllocPlayer(int32_t pnum) void G_MaybeAllocPlayer(int32_t pnum)
{ {
if (g_player[pnum].ps == NULL) if (g_player[pnum].ps == NULL)
@ -6199,8 +6182,6 @@ int app_main()
g_logFlushWindow = 0; g_logFlushWindow = 0;
G_LoadGroups();
// flushlogwindow = 1;
#ifndef EDUKE32_STANDALONE #ifndef EDUKE32_STANDALONE
G_SetupCheats(); G_SetupCheats();
@ -6284,9 +6265,7 @@ int app_main()
} }
loaddefinitions_game(defsfile, FALSE); loaddefinitions_game(defsfile, FALSE);
for (char * m : g_defModules) userConfig.AddDefs.reset();
free(m);
g_defModules.clear();
if (enginePostInit()) if (enginePostInit())
G_FatalEngineError(); G_FatalEngineError();
@ -6966,18 +6945,13 @@ void A_SpawnRandomGlass(int spriteNum, int wallNum, int glassCnt)
#endif #endif
extern void faketimerhandler(); extern void faketimerhandler();
extern void app_crashhandler(void);
GameInterface Interface = { GameInterface Interface = {
TICRATE,
faketimerhandler, faketimerhandler,
app_main, app_main,
validate_hud, validate_hud,
set_hud_layout, set_hud_layout,
set_hud_scale, set_hud_scale,
app_crashhandler,
G_DefaultDefFile,
G_DefFile,
}; };
END_DUKE_NS END_DUKE_NS

View file

@ -22,6 +22,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include "ns.h" // Must come before everything else! #include "ns.h" // Must come before everything else!
#include <algorithm>
#include "gamedef.h" #include "gamedef.h"
#include "cheats.h" #include "cheats.h"
@ -2100,11 +2101,6 @@ void C_UndefineLevel(int32_t vol, int32_t lev)
LUNATIC_EXTERN int32_t C_SetDefName(const char *name) LUNATIC_EXTERN int32_t C_SetDefName(const char *name)
{ {
clearDefNamePtr();
g_defNamePtr = dup_filename(name);
if (g_defNamePtr)
initprintf("Using DEF file: %s.\n", g_defNamePtr);
return (g_defNamePtr==NULL);
} }
defaultprojectile_t DefaultProjectile; defaultprojectile_t DefaultProjectile;
@ -4603,8 +4599,8 @@ ifvar:
if (n != i) if (n != i)
{ {
std::swap(&tempscrptr[i], &tempscrptr[n]); std::swap(tempscrptr[i], tempscrptr[n]);
std::swap(&tempscrptr[i+1], &tempscrptr[n+1]); std::swap(tempscrptr[i+1], tempscrptr[n+1]);
} }
} }
// for (j=3;j<3+tempscrptr[1]*2;j+=2)initprintf("%5d %8x\n",tempscrptr[j],tempscrptr[j+1]); // for (j=3;j<3+tempscrptr[1]*2;j+=2)initprintf("%5d %8x\n",tempscrptr[j],tempscrptr[j+1]);
@ -5193,7 +5189,7 @@ repeatcase:
} }
} }
gamename[i] = '\0'; gamename[i] = '\0';
g_gameNamePtr = Xstrdup(gamename); //g_gameName = gamename; never used.
// G_UpdateAppTitle(); // G_UpdateAppTitle();
} }
continue; continue;
@ -5211,7 +5207,7 @@ repeatcase:
} }
tempbuf[j] = '\0'; tempbuf[j] = '\0';
C_SetDefName(tempbuf); //C_SetDefName(tempbuf); Uh, what? We're inside the DEF here!
} }
continue; continue;

View file

@ -0,0 +1,42 @@
#pragma once
// Directory searching routines
// Mirror WIN32_FIND_DATAW in <winbase.h>
struct findstate_t
{
private:
struct WinData
{
uint32_t Attribs;
uint32_t Times[3 * 2];
uint32_t Size[2];
uint32_t Reserved[2];
wchar_t Name[260];
wchar_t AltName[14];
};
WinData FindData;
FString UTF8Name;
friend void *I_FindFirst(const char *filespec, findstate_t *fileinfo);
friend int I_FindNext(void *handle, findstate_t *fileinfo);
friend const char *I_FindName(findstate_t *fileinfo);
friend int I_FindAttr(findstate_t *fileinfo);
};
void *I_FindFirst (const char *filespec, findstate_t *fileinfo);
int I_FindNext (void *handle, findstate_t *fileinfo);
int I_FindClose (void *handle);
const char *I_FindName(findstate_t *fileinfo);
inline int I_FindAttr(findstate_t *fileinfo)
{
return fileinfo->FindData.Attribs;
}
#define FA_RDONLY 0x00000001
#define FA_HIDDEN 0x00000002
#define FA_SYSTEM 0x00000004
#define FA_DIREC 0x00000010
#define FA_ARCH 0x00000020

View file

@ -41,6 +41,7 @@
#include "i_specialpaths.h" #include "i_specialpaths.h"
#include "printf.h" #include "printf.h"
#include "cmdlib.h" #include "cmdlib.h"
#include "i_findfile.h"
//#include "version.h" // for GAMENAME //#include "version.h" // for GAMENAME
// Stuff that needs to be set up later. // Stuff that needs to be set up later.
@ -336,3 +337,61 @@ FString M_GetDocumentsPath()
return path; return path;
} }
//==========================================================================
//
// I_FindFirst
//
// Start a pattern matching sequence.
//
//==========================================================================
void *I_FindFirst(const char *filespec, findstate_t *fileinfo)
{
static_assert(sizeof(WIN32_FIND_DATAW) == sizeof(fileinfo->FindData), "Findata size mismatch");
auto widespec = WideString(filespec);
fileinfo->UTF8Name = "";
return FindFirstFileW(widespec.c_str(), (LPWIN32_FIND_DATAW)&fileinfo->FindData);
}
//==========================================================================
//
// I_FindNext
//
// Return the next file in a pattern matching sequence.
//
//==========================================================================
int I_FindNext(void *handle, findstate_t *fileinfo)
{
fileinfo->UTF8Name = "";
return !FindNextFileW((HANDLE)handle, (LPWIN32_FIND_DATAW)&fileinfo->FindData);
}
//==========================================================================
//
// I_FindClose
//
// Finish a pattern matching sequence.
//
//==========================================================================
int I_FindClose(void *handle)
{
return FindClose((HANDLE)handle);
}
//==========================================================================
//
// I_FindName
//
// Returns the name for an entry
//
//==========================================================================
const char *I_FindName(findstate_t *fileinfo)
{
if (fileinfo->UTF8Name.IsEmpty()) fileinfo->UTF8Name = fileinfo->FindData.Name;
return fileinfo->UTF8Name.GetChars();
}

View file

@ -19,87 +19,6 @@
BEGIN_RR_NS BEGIN_RR_NS
struct grpfile_t const *g_selectedGrp;
int32_t g_gameType = GAMEFLAG_DUKE;
int g_addonNum = 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;
// grp/con handling
static const char *defaultconfilename = "GAME.CON";
static const char *defaultgamegrp[GAMECOUNT] = { "DUKE3D.GRP", "REDNECK.GRP", "REDNECK.GRP", "NAM.GRP", "NAPALM.GRP" };
static const char *defaultdeffilename[GAMECOUNT] = { "duke3d.def", "rr.def", "rrra.def", "nam.def", "napalm.grp" };
static const char *defaultgameconfilename[GAMECOUNT] = { "GAME.CON", "GAME.CON", "GAME.CON", "NAM.CON", "NAPALM.CON" };
const char* G_DefaultGrpFile(void)
{
if (DUKE)
return defaultgamegrp[GAME_DUKE];
else if (RR)
return defaultgamegrp[GAME_RR];
return defaultgamegrp[0];
}
const char* G_DefaultDefFile(void)
{
if (DUKE)
return defaultdeffilename[GAME_DUKE];
else if (RRRA)
return defaultdeffilename[GAME_RRRA];
else if (RR)
return defaultdeffilename[GAME_RR];
return defaultdeffilename[0];
}
const char *G_DefaultConFile(void)
{
/*if (DUKE && testkopen(defaultgameconfilename[GAME_DUKE],0))
return defaultgameconfilename[GAME_DUKE];
else if (WW2GI && testkopen(defaultgameconfilename[GAME_WW2GI],0))
return defaultgameconfilename[GAME_WW2GI];
else */if (NAPALM)
{
if (!testkopen(defaultgameconfilename[GAME_NAPALM],0))
{
if (testkopen(defaultgameconfilename[GAME_NAM],0))
return defaultgameconfilename[GAME_NAM]; // NAM/NAPALM Sharing
}
else
return defaultgameconfilename[GAME_NAPALM];
}
else if (NAM)
{
if (!testkopen(defaultgameconfilename[GAME_NAM],0))
{
if (testkopen(defaultgameconfilename[GAME_NAPALM],0))
return defaultgameconfilename[GAME_NAPALM]; // NAM/NAPALM Sharing
}
else
return defaultgameconfilename[GAME_NAM];
}
return defaultconfilename;
}
const char *G_GrpFile(void)
{
return userConfig.gamegrp.IsNotEmpty()? userConfig.gamegrp.GetChars() : G_DefaultGrpFile();
}
const char *G_DefFile(void)
{
return userConfig.DefaultDef.IsNotEmpty() ? userConfig.DefaultDef.GetChars() : G_DefaultDefFile();
}
const char *G_ConFile(void)
{
return userConfig.DefaultCon.IsNotEmpty() ? userConfig.DefaultCon.GetChars() : G_DefaultConFile();
}
////////// //////////
// Set up new-style multi-psky handling. // Set up new-style multi-psky handling.
@ -183,187 +102,6 @@ void G_SetupGlobalPsky(void)
////////// //////////
static void G_LoadAddon(void);
int32_t g_groupFileHandle;
struct strllist* CommandGrps;
static int32_t G_TryLoadingGrp(char const * const grpfile)
{
int32_t i;
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);
return i;
}
static int32_t G_LoadGrpDependencyChain(grpfile_t const * const grp)
{
if (!grp)
return -1;
if (grp->type->dependency && grp->type->dependency != grp->type->crcval)
G_LoadGrpDependencyChain(FindGroup(grp->type->dependency));
int32_t const i = G_TryLoadingGrp(grp->filename);
if (grp->type->postprocessing)
grp->type->postprocessing(i);
return i;
}
void G_LoadGroups()
{
if (g_modDir[0] != '/')
{
char cwd[BMAX_PATH];
FString g_rootDir = progdir + g_modDir;
addsearchpath(g_rootDir);
// addsearchpath(mod_dir);
char path[BMAX_PATH];
if (getcwd(cwd, BMAX_PATH))
{
Bsnprintf(path, sizeof(path), "%s/%s", cwd, g_modDir);
if (!Bstrcmp(g_rootDir, path))
{
if (addsearchpath(path) == -2)
if (Bmkdir(path, S_IRWXU) == 0)
addsearchpath(path);
}
}
}
if (g_addonNum)
G_LoadAddon();
const char *grpfile;
int32_t i;
if ((i = G_LoadGrpDependencyChain(g_selectedGrp)) != -1)
{
grpfile = g_selectedGrp->filename;
//clearGrpNamePtr();
//g_grpNamePtr = dup_filename(grpfile);
grpinfo_t const * const type = g_selectedGrp->type;
g_gameType = type->game;
g_gameNamePtr = type->name;
//if (type->scriptname && g_scriptNamePtr == NULL)
// g_scriptNamePtr = dup_filename(type->scriptname);
if (type->defname && g_defNamePtr == NULL)
g_defNamePtr = dup_filename(type->defname);
if (type->rtsname)
RTS_Init(type->rtsname);
}
else
{
grpfile = G_GrpFile();
i = G_TryLoadingGrp(grpfile);
}
if (G_AllowAutoload())
{
G_LoadGroupsInDir("autoload");
if (i != -1)
G_DoAutoload(grpfile);
}
if (g_modDir[0] != '/')
G_LoadGroupsInDir(g_modDir);
if (g_defNamePtr == NULL)
{
const char *tmpptr = getenv("DUKE3DDEF");
if (tmpptr)
{
clearDefNamePtr();
g_defNamePtr = dup_filename(tmpptr);
initprintf("Using \"%s\" as definitions file\n", g_defNamePtr);
}
}
loaddefinitions_game(G_DefFile(), TRUE);
}
static void G_LoadAddon(void)
{
int32_t crc = 0; // compiler-happy
switch (g_addonNum)
{
case ADDON_DUKEDC:
crc = DUKEDC_CRC;
break;
case ADDON_NWINTER:
crc = DUKENW_CRC;
break;
case ADDON_CARIBBEAN:
crc = DUKECB_CRC;
break;
}
if (!crc) return;
grpfile_t const * const grp = FindGroup(crc);
if (grp)
g_selectedGrp = grp;
}
//////////
// loads all group (grp, zip, pk3/4) files in the given directory
void G_LoadGroupsInDir(const char *dirname)
{
static const char *extensions[] = { "*.grp", "*.zip", "*.ssi", "*.pk3", "*.pk4" };
char buf[BMAX_PATH];
fnlist_t fnlist = FNLIST_INITIALIZER;
for (auto & extension : extensions)
{
CACHE1D_FIND_REC *rec;
fnlist_getnames(&fnlist, dirname, extension, -1, 0);
for (rec=fnlist.findfiles; rec; rec=rec->next)
{
Bsnprintf(buf, sizeof(buf), "%s/%s", dirname, rec->name);
initprintf("Using group file \"%s\".\n", buf);
initgroupfile(buf);
}
fnlist_clearnames(&fnlist);
}
}
void G_DoAutoload(const char *dirname)
{
char buf[BMAX_PATH];
Bsnprintf(buf, sizeof(buf), "autoload/%s", dirname);
G_LoadGroupsInDir(buf);
}
//////////
void G_LoadLookups(void) void G_LoadLookups(void)
{ {
int32_t j; int32_t j;

View file

@ -14,11 +14,6 @@
BEGIN_RR_NS BEGIN_RR_NS
extern struct grpfile_t const *g_selectedGrp;
extern int32_t g_gameType;
extern int g_addonNum;
#define DUKE (g_gameType & GAMEFLAG_DUKE) #define DUKE (g_gameType & GAMEFLAG_DUKE)
#define RR (g_gameType & GAMEFLAG_RR) #define RR (g_gameType & GAMEFLAG_RR)
#define RRRA (g_gameType & GAMEFLAG_RRRA) #define RRRA (g_gameType & GAMEFLAG_RRRA)
@ -40,26 +35,6 @@ enum Games_t {
GAMECOUNT GAMECOUNT
}; };
enum instpath_t {
INSTPATH_STEAM_DUKE3D_MEGATON,
INSTPATH_STEAM_DUKE3D_3DR,
INSTPATH_GOG_DUKE3D,
INSTPATH_3DR_DUKE3D,
INSTPATH_3DR_ANTH,
//INSTPATH_STEAM_NAM,
//INSTPATH_STEAM_WW2GI,
INSTPATH_GOG_RR,
INSTPATH_GOG_RRRA,
NUMINSTPATHS
};
enum searchpathtypes_t {
SEARCHPATH_REMOVE = 1<<0,
SEARCHPATH_NAM = 1<<1,
SEARCHPATH_RR = 1<<2,
SEARCHPATH_RRRA = 1<<3,
};
typedef enum basepal_ { typedef enum basepal_ {
BASEPAL = 0, BASEPAL = 0,
WATERPAL, WATERPAL,
@ -82,16 +57,7 @@ typedef enum basepal_ {
#define OSD_ERROR OSDTEXT_DARKRED OSDTEXT_BRIGHT #define OSD_ERROR OSDTEXT_DARKRED OSDTEXT_BRIGHT
extern const char *g_gameNamePtr;
extern const char *G_DefaultGrpFile(void);
extern const char *G_GrpFile(void);
extern const char *G_DefaultConFile(void);
extern const char *G_ConFile(void);
extern int loaddefinitions_game(const char *fn, int32_t preload); extern int loaddefinitions_game(const char *fn, int32_t preload);
extern int32_t g_groupFileHandle;
////////// //////////
@ -100,19 +66,6 @@ extern void G_SetupGlobalPsky(void);
////////// //////////
extern void G_AddSearchPaths(void);
extern void G_LoadGroups();
extern const char * G_GetInstallPath(int32_t insttype);
//////////
void G_LoadGroupsInDir(const char *dirname);
void G_DoAutoload(const char *dirname);
//////////
extern void G_LoadLookups(void); extern void G_LoadLookups(void);
////////// //////////

View file

@ -45,6 +45,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include "gamecvars.h" #include "gamecvars.h"
#include "gameconfigfile.h" #include "gameconfigfile.h"
#include "printf.h" #include "printf.h"
#include "m_argv.h"
#include "filesystem/filesystem.h" #include "filesystem/filesystem.h"
// Uncomment to prevent anything except mirrors from drawing. It is sensible to // Uncomment to prevent anything except mirrors from drawing. It is sensible to
@ -72,10 +73,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
BEGIN_RR_NS BEGIN_RR_NS
extern const char* G_DefaultDefFile(void);
extern const char* G_DefFile(void);
int32_t g_quitDeadline = 0; int32_t g_quitDeadline = 0;
int32_t g_cameraDistance = 0, g_cameraClock = 0; int32_t g_cameraDistance = 0, g_cameraClock = 0;
@ -7022,7 +7019,7 @@ int loaddefinitions_game(const char *fileName, int32_t firstPass)
if (pScript) if (pScript)
parsedefinitions_game(pScript, firstPass); parsedefinitions_game(pScript, firstPass);
for (char const * m : g_defModules) for (auto& m : *userConfig.AddDefs)
parsedefinitions_game_include(m, NULL, "null", firstPass); parsedefinitions_game_include(m, NULL, "null", firstPass);
if (pScript) if (pScript)
@ -7148,8 +7145,6 @@ static void G_CompileScripts(void)
Bmemset(sprite, 0, MAXSPRITES*sizeof(spritetype)); Bmemset(sprite, 0, MAXSPRITES*sizeof(spritetype));
Bmemset(sector, 0, MAXSECTORS*sizeof(sectortype)); Bmemset(sector, 0, MAXSECTORS*sizeof(sectortype));
Bmemset(wall, 0, MAXWALLS*sizeof(walltype)); Bmemset(wall, 0, MAXWALLS*sizeof(walltype));
pathsearchmode = psm;
} }
static inline void G_CheckGametype(void) static inline void G_CheckGametype(void)
@ -7539,12 +7534,6 @@ static int G_EndOfLevel(void)
return 1; return 1;
} }
void app_crashhandler(void)
{
G_CloseDemoWrite();
G_GameQuit();
}
#if defined(_WIN32) && defined(DEBUGGINGAIDS) #if defined(_WIN32) && defined(DEBUGGINGAIDS)
// See FILENAME_CASE_CHECK in cache1d.c // See FILENAME_CASE_CHECK in cache1d.c
static int32_t check_filename_casing(void) static int32_t check_filename_casing(void)
@ -7603,8 +7592,6 @@ int app_main()
g_logFlushWindow = 0; g_logFlushWindow = 0;
G_LoadGroups();
// flushlogwindow = 1;
if (RR) if (RR)
{ {
@ -7693,9 +7680,7 @@ int app_main()
} }
loaddefinitions_game(defsfile, FALSE); loaddefinitions_game(defsfile, FALSE);
for (char * m : g_defModules) userConfig.AddDefs.reset();
free(m);
g_defModules.clear();
if (enginePostInit()) if (enginePostInit())
G_FatalEngineError(); G_FatalEngineError();
@ -8442,18 +8427,12 @@ void A_SpawnRandomGlass(int spriteNum, int wallNum, int glassCnt)
extern void faketimerhandler(); extern void faketimerhandler();
extern int app_main(); extern int app_main();
extern void app_crashhandler(void);
GameInterface Interface = { GameInterface Interface = {
TICRATE,
faketimerhandler, faketimerhandler,
app_main, app_main,
validate_hud, validate_hud,
set_hud_layout, set_hud_layout,
set_hud_scale, set_hud_scale,
app_crashhandler,
G_DefaultDefFile,
G_DefFile,
}; };
END_RR_NS END_RR_NS

View file

@ -13,43 +13,6 @@
BEGIN_SW_NS BEGIN_SW_NS
static const char *defaultgrpfilename = "SW.GRP";
static const char *defaultdeffilename = "sw.def";
// g_grpNamePtr can ONLY point to a malloc'd block (length BMAX_PATH)
char *g_grpNamePtr = NULL;
void clearGrpNamePtr(void)
{
Bfree(g_grpNamePtr);
// g_grpNamePtr assumed to be assigned to right after
}
const char *G_DefaultGrpFile(void)
{
return defaultgrpfilename;
}
const char *G_GrpFile(void)
{
if (g_grpNamePtr == NULL)
return G_DefaultGrpFile();
else
return g_grpNamePtr;
}
const char *G_DefaultDefFile(void)
{
return defaultdeffilename;
}
const char *G_DefFile(void)
{
if (g_defNamePtr == NULL)
return G_DefaultDefFile();
else
return g_defNamePtr;
}
void SW_InitMultiPsky(void) void SW_InitMultiPsky(void)
{ {
// default // default
@ -58,8 +21,6 @@ void SW_InitMultiPsky(void)
defaultsky->horizfrac = 8192; defaultsky->horizfrac = 8192;
} }
void SW_CleanupSearchPaths() void SW_CleanupSearchPaths()
{ {
} }

View file

@ -129,13 +129,6 @@ BEGIN_SW_NS
extern int g_useCwd; extern int g_useCwd;
extern char *g_grpNamePtr;
const char *G_DefaultGrpFile(void);
const char *G_GrpFile(void);
void clearGrpNamePtr(void);
void SW_InitMultiPsky(void); void SW_InitMultiPsky(void);
void SW_ExtPreInit(int32_t argc, char const * const * argv); void SW_ExtPreInit(int32_t argc, char const * const * argv);

View file

@ -92,6 +92,7 @@ Things required to make savegames work:
#include "common_game.h" #include "common_game.h"
#include "gameconfigfile.h" #include "gameconfigfile.h"
#include "printf.h" #include "printf.h"
#include "m_argv.h"
//#include "crc32.h" //#include "crc32.h"
@ -103,8 +104,6 @@ signed char MNU_InputString(char*, short);
SWBOOL IsCommand(char* str); SWBOOL IsCommand(char* str);
SWBOOL MNU_StartNetGame(void); SWBOOL MNU_StartNetGame(void);
const char* G_DefFile(void);
const char* AppProperName = "VoidSW"; const char* AppProperName = "VoidSW";
const char* AppTechnicalName = "voidsw"; const char* AppTechnicalName = "voidsw";
@ -862,7 +861,6 @@ InitGame()
if (engineInit()) if (engineInit())
SW_FatalEngineError(); SW_FatalEngineError();
//initgroupfile(G_GrpFile()); // JBF: moving this close to start of program to detect shareware
InitAutoNet(); InitAutoNet();
timerInit(120); timerInit(120);
@ -976,9 +974,7 @@ InitGame()
if (!loaddefinitionsfile(G_DefFile())) buildputs("Definitions file loaded.\n"); if (!loaddefinitionsfile(G_DefFile())) buildputs("Definitions file loaded.\n");
for (char * m : g_defModules) userConfig.AddDefs.reset();
free(m);
g_defModules.clear();
if (enginePostInit()) if (enginePostInit())
SW_FatalEngineError(); SW_FatalEngineError();
@ -3350,7 +3346,6 @@ int32_t app_main()
I_Error("There was a problem initialising the Build engine: %s", engineerrstr); I_Error("There was a problem initialising the Build engine: %s", engineerrstr);
} }
initgroupfile(G_GrpFile());
if (!DetectShareware()) if (!DetectShareware())
{ {
if (SW_SHAREWARE) buildputs("Detected shareware GRP\n"); if (SW_SHAREWARE) buildputs("Detected shareware GRP\n");
@ -3375,468 +3370,6 @@ int32_t app_main()
UserMapName[0] = '\0'; UserMapName[0] = '\0';
//LocationInfo = TRUE;
#if 0
//#if DEBUG && SYNC_TEST
// automatically record a demo
DemoRecording = TRUE;
DemoPlaying = FALSE;
PreCaching = TRUE;
DemoRecCnt = 0;
strcpy(DemoFileName, "DMOTEST.DMO");
//DemoSyncRecord = TRUE;
#endif
#if DEBUG
{
FILE *fout;
if ((fout = fopen("dbg.foo", "wb")) != NULL)
{
fprintf(fout, "Whoo-oo-ooooo wants some wang?\n");
fclose(fout);
}
}
#endif
#if 0
for (cnt = 1; cnt < argc; cnt++)
{
char const *arg = argv[cnt];
if (*arg != '/' && *arg != '-') continue;
if (firstnet > 0)
{
arg++;
switch (arg[0])
{
case 'n':
case 'N':
if (arg[1] == '0')
{
NetBroadcastMode = FALSE;
buildputs("Network mode: master/slave\n");
wm_msgbox("Multiplayer Option Error",
"This release unfortunately does not support a master-slave networking "
"mode because of certain bugs we have not been able to locate and fix "
"at this time. However, peer-to-peer networking has been found to be "
"playable, so we suggest attempting to use that for now. Details can be "
"found in the release notes. Sorry for the inconvenience.");
return 0;
}
else if (arg[1] == '1')
{
NetBroadcastMode = TRUE;
buildputs("Network mode: peer-to-peer\n");
}
break;
default:
break;
}
continue;
}
// Store arg in command line array!
CON_StoreArg(arg);
arg++;
if (Bstrncasecmp(arg, "autonet",7) == 0)
{
AutoNet = TRUE;
cnt++;
sscanf(argv[cnt],"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",&Auto.Rules,&Auto.Level,&Auto.Enemy,&Auto.Markers,
&Auto.Team,&Auto.HurtTeam,&Auto.Kill,&Auto.Time,&Auto.Color,&Auto.Nuke);
}
else if (Bstrncasecmp(arg, "turnscale",9) == 0)
{
if (cnt <= argc-2)
{
cnt++;
sscanf(argv[cnt], "%d",&turn_scale);
}
}
else if (Bstrncasecmp(arg, "movescale",9) == 0)
{
if (cnt <= argc-2)
{
cnt++;
sscanf(argv[cnt], "%d",&move_scale);
}
}
else if (Bstrncasecmp(arg, "extcompat",9) == 0)
{
move_scale *= 5;
turn_scale *= 5;
}
else if (Bstrncasecmp(arg, "setupfile",8) == 0)
{
// Passed by setup.exe
// skip setupfile name
cnt++;
}
else if (Bstrncasecmp(arg, "net",3) == 0)
{
if (cnt+1 < argc)
{
firstnet = cnt+1;
}
}
#if DEBUG
else if (Bstrncasecmp(arg, "debug",5) == 0)
{
#ifdef RENDERTYPEWIN
char *str;
int strl;
strl = 24 + 70;
for (i=0; i < (int)SIZ(cli_dbg_arg); i++)
strl += strlen(cli_dbg_arg[i].arg_fmt) + 1 + strlen(cli_dbg_arg[i].arg_descr) + 1;
str = (char *)malloc(strl);
if (str)
{
strcpy(str,
"Usage: sw [options]\n"
"options: ('/' may be used instead of '-', <> text is optional)\n\n"
);
for (i=0; i < (int)SIZ(cli_dbg_arg); i++)
{
strcat(str, cli_dbg_arg[i].arg_fmt);
strcat(str, "\t");
strcat(str, cli_dbg_arg[i].arg_descr);
strcat(str, "\n");
}
wm_msgbox("Shadow Warrior Debug Help",str);
free(str);
}
#else
printf("Usage: %s [options]\n", argv[0]);
printf("options: ('/' may be used instead of '-', <> text is optional)\n\n");
for (i = 0; i < (int)SIZ(cli_dbg_arg); i++)
{
if (cli_dbg_arg[i].arg_fmt)
{
printf(" %-20s %-30s\n",cli_dbg_arg[i].arg_fmt, cli_dbg_arg[i].arg_descr);
}
}
#endif
swexit(0);
}
#endif
else if (Bstrncasecmp(arg, "short",5) == 0)
{
ShortGameMode = TRUE;
}
else if (Bstrncasecmp(arg, "nodemo",6) == 0)
{
NoDemoStartup = TRUE;
}
else if (Bstrncasecmp(arg, "allsync",3) == 0)
{
NumSyncBytes = 8;
}
else if (Bstrncasecmp(arg, "name",4) == 0)
{
if (cnt <= argc-2)
{
strncpy(PlayerNameArg, argv[++cnt], SIZ(PlayerNameArg)-1);
PlayerNameArg[SIZ(PlayerNameArg)-1] = '\0';
}
}
else if (Bstrncasecmp(arg, "f8",2) == 0)
{
MovesPerPacket = 8;
}
else if (Bstrncasecmp(arg, "f4",2) == 0)
{
MovesPerPacket = 4;
}
else if (Bstrncasecmp(arg, "f2",2) == 0)
{
MovesPerPacket = 2;
}
else if (Bstrncasecmp(arg, "monst", 5) == 0)
{
DebugActor = TRUE;
}
else if (Bstrncasecmp(arg, "nopredict",6) == 0)
{
extern SWBOOL PredictionOn;
PredictionOn = FALSE;
}
else if (Bstrncasecmp(arg, "col", 3) == 0)
// provides a way to force the player color for joiners
// since -autonet does not seem to work for them
{
int temp;
cnt++;
sscanf(argv[cnt],"%d",&temp);
AutoColor = temp;
HasAutoColor = TRUE;
}
else if (Bstrncasecmp(arg, "level", 5) == 0)
{
if (strlen(arg) > 5)
{
strcpy(UserMapName,LevelInfo[atoi(&arg[5])].LevelName);
}
}
else if (Bstrncasecmp(arg, "s", 1) == 0)
{
if (strlen(arg) > 1)
Skill = atoi(&arg[1])-1;
Skill = max(Skill,short(0));
Skill = min(Skill,short(3));
}
else if (Bstrncasecmp(arg, "commbat", 7) == 0)
{
if (strlen(arg) > 7)
{
FakeMultiNumPlayers = atoi(&arg[7]);
gNet.MultiGameType = MULTI_GAME_COMMBAT;
}
}
else
/* bots suck, bye bye!
#ifndef SW_SHAREWARE
if (memcmp(argv[cnt], "-bots", 5) == 0)
{
if (strlen(argv[cnt]) > 5)
{
FakeMultiNumPlayers = atoi(&argv[cnt][5]);
printf("Adding %d BOT(s) to the game!\n",FakeMultiNumPlayers);
gNet.MultiGameType = MULTI_GAME_AI_BOTS;
BotMode = TRUE;
}
}
else
#endif
*/
if (Bstrncasecmp(arg, "nometers", 8) == 0)
{
NoMeters = TRUE;
}
else if (Bstrncasecmp(arg, "coop", 4) == 0)
{
if (strlen(arg) > 4)
{
FakeMultiNumPlayers = atoi(&arg[4]);
gNet.MultiGameType = MULTI_GAME_COOPERATIVE;
}
}
else if (FALSE && Bstrncasecmp(arg, "ddr", 3) == 0)
{
//NumSyncBytes = 8;
DemoRecording = TRUE;
DemoPlaying = FALSE;
DemoRecCnt = 0;
DemoDebugMode = TRUE;
if (strlen(arg) > 3)
{
strcpy(DemoFileName, &arg[2]);
if (strchr(DemoFileName, '.') == 0)
strcat(DemoFileName, ".dmo");
}
}
else if (FALSE && Bstrncasecmp(arg, "dr", 2) == 0)
{
//NumSyncBytes = 8;
DemoRecording = TRUE;
DemoPlaying = FALSE;
DemoRecCnt = 0;
if (strlen(arg) > 2)
{
strcpy(DemoFileName, &arg[2]);
if (strchr(DemoFileName, '.') == 0)
strcat(DemoFileName, ".dmo");
}
}
else if (FALSE && Bstrncasecmp(arg, "dp", 2) == 0)
{
DemoPlaying = TRUE;
DemoRecording = FALSE;
PreCaching = TRUE;
if (strlen(arg) > 2)
{
strcpy(DemoFileName, &arg[2]);
if (strchr(DemoFileName, '.') == 0)
strcat(DemoFileName, ".dmo");
}
}
#if 0 //def NET_MODE_MASTER_SLAVE
else if (Bstrncasecmp(arg, "masterslave",6) == 0)
{
NetModeOverride = TRUE;
NetBroadcastMode = FALSE;
}
else if (Bstrncasecmp(arg, "broadcast",5) == 0)
{
NetModeOverride = TRUE;
NetBroadcastMode = TRUE;
}
#endif
else if (Bstrncasecmp(arg, "cheat",5) == 0)
{
ArgCheat = TRUE;
}
else if (Bstrncasecmp(arg, "demosynctest",12) == 0)
{
NumSyncBytes = 8;
DemoSyncTest = TRUE;
DemoSyncRecord = FALSE;
}
else if (Bstrncasecmp(arg, "demosyncrecord",12) == 0)
{
NumSyncBytes = 8;
DemoSyncTest = FALSE;
DemoSyncRecord = TRUE;
}
else if (Bstrncasecmp(arg, "cam",3) == 0)
{
CameraTestMode = TRUE;
}
#if DEBUG
else if (FALSE && Bstrncasecmp(arg, "de", 2) == 0)
{
#if DEMO_FILE_TYPE == DEMO_FILE_GROUP
DemoPlaying = TRUE;
DemoRecording = FALSE;
if (strlen(arg) > 2)
{
strcpy(DemoFileName, &arg[2]);
if (strchr(DemoFileName, '.') == 0)
strcat(DemoFileName, ".dmo");
}
#else
DemoEdit = TRUE;
DemoPlaying = TRUE;
DemoRecording = FALSE;
if (strlen(arg) > 2)
{
strcpy(DemoFileName, &arg[2]);
if (strchr(DemoFileName, '.') == 0)
strcat(DemoFileName, ".dmo");
}
#endif
}
else if (Bstrncasecmp(arg, "randprint",5) == 0)
{
RandomPrint = TRUE;
}
else if (Bstrncasecmp(arg, "level", 5) == 0)
{
if (strlen(arg) > 5)
{
strcpy(UserMapName,LevelInfo[atoi(&arg[5])].LevelName);
}
}
else if (Bstrncasecmp(arg, "debugsecret", 10) == 0)
{
extern SWBOOL DebugSecret;
DebugSecret = TRUE;
}
else if (Bstrncasecmp(arg, "debugactor", 10) == 0)
{
DebugActor = TRUE;
}
else if (Bstrncasecmp(arg, "mono", 4) == 0)
{
DispMono = TRUE;
}
else if (Bstrncasecmp(arg, "debugso", 7) == 0)
{
DebugSO = TRUE;
}
else if (Bstrncasecmp(arg, "nosyncprint",10) == 0)
{
extern SWBOOL SyncPrintMode;
SyncPrintMode = FALSE;
}
else if (Bstrncasecmp(arg, "debuganim", 9) == 0)
{
DebugAnim = TRUE;
}
else if (Bstrncasecmp(arg, "debugsector", 11) == 0)
{
DebugSector = TRUE;
}
else if (Bstrncasecmp(arg, "debugpanel", 10) == 0)
{
DebugPanel = TRUE;
}
else if (FALSE && Bstrncasecmp(arg, "dt", 2) == 0)
{
if (strlen(arg) > 2)
{
strcpy(DemoTmpName, &arg[2]);
if (strchr(DemoFileName, '.') == 0)
strcat(DemoFileName, ".dmo");
}
}
else if (Bstrncasecmp(arg, "nodemo", 6) == 0)
{
DemoRecording = FALSE;
DemoPlaying = FALSE;
PreCaching = TRUE;
DemoRecCnt = 0;
DemoSyncTest = FALSE;
DemoSyncRecord = FALSE;
}
#endif
else if (Bstrncasecmp(arg, "map", 3) == 0 && !SW_SHAREWARE)
{
int fil;
strcpy(UserMapName, argv[++cnt]);
if (strchr(UserMapName, '.') == 0)
strcat(UserMapName, ".map");
if (!testkopen(UserMapName,0))
{
#ifdef RENDERTYPEWIN
char msg[256];
Bsnprintf(msg, 256, "ERROR: Could not find user map %s!",UserMapName);
wm_msgbox(apptitle, msg);
#else
printf("ERROR: Could not find user map %s!\n\n",UserMapName);
#endif
swexit(0);
}
}
else if (Bstrncasecmp(arg, "g", 1) == 0 && !SW_SHAREWARE)
{
if (strlen(arg) > 1)
{
if (initgroupfile(arg+1) >= 0)
buildprintf("Added %s\n", arg+1);
}
}
else if (Bstrncasecmp(arg, "h", 1) == 0 && !SW_SHAREWARE)
{
if (strlen(arg) > 1)
G_AddDef(arg+1);
}
else if (Bstrncasecmp(arg, "mh", 1) == 0 && !SW_SHAREWARE)
{
if (strlen(arg) > 1)
G_AddDefModule(arg+1);
}
}
#endif
Control(); Control();
return 0; return 0;
@ -5502,7 +5035,6 @@ StdRandomRange(int range)
// [JM] Probably will need some doing over. !CHECKME! // [JM] Probably will need some doing over. !CHECKME!
void M32RunScript(const char *s) { UNREFERENCED_PARAMETER(s); } void M32RunScript(const char *s) { UNREFERENCED_PARAMETER(s); }
void G_Polymer_UnInit(void) { } void G_Polymer_UnInit(void) { }
void app_crashhandler(void) { }
int osdcmd_restartvid(const osdfuncparm_t *parm) int osdcmd_restartvid(const osdfuncparm_t *parm)
{ {
@ -5537,20 +5069,15 @@ saveable_module saveable_build =
extern void faketimerhandler(); extern void faketimerhandler();
extern int app_main(); extern int app_main();
extern void app_crashhandler(void);
/*extern*/ bool validate_hud(int requested_size) { return requested_size; } /*extern*/ bool validate_hud(int requested_size) { return requested_size; }
/*extern*/ void set_hud(int requested_size) { /* the relevant setting is gs.BorderNum */} /*extern*/ void set_hud(int requested_size) { /* the relevant setting is gs.BorderNum */}
GameInterface Interface = { GameInterface Interface = {
140, // Huh?
faketimerhandler, faketimerhandler,
app_main, app_main,
validate_hud, validate_hud,
set_hud, set_hud,
set_hud, set_hud,
app_crashhandler,
G_DefFile,
G_DefFile,
}; };
// vim:ts=4:sw=4:expandtab: // vim:ts=4:sw=4:expandtab: