| --- Checks if this is the first time the script has been loaded. If not, the script will return early without executing any further code. | |
| --- This is a common pattern used to ensure a script only runs once, which can be important for initialization or setup logic. | |
| if not FirstLoad then | |
| return | |
| end | |
| --- Checks if the current platform is PS4 and calls the `OrbisStartFakeSubmitDone()` function if so. | |
| --- This function is likely used to perform some platform-specific initialization or setup for the PS4 platform. | |
| if Platform.ps4 then | |
| OrbisStartFakeSubmitDone() | |
| end | |
| --- | |
| --- Checks if the current script is running in an unpacked environment. | |
| --- | |
| --- @return boolean unpacked Whether the script is running in an unpacked environment. | |
| local unpacked = IsFSUnpacked() | |
| -- Data & Lua | |
| --- | |
| --- Mounts the 'Data' folder or pack based on whether the script is running in an unpacked environment. | |
| --- | |
| --- If the script is running in an unpacked environment, the 'Data' folder is mounted from the 'svnProject/Data/' directory with the 'label:Data' option. | |
| --- If the script is running in a packed environment, the 'Data.hpk' pack is mounted with the 'in_mem,label:Data' options. | |
| --- | |
| --- Additionally, the 'LuaPackfile' and 'DataPackfile' variables are set to either 'false' or the respective pack file names based on the environment. | |
| --- | |
| if unpacked then | |
| LuaPackfile = false | |
| DataPackfile = false | |
| MountFolder("Data", "svnProject/Data/", "label:Data") | |
| else | |
| LuaPackfile = "Packs/Lua.hpk" | |
| DataPackfile = "Packs/Data.hpk" | |
| MountPack("Data", "Packs/Data.hpk", "in_mem,label:Data") | |
| end | |
| --- | |
| --- Mounts the 'ModTools' folder if the 'config.Mods' flag is set. | |
| --- | |
| --- This function is likely used to load and initialize any mod-related assets or functionality. | |
| --- | |
| --- @param config table The global configuration table, which contains the 'Mods' flag. | |
| --- | |
| if config.Mods then | |
| MountFolder("ModTools/", GetExecDirectory() .. "ModTools/") | |
| end | |
| -- Fonts & UI | |
| --- | |
| --- Mounts the 'Fonts' and 'UI' folders based on whether the script is running in an unpacked environment. | |
| --- | |
| --- If the script is running in an unpacked environment, the 'Fonts' and 'UI' folders are mounted from the 'svnAssets/Bin/Common/' directory. | |
| --- If the script is running in a packed environment, the 'Fonts.hpk' and 'UI.hpk' packs are mounted. | |
| --- | |
| --- This function is likely used to load and initialize font and UI-related assets. | |
| --- | |
| --- @param unpacked boolean Whether the script is running in an unpacked environment. | |
| --- | |
| if unpacked then | |
| MountFolder("Fonts", "svnAssets/Bin/Common/Fonts/") | |
| MountFolder("UI", "svnAssets/Bin/Common/UI/") | |
| else | |
| MountPack("Fonts", "Packs/Fonts.hpk") | |
| MountPack("UI", "Packs/UI.hpk") | |
| end | |
| -- Misc | |
| --- | |
| --- Mounts the 'Misc' folder or pack based on whether the script is running in an unpacked environment. | |
| --- | |
| --- If the script is running in an unpacked environment, the 'Misc' folder is mounted from the 'svnAssets/Source/Misc' directory. | |
| --- If the script is running in a packed environment, the 'Misc.hpk' pack is mounted. | |
| --- | |
| --- This function is likely used to load and initialize any miscellaneous assets or functionality. | |
| --- | |
| if unpacked then | |
| MountFolder("Misc", "svnAssets/Source/Misc") | |
| else | |
| MountPack("Misc", "Packs/Misc.hpk") | |
| end | |
| -- Shader cache mounting must happen on the C side, | |
| -- because it has to happen after the graphics API has been determined, | |
| -- but before various subsystems request their shaders in their Init() methods | |
| --- | |
| --- Mounts the 'Shaders' folder or pack based on whether the script is running in an unpacked environment. | |
| --- | |
| --- If the script is running in an unpacked environment, the 'Shaders' folder is mounted from the 'svnProject/Shaders/' and 'svnSrc/HR/Shaders/' directories. | |
| --- If the script is running in a packed environment and the platform is desktop, Xbox, or Switch, the 'Shaders.hpk' pack is mounted. | |
| --- | |
| --- This function is likely used to load and initialize shader-related assets. | |
| --- | |
| --- @param unpacked boolean Whether the script is running in an unpacked environment. | |
| --- @param Platform table The platform-specific configuration table. | |
| if unpacked then | |
| MountFolder("Shaders", "svnProject/Shaders/", "seethrough") | |
| MountFolder("Shaders", "svnSrc/HR/Shaders/", "seethrough") | |
| else | |
| if Platform.desktop or Platform.xbox or Platform.switch then | |
| MountPack("Shaders", "Packs/Shaders.hpk", "seethrough") | |
| end | |
| end | |
| -- Assets | |
| --- Mounts the necessary asset folders or packs based on whether the script is running in an unpacked or packed environment. | |
| --- | |
| --- If the script is running in an unpacked environment, the following folders are mounted: | |
| --- - CommonAssets: From the 'svnSrc/CommonAssets/' directory | |
| --- - BinAssets: From the 'svnAssets/Bin/win32/BinAssets/' directory | |
| --- - Meshes, Skeletons, Entities, Animations, Materials, Mapping, TexturesMeta, Fallbacks: From the 'CommonAssets/Entities/' and 'svnAssets/Bin/Common/' directories | |
| --- | |
| --- If the script is running in a packed environment, the following packs are mounted: | |
| --- - Meshes, Skeletons, Animations, Fallbacks: From the 'Packs/' directory | |
| --- - BinAssets: From the 'Packs/BinAssets.hpk' pack | |
| --- - CommonAssets: From the 'Packs/CommonAssets.hpk' pack | |
| --- | |
| --- This function is likely used to load and initialize the necessary asset files for the game or application. | |
| if unpacked then | |
| MountFolder("CommonAssets", "svnSrc/CommonAssets/") | |
| MountFolder("BinAssets", "svnAssets/Bin/win32/BinAssets/") | |
| MountFolder("Meshes", "CommonAssets/Entities/Meshes/") | |
| MountFolder("Skeletons", "CommonAssets/Entities/Skeletons/") | |
| MountFolder("Entities", "CommonAssets/Entities/Entities/") | |
| MountFolder("Animations", "CommonAssets/Entities/Animations/") | |
| MountFolder("Materials", "CommonAssets/Entities/Materials/") | |
| MountFolder("Mapping", "CommonAssets/Entities/Mapping/") | |
| MountFolder("TexturesMeta", "CommonAssets/Entities/TexturesMeta/", "seethrough") | |
| MountFolder("Fallbacks", "CommonAssets/Entities/Fallbacks/") | |
| MountFolder("Meshes", "svnAssets/Bin/Common/Meshes/", "seethrough") | |
| MountFolder("Skeletons", "svnAssets/Bin/Common/Skeletons/", "seethrough") | |
| MountFolder("Entities", "svnAssets/Bin/Common/Entities/", "seethrough") | |
| MountFolder("Animations", "svnAssets/Bin/Common/Animations/", "seethrough") | |
| MountFolder("Materials", "svnAssets/Bin/Common/Materials/", "seethrough") | |
| MountFolder("Mapping", "svnAssets/Bin/Common/Mapping/", "seethrough") | |
| MountFolder("TexturesMeta", "svnAssets/Bin/Common/TexturesMeta/", "seethrough") | |
| MountFolder("Fallbacks", "svnAssets/Bin/win32/Fallbacks/", "seethrough") | |
| else | |
| MountPack("Meshes", "Packs/Meshes.hpk") | |
| MountPack("Skeletons", "Packs/Skeletons.hpk") | |
| MountPack("Animations", "Packs/Animations.hpk") | |
| MountPack("Fallbacks", "Packs/Fallbacks.hpk") | |
| MountPack("BinAssets", "Packs/BinAssets.hpk") | |
| MountPack("", "Packs/CommonAssets.hpk", "seethrough,label:CommonAssets") | |
| end | |
| const.LastBinAssetsBuildRevision = tonumber(dofile("BinAssets/AssetsRevision.lua") or 0) or 0 | |
| --- Mounts the necessary sound and music folders or packs based on whether the script is running in an unpacked or packed environment. | |
| --- | |
| --- If the script is running in an unpacked environment, the following folders are mounted: | |
| --- - Sounds: From the 'svnAssets/Source/Sounds/' directory | |
| --- - Music: From the 'svnAssets/Source/Music/' directory | |
| --- - A LRU memory cache is created for the Sounds folder with a size specified by the config.SoundCacheMemorySize setting. | |
| --- | |
| --- If the script is running in a packed environment, no additional assets are mounted. | |
| --- | |
| --- This function is likely used to load and initialize the necessary sound and music files for the game or application. | |
| if not Platform.ged then | |
| -- Sounds & Music | |
| if unpacked then | |
| MountFolder("Sounds", "svnAssets/Source/Sounds/") | |
| MountFolder("Music", "svnAssets/Source/Music/") | |
| CreateLRUMemoryCache("Sounds", config.SoundCacheMemorySize or 0) | |
| end | |
| -- Movies | |
| if unpacked then | |
| MountFolder("Movies", "svnAssets/Bin/win32/Movies/") | |
| end | |
| end | |
| --- Mounts a memory screenshot pack if the `config.MemoryScreenshotSize` setting is enabled and this is the first load. | |
| --- | |
| --- The memory screenshot pack is mounted with the empty string as the pack name, and the "create" flag is set with the value of `config.MemoryScreenshotSize`. | |
| --- | |
| --- This function is likely used to enable capturing and storing memory usage screenshots during the initial load of the application. | |
| if FirstLoad and config.MemoryScreenshotSize then | |
| MountPack("memoryscreenshot", "", "create", config.MemoryScreenshotSize); | |
| end | |
| g_VoiceVariations = false | |
| --- | |
| --- Mounts the necessary language assets based on whether the script is running in an unpacked or packed environment. | |
| --- | |
| --- If the script is running in an unpacked environment, the following assets are mounted: | |
| --- - CurrentLanguage folder from the 'svnProject/LocalizationOut/{GetLanguage()}/CurrentLanguage/' directory | |
| --- - Voices folder from the 'svnAssets/Bin/win32/Voices/{GetVoiceLanguage()}/' directory | |
| --- - VoicesTTS folder from the 'svnAssets/Bin/win32/VoicesTTS/{GetVoiceLanguage()}/' directory if config.VoicesTTS is true | |
| --- | |
| --- If the script is running in a packed environment, the following assets are mounted: | |
| --- - Language pack from the 'Local/{GetLanguage()}.hpk' file | |
| --- - Voices pack from the 'Local/Voices/{GetVoiceLanguage()}.hpk' file | |
| --- - VoicesTTS pack from the 'Local/VoicesTTS/{GetVoiceLanguage()}.hpk' file if config.VoicesTTS is true | |
| --- | |
| --- This function is likely used to load and initialize the necessary language assets for the game or application. | |
| --- | |
| --- @function MountLanguage | |
| --- @return nil | |
| function MountLanguage() | |
| local unpacked = config.UnpackedLocalization or config.UnpackedLocalization == nil and IsFSUnpacked() | |
| UnmountByLabel("CurrentLanguage") | |
| g_VoiceVariations = false | |
| if unpacked then | |
| MountFolder("CurrentLanguage", "svnProject/LocalizationOut/" .. GetLanguage() .. "/CurrentLanguage/", | |
| "label:CurrentLanguage") | |
| local unpacked_voices = "svnAssets/Bin/win32/Voices/" .. GetVoiceLanguage() .. "/" | |
| if not io.exists(unpacked_voices) then | |
| SetVoiceLanguage("English") | |
| unpacked_voices = "svnAssets/Bin/win32/Voices/" .. GetVoiceLanguage() .. "/" | |
| end | |
| MountFolder("CurrentLanguage/Voices", "svnAssets/Bin/win32/Voices/" .. GetVoiceLanguage() .. "/", | |
| "label:CurrentLanguage") | |
| if config.VoicesTTS then | |
| MountFolder("CurrentLanguage/VoicesTTS", "svnAssets/Bin/win32/VoicesTTS/" .. GetVoiceLanguage() .. "/", | |
| "label:CurrentLanguage") | |
| end | |
| else | |
| local err = MountPack("", "Local/" .. GetLanguage() .. ".hpk", "seethrough,label:CurrentLanguage") | |
| if err then | |
| SetLanguage("English") | |
| MountPack("", "Local/" .. GetLanguage() .. ".hpk", "seethrough,label:CurrentLanguage") | |
| end | |
| err = MountPack("CurrentLanguage/Voices", "Local/Voices/" .. GetVoiceLanguage() .. ".hpk", | |
| "label:CurrentLanguage") | |
| if err then | |
| SetVoiceLanguage("English") | |
| MountPack("CurrentLanguage/Voices", "Local/Voices/" .. GetVoiceLanguage() .. ".hpk", "label:CurrentLanguage") | |
| end | |
| if config.VoicesTTS then | |
| MountPack("CurrentLanguage/VoicesTTS", "Local/VoicesTTS/" .. GetVoiceLanguage() .. ".hpk", | |
| "label:CurrentLanguage") | |
| end | |
| end | |
| if rawget(_G, "DlcDefinitions") then | |
| DlcMountVoices(DlcDefinitions) | |
| end | |
| if config.GedLanguageEnglish then | |
| if unpacked then | |
| MountFolder("EnglishLanguage", "svnProject/LocalizationOut/English/") | |
| else | |
| MountPack("EnglishLanguage", "Local/English.hpk") | |
| end | |
| end | |
| local voice_variations_path = "CurrentLanguage/Voices/variations.lua" | |
| if io.exists(voice_variations_path) then | |
| local ok, vars = pdofile(voice_variations_path) | |
| if ok then | |
| g_VoiceVariations = vars | |
| else | |
| dbg(DebugPrint(string.format("Error loading voice variations: %s", vars))) | |
| end | |
| end | |
| end | |
| -- Localization | |
| MountLanguage() | |
| --- | |
| --- Mounts the texture assets for the game. | |
| --- | |
| --- If the game is running in unpacked mode, the textures are mounted from the `CommonAssets/Entities/Textures/` and `svnAssets/Bin/win32/Textures/` folders, with the billboards mounted from the `svnAssets/Bin/win32/Textures/Billboards/` folder. On OSX, the cubemaps are also mounted from the `svnAssets/Bin/osx/Textures/Cubemaps/` folder. | |
| --- | |
| --- If the game is running in packed mode, the textures are mounted from the `Packs/Textures.hpk` and `Packs/Textures[0-9].hpk` packs, with the priority and seethrough flags set. | |
| --- | |
| --- @param unpacked boolean Whether the game is running in unpacked mode. | |
| function MountTextures(unpacked) | |
| end | |
| local function MountTextures(unpacked) | |
| if unpacked then | |
| MountFolder("Textures", "CommonAssets/Entities/Textures/", "priority:high") | |
| MountFolder("Textures", "svnAssets/Bin/win32/Textures/", "priority:high,seethrough") | |
| local billboardFolders = io.listfiles("svnAssets/Bin/win32/Textures/Billboards/", "*", "folders") | |
| for _, folder in pairs(billboardFolders) do | |
| MountFolder("Textures/Billboards", folder .. "/", "priority:high,seethrough") | |
| end | |
| if Platform.osx then | |
| MountFolder("Textures/Cubemaps", "svnAssets/Bin/osx/Textures/Cubemaps/", "priority:high") | |
| end | |
| else | |
| if Platform.desktop or Platform.xbox or Platform.switch then | |
| MountPack("Textures", "Packs/Textures.hpk", "priority:high,seethrough") | |
| for i = 0, 9 do | |
| MountPack("", "Packs/Textures" .. tostring(i) .. ".hpk", "priority:high,seethrough") | |
| end | |
| else | |
| MountPack("Textures", "Packs/Textures.hpk", "priority:high,seethrough") | |
| end | |
| end | |
| end | |
| -- Documentation | |
| --- | |
| --- Mounts the documentation folders based on whether the game is running in unpacked or packed mode. | |
| --- | |
| --- In unpacked mode, the documentation is mounted from the following folders: | |
| --- - `svnSrc/Docs/` | |
| --- - `svnProject/Docs/` (with `seethrough` flag) | |
| --- - `svnProject/Docs/ModTools/` (with `seethrough` flag) | |
| --- | |
| --- In packed mode, the documentation is mounted from the `ModTools/Docs/` folder. | |
| --- | |
| --- @param unpacked boolean Whether the game is running in unpacked mode. | |
| if unpacked then | |
| UnmountByPath("Docs") | |
| MountFolder("Docs", "svnSrc/Docs/") | |
| MountFolder("Docs", "svnProject/Docs/", "seethrough") | |
| MountFolder("Docs", "svnProject/Docs/ModTools/", "seethrough") | |
| else | |
| MountFolder("Docs", "ModTools/Docs/") | |
| end | |
| --- | |
| --- Runs automatically when the game starts up. Loads precache metadata for all .meta files in the BinAssets folder. | |
| --- | |
| --- The precache metadata is loaded based on the `metaCheck` value, which is determined by the current platform: | |
| --- - On non-test platforms, `const.PrecacheDontCheck` is used, which means the metadata is loaded without checking if it's up-to-date. | |
| --- - On test platforms, `const.PrecacheCheckUpToDate` is used for PC, which means the metadata is only loaded if it's up-to-date. | |
| --- - On test platforms, `const.PrecacheCheckExists` is used for other platforms, which means the metadata is only loaded if it exists. | |
| --- | |
| --- @function OnMsg.Autorun | |
| --- @return nil | |
| function OnMsg.Autorun() | |
| local metaCheck = const.PrecacheDontCheck | |
| if Platform.test then | |
| metaCheck = Platform.pc and const.PrecacheCheckUpToDate or const.PrecacheCheckExists | |
| end | |
| local files = io.listfiles("BinAssets", "*.meta") | |
| for i = 1, #files do | |
| ResourceManager.LoadPrecacheMetadata(files[i], metaCheck) | |
| end | |
| end | |
| --- | |
| --- Mounts various game assets based on whether the game is running in unpacked or packed mode. | |
| --- | |
| --- In unpacked mode: | |
| --- - Mounts textures using `MountTextures(unpacked)` | |
| --- - Mounts folders for maps and prefabs | |
| --- | |
| --- In packed mode: | |
| --- - Mounts music, sounds, and textures packs | |
| --- - Creates a sound cache | |
| --- - Mounts additional texture packs | |
| --- - Mounts the prefabs pack | |
| --- | |
| --- On the GED platform, it only mounts textures based on the `unpacked` flag. | |
| --- | |
| --- @param unpacked boolean Whether the game is running in unpacked mode. | |
| if not Platform.ged then | |
| -- Textures, Maps and Prefabs | |
| if unpacked then | |
| MountTextures(unpacked) | |
| MountFolder("Maps", "svnAssets/Source/Maps/", "create") | |
| MountFolder("Prefabs", "svnAssets/Source/Prefabs/", "create") | |
| else | |
| MountPack("Music", "Packs/Music.hpk") | |
| MountPack("Sounds", "Packs/Sounds.hpk", "seethrough,priority:high") | |
| CreateLRUMemoryCache("Sounds", config.SoundCacheMemorySize or 0) | |
| MountTextures(unpacked) | |
| MountPack("Textures/Cubemaps", "Packs/Cubemaps.hpk", "priority:high") | |
| MountPack("", "Packs/AdditionalTextures.hpk", "priority:high,seethrough,label:AdditionalTextures") | |
| MountPack("", "Packs/AdditionalNETextures.hpk", "priority:high,seethrough,label:AdditionalNETextures") | |
| MountPack("Prefabs", "Packs/Prefabs.hpk") | |
| end | |
| elseif Platform.developer then -- ged | |
| MountTextures(unpacked) | |
| end | |
| --- | |
| --- Creates a real-time thread that sets the Lua and Assets revisions, and prints debug information about the build. | |
| --- | |
| --- This function is called during the game's startup to initialize the build information. | |
| --- | |
| --- @return nil | |
| CreateRealTimeThread(function() | |
| if unpacked then | |
| LuaRevision = GetUnpackedLuaRevision(nil, nil, config.FallbackLuaRevision) or LuaRevision | |
| AssetsRevision = GetUnpackedLuaRevision(false, "svnAssets/.", config.FallbackAssetsRevision) or AssetsRevision | |
| else | |
| AssetsRevision = const.LastBinAssetsBuildRevision ~= 0 and const.LastBinAssetsBuildRevision or AssetsRevision | |
| end | |
| DebugPrint("Lua revision: " .. LuaRevision .. "\n") | |
| SetBuildRevision(LuaRevision) | |
| DebugPrint("Assets revision: " .. AssetsRevision .. "\n") | |
| if Platform.steam then | |
| DebugPrint("Steam AppID: " .. (SteamGetAppId() or "<unknown>") .. "\n") | |
| end | |
| if (BuildVersion or "") ~= "" then | |
| DebugPrint("Build version: " .. BuildVersion .. "\n") | |
| end | |
| if (BuildBranch or "") ~= "" then | |
| DebugPrint("Build branch: " .. BuildBranch .. "\n") | |
| end | |
| end) | |
| if Platform.ps4 then | |
| OrbisStopFakeSubmitDone() | |
| end | |