These aren't intended (at the moment) to be exposed to the script writer; it's needed so that classes with a GameScriptRotation member can have a default member initialiser.
If the script adds a waterskin of X litres, we will overwrite the waterskin that's already there, if any (assuming the requested waterskin and the one the player has are both small or both large).
If the script tries to remove a waterskin of X litres, the player will only lose their waterskin if it has EXACTLY X litres. If their waterskin has Y litres, it will remain in the inventory.
These don't need to be scoped, but I originally made it an enum class and plan to end up doing so down the line anyway, and this should save a bit of time there.
Rename LARA_DRAW_TYPE to LARA_TYPE as it's used in more than just drawing code. Make WEATHER_TYPE a scoped enum (would have done this for LARA_TYPE too but didn't want to pepper casts in other parts of the codebase). Relabel constants in both enums.
Add kLaraTypes and kWeatherTypes and add them as tables in GameFlow.
Remove Background member - it's not level-specific so GameFlow is a better home for it.
Add (incomplete for now) documentation for some GameScriptLevel members - those I tested, at any rate.
Remove a lot of members which were unused and which represented level properties already accounted for in GameScriptLevel.
Make TITLE_TYPE an enum class and relabel its values.
Add TitleScreenImagePath and SetTitleScreenImagePath, which replaces GameScriptLevel's Background member.
Register GameScriptColor in GameFlowScript since we will be using it for the fog and sky layer properties of levels.
Make all GameScript maps unordered_maps, as these are supposed to be more suitable for cases where we don't need the data to be sorted.
Add default member initialisers to GameScript.
SetErrorMode is called via Lua in settings.lua to allow us or the LD to choose between the three ERROR_MODEs for script asserts.
ScriptWarn is for when we want to follow up on a failed assert in ERROR_MODE::WARN. e.g. if the player gives in an invalid HP value, we would ScriptWarn to tell them that the HP is being set to zero instead. If we added this information in ScriptAssert, we would end up displaying this message in TERMINATE mode, too - which is incorrect, since we won't have set the HP to zero, as we will have terminated the game.
Rework Level and Game tables as they weren't entirely working before. These correspond to m_locals and m_globals, which hold the level-specific and game-spanning data that will go into save files.
Make GetVariable and SetVariable take sol::table args. Sol seems to require this in order to use them as metamethods of a table (it doesn't require them for usertypes, but it seems more logical from the API point of view for Level and Game to be tables).
Add documentation for the above tables.
Move several functions out of the GameScript class in order to simplify its interface, and make them static functions that only live in GameLogicScript.cpp.
Remove g_GameScript from GameLogicScript.cpp as it's not used there; let winmain.cpp deal with it instead.