--- | |
--- 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>.<minor>).", 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 | |