OpenTTD Source  13.2.1
script_instance.hpp
Go to the documentation of this file.
1 /*
2  * This file is part of OpenTTD.
3  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6  */
7 
10 #ifndef SCRIPT_INSTANCE_HPP
11 #define SCRIPT_INSTANCE_HPP
12 
13 #include <variant>
14 #include <list>
15 #include <squirrel.h>
16 #include "script_suspend.hpp"
17 
18 #include "../command_type.h"
19 #include "../company_type.h"
20 #include "../fileio_type.h"
21 
22 static const uint SQUIRREL_MAX_DEPTH = 25;
23 
26 private:
29  SQSL_INT = 0x00,
30  SQSL_STRING = 0x01,
31  SQSL_ARRAY = 0x02,
32  SQSL_TABLE = 0x03,
33  SQSL_BOOL = 0x04,
34  SQSL_NULL = 0x05,
36  };
37 
38 public:
39  friend class ScriptObject;
40  friend class ScriptController;
41 
42  typedef std::variant<SQInteger, std::string, SQBool, SQSaveLoadType> ScriptDataVariant;
43  typedef std::list<ScriptDataVariant> ScriptData;
44 
48  ScriptInstance(const char *APIName);
49  virtual ~ScriptInstance();
50 
57  void Initialize(const char *main_script, const char *instance_name, CompanyID company);
58 
64  virtual int GetSetting(const char *name) = 0;
65 
72  virtual class ScriptInfo *FindLibrary(const char *library, int version) = 0;
73 
78  void Continue();
79 
83  void GameLoop();
84 
88  void CollectGarbage();
89 
93  class ScriptStorage *GetStorage();
94 
98  void *GetLogPointer();
99 
104 
109 
114 
119 
124 
129 
134 
139 
144 
148  class ScriptController *GetController() { return controller; }
149 
153  inline bool IsDead() const { return this->is_dead; }
154 
158  void Save();
159 
163  static void SaveEmpty();
164 
171  static ScriptData *Load(int version);
172 
177  void LoadOnStack(ScriptData *data);
178 
182  static void LoadEmpty();
183 
189  void Pause();
190 
195  bool IsPaused();
196 
202  void Unpause();
203 
209  SQInteger GetOpsTillSuspend();
210 
220  bool DoCommandCallback(const CommandCost &result, const CommandDataBuffer &data, CommandDataBuffer result_data, Commands cmd);
221 
226  void InsertEvent(class ScriptEvent *event);
227 
233  bool IsSleeping() { return this->suspend != 0; }
234 
235  size_t GetAllocatedMemory() const;
236 
240  inline bool InShutdown() const { return this->in_shutdown; }
241 
246  void ReleaseSQObject(HSQOBJECT *obj);
247 
248 protected:
249  class Squirrel *engine;
250  const char *versionAPI;
251 
255  virtual void RegisterAPI();
256 
263  bool LoadCompatibilityScripts(const char *api_version, Subdirectory dir);
264 
268  virtual void Died();
269 
274 
278  virtual void LoadDummyScript() = 0;
279 
280 private:
281  class ScriptController *controller;
283  SQObject *instance;
284 
285  bool is_started;
286  bool is_dead;
288  int suspend;
289  bool is_paused;
290  bool in_shutdown;
293 
298  bool CallLoad();
299 
310  static bool SaveObject(HSQUIRRELVM vm, SQInteger index, int max_depth, bool test);
311 
316  static bool LoadObjects(ScriptData *data);
317 
318  static bool LoadObjects(HSQUIRRELVM vm, ScriptData *data);
319 };
320 
321 #endif /* SCRIPT_INSTANCE_HPP */
ScriptInstance::SQSL_ARRAY_TABLE_END
@ SQSL_ARRAY_TABLE_END
Marks the end of an array or table, no data follows.
Definition: script_instance.hpp:35
ScriptInstance::LoadDummyScript
virtual void LoadDummyScript()=0
Load the dummy script.
ScriptInstance::SaveObject
static bool SaveObject(HSQUIRRELVM vm, SQInteger index, int max_depth, bool test)
Save one object (int / string / array / table) to the savegame.
Definition: script_instance.cpp:353
ScriptInstance::engine
class Squirrel * engine
A wrapper around the squirrel vm.
Definition: script_instance.hpp:249
ScriptInstance::last_allocated_memory
size_t last_allocated_memory
Last known allocated memory value (for display for crashed scripts)
Definition: script_instance.hpp:292
ScriptStorage
The storage for each script.
Definition: script_storage.hpp:31
script_suspend.hpp
ScriptInstance::CallLoad
bool CallLoad()
Call the script Load function if it exists and data was loaded from a savegame.
Definition: script_instance.cpp:705
ScriptInstance::is_dead
bool is_dead
True if the script has been stopped.
Definition: script_instance.hpp:286
ScriptInstance::InsertEvent
void InsertEvent(class ScriptEvent *event)
Insert an event for this script.
Definition: script_instance.cpp:771
ScriptInstance::GameLoop
void GameLoop()
Run the GameLoop of a script.
Definition: script_instance.cpp:170
ScriptInstance::controller
class ScriptController * controller
The script main class.
Definition: script_instance.hpp:281
ScriptInstance::Save
void Save()
Call the script Save function and save all data in the savegame.
Definition: script_instance.cpp:475
Commands
Commands
List of commands.
Definition: command_type.h:176
CommandDataBuffer
std::vector< byte > CommandDataBuffer
Storage buffer for serialized command data.
Definition: command_type.h:451
ScriptInstance
Runtime information about a script like a pointer to the squirrel vm and the current state.
Definition: script_instance.hpp:25
ScriptInstance::ScriptInstance
ScriptInstance(const char *APIName)
Create a new script.
Definition: script_instance.cpp:52
ScriptInstance::Unpause
void Unpause()
Resume execution of the script.
Definition: script_instance.cpp:554
ScriptInstance::DoCommandReturnStoryPageElementID
static void DoCommandReturnStoryPageElementID(ScriptInstance *instance)
Return a StoryPageElementID reply for a DoCommand.
Definition: script_instance.cpp:297
ScriptInstance::instance
SQObject * instance
Squirrel-pointer to the script main class.
Definition: script_instance.hpp:283
Script_SuspendCallbackProc
void() Script_SuspendCallbackProc(class ScriptInstance *instance)
The callback function when a script suspends.
Definition: script_suspend.hpp:16
ScriptInstance::SQSL_STRING
@ SQSL_STRING
The following data is an string.
Definition: script_instance.hpp:30
ScriptInstance::is_save_data_on_stack
bool is_save_data_on_stack
Is the save data still on the squirrel stack?
Definition: script_instance.hpp:287
ScriptInstance::is_paused
bool is_paused
Is the script paused? (a paused script will not be executed until unpaused)
Definition: script_instance.hpp:289
ScriptInstance::DoCommandReturnLeagueTableElementID
static void DoCommandReturnLeagueTableElementID(ScriptInstance *instance)
Return a LeagueTableElementID reply for a DoCommand.
Definition: script_instance.cpp:302
Owner
Owner
Enum for all companies/owners.
Definition: company_type.h:18
ScriptInstance::DoCommandReturnLeagueTableID
static void DoCommandReturnLeagueTableID(ScriptInstance *instance)
Return a LeagueTableID reply for a DoCommand.
Definition: script_instance.cpp:307
ScriptInstance::GetOpsTillSuspend
SQInteger GetOpsTillSuspend()
Get the number of operations the script can execute before being suspended.
Definition: script_instance.cpp:742
ScriptInstance::Pause
void Pause()
Suspends the script for the current tick and then pause the execution of script.
Definition: script_instance.cpp:545
ScriptInstance::DoCommandReturnGoalID
static void DoCommandReturnGoalID(ScriptInstance *instance)
Return a GoalID reply for a DoCommand.
Definition: script_instance.cpp:287
ScriptInstance::ReleaseSQObject
void ReleaseSQObject(HSQOBJECT *obj)
Decrease the ref count of a squirrel object.
Definition: script_instance.cpp:784
ScriptInstance::storage
class ScriptStorage * storage
Some global information for each running script.
Definition: script_instance.hpp:282
ScriptInfo::version
int version
Version of the script.
Definition: script_info.hpp:161
Squirrel
Definition: squirrel.hpp:23
ScriptInstance::DoCommandReturnSignID
static void DoCommandReturnSignID(ScriptInstance *instance)
Return a SignID reply for a DoCommand.
Definition: script_instance.cpp:277
ScriptInstance::in_shutdown
bool in_shutdown
Is this instance currently being destructed?
Definition: script_instance.hpp:290
CommandCost
Common return value for all commands.
Definition: command_type.h:24
ScriptInstance::InShutdown
bool InShutdown() const
Indicate whether this instance is currently being destroyed.
Definition: script_instance.hpp:240
ScriptInstance::DoCommandReturn
static void DoCommandReturn(ScriptInstance *instance)
Return a true/false reply for a DoCommand.
Definition: script_instance.cpp:267
ScriptInstance::SaveEmpty
static void SaveEmpty()
Don't save any data in the savegame.
Definition: script_instance.cpp:469
ScriptInstance::LoadObjects
static bool LoadObjects(ScriptData *data)
Load all objects from a savegame.
Definition: script_instance.cpp:564
ScriptInstance::Load
static ScriptData * Load(int version)
Load data from a savegame.
Definition: script_instance.cpp:673
ScriptInstance::IsDead
bool IsDead() const
Return the "this script died" value.
Definition: script_instance.hpp:153
CommandCallbackData
void CommandCallbackData(Commands cmd, const CommandCost &result, const CommandDataBuffer &data, CommandDataBuffer result_data)
Define a callback function for the client, after the command is finished.
Definition: command_type.h:481
ScriptInstance::SQSL_TABLE
@ SQSL_TABLE
The following data is an table.
Definition: script_instance.hpp:32
ScriptInstance::is_started
bool is_started
Is the scripts constructor executed?
Definition: script_instance.hpp:285
ScriptInstance::DoCommandReturnStoryPageID
static void DoCommandReturnStoryPageID(ScriptInstance *instance)
Return a StoryPageID reply for a DoCommand.
Definition: script_instance.cpp:292
ScriptInstance::RegisterAPI
virtual void RegisterAPI()
Register all API functions to the VM.
Definition: script_instance.cpp:111
ScriptInstance::Initialize
void Initialize(const char *main_script, const char *instance_name, CompanyID company)
Initialize the script and prepare it for its first run.
Definition: script_instance.cpp:71
ScriptInstance::LoadEmpty
static void LoadEmpty()
Load and discard data from a savegame.
Definition: script_instance.cpp:664
ScriptInstance::DoCommandReturnGroupID
static void DoCommandReturnGroupID(ScriptInstance *instance)
Return a GroupID reply for a DoCommand.
Definition: script_instance.cpp:282
ScriptInstance::IsSleeping
bool IsSleeping()
Check if the instance is sleeping, which either happened because the script executed a DoCommand,...
Definition: script_instance.hpp:233
ScriptInstance::callback
Script_SuspendCallbackProc * callback
Callback that should be called in the next tick the script runs.
Definition: script_instance.hpp:291
ScriptInstance::SQSL_ARRAY
@ SQSL_ARRAY
The following data is an array.
Definition: script_instance.hpp:31
ScriptInstance::GetSetting
virtual int GetSetting(const char *name)=0
Get the value of a setting of the current instance.
ScriptInstance::DoCommandCallback
bool DoCommandCallback(const CommandCost &result, const CommandDataBuffer &data, CommandDataBuffer result_data, Commands cmd)
DoCommand callback function for all commands executed by scripts.
Definition: script_instance.cpp:747
ScriptInstance::SQSL_NULL
@ SQSL_NULL
A null variable.
Definition: script_instance.hpp:34
ScriptInstance::SQSL_BOOL
@ SQSL_BOOL
The following data is a boolean.
Definition: script_instance.hpp:33
ScriptInstance::DoCommandReturnVehicleID
static void DoCommandReturnVehicleID(ScriptInstance *instance)
Return a VehicleID reply for a DoCommand.
Definition: script_instance.cpp:272
ScriptInstance::GetStorage
class ScriptStorage * GetStorage()
Get the storage of this script.
Definition: script_instance.cpp:313
ScriptInstance::GetController
class ScriptController * GetController()
Get the controller attached to the instance.
Definition: script_instance.hpp:148
ScriptInstance::LoadOnStack
void LoadOnStack(ScriptData *data)
Store loaded data on the stack.
Definition: script_instance.cpp:690
Subdirectory
Subdirectory
The different kinds of subdirectories OpenTTD uses.
Definition: fileio_type.h:108
ScriptInstance::SQSaveLoadType
SQSaveLoadType
The type of the data that follows in the savegame.
Definition: script_instance.hpp:28
ScriptInstance::Died
virtual void Died()
Tell the script it died.
Definition: script_instance.cpp:155
ScriptInstance::suspend
int suspend
The amount of ticks to suspend this script before it's allowed to continue.
Definition: script_instance.hpp:288
ScriptInstance::Continue
void Continue()
A script in multiplayer waits for the server to handle its DoCommand.
Definition: script_instance.cpp:149
ScriptInstance::SQSL_INT
@ SQSL_INT
The following data is an integer.
Definition: script_instance.hpp:29
ScriptInstance::IsPaused
bool IsPaused()
Checks if the script is paused.
Definition: script_instance.cpp:559
ScriptInstance::LoadCompatibilityScripts
bool LoadCompatibilityScripts(const char *api_version, Subdirectory dir)
Load squirrel scripts to emulate an older API.
Definition: script_instance.cpp:117
ScriptInstance::CollectGarbage
void CollectGarbage()
Let the VM collect any garbage.
Definition: script_instance.cpp:259
ScriptInfo
All static information from an Script like name, version, etc.
Definition: script_info.hpp:30
ScriptInstance::versionAPI
const char * versionAPI
Current API used by this script.
Definition: script_instance.hpp:250
ScriptInstance::FindLibrary
virtual class ScriptInfo * FindLibrary(const char *library, int version)=0
Find a library.
ScriptInstance::GetLogPointer
void * GetLogPointer()
Get the log pointer of this script.
Definition: script_instance.cpp:318
SQUIRREL_MAX_DEPTH
static const uint SQUIRREL_MAX_DEPTH
The maximum recursive depth for items stored in the savegame.
Definition: script_instance.hpp:22
ScriptInstance::GetDoCommandCallback
virtual CommandCallbackData * GetDoCommandCallback()=0
Get the callback handling DoCommands in case of networking.