OpenTTD Source 20241224-master-gf74b0cf984
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 <squirrel.h>
15#include "script_suspend.hpp"
16#include "script_log_types.hpp"
17
18#include "../command_type.h"
19#include "../company_type.h"
20#include "../fileio_type.h"
21
22static const uint SQUIRREL_MAX_DEPTH = 25;
23
26private:
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
38public:
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 std::string &main_script, const std::string &instance_name, CompanyID company);
58
64 virtual int GetSetting(const std::string &name) = 0;
65
72 virtual class ScriptInfo *FindLibrary(const std::string &library, int version) = 0;
73
78 void Continue();
79
83 void GameLoop();
84
88 void CollectGarbage();
89
94
98 ScriptLogTypes::LogData &GetLogData();
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 inline bool IsAlive() const { return !this->IsDead() && !this->in_shutdown; }
159
163 void Save();
164
168 static void SaveEmpty();
169
176 static ScriptData *Load(int version);
177
182 void LoadOnStack(ScriptData *data);
183
187 static void LoadEmpty();
188
194 void Pause();
195
200 bool IsPaused();
201
207 void Unpause();
208
214 SQInteger GetOpsTillSuspend();
215
225 bool DoCommandCallback(const CommandCost &result, const CommandDataBuffer &data, CommandDataBuffer result_data, Commands cmd);
226
231 void InsertEvent(class ScriptEvent *event);
232
238 bool IsSleeping() { return this->suspend != 0; }
239
240 size_t GetAllocatedMemory() const;
241
245 inline bool InShutdown() const { return this->in_shutdown; }
246
251 void ReleaseSQObject(HSQOBJECT *obj);
252
253protected:
255 std::string versionAPI;
256
260 virtual void RegisterAPI();
261
268 bool LoadCompatibilityScripts(const std::string &api_version, Subdirectory dir);
269
273 virtual void Died();
274
279
283 virtual void LoadDummyScript() = 0;
284
285private:
286 class ScriptController *controller;
288 SQObject *instance;
289
291 bool is_dead;
298
303 bool CallLoad();
304
315 static bool SaveObject(HSQUIRRELVM vm, SQInteger index, int max_depth, bool test);
316
321 static bool LoadObjects(ScriptData *data);
322
323 static bool LoadObjects(HSQUIRRELVM vm, ScriptData *data);
324};
325
326#endif /* SCRIPT_INSTANCE_HPP */
Common return value for all commands.
All static information from an Script like name, version, etc.
Runtime information about a script like a pointer to the squirrel vm and the current state.
virtual class ScriptInfo * FindLibrary(const std::string &library, int version)=0
Find a library.
static ScriptData * Load(int version)
Load data from a savegame.
virtual void RegisterAPI()
Register all API functions to the VM.
void InsertEvent(class ScriptEvent *event)
Insert an event for this script.
void Unpause()
Resume execution of the script.
virtual CommandCallbackData * GetDoCommandCallback()=0
Get the callback handling DoCommands in case of networking.
class ScriptStorage * GetStorage()
Get the storage of this script.
bool IsPaused()
Checks if the script is paused.
virtual void Died()
Tell the script it died.
static bool LoadObjects(ScriptData *data)
Load all objects from a savegame.
void ReleaseSQObject(HSQOBJECT *obj)
Decrease the ref count of a squirrel object.
static void DoCommandReturnLeagueTableElementID(ScriptInstance *instance)
Return a LeagueTableElementID reply for a DoCommand.
void CollectGarbage()
Let the VM collect any garbage.
class Squirrel * engine
A wrapper around the squirrel vm.
SQSaveLoadType
The type of the data that follows in the savegame.
@ SQSL_BOOL
The following data is a boolean.
@ SQSL_STRING
The following data is an string.
@ SQSL_TABLE
The following data is an table.
@ SQSL_ARRAY_TABLE_END
Marks the end of an array or table, no data follows.
@ SQSL_ARRAY
The following data is an array.
@ SQSL_NULL
A null variable.
@ SQSL_INT
The following data is an integer.
static void DoCommandReturn(ScriptInstance *instance)
Return a true/false reply for a DoCommand.
static void SaveEmpty()
Don't save any data in the savegame.
static void DoCommandReturnStoryPageElementID(ScriptInstance *instance)
Return a StoryPageElementID reply for a DoCommand.
void LoadOnStack(ScriptData *data)
Store loaded data on the stack.
void Save()
Call the script Save function and save all data in the savegame.
bool is_save_data_on_stack
Is the save data still on the squirrel stack?
bool in_shutdown
Is this instance currently being destructed?
virtual void LoadDummyScript()=0
Load the dummy script.
bool LoadCompatibilityScripts(const std::string &api_version, Subdirectory dir)
Load squirrel scripts to emulate an older API.
static void DoCommandReturnVehicleID(ScriptInstance *instance)
Return a VehicleID reply for a DoCommand.
static void DoCommandReturnGoalID(ScriptInstance *instance)
Return a GoalID reply for a DoCommand.
static void DoCommandReturnGroupID(ScriptInstance *instance)
Return a GroupID reply for a DoCommand.
class ScriptController * GetController()
Get the controller attached to the instance.
bool IsSleeping()
Check if the instance is sleeping, which either happened because the script executed a DoCommand,...
bool DoCommandCallback(const CommandCost &result, const CommandDataBuffer &data, CommandDataBuffer result_data, Commands cmd)
DoCommand callback function for all commands executed by scripts.
SQObject * instance
Squirrel-pointer to the script main class.
ScriptLogTypes::LogData & GetLogData()
Get the log pointer of this script.
void Pause()
Suspends the script for the current tick and then pause the execution of script.
Script_SuspendCallbackProc * callback
Callback that should be called in the next tick the script runs.
void Initialize(const std::string &main_script, const std::string &instance_name, CompanyID company)
Initialize the script and prepare it for its first run.
static bool SaveObject(HSQUIRRELVM vm, SQInteger index, int max_depth, bool test)
Save one object (int / string / array / table) to the savegame.
bool CallLoad()
Call the script Load function if it exists and data was loaded from a savegame.
bool is_dead
True if the script has been stopped.
bool InShutdown() const
Indicate whether this instance is currently being destroyed.
bool IsDead() const
Return the "this script died" value.
size_t last_allocated_memory
Last known allocated memory value (for display for crashed scripts)
void Continue()
A script in multiplayer waits for the server to handle its DoCommand.
virtual int GetSetting(const std::string &name)=0
Get the value of a setting of the current instance.
static void LoadEmpty()
Load and discard data from a savegame.
void GameLoop()
Run the GameLoop of a script.
int suspend
The amount of ticks to suspend this script before it's allowed to continue.
bool IsAlive() const
Return whether the script is alive.
std::string versionAPI
Current API used by this script.
static void DoCommandReturnLeagueTableID(ScriptInstance *instance)
Return a LeagueTableID reply for a DoCommand.
class ScriptController * controller
The script main class.
static void DoCommandReturnSignID(ScriptInstance *instance)
Return a SignID reply for a DoCommand.
SQInteger GetOpsTillSuspend()
Get the number of operations the script can execute before being suspended.
bool is_started
Is the scripts constructor executed?
static void DoCommandReturnStoryPageID(ScriptInstance *instance)
Return a StoryPageID reply for a DoCommand.
class ScriptStorage * storage
Some global information for each running script.
bool is_paused
Is the script paused? (a paused script will not be executed until unpaused)
The storage for each script.
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.
std::vector< uint8_t > CommandDataBuffer
Storage buffer for serialized command data.
Commands
List of commands.
Owner
Enum for all companies/owners.
Subdirectory
The different kinds of subdirectories OpenTTD uses.
static const uint SQUIRREL_MAX_DEPTH
The maximum recursive depth for items stored in the savegame.
The Script_Suspend tracks the suspension of a script.
void() Script_SuspendCallbackProc(class ScriptInstance *instance)
The callback function when a script suspends.