OpParam::OpParam(const C *opnm,I nargs): opname(opnm),frames(0),args(0),arg(NULL), /*part(false),*/ ovrlap(false),revdir(false),oddrem(false) { InitArgs(nargs); }
// Initialise PhysicsFS, set up basic search paths and add arguments from .ini file. // The .ini file can be in either the user directory or the same directory as the program. // The user directory is searched first. void PHYSFSX_init(int argc, char *argv[]) { #if defined(__unix__) const char *path = NULL; #endif #ifdef macintosh // Mac OS 9 char base_dir[PATH_MAX]; int bundle = 0; #else #define base_dir PHYSFS_getBaseDir() #endif PHYSFS_init(argv[0]); atexit(PHYSFSX_deinit); PHYSFS_permitSymbolicLinks(1); #ifdef macintosh strcpy(base_dir, PHYSFS_getBaseDir()); if (strstr(base_dir, ".app:Contents:MacOSClassic")) // the Mac OS 9 program is still in the .app bundle { char *p; bundle = 1; if (base_dir[strlen(base_dir) - 1] == ':') base_dir[strlen(base_dir) - 1] = '\0'; p = strrchr(base_dir, ':'); *p = '\0'; // path to 'Contents' p = strrchr(base_dir, ':'); *p = '\0'; // path to bundle p = strrchr(base_dir, ':'); *p = '\0'; // path to directory containing bundle } #endif #if (defined(__APPLE__) && defined(__MACH__)) // others? chdir(base_dir); // make sure relative hogdir paths work #endif #if defined(__unix__) char fullPath[PATH_MAX + 5]; # if !(defined(__APPLE__) && defined(__MACH__)) path = "~/.d2x-rebirth/"; # else path = "~/Library/Preferences/D2X Rebirth/"; # endif if (path[0] == '~') // yes, this tilde can be put before non-unix paths. { const char *home = PHYSFS_getUserDir(); strcpy(fullPath, home); // prepend home to the path path++; if (*path == *PHYSFS_getDirSeparator()) path++; strncat(fullPath, path, PATH_MAX + 5 - strlen(home)); } else strncpy(fullPath, path, PATH_MAX + 5); PHYSFS_setWriteDir(fullPath); if (!PHYSFS_getWriteDir()) { // need to make it char *p; char ancestor[PATH_MAX + 5]; // the directory which actually exists char child[PATH_MAX + 5]; // the directory relative to the above we're trying to make strcpy(ancestor, fullPath); while (!PHYSFS_getWriteDir() && ((p = strrchr(ancestor, *PHYSFS_getDirSeparator())))) { if (p[1] == 0) { // separator at the end (intended here, for safety) *p = 0; // kill this separator if (!((p = strrchr(ancestor, *PHYSFS_getDirSeparator())))) break; // give up, this is (usually) the root directory } p[1] = 0; // go to parent PHYSFS_setWriteDir(ancestor); } strcpy(child, fullPath + strlen(ancestor)); for (p = child; (p = strchr(p, *PHYSFS_getDirSeparator())); p++) *p = '/'; PHYSFS_mkdir(child); PHYSFS_setWriteDir(fullPath); } PHYSFS_addToSearchPath(PHYSFS_getWriteDir(), 1); #endif PHYSFS_addToSearchPath(base_dir, 1); InitArgs( argc,argv ); PHYSFS_removeFromSearchPath(base_dir); if (!PHYSFS_getWriteDir()) { PHYSFS_setWriteDir(base_dir); if (!PHYSFS_getWriteDir()) Error("can't set write dir: %s\n", PHYSFS_getLastError()); else PHYSFS_addToSearchPath(PHYSFS_getWriteDir(), 0); } //tell PHYSFS where hogdir is if (GameArg.SysHogDir) PHYSFS_addToSearchPath(GameArg.SysHogDir,1); #if defined(__unix__) else if (!GameArg.SysNoHogDir) PHYSFS_addToSearchPath(SHAREPATH, 1); #endif PHYSFSX_addRelToSearchPath("data", 1); // 'Data' subdirectory // For Macintosh, add the 'Resources' directory in the .app bundle to the searchpaths #if defined(__APPLE__) && defined(__MACH__) { ProcessSerialNumber psn = { 0, kCurrentProcess }; FSRef fsref; OSStatus err; err = GetProcessBundleLocation(&psn, &fsref); if (err == noErr) err = FSRefMakePath(&fsref, (ubyte *)fullPath, PATH_MAX); if (err == noErr) { strncat(fullPath, "/Contents/Resources/", PATH_MAX + 4 - strlen(fullPath)); fullPath[PATH_MAX + 4] = '\0'; PHYSFS_addToSearchPath(fullPath, 1); } } #elif defined(macintosh) if (bundle) { base_dir[strlen(base_dir)] = ':'; // go back in the bundle base_dir[strlen(base_dir)] = ':'; // go back in 'Contents' strncat(base_dir, ":Resources:", PATH_MAX - 1 - strlen(base_dir)); base_dir[PATH_MAX - 1] = '\0'; PHYSFS_addToSearchPath(base_dir, 1); } #endif }
int Initialize (int argc, char *argv[]) { /*---*/PrintLog ("Initializing data\n"); gameData.time.xGameTotal = 0; signal (SIGABRT, D2SignalHandler); signal (SIGFPE, D2SignalHandler); signal (SIGILL, D2SignalHandler); signal (SIGINT, D2SignalHandler); signal (SIGSEGV, D2SignalHandler); signal (SIGTERM, D2SignalHandler); #ifdef _WIN32 SDL_SetSpecialKeyHandling (0); #endif hogFileManager.Init ("", ""); InitGameStates (); gameData.Init (); InitExtraGameInfo (); InitNetworkData (); InitGameOptions (0); InitArgs (argc, argv); GetAppFolders (); if (FindArg ("-debug-printlog") || FindArg ("-printlog")) { char fnErr [FILENAME_LEN]; #ifdef __unix__ sprintf (fnErr, "%s/d2x.log", getenv ("HOME")); fErr = fopen (fnErr, "wt"); #else sprintf (fnErr, "%s/d2x.log", gameFolders.szGameDir); fErr = fopen (fnErr, "wt"); #endif } PrintLog ("%s\n", DESCENT_VERSION); InitArgs (argc, argv); GetAppFolders (); #ifdef D2X_MEM_HANDLER MemInit (); #endif error_init (NULL, NULL); *szAutoHogFile = *szAutoMission = '\0'; EvalArgs (); InitGameOptions (1); DefaultAllSettings (); gameOpts->render.nMathFormat = gameOpts->render.nDefMathFormat; /*---*/PrintLog ("Loading text resources\n"); /*---*/PrintLog ("Loading main hog file\n"); if (!(hogFileManager.Init ("descent2.hog", gameFolders.szDataDir) || (gameStates.app.bDemoData = hogFileManager.Init ("d2demo.hog", gameFolders.szDataDir)))) { /*---*/PrintLog ("Descent 2 data not found\n"); Error (TXT_NO_HOG2); } LoadGameTexts (); /*---*/PrintLog ("Reading configuration file\n"); ReadConfigFile (); if (!InitGraphics ()) return 1; console.Setup (SMALL_FONT, &screen, CON_NUM_LINES, 0, 0, screen.Width (), screen.Height () / 2); if (gameStates.app.bProgressBars && gameOpts->menus.nStyle) InitializeGauge (); else { CMenu m (1); int key = 0; m.AddGauge ("", -1, 1000); // dummy for InitializePoll() messageBox.Show (TXT_INITIALIZING); for (loadOp = 0; loadOp < InitGaugeSize (); ) InitializePoll (m, key, 0, 0); } messageBox.Clear (); PrintBanner (); if (!gameStates.app.bAutoRunMission) { /*---*/PrintLog ("Showing title screens\n"); if (!ShowTitleScreens ()) ShowLoadingScreen (); } if (FindArg ("-norun")) return 0; /*---*/PrintLog ("Loading hires models\n"); LoadHiresModels (0); LoadModelData (); ogl.InitShaders (); //required for some menus to show all possible choices return 0; }