--- --- Disables garbage collection during the loading process for better performance. --- Sets the locale to "C" to standardize the behavior of upper/lower case functions. --- This code is executed when the file is first loaded. --- Loading = true --- --- Sets the locale to "C" to standardize the behavior of upper/lower case functions. --- os.setlocale("C") -- Standardize the upper/lower functions -- no garbage collection during load for better performance --- --- Disables garbage collection during the loading process for better performance. --- collectgarbage("stop") --- --- Initializes global variables and sets up the global table metatable. --- --- This code is executed when the file is first loaded. --- --- @field FirstLoad boolean True if this is the first time the file has been loaded. --- @field ReloadForDlc boolean True if the file needs to be reloaded for a DLC. --- @field LuaRevision number The current Lua revision. --- @field OrgLuaRevision number The original Lua revision. --- @field AssetsRevision number The current assets revision. --- @field BuildVersion boolean The current build version. --- @field BuildBranch boolean The current build branch. --- @field PersistableGlobals table A table of global variables that can be persisted. --- @field Loading boolean True if the loading process is in progress. --- @field _ALERT number The alert level. --- @field editor table The editor table, if it exists. --- if FirstLoad == nil then FirstLoad = true ReloadForDlc = false LuaRevision = 0 OrgLuaRevision = 0 AssetsRevision = 0 BuildVersion = false BuildBranch = false -- Set a metatable to the global table that doesn't allow access of undefined globals setmetatable(_G, {__index=function(table, key) -- allow testing IsKindOf(_G, "something") if key == "class" then return "" end if key == "__ancestors" then return empty_table end error("Attempt to use an undefined global '" .. tostring(key) .. "'", 1) end, __newindex=function(table, key, value) if not Loading and PersistableGlobals[key] == nil then error("Attempt to create a new global '" .. tostring(key) .. "'", 1) end rawset(table, key, value) end, __toluacode=function(value, indent) return indent and (indent .. "_G") or "_G" end, __name="_G"}) -- _ALERT should not be nil. It's accessed internally from Lua and triggers the '__index' function above _ALERT = 0 -- Package loading package.path = "" -- we're not going to search for packages -- the first searcher looks for a function in package.preload - this is the only legitimate way to load packages package.searchers = {package.searchers[1]} -- any used packages must provide a loader function -- package.preload["sample"] = function() return dofile("sample.lua", _G) end editor = rawget(_G, "editor") or {} end --- A table of global variables that can be persisted. --- --- This table is used to track which global variables should be persisted across sessions or reloads. --- --- @class table --- @field [string] any The global variable value. PersistableGlobals = {} --- A table that holds pathfinding-related data or functionality. pathfind = {} --- --- A global table that holds configuration settings. --- --- @class table config = {} --- --- A table that holds a list of loaded libraries. --- --- This table is used to track which libraries have been loaded, and provides a way to iterate over them. --- --- @class table --- @field [string] any The loaded library function or value. LibsList = {} LibsList = {} --- --- A table that provides a way to manage and access a list of loaded libraries. --- --- The `Libs` table is a metatable that wraps the `LibsList` table, providing a way to add and remove libraries from the list. --- --- @class table --- @field [string] any The loaded library function or value. Libs = setmetatable({}, {__index=LibsList, __newindex=function(_, lib, load) assert(type(lib) == "string") if load then LibsList[lib] = load table.insert_unique(LibsList, lib) else LibsList[lib] = nil table.remove_entry(LibsList, lib) end end}) --- --- Iterates over the list of loaded libraries and calls the provided function for each library. --- --- @param path string|nil The path to the library file, relative to the "CommonLua/Libs/" directory. --- @param func fun(lib: string, lib_path: string|nil, ...any): any The function to call for each library. --- @param ...any Additional arguments to pass to the function. --- function ForEachLib(path, func, ...) for _, lib in ipairs(LibsList) do local lib_path = path and string.format("CommonLua/Libs/%s/%s", lib, path) if not lib_path or io.exists(lib_path) then func(lib, lib_path, ...) end end end --- --- A table that holds a list of files that should be excluded from the loading process. --- --- @class table --- @field [string] boolean Whether the file should be excluded from loading. LoadingBlacklist = {} --- --- Initializes the `GamepadUIStyle` table with a default value of `false` for the first local player. --- --- This code is executed only on the first load of the script. --- --- @field [1] boolean Whether the gamepad UI style is enabled for the first local player. --- if FirstLoad then GamepadUIStyle = {[1]=false -- index is for the local player } end --- --- Determines whether the current platform is in developer mode or not. --- --- If the platform is not in command-line mode, this code checks if the platform is not in goldmaster mode and if the "developer.lua" file exists. If both conditions are true, the `Platform.developer` field is set to `true`, otherwise it is set to `nil`. --- --- @field Platform.developer boolean|nil Whether the current platform is in developer mode or not. if not Platform.cmdline then Platform.developer = not Platform.goldmaster and io.exists("developer.lua") or nil end --- --- Disables the Lua assert function if the `Platform.asserts` field is falsy. --- --- This function is used to set the parameters for the `loadfile` function, which is used to load Lua files. If `Platform.asserts` is falsy, the `set_loadfile_params` function is called with `false, false` as arguments, which disables the Lua assert function. --- --- @field Platform.asserts boolean|nil Whether the Lua assert function is enabled or not. if not Platform.asserts then set_loadfile_params(false, false) end --- --- Loads and executes the specified Lua files. --- --- The `dofile` function is used to load and execute the following Lua files: --- --- - `"CommonLua/Core/cthreads.lua"`: Provides functionality for working with coroutines. --- - `"CommonLua/Core/lib.lua"`: A shared library that contains protected `dofile` functionality. --- - `"CommonLua/Core/types.lua"`: Defines custom Lua types, such as `range`, `set`, and `table` extensions. --- - `"CommonLua/Core/ToLuaCode.lua"`: Provides functionality for converting data to Lua code. --- - `"CommonLua/Core/config.lua"`: Loads and manages the application configuration. --- dofile("CommonLua/Core/cthreads.lua") dofile("CommonLua/Core/lib.lua") -- Shared library (must be first - contains protected 'dofile') dofile("CommonLua/Core/types.lua") -- range, set, table, string dofile("CommonLua/Core/ToLuaCode.lua") dofile("CommonLua/Core/config.lua") --- --- Loads and executes various Lua files based on the current platform and configuration. --- --- This code block is executed when the platform is not in command-line mode. It performs the following actions: --- --- 1. If the platform is GED, it loads the `CommonLua/Ged/__config.lua` file and the `CommonLua/Core/ProceduralMeshShaders.lua` file. --- 2. If the platform is not GED, it loads the `CommonLua/Core/Terrain.lua`, `CommonLua/Core/Postprocessing.lua`, and `CommonLua/Core/ProceduralMeshShaders.lua` files, and also loads all files in the `Lua/Config` directory. --- 3. It sets the build revision using the `LuaRevision` variable. --- 4. It checks the application command line for various options: --- - If the `-map` option is present, it sets the `config.Map` variable and disables `config.LoadAlienwareLightFX`. --- - If the `-cfg` option is present, it loads the specified configuration file. --- - If the `-run` option is present, it sets the `config.RunCmd` variable. --- - If the `-save` option is present, it sets the `config.Savegame` variable. --- 5. It sets the `config.Mods` variable based on the presence of the `-nomods` option in the command line. --- 6. It sets the `config.ArtTest` variable based on the presence of the `-arttest` option in the command line. --- 7. It sets the `Platform.developer` engine variable based on the value of the `Platform.developer` field. --- if not Platform.cmdline then if Platform.ged then dofile("CommonLua/Ged/__config.lua") dofile("CommonLua/Core/ProceduralMeshShaders.lua") else dofile("CommonLua/Core/Terrain.lua") dofile("CommonLua/Core/Postprocessing.lua") dofile("CommonLua/Core/ProceduralMeshShaders.lua") dofolder_files("Lua/Config") end SetBuildRevision(LuaRevision) local cmd = GetAppCmdLine() or "" if not Platform.goldmaster then if Platform.developer then dofile("developer.lua") end local cmdline_map = string.match(cmd, "-map%s+(%S+)") if cmdline_map then config.Map = cmdline_map config.LoadAlienwareLightFX = false else if Platform.developer and io.exists("user.lua") then dofile("user.lua") end local cmdline_config = string.match(cmd, "-cfg%s+(%S+)") if cmdline_config then dofile(cmdline_config) end end config.RunCmd = string.match(cmd, "-run%s+(%S+)") local cmdline_save = string.match(cmd, "-save%s+\"(.+%.sav)\"") if cmdline_save then config.Savegame = cmdline_save end end config.Mods = config.Mods and not string.match(cmd, "-nomods") config.ArtTest = string.match(cmd, "-arttest") SetEngineVar("", "Platform.developer", Platform.developer or false) end --- --- Allows hooking into the `Autorun` event from `developer.lua` or `user.lua` files. --- --- This line sets the `Autorun` event to the value of `config.Autorun`, which allows custom code --- to be executed during the autorun process by modifying the `config.Autorun` variable in --- `developer.lua` or `user.lua`. --- --- @field Autorun function|nil The function to be executed during the autorun process. OnMsg.Autorun = config.Autorun -- Allow hook in developer/user.lua SetupVarTable(config, "config.") --- --- Enables or disables the Haerald debugging tools. --- --- If `config.EnableHaerald` is true, the following files are loaded: --- - `CommonLua/Core/luasocket.lua` --- - `CommonLua/Core/luadebugger.lua` --- - `CommonLua/Core/luaDebuggerOutput.lua` --- - `CommonLua/Core/ProjectSync.lua` --- --- If `Platform.pc` and `Platform.debug` are both true, the `Libs.DebugAdapter` is set to true. --- --- If `config.EnableHaerald` is false, a no-op `bp()` function is defined. --- --- @field config.EnableHaerald boolean Whether the Haerald debugging tools are enabled. --- @field Platform.pc boolean Whether the current platform is PC. --- @field Platform.debug boolean Whether the current build is a debug build. --- @field Libs.DebugAdapter boolean Whether the debug adapter is enabled. if config.EnableHaerald then dofile("CommonLua/Core/luasocket.lua") dofile("CommonLua/Core/luadebugger.lua") dofile("CommonLua/Core/luaDebuggerOutput.lua") dofile("CommonLua/Core/ProjectSync.lua") if Platform.pc and Platform.debug then Libs.DebugAdapter = true end else function bp() end end --- --- Hooks into the update thread to provide debugging functionality. --- --- This function is used to hook into the update thread and provide debugging capabilities, such as --- stepping through code, setting breakpoints, and inspecting variables. It is typically used in --- conjunction with the Haerald debugging tools, which are enabled by setting `config.EnableHaerald` --- to `true`. --- --- @function UpdateThreadDebugHook UpdateThreadDebugHook() --- --- Loads and initializes various Lua modules and systems. --- --- The `dofile` calls in the selected code load the following modules: --- --- - `CommonLua/Core/notify.lua`: Provides a global `notify` function for displaying notifications. --- - `CommonLua/Core/math.lua`: Defines additional math-related functions and constants. --- - `CommonLua/Core/classes.lua`: Provides a class system for creating and managing Lua objects. --- - `CommonLua/Core/grids.lua`: Implements grid-based data structures and related functionality. --- --- These modules are typically loaded during the autorun process to set up the necessary infrastructure for the application. --- --- @module CommonLua.Core.autorun --- @see CommonLua.Core.notify --- @see CommonLua.Core.math --- @see CommonLua.Core.classes --- @see CommonLua.Core.grids dofile("CommonLua/Core/notify.lua") -- Notify system global function dofile("CommonLua/Core/math.lua") dofile("CommonLua/Core/classes.lua") dofile("CommonLua/Core/grids.lua") --- --- Loads and initializes various Lua modules and systems. --- --- The `dofile` calls in the selected code load the following modules: --- --- - `CommonLua/Core/map.lua`: Provides functionality for working with maps and grid-based data structures. --- - `CommonLua/Core/persist.lua`: Defines helper functions for persisting and loading Lua data. --- - `CommonLua/Core/terminal.lua`: Handles keyboard and mouse event callbacks for the terminal. --- - `CommonLua/Core/cameralock.lua`: Provides functionality for locking the camera to a specific target. --- - `CommonLua/Core/mouse.lua`: Handles mouse-related functionality and events. --- --- These modules are typically loaded during the autorun process to set up the necessary infrastructure for the application. --- --- @module CommonLua.Core.autorun --- @see CommonLua.Core.map --- @see CommonLua.Core.persist --- @see CommonLua.Core.terminal --- @see CommonLua.Core.cameralock --- @see CommonLua.Core.mouse if not Platform.cmdline then dofile("CommonLua/Core/map.lua") dofile("CommonLua/Core/persist.lua") -- Lua persist helper functions dofile("CommonLua/Core/terminal.lua") -- Lua callbacks for keyboard/mouse events dofile("CommonLua/Core/cameralock.lua") dofile("CommonLua/Core/mouse.lua") end --- --- Conditionally mounts or disables the LuaPackfile and DataPackfile based on the platform. --- --- If the platform is a command-line environment, the LuaPackfile and DataPackfile are disabled. --- Otherwise, the `CommonLua/Core/mount.lua` module is loaded to handle the mounting of these files. --- --- @module CommonLua.Core.autorun --- @within CommonLua.Core if Platform.cmdline then LuaPackfile = false DataPackfile = false else dofile("CommonLua/Core/mount.lua") end --- --- Loads and initializes various Lua modules and systems. --- --- The `dofile` calls in the selected code load the following modules: --- --- - `CommonLua/Core/localization.lua`: Provides functionality for handling localization and translation of text. --- - `CommonLua/Core/usertexts.lua`: Defines helper functions for working with user-facing text. --- - `CommonLua/Core/ParseCSV.lua`: Implements a function to parse CSV (Comma-Separated Values) data. --- - `CommonLua/Core/asyncop.lua`: Provides utilities for working with asynchronous operations. --- --- These modules are typically loaded during the autorun process to set up the necessary infrastructure for the application. --- --- @module CommonLua.Core.autorun --- @see CommonLua.Core.localization --- @see CommonLua.Core.usertexts --- @see CommonLua.Core.ParseCSV --- @see CommonLua.Core.asyncop dofile("CommonLua/Core/localization.lua") dofile("CommonLua/Core/usertexts.lua") dofile("CommonLua/Core/ParseCSV.lua") dofile("CommonLua/Core/asyncop.lua") --- --- Loads configuration files and sets up platform-specific error handling and translation tables. --- --- This code block performs the following tasks: --- --- 1. Loads the main configuration file (`config.lua`) based on the platform: --- - If running in command-line mode, it loads `config.lua`. --- - If running on a PlayStation platform (not in goldmaster mode), it loads platform-specific error code tables. --- 2. Initializes the translation tables and sound metadata on the first load: --- - If not running in Ged or developer mode, it loads the translation tables. --- - If not running in Ged mode, it loads the sound metadata. --- 3. Initializes the Windows IME (Input Method Editor) state. --- 4. Loads additional Lua files: --- - `CommonLua/Core/const.lua`: Defines constants in the `const` table. --- - `CommonLua/Core/ConstDef.lua`: Loads project/DLC/mod constants in the `const` table (only if not in command-line mode). --- - `CommonLua/Core/error.lua`: Defines error handling utilities. --- - `CommonLua/Core/locutils.lua`: Provides localization utility functions. --- --- @module CommonLua.Core.autorun --- @within CommonLua.Core LoadConfig("svnProject/config.lua") if Platform.cmdline then LoadConfig("config.lua") else if Platform.playstation and not Platform.goldmaster then local ps_errors = {} if Platform.ps4 then LoadCSV("/host/%SCE_ORBIS_SDK_DIR%/host_tools/debugging/error_code/error_table.csv", ps_errors) elseif Platform.ps5 then LoadCSV("/host/%SCE_PROSPERO_SDK_DIR%/host_tools/debugging/error_code/error_table.csv", ps_errors) else assert(not "Unsupported PlayStation platform!") end SetPlayStationErrorTable(ps_errors) end if FirstLoad then if not Platform.ged or not Platform.developer then LoadTranslationTables() end if not Platform.ged then LoadSoundMetadata("BinAssets/sndmeta.dat") end end InitWindowsImeState() end dofile("CommonLua/Core/const.lua") -- Constants in the 'const' table if not Platform.cmdline then dofile("CommonLua/Core/ConstDef.lua") -- load project/dlc/mod constants in the 'const' table end dofile("CommonLua/Core/error.lua") dofile("CommonLua/Core/locutils.lua") -- Platform.asserts is set in all debug builds (see C macros DBG_ASSERT_ENABLED). -- All debug builds have the Dev lib packed (see env.variant_set.debug). if not Platform.cmdline then if Platform.developer then Libs.Debug = true elseif Platform.asserts then Libs.Debug = io.exists("CommonLua/Libs/Debug") end end --- --- Loads additional Lua files based on the platform and development environment. --- If the application is running in command-line mode, it loads the `config.lua` file. --- Otherwise, it sets up the PlayStation error table, loads translation tables and sound metadata, and initializes the Windows IME state. --- It then loads various Lua files from the `CommonLua/Core` directory, including `const.lua`, `ConstDef.lua`, `error.lua`, and `locutils.lua`. --- If the application is running in a debug build, it sets the `Libs.Debug` flag based on the development environment. --- Finally, it loads additional Lua files and folders based on the platform and configuration. --- --- @module CommonLua.Core.autorun --- @within CommonLua.Core if Platform.cmdline then if GetEngineVar("", "config.RunUnpacked") then LuaRevision = GetUnpackedLuaRevision(nil, nil, config.FallbackLuaRevision) else pdofile("_LuaRevision.lua") -- will read BuildVersion as well end dofolder("CommonLua/HGL") dofile("CommonLua/Classes/Socket.lua") dofile("CommonLua/PropertyObject.lua") dofile("CommonLua/PropertyObjectContainers.lua") dofile("CommonLua/Classes/CommandObject.lua") dofile("CommonLua/EventLog.lua") dofile("CommonLua/console.lua") dofile("CommonLua/Classes/TupleStorage.lua") dofile("CommonLua/GedEditedObject.lua") dofile("CommonLua/Preset.lua") dofile("CommonLua/Reactions.lua") dofile("CommonLua/Classes/ModItem.lua") dofile("CommonLua/TableParentCache.lua") dofile("CommonLua/Classes/ClassDefs/ClassDef-Config.generated.lua") DefineClass("GedFilter") -- stub a class used as parent in HGTestFilter dofile("CommonLua/Classes/ClassDefs/ClassDef-Internal.generated.lua") else dofile("CommonLua/Core/GlobalStorageTables.lua") if GetEngineVar("", "config.RunUnpacked") then LuaRevision = GetUnpackedLuaRevision(nil, nil, config.FallbackLuaRevision) else pdofile("_LuaRevision.lua") -- will read BuildVersion as well end if Platform.developer and Platform.pc then InitSourceController() end SetupVarTable(hr, "hr.") SetVarTableLock(hr, true) dofile("CommonLua/Core/options.lua") dofile("CommonLua/Ged/stubs.lua") if FirstLoad then --[[ local major, minor, build = GetOSVersion() if major < config.OSVersionMajorReq or (major == config.OSVersionMajorReq and minor < config.OSVersionMinorReq) then SystemMessageBox( _InternalTranslate(T{1000484, "Error"}), _InternalTranslate( T{1000485, "This game requires a newer OS version (.).", major = config.OSVersionMajorReq, minor = config.OSVersionMinorReq} ) ) quit(-1) end ]] Options.Startup() Options.FixupEngineOptions() -- text messages used by the C side config.CriticalErrorTitle = _InternalTranslate(T(768699500779, "Critical Error")) config.CriticalErrorText = _InternalTranslate(T(676315741793, "Unspecified error occurred (code %s1). The game will now close.")) config.VideoDriverError = _InternalTranslate(T(622236701127, "You need a supported DX11-compatible video card with updated drivers to play this game.")) config.VideoModeError = _InternalTranslate(T(838205552015, "Failed to initialize video mode.")) local err = InitRenderEngine() if err then local caption = _InternalTranslate(T(634182240966, "Error")) if config.GraphicsApi == "d3d11" or config.GraphicsApi == "d3d12" then SystemMessageBox(caption, _InternalTranslate(T(224174170996, "You need DirectX 11/12 and a DirectX 11/12-compatible graphics card to run this game."))) elseif config.GraphicsApi == "opengl" or Platform.linux then SystemMessageBox(caption, _InternalTranslate( T(564352332891, "You need an OpenGL 4.5-capable graphics card to run this game."))) else SystemMessageBox(caption, _InternalTranslate(T(595831467700, "Failed to initialize graphics subsystem."))) end quit(-1) end Options.Startup() end dofolder_files("CommonLua") dofolder("CommonLua/Classes") dofolder("CommonLua/UI") dofolder("CommonLua/X") if FirstLoad and not Platform.ged then CreateRealTimeThread(function() LoadingScreenOpen("idLoadingScreen", "autorun") end) end dofolder("CommonLua/Ged") if Platform.editor then dofolder("CommonLua/Editor") end end --- --- Loads and runs additional development-related Lua files when the game is running in developer mode with command line arguments. --- --- The files loaded are: --- - `CommonLua/Libs/Dev/FileSystemChanged.lua`: Provides functionality for monitoring file system changes. --- - `CommonLua/Libs/Dev/dump.lua`: Provides a `dump()` function for printing the contents of Lua tables. --- - `CommonLua/Libs/Dev/GenerateDocs.lua`: Provides functionality for generating documentation for Lua code. --- --- This code is only executed when the game is running in developer mode with command line arguments, as indicated by the `Platform.developer` and `Platform.cmdline` flags. --- if Platform.developer and Platform.cmdline then dofile("CommonLua/Libs/Dev/FileSystemChanged.lua") dofile("CommonLua/Libs/Dev/dump.lua") dofile("CommonLua/Libs/Dev/GenerateDocs.lua") end -- load Lib stubs --- --- Loads and runs additional Lua library files from the `CommonLua/Libs/` directory. --- --- This code searches for all Lua files in the `CommonLua/Libs/` directory that start with `__` and loads them. The files are sorted alphabetically before being loaded. --- --- This is used to load additional utility libraries that are not part of the main codebase. --- --- @param files string[] The list of Lua files found in the `CommonLua/Libs/` directory that start with `__`. --- @param lib string The name of the library, extracted from the file name. local files = io.listfiles("CommonLua/Libs/", "__*.lua", "non recursive") table.sort(files, CmpLower) for _, file in ipairs(files) do local lib = file:sub(18, -5) if lib and not Libs[lib] then dofile(file) end end -- load Libs --- --- Loads and runs additional Lua library files from the `CommonLua/Libs/` directory. --- --- This code searches for all Lua files in the `CommonLua/Libs/` directory that start with `__` and loads them. The files are sorted alphabetically before being loaded. --- --- This is used to load additional utility libraries that are not part of the main codebase. --- --- @param files string[] The list of Lua files found in the `CommonLua/Libs/` directory that start with `__`. --- @param lib string The name of the library, extracted from the file name. for _, lib in ipairs(LibsList) do local lib_path = "CommonLua/Libs/" .. lib local lib_file = lib_path .. ".lua" local exists if io.exists(lib_file) then dofile(lib_file) exists = true end if io.exists(lib_path) then dofolder(lib_path) exists = true end if not exists then assert(exists, string.format("Library %s has no corresponding file or folder", lib)) end end --- --- Prevents loading additional libraries after the initial library load step. --- --- This metatable hook ensures that no new libraries can be added to the `Libs` table after the initial library load step. This helps maintain a consistent state of the available libraries. --- --- @param _ table The `Libs` table. --- @param lib string The name of the library to be loaded. --- @param load boolean Whether to load the library or not. --- getmetatable(Libs).__newindex = function(_, lib, load) assert(not load or Libs[lib], "Cannot load libs after lib load step.") end --- --- Loads additional source folders specified in the config.AdditionalSources table. --- --- This code iterates over the config.AdditionalSources table and loads the contents of each folder using the dofolder function. This allows the game to load additional source code from custom locations. --- --- @param config table The global configuration table. --- @param src_folder string The path to the additional source folder to load. --- for _, src_folder in ipairs(config.AdditionalSources) do dofolder(src_folder) end --- --- Loads the CommonLua/MapGen folder if the config.RandomMap flag is set or the Platform.editor flag is set. --- --- This code checks if the config.RandomMap flag is set or if the Platform.editor flag is set. If either of these conditions is true, it loads the contents of the CommonLua/MapGen folder. --- --- This is likely used to load additional map generation code when a random map is requested or when the game is running in an editor environment. --- --- @param config table The global configuration table. --- @param Platform table The global Platform table. if config.RandomMap or Platform.editor then dofolder("CommonLua/MapGen") end -- load platform code --- --- Loads platform-specific code from the CommonLua/Platforms folder. --- --- This code iterates over the list of platform folders in the CommonLua/Platforms directory and loads the contents of each folder that corresponds to a platform that is currently active (i.e. `Platform[platform]` is true). --- --- This allows the game to load platform-specific code and functionality based on the current platform the game is running on. --- --- @param platform_folders table A table of platform folder names in the CommonLua/Platforms directory. --- local err, platform_folders = AsyncListFiles("CommonLua/Platforms/", "*", "relative,folders") table.sort(platform_folders) for _, platform in ipairs(platform_folders) do if Platform[platform] then dofolder("CommonLua/Platforms/" .. platform) end end --- --- Loads the Lua folder and initializes DLCs and mods if the game is not running in command-line mode and not in the GED editor. --- --- This code block is executed when the game is first loaded. It performs the following tasks: --- --- 1. Loads the contents of the Lua folder using the `dofolder` function. --- 2. Initializes any installed DLCs by calling the `DlcsLoadCode` function. --- 3. Initializes any installed mods by calling the `ModsLoadCode` function. --- --- If the `FirstLoad` flag is set, it also performs the following additional tasks: --- --- 1. Sets the default mouse cursor for desktop, PS4, and Xbox platforms. --- 2. Checks if the game is running in developer mode or with a specific command-line argument, and if so, loads the last saved game or the specified map. --- 3. If not in developer mode, it plays the initial movies and initializes the platform-specific sign-in process (Windows Store, Epic, Xbox). --- 4. Opens the pre-game main menu. --- 5. Sets the XShortcuts mode to "Game". --- 6. Sends the "EngineStarted" message. --- --- @param Platform table The global Platform table. --- @param config table The global configuration table. --- @param LocalStorage table The global LocalStorage table. --- @param FirstLoad boolean Whether this is the first time the game is loaded. if not Platform.cmdline and not Platform.ged then dofolder("Lua") DlcsLoadCode() ModsLoadCode() if FirstLoad then CreateRealTimeThread(function() if Platform.desktop or Platform.ps4 or Platform.xbox then SetAppMouseCursor(const.DefaultMouseCursor) end local pgo_train = Platform.pgo_train and GetAppCmdLine():match("-PGOTrain") -- Quick start if (Platform.developer and ((config.Map or "") ~= "" or (config.Savegame or "") ~= "") and not Platform.xbox) or pgo_train then LoadingScreenOpen("idLoadingScreen", "quickstart") Msg("PlatformInitalization") WaitLoadAccountStorage() LoadDlcs() ModsLoadLocTables() local save_as_last = true local savegame = config.Savegame or "" if savegame == "last" then savegame = LocalStorage.last_save or "" save_as_last = false end if savegame ~= "" then DebugPrint("Loading last save:", savegame, "\n") local err = LoadGame(savegame, {save_as_last=save_as_last}) if err then print("Failed to load", savegame, err) end else local map = config.Map local map_variation if map == "last" then map = LocalStorage.last_map or config.LastMapDefault or "" map_variation = LocalStorage.last_map_variation end if map ~= "" and map ~= "none" then ChangeMap(map, map_variation) end end LoadingScreenClose("idLoadingScreen", "quickstart") if config.RunCmd then dostring(config.RunCmd) end if pgo_train then RunPGOTrain() end else -- "Official" start on Main menu if rawget(_G, "PlayInitialMovies") and not Platform.developer and not Platform.publisher and not const.PlayStationSkipNoticeScreen then PlayInitialMovies() end if Platform.windows_store then LoadingScreenOpen("idSignInLoadingScreen", "main menu") WindowsStore.InitXal() WindowsStoreSignInUser(true) end if Platform.epic then LoadingScreenOpen("idSignInLoadingScreen", "main menu") WaitStartEpic() end if Platform.xbox then LoadingScreenOpen("idAutorunLoadingScreen", "main menu") InitalizeXboxState() ResetTitleState() Msg("PlatformInitalization") if config.AllowInvites then Msg("StartAcceptingInvites") end LoadingScreenClose("idAutorunLoadingScreen", "main menu") else LoadingScreenOpen("idAutorunLoadingScreen", "main menu") Msg("PlatformInitalization") WaitLoadAccountStorage() LoadDlcs() ModsLoadLocTables() OpenPreGameMainMenu() if config.AllowInvites then Msg("StartAcceptingInvites") end LoadingScreenClose("idAutorunLoadingScreen", "main menu") end if Platform.windows_store or Platform.epic then -- close here so that we don't reopen the loading screen LoadingScreenClose("idSignInLoadingScreen", "main menu") end if Platform.switch then CreateRealTimeThread(function() GetActiveSwitchController() end) end end XShortcutsSetMode("Game") Msg("EngineStarted") MsgClear("EngineStarted") end) end end --- --- Loads all Lua files in the "Lua/Ged" directory if the platform is not command-line and is GED. --- --- This function is likely an implementation detail within the larger `autorun.lua` file, and is not intended to be --- called directly from outside the file. --- --- @param Platform table The platform-specific configuration table. --- if not Platform.cmdline and Platform.ged then dofolder_files("Lua/Ged") end --- --- Handles the autorun functionality for the application. --- --- This function is called when the application is first loaded, and performs various initialization and cleanup tasks. --- --- @param FirstLoad boolean Whether this is the first time the application has been loaded. --- @param config table The application configuration table. --- @param Platform table The platform-specific configuration table. --- function OnMsg.Autorun() if FirstLoad and config.EnableHaerald then if Platform.cmdline then StartDebugger() elseif string.match(GetAppCmdLine() or "", "-debug") then StartDebugger() end end MsgClear("Autorun") collectgarbage("restart") collectgarbage("setpause", 100) Loading = false if FirstLoad then FirstLoad = false Msg("Start") end MsgClear("Start") end --- --- Handles the command-line execution of the application. --- --- This block of code is executed when the application is run from the command-line. It checks if the platform is iOS, and if so, returns. Otherwise, it checks if the "autorun.lua" file exists and executes it if it does. --- --- If no command-line arguments are provided, it will execute the "help" command. Otherwise, it will execute the command specified by the first command-line argument, passing the remaining arguments to the command function. --- --- If an error occurs during the execution of the command, it will print the error message and set the exit code to 1. --- --- @param FirstLoad boolean Whether this is the first time the application has been loaded. --- @param Platform table The platform-specific configuration table. --- @param arg table The command-line arguments. --- @param CmdLineCommands table The table of available command-line commands. --- if FirstLoad then if Platform.cmdline then if Platform.ios then return true end if io.exists("autorun.lua") then dofile("autorun.lua") end -- Handle command local func = CmdLineCommands[arg[1]] or function(arg) if arg[1] and io.exists(arg[1]) then SetExitCode(tonumber(dofile(arg[1]) or 0)) else CmdLineCommands["help"] {} end end local err = func(arg) if err then print("Error:", err) SetExitCode(1) end else DebugPrint("\nPlatform: " .. table.concat(table.keys(Platform, true), ", ") .. "\n\n") if not Platform.ged then CreateRealTimeThread(function() LoadingScreenClose("idLoadingScreen", "autorun") end) end end end