/* * OpenClonk, http://www.openclonk.org * * Copyright (c) 1998-2000, Matthes Bender * Copyright (c) 2001-2009, RedWolf Design GmbH, http://www.clonk.de/ * Copyright (c) 2009-2016, The OpenClonk Team and contributors * * Distributed under the terms of the ISC license; see accompanying file * "COPYING" for details. * * "Clonk" is a registered trademark of Matthes Bender, used with permission. * See accompanying file "TRADEMARK" for details. * * To redistribute this file separately, substitute the full license texts * for the above references. */ /* Game configuration as stored in registry */ #ifndef INC_C4Config #define INC_C4Config #include "config/C4Constants.h" #include "lib/C4InputValidation.h" #include "control/C4PlayerControl.h" #include #define C4DEFAULT_FONT_NAME "Endeavour" enum { CFG_MaxString = 1024 }; class C4ConfigGeneral { public: enum { ConfigResetSafetyVal = 42 }; char Name[CFG_MaxString+1]; char Language[CFG_MaxString+1]; // entered by user in frontend options (may contain comma separated list or long language descriptions) char LanguageEx[CFG_MaxString+1]; // full fallback list composed by frontend options (condensed comma separated list) char Participants[CFG_MaxString+1]; int32_t AlwaysDebug; // if set: turns on debugmode whenever engine is started int32_t OpenScenarioInGameMode; // When the program arguments include a scenario path, open the game regularly char RXFontName[CFG_MaxString+1]; int32_t RXFontSize; char ConfigUserPath[CFG_MaxString + 1]; StdStrBuf ScreenshotFolder; char MissionAccess[CFG_MaxString+1]; int32_t FPS; int32_t DefRec; int32_t MMTimer; // use multimedia-timers int32_t ScrollSmooth; // view movement smoothing int32_t ConfigResetSafety; // safety value: If this value is screwed, the config got corrupted and must be reset // Determined at run-time StdCopyStrBuf ExePath; StdCopyStrBuf TempPath; char UserDataPath[CFG_MaxString+1]; char SystemDataPath[CFG_MaxString+1]; char ScreenshotPath[CFG_MaxString+1]; char TempUpdatePath[CFG_MaxString+1]; bool GamepadEnabled; bool FirstStart; int32_t DebugRec; // if defined, the external file is used for debugrec writing. Otherwise read/check int32_t DebugRecWrite; // if defined, an external file is used for debugrec writing (replays only) char DebugRecExternalFile[_MAX_PATH+1]; public: static int GetLanguageSequence(const char *strSource, char *strTarget); void DefaultLanguage(); bool CreateSaveFolder(const char *strDirectory, const char *strLanguageTitle); void DeterminePaths(); void CompileFunc(StdCompiler *pComp); private: struct { char PlayerPath[CFG_MaxString+1]; } Adopt; }; class C4ConfigDeveloper { public: int32_t AutoFileReload; int32_t ExtraWarnings; char TodoFilename[CFG_MaxString + 1]; char AltTodoFilename[CFG_MaxString + 1]; int32_t MaxScriptMRU; // maximum number of remembered elements in recently used scripts int32_t DebugShapeTextures; // if nonzero, show messages about loaded shape textures void CompileFunc(StdCompiler *pComp); }; class C4ConfigGraphics { public: int32_t SplitscreenDividers; int32_t ShowStartupMessages; int32_t VerboseObjectLoading; int32_t MenuTransparency; int32_t UpperBoard; int32_t ShowClock; int32_t ResX,ResY; int32_t WindowX,WindowY; int32_t RefreshRate; // monitor vertical refresh rate int32_t Windowed; // 0: fullscreen, 1: windowed, 2: fullscreen in game, windowed in menu int32_t ShowCrewNames; // show player name above clonks? int32_t ShowCrewCNames; // show clonk names above clonks? int32_t PXSGfx; // show PXS-graphics (instead of sole pixels) int32_t Gamma; // gamma value int32_t Currency; // default wealth symbolseb int32_t Monitor; // monitor index to play on int32_t FireParticles; // draw extended fire particles if enabled (default on) int32_t MaxRefreshDelay; // minimum time after which graphics should be refreshed (ms) int32_t NoOffscreenBlits; // if set, all blits to non-primary-surfaces are emulated int32_t MultiSampling; // multisampling samples int32_t AutoFrameSkip; // if true, gfx frames are skipped when they would slow down the game int32_t DebugOpenGL; // if true, enables OpenGL debugging void CompileFunc(StdCompiler *pComp); }; class C4ConfigSound { public: int32_t RXSound; int32_t RXMusic; int32_t FEMusic; int32_t FESamples; int32_t FMMode; int32_t Verbose; // show music files names int32_t MusicVolume; int32_t SoundVolume; void CompileFunc(StdCompiler *pComp); }; class C4ConfigNetwork { public: int32_t ControlRate; int32_t ControlPreSend; int32_t Lobby; int32_t NoRuntimeJoin; int32_t NoReferenceRequest; int32_t MaxResSearchRecursion; char WorkPath[CFG_MaxString+1]; ValidatedStdCopyStrBuf Comment; int32_t MasterServerSignUp; int32_t MasterServerActive; int32_t MasterKeepPeriod; int32_t MasterReferencePeriod; int32_t LeagueServerSignUp; int32_t UseAlternateServer; int32_t PortTCP,PortUDP,PortDiscovery,PortRefServer; int32_t EnableUPnP; int32_t ControlMode; ValidatedStdCopyStrBuf Nick; int32_t MaxLoadFileSize; char LastPassword[CFG_MaxString+1]; char AlternateServerAddress[CFG_MaxString+1]; StdCopyStrBuf LastLeagueServer, LastLeaguePlayerName, LastLeagueAccount, LastLeagueLoginToken; #ifdef WITH_AUTOMATIC_UPDATE char UpdateServerAddress[CFG_MaxString+1]; int32_t AutomaticUpdate; int32_t LastUpdateTime; #endif int32_t AsyncMaxWait; int32_t PacketLogging; public: void CompileFunc(StdCompiler *pComp); const char *GetLeagueServerAddress(); void CheckPortsForCollisions(); void SetLeagueLoginData(const char *szServer, const char *szPlayerName, const char *szAccount, const char *szLoginToken); bool GetLeagueLoginData(const char *szServer, const char *szPlayerName, StdStrBuf *pAccount, StdStrBuf *pLoginToken) const; }; class C4ConfigStartup { public: // config for do-not-show-this-msg-again-messages int32_t HideMsgGfxEngineChange; int32_t HideMsgGfxBitDepthChange; int32_t HideMsgMMTimerChange; int32_t HideMsgStartDedicated; int32_t HideMsgPlrTakeOver; int32_t HideMsgPlrNoTakeOver; int32_t HideMsgNoOfficialLeague; int32_t HideMsgIRCDangerous; int32_t AlphabeticalSorting; // if set, Folder.txt-sorting is ignored in scenario selection int32_t LastPortraitFolderIdx; void CompileFunc(StdCompiler *pComp); }; class C4ConfigLobby { public: int32_t CountdownTime; int32_t AllowPlayerSave; // whether save-to-disk function is enabled for player resources void CompileFunc(StdCompiler *pComp); }; class C4ConfigIRC { public: char Server[CFG_MaxString+1]; char Nick[CFG_MaxString+1]; char RealName[CFG_MaxString+1]; char Channel[CFG_MaxString+1]; void CompileFunc(StdCompiler *pComp); int32_t AllowAllChannels; }; const int C4ConfigMaxGamepads = 4; class C4ConfigGamepad { public: int32_t Button[C4MaxKey]; uint32_t AxisMin[6], AxisMax[6]; bool AxisCalibrated[6]; void CompileFunc(StdCompiler *pComp, bool fButtonsOnly=false); void ResetButtons(); // reset all buttons to default void Reset(); // reset all buttons and axis calibration to default }; class C4ConfigControls { public: int32_t GamepadGuiControl; int32_t MouseAutoScroll; // auto scroll strength C4PlayerControlAssignmentSets UserSets; void CompileFunc(StdCompiler *pComp); void ResetKeys(); // reset all keys to default }; class C4ConfigSecurity { public: char KeyPath[CFG_MaxString + 1]; // absolute path; environment variables are stored and only expanded upon evaluation int32_t WasRegistered; void CompileFunc(StdCompiler *pComp); }; class C4Config { public: C4Config(); ~C4Config(); public: C4ConfigGeneral General; C4ConfigDeveloper Developer; C4ConfigGraphics Graphics; C4ConfigSound Sound; C4ConfigNetwork Network; C4ConfigLobby Lobby; C4ConfigIRC IRC; C4ConfigGamepad Gamepads[C4ConfigMaxGamepads]; C4ConfigControls Controls; C4ConfigStartup Startup; C4ConfigSecurity Security; bool fConfigLoaded; // true if config has been successfully loaded StdStrBuf ConfigFilename; // set for configs loaded from a nondefault config file public: const char* GetSubkeyPath(const char *strSubkey); void Default(); bool Save(); bool Load(const char *szConfigFile = NULL); bool Init(); bool Registered(); const char *AtExePath(const char *szFilename); const char *AtTempPath(const char *szFilename); const char *AtTempUpdatePath(const char *szFilename); const char *AtNetworkPath(const char *szFilename); const char *AtScreenshotPath(const char *szFilename); const char *AtUserDataPath(const char *szFilename); const char *AtUserDataRelativePath(const char *szFilename); const char *AtSystemDataPath(const char *szFilename); const char *AtSystemDataRelativePath(const char *szFilename); const char *AtRelativePath(const char *szFilename); // Returns ASDRP or AUDRP depending on location const char *GetRegistrationData(const char* strField) { return ""; } void ForceRelativePath(StdStrBuf *sFilename); // try AtRelativePath; force GetC4Filename if not possible void CompileFunc(StdCompiler *pComp); bool IsCorrupted() { return (General.ConfigResetSafety != C4ConfigGeneral::ConfigResetSafetyVal) || !Graphics.ResX; } bool RemoveModule(const char *szPath, char *szModules); bool IsModule(const char *szPath, char *szModules); bool AddModule(const char *szPath, char *szModules); void GetConfigFileName(StdStrBuf &filename, const char *szConfigFile); void CleanupTempUpdateFolder(); const char *MakeTempUpdateFolder(); static void ExpandEnvironmentVariables(char *strPath, size_t iMaxLen); }; extern C4Config Config; #endif // INC_C4Config