OpenTTD Source 20250312-master-gcdcc6b491d
|
Runtime information about a script like a pointer to the squirrel vm and the current state. More...
#include <script_instance.hpp>
Public Types | |
typedef std::variant< SQInteger, std::string, SQBool, SQSaveLoadType > | ScriptDataVariant |
typedef std::list< ScriptDataVariant > | ScriptData |
Public Member Functions | |
ScriptInstance (const char *APIName) | |
Create a new script. | |
void | Initialize (const std::string &main_script, const std::string &instance_name, CompanyID company) |
Initialize the script and prepare it for its first run. | |
virtual int | GetSetting (const std::string &name)=0 |
Get the value of a setting of the current instance. | |
virtual class ScriptInfo * | FindLibrary (const std::string &library, int version)=0 |
Find a library. | |
void | Continue () |
A script in multiplayer waits for the server to handle its DoCommand. | |
void | GameLoop () |
Run the GameLoop of a script. | |
void | CollectGarbage () |
Let the VM collect any garbage. | |
class ScriptStorage * | GetStorage () |
Get the storage of this script. | |
ScriptLogTypes::LogData & | GetLogData () |
Get the log pointer of this script. | |
class ScriptController * | GetController () |
Get the controller attached to the instance. | |
bool | IsDead () const |
Return the "this script died" value. | |
bool | IsAlive () const |
Return whether the script is alive. | |
void | Save () |
Call the script Save function and save all data in the savegame. | |
void | LoadOnStack (ScriptData *data) |
Store loaded data on the stack. | |
void | Pause () |
Suspends the script for the current tick and then pause the execution of script. | |
bool | IsPaused () |
Checks if the script is paused. | |
void | Unpause () |
Resume execution of the script. | |
SQInteger | GetOpsTillSuspend () |
Get the number of operations the script can execute before being suspended. | |
bool | DoCommandCallback (const CommandCost &result, const CommandDataBuffer &data, CommandDataBuffer result_data, Commands cmd) |
DoCommand callback function for all commands executed by scripts. | |
void | InsertEvent (class ScriptEvent *event) |
Insert an event for this script. | |
bool | IsSleeping () |
Check if the instance is sleeping, which either happened because the script executed a DoCommand, executed this.Sleep() or it has been paused. | |
size_t | GetAllocatedMemory () const |
bool | InShutdown () const |
Indicate whether this instance is currently being destroyed. | |
void | ReleaseSQObject (HSQOBJECT *obj) |
Decrease the ref count of a squirrel object. | |
Static Public Member Functions | |
static void | DoCommandReturn (ScriptInstance *instance) |
Return a true/false reply for a DoCommand. | |
static void | DoCommandReturnVehicleID (ScriptInstance *instance) |
Return a VehicleID reply for a DoCommand. | |
static void | DoCommandReturnSignID (ScriptInstance *instance) |
Return a SignID reply for a DoCommand. | |
static void | DoCommandReturnGroupID (ScriptInstance *instance) |
Return a GroupID reply for a DoCommand. | |
static void | DoCommandReturnGoalID (ScriptInstance *instance) |
Return a GoalID reply for a DoCommand. | |
static void | DoCommandReturnStoryPageID (ScriptInstance *instance) |
Return a StoryPageID reply for a DoCommand. | |
static void | DoCommandReturnStoryPageElementID (ScriptInstance *instance) |
Return a StoryPageElementID reply for a DoCommand. | |
static void | DoCommandReturnLeagueTableID (ScriptInstance *instance) |
Return a LeagueTableID reply for a DoCommand. | |
static void | DoCommandReturnLeagueTableElementID (ScriptInstance *instance) |
Return a LeagueTableElementID reply for a DoCommand. | |
static void | SaveEmpty () |
Don't save any data in the savegame. | |
static ScriptData * | Load (int version) |
Load data from a savegame. | |
static void | LoadEmpty () |
Load and discard data from a savegame. | |
Protected Member Functions | |
virtual void | RegisterAPI () |
Register all API functions to the VM. | |
bool | LoadCompatibilityScripts (Subdirectory dir, std::span< const std::string_view > api_versions) |
Load squirrel scripts to emulate an older API. | |
virtual void | Died () |
Tell the script it died. | |
virtual CommandCallbackData * | GetDoCommandCallback ()=0 |
Get the callback handling DoCommands in case of networking. | |
virtual void | LoadDummyScript ()=0 |
Load the dummy script. | |
Protected Attributes | |
class Squirrel * | engine = nullptr |
A wrapper around the squirrel vm. | |
std::string | versionAPI {} |
Current API used by this script. | |
Private Types | |
enum | SQSaveLoadType : uint8_t { SQSL_INT = 0x00 , SQSL_STRING = 0x01 , SQSL_ARRAY = 0x02 , SQSL_TABLE = 0x03 , SQSL_BOOL = 0x04 , SQSL_NULL = 0x05 , SQSL_INSTANCE = 0x06 , SQSL_ARRAY_TABLE_END = 0xFF } |
The type of the data that follows in the savegame. More... | |
Private Member Functions | |
bool | CallLoad () |
Call the script Load function if it exists and data was loaded from a savegame. | |
bool | LoadCompatibilityScript (std::string_view api_version, Subdirectory dir) |
Load squirrel script for a specific version to emulate an older API. | |
Static Private Member Functions | |
static bool | SaveObject (HSQUIRRELVM vm, SQInteger index, int max_depth, bool test) |
Save one object (int / string / array / table) to the savegame. | |
static bool | LoadObjects (ScriptData *data) |
Load all objects from a savegame. | |
static bool | LoadObjects (HSQUIRRELVM vm, ScriptData *data) |
Private Attributes | |
class ScriptController * | controller = nullptr |
The script main class. | |
class ScriptStorage * | storage = nullptr |
Some global information for each running script. | |
SQObject * | instance = nullptr |
Squirrel-pointer to the script main class. | |
bool | is_started = false |
Is the scripts constructor executed? | |
bool | is_dead = false |
True if the script has been stopped. | |
bool | is_save_data_on_stack = false |
Is the save data still on the squirrel stack? | |
int | suspend = 0 |
The amount of ticks to suspend this script before it's allowed to continue. | |
bool | is_paused = false |
Is the script paused? (a paused script will not be executed until unpaused) | |
bool | in_shutdown = false |
Is this instance currently being destructed? | |
Script_SuspendCallbackProc * | callback = nullptr |
Callback that should be called in the next tick the script runs. | |
size_t | last_allocated_memory = 0 |
Last known allocated memory value (for display for crashed scripts) | |
Friends | |
class | ScriptObject |
class | ScriptController |
Runtime information about a script like a pointer to the squirrel vm and the current state.
Definition at line 25 of file script_instance.hpp.
typedef std::list<ScriptDataVariant> ScriptInstance::ScriptData |
Definition at line 44 of file script_instance.hpp.
typedef std::variant<SQInteger, std::string, SQBool, SQSaveLoadType> ScriptInstance::ScriptDataVariant |
Definition at line 43 of file script_instance.hpp.
|
private |
The type of the data that follows in the savegame.
Definition at line 28 of file script_instance.hpp.
ScriptInstance::ScriptInstance | ( | const char * | APIName | ) |
Create a new script.
Definition at line 52 of file script_instance.cpp.
References engine, PrintFunc(), Squirrel::SetPrintFunction(), and storage.
|
virtual |
Definition at line 146 of file script_instance.cpp.
|
private |
Call the script Load function if it exists and data was loaded from a savegame.
Definition at line 765 of file script_instance.cpp.
References Squirrel::GetVM(), instance, is_save_data_on_stack, MAX_SL_OPS, and Squirrel::MethodExists().
Referenced by GameLoop().
void ScriptInstance::CollectGarbage | ( | ) |
Let the VM collect any garbage.
Definition at line 268 of file script_instance.cpp.
References Squirrel::CollectGarbage(), engine, is_started, and IsDead().
Referenced by Game::GameLoop().
void ScriptInstance::Continue | ( | ) |
A script in multiplayer waits for the server to handle its DoCommand.
It keeps waiting for this until this function is called.
Definition at line 158 of file script_instance.cpp.
References suspend.
Referenced by CcGame().
|
protectedvirtual |
Tell the script it died.
Reimplemented in AIInstance, and GameInstance.
Definition at line 164 of file script_instance.cpp.
References Debug, engine, in_shutdown, instance, is_dead, last_allocated_memory, and Squirrel::ReleaseObject().
Referenced by AIInstance::Died(), GameInstance::Died(), GameLoop(), and Initialize().
bool ScriptInstance::DoCommandCallback | ( | const CommandCost & | result, |
const CommandDataBuffer & | data, | ||
CommandDataBuffer | result_data, | ||
Commands | cmd | ||
) |
DoCommand callback function for all commands executed by scripts.
result | The result of the command. |
tile | The tile on which the command was executed. |
data | Command data as given to DoCommandPInternal. |
result_data | Extra data return from the command. |
cmd | cmd as given to DoCommandPInternal. |
Definition at line 807 of file script_instance.cpp.
References CMD_END, Debug, CommandCost::Failed(), CommandCost::GetCost(), CommandCost::GetErrorMessage(), and CommandCost::Succeeded().
|
static |
Return a true/false reply for a DoCommand.
Definition at line 276 of file script_instance.cpp.
References instance.
|
static |
Return a GoalID reply for a DoCommand.
Definition at line 296 of file script_instance.cpp.
References instance.
|
static |
Return a GroupID reply for a DoCommand.
Definition at line 291 of file script_instance.cpp.
References instance.
|
static |
Return a LeagueTableElementID reply for a DoCommand.
Definition at line 311 of file script_instance.cpp.
References instance.
|
static |
Return a LeagueTableID reply for a DoCommand.
Definition at line 316 of file script_instance.cpp.
References instance.
|
static |
Return a SignID reply for a DoCommand.
Definition at line 286 of file script_instance.cpp.
References instance.
|
static |
Return a StoryPageElementID reply for a DoCommand.
Definition at line 306 of file script_instance.cpp.
References instance.
|
static |
Return a StoryPageID reply for a DoCommand.
Definition at line 301 of file script_instance.cpp.
References instance.
|
static |
Return a VehicleID reply for a DoCommand.
Definition at line 281 of file script_instance.cpp.
References instance.
|
pure virtual |
Find a library.
library | The library name to find. |
version | The version the library should have. |
Implemented in AIInstance, and GameInstance.
void ScriptInstance::GameLoop | ( | ) |
Run the GameLoop of a script.
Definition at line 179 of file script_instance.cpp.
References _current_company, _settings_game, callback, CallLoad(), Squirrel::CallMethod(), controller, Died(), engine, Script_Suspend::GetSuspendCallback(), Script_Suspend::GetSuspendTime(), Squirrel::GetVM(), Squirrel::HasScriptCrashed(), is_dead, is_paused, is_save_data_on_stack, is_started, IsDead(), Squirrel::IsSuspended(), MAX_CONSTRUCTOR_OPS, Squirrel::MethodExists(), Squirrel::Resume(), Squirrel::ResumeError(), GameSettings::script, ScriptSettings::script_max_opcode_till_suspend, suspend, and Squirrel::ThrowError().
Referenced by Game::GameLoop().
size_t ScriptInstance::GetAllocatedMemory | ( | ) | const |
Definition at line 838 of file script_instance.cpp.
|
inline |
Get the controller attached to the instance.
Definition at line 149 of file script_instance.hpp.
References controller.
|
protectedpure virtual |
Get the callback handling DoCommands in case of networking.
Implemented in AIInstance, and GameInstance.
ScriptLogTypes::LogData & ScriptInstance::GetLogData | ( | ) |
Get the log pointer of this script.
Definition at line 327 of file script_instance.cpp.
SQInteger ScriptInstance::GetOpsTillSuspend | ( | ) |
Get the number of operations the script can execute before being suspended.
This function is safe to call from within a function called by the script.
Definition at line 802 of file script_instance.cpp.
References Squirrel::GetOpsTillSuspend().
|
pure virtual |
Get the value of a setting of the current instance.
name | The name of the setting. |
Implemented in AIInstance, and GameInstance.
ScriptStorage * ScriptInstance::GetStorage | ( | ) |
Get the storage of this script.
Definition at line 322 of file script_instance.cpp.
References storage.
void ScriptInstance::Initialize | ( | const std::string & | main_script, |
const std::string & | instance_name, | ||
CompanyID | company | ||
) |
Initialize the script and prepare it for its first run.
main_script | The full path of the script to load. |
instance_name | The name of the instance out of the script to load. |
company | Which company this script is serving. |
Definition at line 59 of file script_instance.cpp.
References controller, Squirrel::CreateClassInstance(), Died(), engine, Script_FatalError::GetErrorMessage(), instance, is_dead, IsDead(), Squirrel::IsSuspended(), LoadDummyScript(), Squirrel::LoadScript(), RegisterAPI(), Squirrel::ResumeError(), Squirrel::SetGlobalPointer(), and Squirrel::ThrowError().
Referenced by AIInstance::Initialize(), and GameInstance::Initialize().
void ScriptInstance::InsertEvent | ( | class ScriptEvent * | event | ) |
Insert an event for this script.
event | The event to insert. |
Definition at line 831 of file script_instance.cpp.
Referenced by Game::NewEvent().
|
inline |
Indicate whether this instance is currently being destroyed.
Definition at line 246 of file script_instance.hpp.
References in_shutdown.
|
inline |
Return whether the script is alive.
Definition at line 159 of file script_instance.hpp.
References in_shutdown, and IsDead().
|
inline |
Return the "this script died" value.
Definition at line 154 of file script_instance.hpp.
References is_dead.
Referenced by CollectGarbage(), GameLoop(), Initialize(), IsAlive(), ScriptDebugWindow::IsDead(), LoadOnStack(), ShowScriptDebugWindowIfScriptError(), and ScriptDebugWindow::UpdateGSButtonState().
bool ScriptInstance::IsPaused | ( | ) |
Checks if the script is paused.
Definition at line 589 of file script_instance.cpp.
References is_paused.
Referenced by Game::IsPaused(), and ScriptDebugWindow::UpdateGSButtonState().
|
inline |
Check if the instance is sleeping, which either happened because the script executed a DoCommand, executed this.Sleep() or it has been paused.
Definition at line 239 of file script_instance.hpp.
References suspend.
|
static |
Load data from a savegame.
version | The version of the script when saving, or -1 if this was not the original script saving the game. |
Definition at line 726 of file script_instance.cpp.
References _script_byte, _script_sl_byte, LoadEmpty(), LoadObjects(), and SlObject().
Referenced by AIPLChunkHandler::Load(), and GSDTChunkHandler::Load().
|
private |
Load squirrel script for a specific version to emulate an older API.
api_version | API version to load scripts for. |
dir | Subdirectory to find the scripts in. |
Definition at line 108 of file script_instance.cpp.
References Debug, engine, FileExists(), and Squirrel::LoadScript().
Referenced by LoadCompatibilityScripts().
|
protected |
Load squirrel scripts to emulate an older API.
dir | Subdirectory to find the scripts in. |
api_versions | List of available versions of the script type. |
Definition at line 128 of file script_instance.cpp.
References LoadCompatibilityScript(), and versionAPI.
Referenced by AIInstance::RegisterAPI(), and GameInstance::RegisterAPI().
|
protectedpure virtual |
|
static |
Load and discard data from a savegame.
Definition at line 717 of file script_instance.cpp.
References _script_byte, _script_sl_byte, LoadObjects(), and SlObject().
Referenced by AIPLChunkHandler::Load(), GSDTChunkHandler::Load(), and Load().
|
staticprivate |
Definition at line 645 of file script_instance.cpp.
|
staticprivate |
Load all objects from a savegame.
Definition at line 594 of file script_instance.cpp.
References _script_byte, _script_sl_byte, IsSavegameVersionBefore(), LoadObjects(), SlCopy(), SlErrorCorrupt(), SlObject(), SLV_SCRIPT_INT64, SQSL_ARRAY, SQSL_ARRAY_TABLE_END, SQSL_BOOL, SQSL_INSTANCE, SQSL_INT, SQSL_NULL, SQSL_STRING, SQSL_TABLE, and StrMakeValid().
Referenced by Load(), LoadEmpty(), LoadObjects(), and LoadOnStack().
void ScriptInstance::LoadOnStack | ( | ScriptData * | data | ) |
Store loaded data on the stack.
data | The loaded data to store on the stack. |
Definition at line 743 of file script_instance.cpp.
References Script_FatalError::GetErrorMessage(), Squirrel::GetVM(), is_save_data_on_stack, IsDead(), and LoadObjects().
Referenced by Game::StartNew().
void ScriptInstance::Pause | ( | ) |
Suspends the script for the current tick and then pause the execution of script.
The script will not be resumed from its suspended state until the script has been unpaused.
Definition at line 575 of file script_instance.cpp.
References _settings_game, Squirrel::DecreaseOps(), engine, Squirrel::GetVM(), is_paused, GameSettings::script, and ScriptSettings::script_max_opcode_till_suspend.
Referenced by Game::Pause().
|
protectedvirtual |
Register all API functions to the VM.
Reimplemented in AIInstance, and GameInstance.
Definition at line 103 of file script_instance.cpp.
References engine, and squirrel_register_std().
Referenced by Initialize(), AIInstance::RegisterAPI(), and GameInstance::RegisterAPI().
void ScriptInstance::ReleaseSQObject | ( | HSQOBJECT * | obj | ) |
Decrease the ref count of a squirrel object.
obj | The object to release. |
Definition at line 844 of file script_instance.cpp.
References in_shutdown, and Squirrel::ReleaseObject().
void ScriptInstance::Save | ( | ) |
Call the script Save function and save all data in the savegame.
Definition at line 505 of file script_instance.cpp.
References _script_byte, _script_sl_byte, Squirrel::CallMethod(), Squirrel::CrashOccurred(), engine, Script_FatalError::GetErrorMessage(), Squirrel::GetVM(), Squirrel::HasScriptCrashed(), is_dead, is_save_data_on_stack, is_started, Squirrel::IsSuspended(), MAX_SL_OPS, Squirrel::MethodExists(), Squirrel::ResumeError(), SaveEmpty(), SaveObject(), SlObject(), SQUIRREL_MAX_DEPTH, and Squirrel::ThrowError().
Referenced by Game::Save().
|
static |
Don't save any data in the savegame.
Definition at line 499 of file script_instance.cpp.
References _script_byte, _script_sl_byte, and SlObject().
Referenced by Game::Save(), Save(), and AI::Save().
|
staticprivate |
Save one object (int / string / array / table) to the savegame.
vm | The virtual machine to get all the data from. |
index | The index on the squirrel stack of the element to save. |
max_depth | The maximum depth recursive arrays / tables will be stored with before an error is returned. |
test | If true, don't really store the data but only check if it is valid. |
Definition at line 362 of file script_instance.cpp.
References _script_byte, _script_sl_byte, Squirrel::GetRealInstance(), SaveObject(), SlCopy(), SlObject(), SQSL_ARRAY, SQSL_ARRAY_TABLE_END, SQSL_BOOL, SQSL_INSTANCE, SQSL_INT, SQSL_NULL, SQSL_STRING, and SQSL_TABLE.
Referenced by Save(), and SaveObject().
void ScriptInstance::Unpause | ( | ) |
Resume execution of the script.
This function will not actually execute the script, but set a flag so that the script is executed my the usual mechanism that executes the script.
Definition at line 584 of file script_instance.cpp.
References is_paused.
Referenced by Game::Unpause().
|
friend |
Definition at line 41 of file script_instance.hpp.
|
friend |
Definition at line 40 of file script_instance.hpp.
|
private |
Callback that should be called in the next tick the script runs.
Definition at line 297 of file script_instance.hpp.
Referenced by GameLoop().
|
private |
The script main class.
Definition at line 287 of file script_instance.hpp.
Referenced by GameLoop(), GetController(), and Initialize().
|
protected |
A wrapper around the squirrel vm.
Definition at line 255 of file script_instance.hpp.
Referenced by CollectGarbage(), Died(), GameLoop(), AIInstance::Initialize(), GameInstance::Initialize(), Initialize(), LoadCompatibilityScript(), AIInstance::LoadDummyScript(), Pause(), RegisterAPI(), AIInstance::RegisterAPI(), GameInstance::RegisterAPI(), Save(), and ScriptInstance().
|
private |
Is this instance currently being destructed?
Definition at line 296 of file script_instance.hpp.
Referenced by Died(), InShutdown(), IsAlive(), and ReleaseSQObject().
|
private |
Squirrel-pointer to the script main class.
Definition at line 289 of file script_instance.hpp.
Referenced by CallLoad(), Died(), DoCommandReturn(), DoCommandReturnGoalID(), DoCommandReturnGroupID(), DoCommandReturnLeagueTableElementID(), DoCommandReturnLeagueTableID(), DoCommandReturnSignID(), DoCommandReturnStoryPageElementID(), DoCommandReturnStoryPageID(), DoCommandReturnVehicleID(), and Initialize().
|
private |
True if the script has been stopped.
Definition at line 292 of file script_instance.hpp.
Referenced by Died(), GameLoop(), Initialize(), IsDead(), and Save().
|
private |
Is the script paused? (a paused script will not be executed until unpaused)
Definition at line 295 of file script_instance.hpp.
Referenced by GameLoop(), IsPaused(), Pause(), and Unpause().
|
private |
Is the save data still on the squirrel stack?
Definition at line 293 of file script_instance.hpp.
Referenced by CallLoad(), GameLoop(), LoadOnStack(), and Save().
|
private |
Is the scripts constructor executed?
Definition at line 291 of file script_instance.hpp.
Referenced by CollectGarbage(), GameLoop(), and Save().
|
private |
Last known allocated memory value (for display for crashed scripts)
Definition at line 298 of file script_instance.hpp.
Referenced by Died().
|
private |
Some global information for each running script.
Definition at line 288 of file script_instance.hpp.
Referenced by GetStorage(), and ScriptInstance().
|
private |
The amount of ticks to suspend this script before it's allowed to continue.
Definition at line 294 of file script_instance.hpp.
Referenced by Continue(), GameLoop(), and IsSleeping().
|
protected |
Current API used by this script.
Definition at line 256 of file script_instance.hpp.
Referenced by AIInstance::Initialize(), GameInstance::Initialize(), and LoadCompatibilityScripts().