//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // //=============================================================================// #ifndef FILESYSTEM_INIT_H #define FILESYSTEM_INIT_H #ifdef _WIN32 #pragma once #endif #include "filesystem.h" // If this option is on the command line, then filesystem_init won't bring up // the vconfig dialog even if FS_ERRORMODE_VCONFIG is used. #define CMDLINEOPTION_NOVCONFIG "-NoVConfig" #define GAMEDIR_TOKEN "VProject" #if defined(_WIN32) || defined(WIN32) #define PATHSEPARATOR(c) ((c) == '\\' || (c) == '/') #else //_WIN32 #define PATHSEPARATOR(c) ((c) == '/') #endif //_WIN32 enum FSReturnCode_t { FS_OK, FS_MISSING_GAMEINFO_FILE, FS_INVALID_GAMEINFO_FILE, FS_INVALID_PARAMETERS, FS_UNABLE_TO_INIT, FS_MISSING_STEAM_DLL }; enum FSErrorMode_t { FS_ERRORMODE_AUTO, // Call Error() in case of an error. FS_ERRORMODE_VCONFIG, // Call Error() for errors and run vconfig when // appropriate. FS_ERRORMODE_NONE, // Just return FSReturnCode values and setup the string // for FileSystem_GetLastErrorString. }; class CFSSteamSetupInfo { public: CFSSteamSetupInfo(); // Inputs. public: // If this is set, then the init code will look in this directory up to the // root for gameinfo.txt. It must be set for FileSystem_LoadSearchPaths to // work. // // (default: null) const char *m_pDirectoryName; // If this is true, then it won't look at -vproject, -game, or the vproject // environment variable to find gameinfo.txt. If this is true, then // m_pDirectoryName must be set. // // (default: false) bool m_bOnlyUseDirectoryName; // If this is true, then: // 1. It will set the environment variables that steam.dll looks at for // startup info. // 2. It will look for ToolsAppId in the gameinfo.txt file and load the // steam caches associated with that cache if it's there. This is so apps // like Hammer and hlmv can load the main steam caches (like for // Counter-Strike or Half-Life 2), and also load the caches that include // tools-specific materials (materials\editor, materials\debug, etc). // // (default: true - should be FALSE for the engine) bool m_bToolsMode; // If this is true, and m_bToolsMode is false, then it will append the path // to steam.dll to the PATH environment variable. This makes it so you can // run the engine under Steam without having to copy steam.dll up into your // hl2.exe folder. (default: false) bool m_bSetSteamDLLPath; // Are we loading the Steam filesystem? This should be the same value that // FileSystem_GetFileSystemDLLName gave you. bool m_bSteam; // If this is true, then it won't look for a gameinfo.txt. // // (default: false) bool m_bNoGameInfo; // Outputs (if it returns FS_OK). public: char m_GameInfoPath[512]; // The directory that gameinfo.txt lives in. }; class CFSLoadModuleInfo : public CFSSteamSetupInfo { public: CFSLoadModuleInfo(); // Inputs. public: // Full path to the file system DLL (gotten from // FileSystem_GetFileSystemDLLName). const char *m_pFileSystemDLLName; // Passed to IFileSystem::Connect. CreateInterfaceFn m_ConnectFactory; // Outputs (if it returns FS_OK). public: // The filesystem you got from FileSystem_LoadFileSystemModule. IFileSystem *m_pFileSystem; CSysModule *m_pModule; }; class CFSMountContentInfo { public: CFSMountContentInfo(); // Inputs. public: // See CFSLoadModuleInfo::m_bToolsMode (this valid should always be the same // as you passed to CFSLoadModuleInfo::m_bToolsMode). bool m_bToolsMode; // This specifies the directory where gameinfo.txt is. This must be set. // It can come from CFSLoadModuleInfo::m_GameInfoPath. const char *m_pDirectoryName; // Gotten from CFSLoadModuleInfo::m_pFileSystem. IFileSystem *m_pFileSystem; }; class CFSSearchPathsInit { public: CFSSearchPathsInit(); // Inputs. public: // This specifies the directory where gameinfo.txt is. This must be set. const char *m_pDirectoryName; // If this is set, then any search paths with a _english will be replaced // with _m_pLanguage and added before the _english path (default: null) const char *m_pLanguage; // This is the filesystem FileSystem_LoadSearchPaths is talking to. IFileSystem *m_pFileSystem; bool m_bMountHDContent; bool m_bLowViolence; // Outputs. public: // This is the location of the first search path called "game", which also // becomes your "mod" search path. char m_ModPath[512]; }; const char *GetVProjectCmdLineValue(); // Call this to use a bin directory relative to VPROJECT void FileSystem_UseVProjectBinDir(bool bEnable); // This is used by all things that use the application framework: // Note that the application framework automatically takes care of step 1 if you // use CSteamApplication. Step 1: Ask filesystem_init for the name of the // filesystem DLL to load FSReturnCode_t FileSystem_GetFileSystemDLLName(char *pFileSystemDLL, int nMaxLen, bool &bSteam); // Step 2: Use filesystem framework to load/connect/init that filesystem DLL // -or- just set up the steam environment and get back the gameinfo.txt path // The second method is used by the application framework, which wants to // connect/init the filesystem itself FSReturnCode_t FileSystem_LoadFileSystemModule(CFSLoadModuleInfo &info); FSReturnCode_t FileSystem_SetupSteamEnvironment(CFSSteamSetupInfo &info); // Step 3: Ask filesystem_init to set up the executable search path, and mount // the steam content based on the mod gameinfo.txt file FSReturnCode_t FileSystem_MountContent(CFSMountContentInfo &fsInfo); // Step 4: Load the search paths out of pGameDirectory\gameinfo.txt. FSReturnCode_t FileSystem_LoadSearchPaths(CFSSearchPathsInit &initInfo); // This is automatically done during step 3, but if you want to redo all the // search paths (like Hammer does), you can call this to reset executable_path. FSReturnCode_t FileSystem_SetBasePaths(IFileSystem *pFileSystem); // Utility function to add the PLATFORM search path. void FileSystem_AddSearchPath_Platform(IFileSystem *pFileSystem, const char *szGameInfoPath); // See FSErrorMode_t. If you don't specify one here, then the default is // FS_ERRORMODE_VCONFIG. void FileSystem_SetErrorMode(FSErrorMode_t errorMode = FS_ERRORMODE_VCONFIG); bool FileSystem_GetExecutableDir(char *exedir, int exeDirLen); // Clear SteamAppUser, SteamUserPassphrase, and SteamAppId from this process's // environment. // TODO: always do this after LoadFileSysteModule.. there's no reason it should // be in the environment. void FileSystem_ClearSteamEnvVars(); // Find the steam.cfg above you for optional stuff FSReturnCode_t GetSteamCfgPath(char *steamCfgPath, int steamCfgPathLen); // Returns the last error. const char *FileSystem_GetLastErrorString(); void Q_getwd(char *out, int outSize); #endif // FILESYSTEM_INIT_H