OpenTTD
game_instance.cpp
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 #include "../stdafx.h"
11 #include "../error.h"
12 
13 #include "../script/squirrel_class.hpp"
14 
15 #include "../script/script_storage.hpp"
16 #include "../ai/ai_gui.hpp"
17 #include "game_config.hpp"
18 #include "game_info.hpp"
19 #include "game_instance.hpp"
20 #include "game_text.hpp"
21 #include "game.hpp"
22 
23 /* Convert all Game related classes to Squirrel data.
24  * Note: this line is a marker in squirrel_export.sh. Do not change! */
25 #include "../script/api/game/game_accounting.hpp.sq"
26 #include "../script/api/game/game_admin.hpp.sq"
27 #include "../script/api/game/game_airport.hpp.sq"
28 #include "../script/api/game/game_base.hpp.sq"
29 #include "../script/api/game/game_basestation.hpp.sq"
30 #include "../script/api/game/game_bridge.hpp.sq"
31 #include "../script/api/game/game_bridgelist.hpp.sq"
32 #include "../script/api/game/game_cargo.hpp.sq"
33 #include "../script/api/game/game_cargolist.hpp.sq"
34 #include "../script/api/game/game_cargomonitor.hpp.sq"
35 #include "../script/api/game/game_client.hpp.sq"
36 #include "../script/api/game/game_clientlist.hpp.sq"
37 #include "../script/api/game/game_company.hpp.sq"
38 #include "../script/api/game/game_companymode.hpp.sq"
39 #include "../script/api/game/game_controller.hpp.sq"
40 #include "../script/api/game/game_date.hpp.sq"
41 #include "../script/api/game/game_depotlist.hpp.sq"
42 #include "../script/api/game/game_engine.hpp.sq"
43 #include "../script/api/game/game_enginelist.hpp.sq"
44 #include "../script/api/game/game_error.hpp.sq"
45 #include "../script/api/game/game_event.hpp.sq"
46 #include "../script/api/game/game_event_types.hpp.sq"
47 #include "../script/api/game/game_execmode.hpp.sq"
48 #include "../script/api/game/game_game.hpp.sq"
49 #include "../script/api/game/game_gamesettings.hpp.sq"
50 #include "../script/api/game/game_goal.hpp.sq"
51 #include "../script/api/game/game_industry.hpp.sq"
52 #include "../script/api/game/game_industrylist.hpp.sq"
53 #include "../script/api/game/game_industrytype.hpp.sq"
54 #include "../script/api/game/game_industrytypelist.hpp.sq"
55 #include "../script/api/game/game_infrastructure.hpp.sq"
56 #include "../script/api/game/game_list.hpp.sq"
57 #include "../script/api/game/game_log.hpp.sq"
58 #include "../script/api/game/game_map.hpp.sq"
59 #include "../script/api/game/game_marine.hpp.sq"
60 #include "../script/api/game/game_news.hpp.sq"
61 #include "../script/api/game/game_order.hpp.sq"
62 #include "../script/api/game/game_rail.hpp.sq"
63 #include "../script/api/game/game_railtypelist.hpp.sq"
64 #include "../script/api/game/game_road.hpp.sq"
65 #include "../script/api/game/game_roadtypelist.hpp.sq"
66 #include "../script/api/game/game_sign.hpp.sq"
67 #include "../script/api/game/game_signlist.hpp.sq"
68 #include "../script/api/game/game_station.hpp.sq"
69 #include "../script/api/game/game_stationlist.hpp.sq"
70 #include "../script/api/game/game_story_page.hpp.sq"
71 #include "../script/api/game/game_storypageelementlist.hpp.sq"
72 #include "../script/api/game/game_storypagelist.hpp.sq"
73 #include "../script/api/game/game_subsidy.hpp.sq"
74 #include "../script/api/game/game_subsidylist.hpp.sq"
75 #include "../script/api/game/game_testmode.hpp.sq"
76 #include "../script/api/game/game_text.hpp.sq"
77 #include "../script/api/game/game_tile.hpp.sq"
78 #include "../script/api/game/game_tilelist.hpp.sq"
79 #include "../script/api/game/game_town.hpp.sq"
80 #include "../script/api/game/game_townlist.hpp.sq"
81 #include "../script/api/game/game_tunnel.hpp.sq"
82 #include "../script/api/game/game_vehicle.hpp.sq"
83 #include "../script/api/game/game_vehiclelist.hpp.sq"
84 #include "../script/api/game/game_viewport.hpp.sq"
85 #include "../script/api/game/game_waypoint.hpp.sq"
86 #include "../script/api/game/game_waypointlist.hpp.sq"
87 #include "../script/api/game/game_window.hpp.sq"
88 
89 #include "../safeguards.h"
90 
91 
92 GameInstance::GameInstance() :
93  ScriptInstance("GS")
94 {}
95 
97 {
98  this->versionAPI = info->GetAPIVersion();
99 
100  /* Register the GameController */
101  SQGSController_Register(this->engine);
102 
104 }
105 
107 {
109 
110 /* Register all classes */
111  SQGSList_Register(this->engine);
112  SQGSAccounting_Register(this->engine);
113  SQGSAdmin_Register(this->engine);
114  SQGSAirport_Register(this->engine);
115  SQGSBase_Register(this->engine);
116  SQGSBaseStation_Register(this->engine);
117  SQGSBridge_Register(this->engine);
118  SQGSBridgeList_Register(this->engine);
119  SQGSBridgeList_Length_Register(this->engine);
120  SQGSCargo_Register(this->engine);
121  SQGSCargoList_Register(this->engine);
122  SQGSCargoList_IndustryAccepting_Register(this->engine);
123  SQGSCargoList_IndustryProducing_Register(this->engine);
124  SQGSCargoList_StationAccepting_Register(this->engine);
125  SQGSCargoMonitor_Register(this->engine);
126  SQGSClient_Register(this->engine);
127  SQGSClientList_Register(this->engine);
128  SQGSClientList_Company_Register(this->engine);
129  SQGSCompany_Register(this->engine);
130  SQGSCompanyMode_Register(this->engine);
131  SQGSDate_Register(this->engine);
132  SQGSDepotList_Register(this->engine);
133  SQGSEngine_Register(this->engine);
134  SQGSEngineList_Register(this->engine);
135  SQGSError_Register(this->engine);
136  SQGSEvent_Register(this->engine);
137  SQGSEventAdminPort_Register(this->engine);
138  SQGSEventCompanyBankrupt_Register(this->engine);
139  SQGSEventCompanyInTrouble_Register(this->engine);
140  SQGSEventCompanyMerger_Register(this->engine);
141  SQGSEventCompanyNew_Register(this->engine);
142  SQGSEventCompanyTown_Register(this->engine);
143  SQGSEventController_Register(this->engine);
144  SQGSEventExclusiveTransportRights_Register(this->engine);
145  SQGSEventGoalQuestionAnswer_Register(this->engine);
146  SQGSEventIndustryClose_Register(this->engine);
147  SQGSEventIndustryOpen_Register(this->engine);
148  SQGSEventRoadReconstruction_Register(this->engine);
149  SQGSEventStationFirstVehicle_Register(this->engine);
150  SQGSEventSubsidyAwarded_Register(this->engine);
151  SQGSEventSubsidyExpired_Register(this->engine);
152  SQGSEventSubsidyOffer_Register(this->engine);
153  SQGSEventSubsidyOfferExpired_Register(this->engine);
154  SQGSEventTownFounded_Register(this->engine);
155  SQGSEventVehicleCrashed_Register(this->engine);
156  SQGSEventWindowWidgetClick_Register(this->engine);
157  SQGSExecMode_Register(this->engine);
158  SQGSGame_Register(this->engine);
159  SQGSGameSettings_Register(this->engine);
160  SQGSGoal_Register(this->engine);
161  SQGSIndustry_Register(this->engine);
162  SQGSIndustryList_Register(this->engine);
163  SQGSIndustryList_CargoAccepting_Register(this->engine);
164  SQGSIndustryList_CargoProducing_Register(this->engine);
165  SQGSIndustryType_Register(this->engine);
166  SQGSIndustryTypeList_Register(this->engine);
167  SQGSInfrastructure_Register(this->engine);
168  SQGSLog_Register(this->engine);
169  SQGSMap_Register(this->engine);
170  SQGSMarine_Register(this->engine);
171  SQGSNews_Register(this->engine);
172  SQGSOrder_Register(this->engine);
173  SQGSRail_Register(this->engine);
174  SQGSRailTypeList_Register(this->engine);
175  SQGSRoad_Register(this->engine);
176  SQGSRoadTypeList_Register(this->engine);
177  SQGSSign_Register(this->engine);
178  SQGSSignList_Register(this->engine);
179  SQGSStation_Register(this->engine);
180  SQGSStationList_Register(this->engine);
181  SQGSStationList_Cargo_Register(this->engine);
182  SQGSStationList_CargoPlanned_Register(this->engine);
183  SQGSStationList_CargoPlannedByFrom_Register(this->engine);
184  SQGSStationList_CargoPlannedByVia_Register(this->engine);
185  SQGSStationList_CargoPlannedFromByVia_Register(this->engine);
186  SQGSStationList_CargoPlannedViaByFrom_Register(this->engine);
187  SQGSStationList_CargoWaiting_Register(this->engine);
188  SQGSStationList_CargoWaitingByFrom_Register(this->engine);
189  SQGSStationList_CargoWaitingByVia_Register(this->engine);
190  SQGSStationList_CargoWaitingFromByVia_Register(this->engine);
191  SQGSStationList_CargoWaitingViaByFrom_Register(this->engine);
192  SQGSStationList_Vehicle_Register(this->engine);
193  SQGSStoryPage_Register(this->engine);
194  SQGSStoryPageElementList_Register(this->engine);
195  SQGSStoryPageList_Register(this->engine);
196  SQGSSubsidy_Register(this->engine);
197  SQGSSubsidyList_Register(this->engine);
198  SQGSTestMode_Register(this->engine);
199  SQGSText_Register(this->engine);
200  SQGSTile_Register(this->engine);
201  SQGSTileList_Register(this->engine);
202  SQGSTileList_IndustryAccepting_Register(this->engine);
203  SQGSTileList_IndustryProducing_Register(this->engine);
204  SQGSTileList_StationType_Register(this->engine);
205  SQGSTown_Register(this->engine);
206  SQGSTownEffectList_Register(this->engine);
207  SQGSTownList_Register(this->engine);
208  SQGSTunnel_Register(this->engine);
209  SQGSVehicle_Register(this->engine);
210  SQGSVehicleList_Register(this->engine);
211  SQGSVehicleList_Depot_Register(this->engine);
212  SQGSVehicleList_SharedOrders_Register(this->engine);
213  SQGSVehicleList_Station_Register(this->engine);
214  SQGSViewport_Register(this->engine);
215  SQGSWaypoint_Register(this->engine);
216  SQGSWaypointList_Register(this->engine);
217  SQGSWaypointList_Vehicle_Register(this->engine);
218  SQGSWindow_Register(this->engine);
219 
221 
222  if (!this->LoadCompatibilityScripts(this->versionAPI, GAME_DIR)) this->Died();
223 }
224 
226 {
227  return GameConfig::GetConfig()->GetSetting(name);
228 }
229 
230 ScriptInfo *GameInstance::FindLibrary(const char *library, int version)
231 {
232  return (ScriptInfo *)Game::FindLibrary(library, version);
233 }
234 
236 {
238 
240 
241  const GameInfo *info = Game::GetInfo();
242  if (info != nullptr) {
243  ShowErrorMessage(STR_ERROR_AI_PLEASE_REPORT_CRASH, INVALID_STRING_ID, WL_WARNING);
244 
245  if (info->GetURL() != nullptr) {
246  ScriptLog::Info("Please report the error to the following URL:");
247  ScriptLog::Info(info->GetURL());
248  }
249  }
250 }
251 
260 void CcGame(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2, uint32 cmd)
261 {
262  if (Game::GetGameInstance()->DoCommandCallback(result, tile, p1, p2, cmd)) {
264  }
265 }
266 
268 {
269  return &CcGame;
270 }
void Died() override
Tell the script it died.
int version
Version of the script.
GameConfig stores the configuration settings of every Game.
void RegisterGameTranslation(Squirrel *engine)
Register the current translation to the Squirrel engine.
Definition: game_text.cpp:345
Base functions regarding game texts.
void ShowErrorMessage(StringID summary_msg, StringID detailed_msg, WarningLevel wl, int x=0, int y=0, const GRFFile *textref_stack_grffile=nullptr, uint textref_stack_size=0, const uint32 *textref_stack=nullptr)
Display an error message in a window.
Definition: error_gui.cpp:380
Subdirectory for all game scripts.
Definition: fileio_type.h:121
void Continue()
A script in multiplayer waits for the server to handle his DoCommand.
static GameConfig * GetConfig(ScriptSettingSource source=SSS_DEFAULT)
Get the config of a company.
Definition: game_config.cpp:18
Common return value for all commands.
Definition: command_type.h:23
int GetSetting(const char *name) override
Get the value of a setting of the current instance.
All static information from an Game like name, version, etc.
Definition: game_info.hpp:16
const char * GetMainScript() const
Get the filename of the main.nut script.
Definition: script_info.hpp:92
void CommandCallback(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2, uint32 cmd)
Define a callback function for the client, after the command is finished.
Definition: command_type.h:470
Other information.
Definition: error.h:22
void CcGame(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2, uint32 cmd)
DoCommand callback function for all commands executed by Game Scripts.
All static information from an Script like name, version, etc.
Definition: script_info.hpp:30
The GameInstance tracks games.
Runtime information about a script like a pointer to the squirrel vm and the current state...
static class GameLibrary * FindLibrary(const char *library, int version)
Wrapper function for GameScanner::FindLibrary.
Definition: game_core.cpp:253
const char * GetAPIVersion() const
Get the API version this Game is written for.
Definition: game_info.hpp:39
const char * GetURL() const
Get the website for this script.
Definition: script_info.hpp:87
static class GameInfo * GetInfo()
Get the current GameInfo.
Definition: game.hpp:80
Window * ShowAIDebugWindow(CompanyID show_company)
Open the AI debug window and select the given company.
Definition: ai_gui.cpp:1525
const char * name
Full name of the script.
void RegisterAPI() override
Register all API functions to the VM.
GameInfo keeps track of all information of an Game, like Author, Description, ... ...
static class GameInstance * GetGameInstance()
Get the current GameScript instance.
Definition: game.hpp:75
uint32 TileIndex
The index/ID of a Tile.
Definition: tile_type.h:78
ScriptInfo * FindLibrary(const char *library, int version) override
Find a library.
virtual void RegisterAPI()
Register all API functions to the VM.
void Initialize(const char *main_script, const char *instance_name, CompanyID company)
Initialize the script and prepare it for its first run.
Base functions for all Games.
class Squirrel * engine
Engine used to register for Squirrel.
static const StringID INVALID_STRING_ID
Constant representing an invalid string (16bit in case it is used in savegames)
Definition: strings_type.h:17
CommandCallback * GetDoCommandCallback() override
Get the callback handling DoCommands in case of networking.
virtual int GetSetting(const char *name) const
Get the value of a setting for this config.
virtual void Died()
Tell the script it died.
void Initialize(class GameInfo *info)
Initialize the script and prepare it for its first run.
const char * GetInstanceName() const
Get the name of the instance of the script to create.
Definition: script_info.hpp:82
The object is owned by a superuser / goal script.
Definition: company_type.h:27