OpenTTD Source 20260208-master-g43af8e94d0
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 <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
6 */
7
9
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:
28 enum SQSaveLoadType : uint8_t {
29 SQSL_INT = 0x00,
30 SQSL_STRING = 0x01,
31 SQSL_ARRAY = 0x02,
32 SQSL_TABLE = 0x03,
33 SQSL_BOOL = 0x04,
34 SQSL_NULL = 0x05,
37 };
38
39public:
40 friend class ScriptObject;
41 friend class ScriptController;
42
43 typedef std::variant<SQInteger, std::string, SQBool, SQSaveLoadType> ScriptDataVariant;
44 typedef std::list<ScriptDataVariant> ScriptData;
45
49 ScriptInstance(std::string_view api_name);
50 virtual ~ScriptInstance();
51
58 void Initialize(const std::string &main_script, const std::string &instance_name, CompanyID company);
59
65 virtual int GetSetting(const std::string &name) = 0;
66
73 virtual class ScriptInfo *FindLibrary(const std::string &library, int version) = 0;
74
79 void Continue();
80
84 void GameLoop();
85
89 void CollectGarbage();
90
95
99 ScriptLogTypes::LogData &GetLogData();
100
105
110
115
120
125
130
135
140
145
149 class ScriptController &GetController()
150 {
151 assert(this->controller != nullptr);
152 return *this->controller;
153 }
154
158 inline bool IsDead() const { return this->is_dead; }
159
163 inline bool IsAlive() const { return !this->IsDead() && !this->in_shutdown; }
164
168 void Save();
169
173 static void SaveEmpty();
174
181 static ScriptData *Load(int version);
182
187 void LoadOnStack(ScriptData *data);
188
192 static void LoadEmpty();
193
199 void Pause();
200
205 bool IsPaused();
206
212 void Unpause();
213
219 SQInteger GetOpsTillSuspend();
220
229 bool DoCommandCallback(const CommandCost &result, const CommandDataBuffer &data, CommandDataBuffer result_data, Commands cmd);
230
235 void InsertEvent(class ScriptEvent *event);
236
242 bool IsSleeping() { return this->suspend != 0; }
243
244 size_t GetAllocatedMemory() const;
245
249 inline bool InShutdown() const { return this->in_shutdown; }
250
255 void ReleaseSQObject(HSQOBJECT *obj);
256
257protected:
258 std::unique_ptr<class Squirrel> engine;
259 std::string api_version{};
260
264 virtual void RegisterAPI();
265
272 bool LoadCompatibilityScripts(Subdirectory dir, std::span<const std::string_view> api_versions);
273
277 virtual void Died();
278
283
287 virtual void LoadDummyScript() = 0;
288
289private:
290 std::unique_ptr<class ScriptStorage> storage;
291 std::unique_ptr<class ScriptController> controller;
292 std::unique_ptr<SQObject> instance;
293
294 bool is_started = false;
295 bool is_dead = false;
297 int suspend = 0;
298 bool is_paused = false;
299 bool in_shutdown = false;
302
307 bool CallLoad();
308
315 bool LoadCompatibilityScript(std::string_view api_version, Subdirectory dir);
316
327 static bool SaveObject(HSQUIRRELVM vm, SQInteger index, int max_depth, bool test);
328
333 static bool LoadObjects(ScriptData *data);
334
335 static bool LoadObjects(HSQUIRRELVM vm, ScriptData *data);
336};
337
338#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.
bool LoadCompatibilityScripts(Subdirectory dir, std::span< const std::string_view > api_versions)
Load squirrel scripts to emulate an older API.
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.
static void DoCommandReturnGroupID(ScriptInstance &instance)
Return a GroupID reply for a DoCommand.
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 DoCommandReturnVehicleID(ScriptInstance &instance)
Return a VehicleID reply for a DoCommand.
static void DoCommandReturnSignID(ScriptInstance &instance)
Return a SignID reply for a DoCommand.
std::unique_ptr< class Squirrel > engine
A wrapper around the squirrel vm.
void CollectGarbage()
Let the VM collect any garbage.
static void DoCommandReturn(ScriptInstance &instance)
Return a true/false reply for a DoCommand.
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.
@ SQSL_INSTANCE
The following data is an instance.
static void DoCommandReturnGoalID(ScriptInstance &instance)
Return a GoalID reply for a DoCommand.
static void SaveEmpty()
Don't save any data in the savegame.
static void DoCommandReturnLeagueTableElementID(ScriptInstance &instance)
Return a LeagueTableElementID 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.
std::string api_version
Current API used by this script.
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.
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.
ScriptInstance(std::string_view api_name)
Create a new 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.
std::unique_ptr< class ScriptController > controller
The script main class.
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.
static void DoCommandReturnStoryPageElementID(ScriptInstance &instance)
Return a StoryPageElementID reply for a DoCommand.
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.
SQInteger GetOpsTillSuspend()
Get the number of operations the script can execute before being suspended.
std::unique_ptr< class ScriptStorage > storage
Some global information for each running script.
class ScriptStorage & GetStorage()
Get the storage of this script.
bool is_started
Is the scripts constructor executed?
static void DoCommandReturnLeagueTableID(ScriptInstance &instance)
Return a LeagueTableID reply for a DoCommand.
static void DoCommandReturnStoryPageID(ScriptInstance &instance)
Return a StoryPageID reply for a DoCommand.
bool LoadCompatibilityScript(std::string_view api_version, Subdirectory dir)
Load squirrel script for a specific version to emulate an older API.
bool is_paused
Is the script paused? (a paused script will not be executed until unpaused).
std::unique_ptr< SQObject > instance
Squirrel-pointer to the script main class.
The storage for each script.
Types related to commands.
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.
Types related to companies.
Types for standard in/out file operations.
Subdirectory
The different kinds of subdirectories OpenTTD uses.
Definition fileio_type.h:88
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.