OpenTTD Source 20250312-master-gcdcc6b491d
ScriptInstance Class Referenceabstract

Runtime information about a script like a pointer to the squirrel vm and the current state. More...

#include <script_instance.hpp>

Inheritance diagram for ScriptInstance:
AIInstance GameInstance

Public Types

typedef std::variant< SQInteger, std::string, SQBool, SQSaveLoadTypeScriptDataVariant
 
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 ScriptInfoFindLibrary (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 ScriptStorageGetStorage ()
 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 CommandCallbackDataGetDoCommandCallback ()=0
 Get the callback handling DoCommands in case of networking.
 
virtual void LoadDummyScript ()=0
 Load the dummy script.
 

Protected Attributes

class Squirrelengine = 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 ScriptStoragestorage = 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_SuspendCallbackProccallback = 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
 

Detailed Description

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.

Member Typedef Documentation

◆ ScriptData

typedef std::list<ScriptDataVariant> ScriptInstance::ScriptData

Definition at line 44 of file script_instance.hpp.

◆ ScriptDataVariant

typedef std::variant<SQInteger, std::string, SQBool, SQSaveLoadType> ScriptInstance::ScriptDataVariant

Definition at line 43 of file script_instance.hpp.

Member Enumeration Documentation

◆ SQSaveLoadType

enum ScriptInstance::SQSaveLoadType : uint8_t
private

The type of the data that follows in the savegame.

Enumerator
SQSL_INT 

The following data is an integer.

SQSL_STRING 

The following data is an string.

SQSL_ARRAY 

The following data is an array.

SQSL_TABLE 

The following data is an table.

SQSL_BOOL 

The following data is a boolean.

SQSL_NULL 

A null variable.

SQSL_INSTANCE 

The following data is an instance.

SQSL_ARRAY_TABLE_END 

Marks the end of an array or table, no data follows.

Definition at line 28 of file script_instance.hpp.

Constructor & Destructor Documentation

◆ ScriptInstance()

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.

◆ ~ScriptInstance()

ScriptInstance::~ScriptInstance ( )
virtual

Definition at line 146 of file script_instance.cpp.

Member Function Documentation

◆ CallLoad()

bool ScriptInstance::CallLoad ( )
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().

◆ CollectGarbage()

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().

◆ Continue()

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().

◆ Died()

void ScriptInstance::Died ( )
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().

◆ DoCommandCallback()

bool ScriptInstance::DoCommandCallback ( const CommandCost result,
const CommandDataBuffer data,
CommandDataBuffer  result_data,
Commands  cmd 
)

DoCommand callback function for all commands executed by scripts.

Parameters
resultThe result of the command.
tileThe tile on which the command was executed.
dataCommand data as given to DoCommandPInternal.
result_dataExtra data return from the command.
cmdcmd as given to DoCommandPInternal.
Returns
true if we handled result.

Definition at line 807 of file script_instance.cpp.

References CMD_END, Debug, CommandCost::Failed(), CommandCost::GetCost(), CommandCost::GetErrorMessage(), and CommandCost::Succeeded().

◆ DoCommandReturn()

void ScriptInstance::DoCommandReturn ( ScriptInstance instance)
static

Return a true/false reply for a DoCommand.

Definition at line 276 of file script_instance.cpp.

References instance.

◆ DoCommandReturnGoalID()

void ScriptInstance::DoCommandReturnGoalID ( ScriptInstance instance)
static

Return a GoalID reply for a DoCommand.

Definition at line 296 of file script_instance.cpp.

References instance.

◆ DoCommandReturnGroupID()

void ScriptInstance::DoCommandReturnGroupID ( ScriptInstance instance)
static

Return a GroupID reply for a DoCommand.

Definition at line 291 of file script_instance.cpp.

References instance.

◆ DoCommandReturnLeagueTableElementID()

void ScriptInstance::DoCommandReturnLeagueTableElementID ( ScriptInstance instance)
static

Return a LeagueTableElementID reply for a DoCommand.

Definition at line 311 of file script_instance.cpp.

References instance.

◆ DoCommandReturnLeagueTableID()

void ScriptInstance::DoCommandReturnLeagueTableID ( ScriptInstance instance)
static

Return a LeagueTableID reply for a DoCommand.

Definition at line 316 of file script_instance.cpp.

References instance.

◆ DoCommandReturnSignID()

void ScriptInstance::DoCommandReturnSignID ( ScriptInstance instance)
static

Return a SignID reply for a DoCommand.

Definition at line 286 of file script_instance.cpp.

References instance.

◆ DoCommandReturnStoryPageElementID()

void ScriptInstance::DoCommandReturnStoryPageElementID ( ScriptInstance instance)
static

Return a StoryPageElementID reply for a DoCommand.

Definition at line 306 of file script_instance.cpp.

References instance.

◆ DoCommandReturnStoryPageID()

void ScriptInstance::DoCommandReturnStoryPageID ( ScriptInstance instance)
static

Return a StoryPageID reply for a DoCommand.

Definition at line 301 of file script_instance.cpp.

References instance.

◆ DoCommandReturnVehicleID()

void ScriptInstance::DoCommandReturnVehicleID ( ScriptInstance instance)
static

Return a VehicleID reply for a DoCommand.

Definition at line 281 of file script_instance.cpp.

References instance.

◆ FindLibrary()

virtual class ScriptInfo * ScriptInstance::FindLibrary ( const std::string &  library,
int  version 
)
pure virtual

Find a library.

Parameters
libraryThe library name to find.
versionThe version the library should have.
Returns
The library if found, nullptr otherwise.

Implemented in AIInstance, and GameInstance.

◆ GameLoop()

◆ GetAllocatedMemory()

size_t ScriptInstance::GetAllocatedMemory ( ) const

Definition at line 838 of file script_instance.cpp.

◆ GetController()

class ScriptController * ScriptInstance::GetController ( )
inline

Get the controller attached to the instance.

Definition at line 149 of file script_instance.hpp.

References controller.

◆ GetDoCommandCallback()

virtual CommandCallbackData * ScriptInstance::GetDoCommandCallback ( )
protectedpure virtual

Get the callback handling DoCommands in case of networking.

Implemented in AIInstance, and GameInstance.

◆ GetLogData()

ScriptLogTypes::LogData & ScriptInstance::GetLogData ( )

Get the log pointer of this script.

Definition at line 327 of file script_instance.cpp.

◆ GetOpsTillSuspend()

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.

Returns
The number of operations to execute.

Definition at line 802 of file script_instance.cpp.

References Squirrel::GetOpsTillSuspend().

◆ GetSetting()

virtual int ScriptInstance::GetSetting ( const std::string &  name)
pure virtual

Get the value of a setting of the current instance.

Parameters
nameThe name of the setting.
Returns
the value for the setting, or -1 if the setting is not known.

Implemented in AIInstance, and GameInstance.

◆ GetStorage()

ScriptStorage * ScriptInstance::GetStorage ( )

Get the storage of this script.

Definition at line 322 of file script_instance.cpp.

References storage.

◆ Initialize()

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.

Parameters
main_scriptThe full path of the script to load.
instance_nameThe name of the instance out of the script to load.
companyWhich 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().

◆ InsertEvent()

void ScriptInstance::InsertEvent ( class ScriptEvent *  event)

Insert an event for this script.

Parameters
eventThe event to insert.

Definition at line 831 of file script_instance.cpp.

Referenced by Game::NewEvent().

◆ InShutdown()

bool ScriptInstance::InShutdown ( ) const
inline

Indicate whether this instance is currently being destroyed.

Definition at line 246 of file script_instance.hpp.

References in_shutdown.

◆ IsAlive()

bool ScriptInstance::IsAlive ( ) const
inline

Return whether the script is alive.

Definition at line 159 of file script_instance.hpp.

References in_shutdown, and IsDead().

◆ IsDead()

bool ScriptInstance::IsDead ( ) const
inline

◆ IsPaused()

bool ScriptInstance::IsPaused ( )

Checks if the script is paused.

Returns
true if the script is paused, otherwise false

Definition at line 589 of file script_instance.cpp.

References is_paused.

Referenced by Game::IsPaused(), and ScriptDebugWindow::UpdateGSButtonState().

◆ IsSleeping()

bool ScriptInstance::IsSleeping ( )
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.

◆ Load()

ScriptInstance::ScriptData * ScriptInstance::Load ( int  version)
static

Load data from a savegame.

Parameters
versionThe version of the script when saving, or -1 if this was not the original script saving the game.
Returns
a pointer to loaded data.

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().

◆ LoadCompatibilityScript()

bool ScriptInstance::LoadCompatibilityScript ( std::string_view  api_version,
Subdirectory  dir 
)
private

Load squirrel script for a specific version to emulate an older API.

Parameters
api_versionAPI version to load scripts for.
dirSubdirectory to find the scripts in.
Returns
true iff script loading should proceed.

Definition at line 108 of file script_instance.cpp.

References Debug, engine, FileExists(), and Squirrel::LoadScript().

Referenced by LoadCompatibilityScripts().

◆ LoadCompatibilityScripts()

bool ScriptInstance::LoadCompatibilityScripts ( Subdirectory  dir,
std::span< const std::string_view >  api_versions 
)
protected

Load squirrel scripts to emulate an older API.

Parameters
dirSubdirectory to find the scripts in.
api_versionsList of available versions of the script type.
Returns
true iff script loading should proceed.

Definition at line 128 of file script_instance.cpp.

References LoadCompatibilityScript(), and versionAPI.

Referenced by AIInstance::RegisterAPI(), and GameInstance::RegisterAPI().

◆ LoadDummyScript()

virtual void ScriptInstance::LoadDummyScript ( )
protectedpure virtual

Load the dummy script.

Implemented in AIInstance, and GameInstance.

Referenced by Initialize().

◆ LoadEmpty()

void ScriptInstance::LoadEmpty ( )
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().

◆ LoadObjects() [1/2]

bool ScriptInstance::LoadObjects ( HSQUIRRELVM  vm,
ScriptData *  data 
)
staticprivate

Definition at line 645 of file script_instance.cpp.

◆ LoadObjects() [2/2]

bool ScriptInstance::LoadObjects ( ScriptData *  data)
staticprivate

◆ LoadOnStack()

void ScriptInstance::LoadOnStack ( ScriptData *  data)

Store loaded data on the stack.

Parameters
dataThe 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().

◆ Pause()

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().

◆ RegisterAPI()

void ScriptInstance::RegisterAPI ( )
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().

◆ ReleaseSQObject()

void ScriptInstance::ReleaseSQObject ( HSQOBJECT *  obj)

Decrease the ref count of a squirrel object.

Parameters
objThe object to release.

Definition at line 844 of file script_instance.cpp.

References in_shutdown, and Squirrel::ReleaseObject().

◆ Save()

◆ SaveEmpty()

void ScriptInstance::SaveEmpty ( )
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().

◆ SaveObject()

bool ScriptInstance::SaveObject ( HSQUIRRELVM  vm,
SQInteger  index,
int  max_depth,
bool  test 
)
staticprivate

Save one object (int / string / array / table) to the savegame.

Parameters
vmThe virtual machine to get all the data from.
indexThe index on the squirrel stack of the element to save.
max_depthThe maximum depth recursive arrays / tables will be stored with before an error is returned.
testIf true, don't really store the data but only check if it is valid.
Returns
True if the saving was successful.

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().

◆ Unpause()

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().

Friends And Related Symbol Documentation

◆ ScriptController

friend class ScriptController
friend

Definition at line 41 of file script_instance.hpp.

◆ ScriptObject

friend class ScriptObject
friend

Definition at line 40 of file script_instance.hpp.

Field Documentation

◆ callback

Script_SuspendCallbackProc* ScriptInstance::callback = nullptr
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().

◆ controller

class ScriptController* ScriptInstance::controller = nullptr
private

The script main class.

Definition at line 287 of file script_instance.hpp.

Referenced by GameLoop(), GetController(), and Initialize().

◆ engine

◆ in_shutdown

bool ScriptInstance::in_shutdown = false
private

Is this instance currently being destructed?

Definition at line 296 of file script_instance.hpp.

Referenced by Died(), InShutdown(), IsAlive(), and ReleaseSQObject().

◆ instance

◆ is_dead

bool ScriptInstance::is_dead = false
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().

◆ is_paused

bool ScriptInstance::is_paused = false
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().

◆ is_save_data_on_stack

bool ScriptInstance::is_save_data_on_stack = false
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().

◆ is_started

bool ScriptInstance::is_started = false
private

Is the scripts constructor executed?

Definition at line 291 of file script_instance.hpp.

Referenced by CollectGarbage(), GameLoop(), and Save().

◆ last_allocated_memory

size_t ScriptInstance::last_allocated_memory = 0
private

Last known allocated memory value (for display for crashed scripts)

Definition at line 298 of file script_instance.hpp.

Referenced by Died().

◆ storage

class ScriptStorage* ScriptInstance::storage = nullptr
private

Some global information for each running script.

Definition at line 288 of file script_instance.hpp.

Referenced by GetStorage(), and ScriptInstance().

◆ suspend

int ScriptInstance::suspend = 0
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().

◆ versionAPI

std::string ScriptInstance::versionAPI {}
protected

Current API used by this script.

Definition at line 256 of file script_instance.hpp.

Referenced by AIInstance::Initialize(), GameInstance::Initialize(), and LoadCompatibilityScripts().


The documentation for this class was generated from the following files: