OpenTTD
ai_instance.cpp
Go to the documentation of this file.
1 /* $Id$ */
2 
3 /*
4  * This file is part of OpenTTD.
5  * 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.
6  * 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.
7  * 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/>.
8  */
9 
12 #include "../stdafx.h"
13 #include "../debug.h"
14 #include "../error.h"
15 
16 #include "../script/squirrel_class.hpp"
17 
18 #include "ai_config.hpp"
19 #include "ai_gui.hpp"
20 #include "ai.hpp"
21 
22 #include "../script/script_storage.hpp"
23 #include "ai_info.hpp"
24 #include "ai_instance.hpp"
25 
26 /* Manually include the Text glue. */
27 #include "../script/api/template/template_text.hpp.sq"
28 
29 /* Convert all AI related classes to Squirrel data.
30  * Note: this line is a marker in squirrel_export.sh. Do not change! */
31 #include "../script/api/ai/ai_accounting.hpp.sq"
32 #include "../script/api/ai/ai_airport.hpp.sq"
33 #include "../script/api/ai/ai_base.hpp.sq"
34 #include "../script/api/ai/ai_basestation.hpp.sq"
35 #include "../script/api/ai/ai_bridge.hpp.sq"
36 #include "../script/api/ai/ai_bridgelist.hpp.sq"
37 #include "../script/api/ai/ai_cargo.hpp.sq"
38 #include "../script/api/ai/ai_cargolist.hpp.sq"
39 #include "../script/api/ai/ai_company.hpp.sq"
40 #include "../script/api/ai/ai_controller.hpp.sq"
41 #include "../script/api/ai/ai_date.hpp.sq"
42 #include "../script/api/ai/ai_depotlist.hpp.sq"
43 #include "../script/api/ai/ai_engine.hpp.sq"
44 #include "../script/api/ai/ai_enginelist.hpp.sq"
45 #include "../script/api/ai/ai_error.hpp.sq"
46 #include "../script/api/ai/ai_event.hpp.sq"
47 #include "../script/api/ai/ai_event_types.hpp.sq"
48 #include "../script/api/ai/ai_execmode.hpp.sq"
49 #include "../script/api/ai/ai_gamesettings.hpp.sq"
50 #include "../script/api/ai/ai_group.hpp.sq"
51 #include "../script/api/ai/ai_grouplist.hpp.sq"
52 #include "../script/api/ai/ai_industry.hpp.sq"
53 #include "../script/api/ai/ai_industrylist.hpp.sq"
54 #include "../script/api/ai/ai_industrytype.hpp.sq"
55 #include "../script/api/ai/ai_industrytypelist.hpp.sq"
56 #include "../script/api/ai/ai_infrastructure.hpp.sq"
57 #include "../script/api/ai/ai_list.hpp.sq"
58 #include "../script/api/ai/ai_log.hpp.sq"
59 #include "../script/api/ai/ai_map.hpp.sq"
60 #include "../script/api/ai/ai_marine.hpp.sq"
61 #include "../script/api/ai/ai_order.hpp.sq"
62 #include "../script/api/ai/ai_rail.hpp.sq"
63 #include "../script/api/ai/ai_railtypelist.hpp.sq"
64 #include "../script/api/ai/ai_road.hpp.sq"
65 #include "../script/api/ai/ai_roadtypelist.hpp.sq"
66 #include "../script/api/ai/ai_sign.hpp.sq"
67 #include "../script/api/ai/ai_signlist.hpp.sq"
68 #include "../script/api/ai/ai_station.hpp.sq"
69 #include "../script/api/ai/ai_stationlist.hpp.sq"
70 #include "../script/api/ai/ai_subsidy.hpp.sq"
71 #include "../script/api/ai/ai_subsidylist.hpp.sq"
72 #include "../script/api/ai/ai_testmode.hpp.sq"
73 #include "../script/api/ai/ai_tile.hpp.sq"
74 #include "../script/api/ai/ai_tilelist.hpp.sq"
75 #include "../script/api/ai/ai_town.hpp.sq"
76 #include "../script/api/ai/ai_townlist.hpp.sq"
77 #include "../script/api/ai/ai_tunnel.hpp.sq"
78 #include "../script/api/ai/ai_vehicle.hpp.sq"
79 #include "../script/api/ai/ai_vehiclelist.hpp.sq"
80 #include "../script/api/ai/ai_waypoint.hpp.sq"
81 #include "../script/api/ai/ai_waypointlist.hpp.sq"
82 
83 #include "../company_base.h"
84 #include "../company_func.h"
85 
86 #include "../safeguards.h"
87 
88 AIInstance::AIInstance() :
89  ScriptInstance("AI")
90 {}
91 
93 {
94  this->versionAPI = info->GetAPIVersion();
95 
96  /* Register the AIController (including the "import" command) */
97  SQAIController_Register(this->engine);
98 
100 }
101 
103 {
105 
106 /* Register all classes */
107  SQAIList_Register(this->engine);
108  SQAIAccounting_Register(this->engine);
109  SQAIAirport_Register(this->engine);
110  SQAIBase_Register(this->engine);
111  SQAIBaseStation_Register(this->engine);
112  SQAIBridge_Register(this->engine);
113  SQAIBridgeList_Register(this->engine);
114  SQAIBridgeList_Length_Register(this->engine);
115  SQAICargo_Register(this->engine);
116  SQAICargoList_Register(this->engine);
117  SQAICargoList_IndustryAccepting_Register(this->engine);
118  SQAICargoList_IndustryProducing_Register(this->engine);
119  SQAICargoList_StationAccepting_Register(this->engine);
120  SQAICompany_Register(this->engine);
121  SQAIDate_Register(this->engine);
122  SQAIDepotList_Register(this->engine);
123  SQAIEngine_Register(this->engine);
124  SQAIEngineList_Register(this->engine);
125  SQAIError_Register(this->engine);
126  SQAIEvent_Register(this->engine);
127  SQAIEventAircraftDestTooFar_Register(this->engine);
128  SQAIEventCompanyAskMerger_Register(this->engine);
129  SQAIEventCompanyBankrupt_Register(this->engine);
130  SQAIEventCompanyInTrouble_Register(this->engine);
131  SQAIEventCompanyMerger_Register(this->engine);
132  SQAIEventCompanyNew_Register(this->engine);
133  SQAIEventCompanyTown_Register(this->engine);
134  SQAIEventController_Register(this->engine);
135  SQAIEventDisasterZeppelinerCleared_Register(this->engine);
136  SQAIEventDisasterZeppelinerCrashed_Register(this->engine);
137  SQAIEventEngineAvailable_Register(this->engine);
138  SQAIEventEnginePreview_Register(this->engine);
139  SQAIEventExclusiveTransportRights_Register(this->engine);
140  SQAIEventIndustryClose_Register(this->engine);
141  SQAIEventIndustryOpen_Register(this->engine);
142  SQAIEventRoadReconstruction_Register(this->engine);
143  SQAIEventStationFirstVehicle_Register(this->engine);
144  SQAIEventSubsidyAwarded_Register(this->engine);
145  SQAIEventSubsidyExpired_Register(this->engine);
146  SQAIEventSubsidyOffer_Register(this->engine);
147  SQAIEventSubsidyOfferExpired_Register(this->engine);
148  SQAIEventTownFounded_Register(this->engine);
149  SQAIEventVehicleAutoReplaced_Register(this->engine);
150  SQAIEventVehicleCrashed_Register(this->engine);
151  SQAIEventVehicleLost_Register(this->engine);
152  SQAIEventVehicleUnprofitable_Register(this->engine);
153  SQAIEventVehicleWaitingInDepot_Register(this->engine);
154  SQAIExecMode_Register(this->engine);
155  SQAIGameSettings_Register(this->engine);
156  SQAIGroup_Register(this->engine);
157  SQAIGroupList_Register(this->engine);
158  SQAIIndustry_Register(this->engine);
159  SQAIIndustryList_Register(this->engine);
160  SQAIIndustryList_CargoAccepting_Register(this->engine);
161  SQAIIndustryList_CargoProducing_Register(this->engine);
162  SQAIIndustryType_Register(this->engine);
163  SQAIIndustryTypeList_Register(this->engine);
164  SQAIInfrastructure_Register(this->engine);
165  SQAILog_Register(this->engine);
166  SQAIMap_Register(this->engine);
167  SQAIMarine_Register(this->engine);
168  SQAIOrder_Register(this->engine);
169  SQAIRail_Register(this->engine);
170  SQAIRailTypeList_Register(this->engine);
171  SQAIRoad_Register(this->engine);
172  SQAIRoadTypeList_Register(this->engine);
173  SQAISign_Register(this->engine);
174  SQAISignList_Register(this->engine);
175  SQAIStation_Register(this->engine);
176  SQAIStationList_Register(this->engine);
177  SQAIStationList_Cargo_Register(this->engine);
178  SQAIStationList_CargoPlanned_Register(this->engine);
179  SQAIStationList_CargoPlannedByFrom_Register(this->engine);
180  SQAIStationList_CargoPlannedByVia_Register(this->engine);
181  SQAIStationList_CargoPlannedFromByVia_Register(this->engine);
182  SQAIStationList_CargoPlannedViaByFrom_Register(this->engine);
183  SQAIStationList_CargoWaiting_Register(this->engine);
184  SQAIStationList_CargoWaitingByFrom_Register(this->engine);
185  SQAIStationList_CargoWaitingByVia_Register(this->engine);
186  SQAIStationList_CargoWaitingFromByVia_Register(this->engine);
187  SQAIStationList_CargoWaitingViaByFrom_Register(this->engine);
188  SQAIStationList_Vehicle_Register(this->engine);
189  SQAISubsidy_Register(this->engine);
190  SQAISubsidyList_Register(this->engine);
191  SQAITestMode_Register(this->engine);
192  SQAITile_Register(this->engine);
193  SQAITileList_Register(this->engine);
194  SQAITileList_IndustryAccepting_Register(this->engine);
195  SQAITileList_IndustryProducing_Register(this->engine);
196  SQAITileList_StationType_Register(this->engine);
197  SQAITown_Register(this->engine);
198  SQAITownEffectList_Register(this->engine);
199  SQAITownList_Register(this->engine);
200  SQAITunnel_Register(this->engine);
201  SQAIVehicle_Register(this->engine);
202  SQAIVehicleList_Register(this->engine);
203  SQAIVehicleList_DefaultGroup_Register(this->engine);
204  SQAIVehicleList_Depot_Register(this->engine);
205  SQAIVehicleList_Group_Register(this->engine);
206  SQAIVehicleList_SharedOrders_Register(this->engine);
207  SQAIVehicleList_Station_Register(this->engine);
208  SQAIWaypoint_Register(this->engine);
209  SQAIWaypointList_Register(this->engine);
210  SQAIWaypointList_Vehicle_Register(this->engine);
211 
212  if (!this->LoadCompatibilityScripts(this->versionAPI, AI_DIR)) this->Died();
213 }
214 
216 {
218 
220 
222  if (info != nullptr) {
223  ShowErrorMessage(STR_ERROR_AI_PLEASE_REPORT_CRASH, INVALID_STRING_ID, WL_WARNING);
224 
225  if (info->GetURL() != nullptr) {
226  ScriptLog::Info("Please report the error to the following URL:");
227  ScriptLog::Info(info->GetURL());
228  }
229  }
230 }
231 
233 {
234  ScriptAllocatorScope alloc_scope(this->engine);
235  extern void Script_CreateDummy(HSQUIRRELVM vm, StringID string, const char *type);
236  Script_CreateDummy(this->engine->GetVM(), STR_ERROR_AI_NO_AI_FOUND, "AI");
237 }
238 
239 int AIInstance::GetSetting(const char *name)
240 {
242 }
243 
244 ScriptInfo *AIInstance::FindLibrary(const char *library, int version)
245 {
246  return (ScriptInfo *)AI::FindLibrary(library, version);
247 }
248 
257 void CcAI(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2, uint32 cmd)
258 {
259  /*
260  * The company might not exist anymore. Check for this.
261  * The command checks are not useful since this callback
262  * is also called when the command fails, which is does
263  * when the company does not exist anymore.
264  */
266  if (c == nullptr || c->ai_instance == nullptr) return;
267 
268  if (c->ai_instance->DoCommandCallback(result, tile, p1, p2, cmd)) {
269  c->ai_instance->Continue();
270  }
271 }
272 
274 {
275  return &CcAI;
276 }
static Titem * GetIfValid(size_t index)
Returns Titem with given index.
Definition: pool_type.hpp:257
int version
Version of the script.
Window for configuring the AIs
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:382
void Continue()
A script in multiplayer waits for the server to handle his DoCommand.
The AIInstance tracks an AI.
Common return value for all commands.
Definition: command_type.h:25
void CcAI(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2, uint32 cmd)
DoCommand callback function for all commands executed by AIs.
const char * GetAPIVersion() const
Get the API version this AI is written for.
Definition: ai_info.hpp:51
void Died() override
Tell the script it died.
const char * GetMainScript() const
Get the filename of the main.nut script.
Definition: script_info.hpp:94
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:472
Other information.
Definition: error.h:24
All static information from an Script like name, version, etc.
Definition: script_info.hpp:32
bool DoCommandCallback(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2, uint32 cmd)
DoCommand callback function for all commands executed by scripts.
static AIConfig * GetConfig(CompanyID company, ScriptSettingSource source=SSS_DEFAULT)
Get the config of a company.
Definition: ai_config.cpp:47
void Script_CreateDummy(HSQUIRRELVM vm, StringID string, const char *type)
Run the dummy AI and let it generate an error message.
Runtime information about a script like a pointer to the squirrel vm and the current state...
void Initialize(class AIInfo *info)
Initialize the AI and prepare it for its first run.
Definition: ai_instance.cpp:92
const char * GetURL() const
Get the website for this script.
Definition: script_info.hpp:89
uint32 StringID
Numeric value that represents a string, independent of the selected language.
Definition: strings_type.h:18
int GetSetting(const char *name) const override
Get the value of a setting for this config.
Definition: ai_config.cpp:91
void RegisterAPI() override
Register all API functions to the VM.
Window * ShowAIDebugWindow(CompanyID show_company)
Open the AI debug window and select the given company.
Definition: ai_gui.cpp:1529
HSQUIRRELVM GetVM()
Get the squirrel VM.
Definition: squirrel.hpp:82
const char * name
Full name of the script.
void LoadDummyScript() override
Load the dummy script.
All static information from an AI like name, version, etc.
Definition: ai_info.hpp:18
uint32 TileIndex
The index/ID of a Tile.
Definition: tile_type.h:80
Subdirectory for all AI files.
Definition: fileio_type.h:121
static class AILibrary * FindLibrary(const char *library, int version)
Wrapper function for AIScanner::FindLibrary.
Definition: ai_core.cpp:347
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.
CompanyID _current_company
Company currently doing an action.
Definition: company_cmd.cpp:47
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:19
int GetSetting(const char *name) override
Get the value of a setting of the current instance.
virtual void Died()
Tell the script it died.
Base functions for all AIs.
const char * GetInstanceName() const
Get the name of the instance of the script to create.
Definition: script_info.hpp:84
AIConfig stores the configuration settings of every AI.
AIInfo keeps track of all information of an AI, like Author, Description, ...
Get the Script config from the current game.
CommandCallback * GetDoCommandCallback() override
Get the callback handling DoCommands in case of networking.
ScriptInfo * FindLibrary(const char *library, int version) override
Find a library.