OpenTTD Source 20250218-master-g53dd1258a7
newgrf_debug_data.h
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 "../newgrf_house.h"
11#include "../newgrf_engine.h"
12#include "../newgrf_roadtype.h"
13#include "../newgrf_roadstop.h"
14
15/* Helper for filling property tables */
16#define NIP(prop, base, variable, type, name) { name, [] (const void *b) -> const void * { return std::addressof(static_cast<const base *>(b)->variable); }, cpp_sizeof(base, variable), prop, type }
17
18/* Helper for filling callback tables */
19#define NIC(cb_id, base, variable, bit) { #cb_id, [] (const void *b) -> const void * { return std::addressof(static_cast<const base *>(b)->variable); }, cpp_sizeof(base, variable), bit, cb_id }
20
21/* Helper for filling variable tables */
22#define NIV(var, name) { name, var }
23
24
25/*** NewGRF Vehicles ***/
26
27#define NICV(cb_id, bit) NIC(cb_id, Engine, info.callback_mask, bit)
28static const NICallback _nic_vehicles[] = {
35 NICV(CBID_TRAIN_ALLOW_WAGON_ATTACH, std::monostate{}),
36 NICV(CBID_VEHICLE_ADDITIONAL_TEXT, std::monostate{}),
38 NICV(CBID_VEHICLE_START_STOP_CHECK, std::monostate{}),
39 NICV(CBID_VEHICLE_32DAY_CALLBACK, std::monostate{}),
41 NICV(CBID_VEHICLE_AUTOREPLACE_SELECTION, std::monostate{}),
42 NICV(CBID_VEHICLE_MODIFY_PROPERTY, std::monostate{}),
44};
45
46
47static const NIVariable _niv_vehicles[] = {
48 NIV(0x40, "position in consist and length"),
49 NIV(0x41, "position and length of chain of same vehicles"),
50 NIV(0x42, "transported cargo types"),
51 NIV(0x43, "player info"),
52 NIV(0x44, "aircraft info"),
53 NIV(0x45, "curvature info"),
54 NIV(0x46, "motion counter"),
55 NIV(0x47, "vehicle cargo info"),
56 NIV(0x48, "vehicle type info"),
57 NIV(0x49, "year of construction"),
58 NIV(0x4A, "current rail/road type info"),
59 NIV(0x4B, "long date of last service"),
60 NIV(0x4C, "current max speed"),
61 NIV(0x4D, "position in articulated vehicle"),
62 NIV(0x60, "count vehicle id occurrences"),
63 // 0x61 not useful, since it requires register 0x10F
64 NIV(0x62, "curvature/position difference to other vehicle"),
65 NIV(0x63, "tile compatibility wrt. track-type"),
66};
67
68class NIHVehicle : public NIHelper {
69 bool IsInspectable(uint index) const override { return Vehicle::Get(index)->GetGRF() != nullptr; }
70 uint GetParent(uint index) const override { const Vehicle *first = Vehicle::Get(index)->First(); return GetInspectWindowNumber(GetGrfSpecFeature(first->type), first->index); }
71 const void *GetInstance(uint index)const override { return Vehicle::Get(index); }
72 const void *GetSpec(uint index) const override { return Vehicle::Get(index)->GetEngine(); }
73 void SetStringParameters(uint index) const override { this->SetSimpleStringParameters(STR_VEHICLE_NAME, index); }
74 uint32_t GetGRFID(uint index) const override { return Vehicle::Get(index)->GetGRFID(); }
75 std::span<const BadgeID> GetBadges(uint index) const override { return Vehicle::Get(index)->GetEngine()->badges; }
76
77 uint Resolve(uint index, uint var, uint param, bool &avail) const override
78 {
79 Vehicle *v = Vehicle::Get(index);
81 return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
82 }
83};
84
85static const NIFeature _nif_vehicle = {
86 {},
87 _nic_vehicles,
88 _niv_vehicles,
89 std::make_unique<NIHVehicle>(),
90};
91
92
93/*** NewGRF station (tiles) ***/
94
95#define NICS(cb_id, bit) NIC(cb_id, StationSpec, callback_mask, bit)
96static const NICallback _nic_stations[] = {
99 NICS(CBID_STATION_BUILD_TILE_LAYOUT,std::monostate{}),
100 NICS(CBID_STATION_ANIM_START_STOP, std::monostate{}),
104};
105
106static const NIVariable _niv_stations[] = {
107 NIV(0x40, "platform info and relative position"),
108 NIV(0x41, "platform info and relative position for individually built sections"),
109 NIV(0x42, "terrain and track type"),
110 NIV(0x43, "player info"),
111 NIV(0x44, "path signalling info"),
112 NIV(0x45, "rail continuation info"),
113 NIV(0x46, "platform info and relative position from middle"),
114 NIV(0x47, "platform info and relative position from middle for individually built sections"),
115 NIV(0x48, "bitmask of accepted cargoes"),
116 NIV(0x49, "platform info and relative position of same-direction section"),
117 NIV(0x4A, "current animation frame"),
118 NIV(0x60, "amount of cargo waiting"),
119 NIV(0x61, "time since last cargo pickup"),
120 NIV(0x62, "rating of cargo"),
121 NIV(0x63, "time spent on route"),
122 NIV(0x64, "information about last vehicle picking cargo up"),
123 NIV(0x65, "amount of cargo acceptance"),
124 NIV(0x66, "animation frame of nearby tile"),
125 NIV(0x67, "land info of nearby tiles"),
126 NIV(0x68, "station info of nearby tiles"),
127 NIV(0x69, "information about cargo accepted in the past"),
128 NIV(0x6A, "GRFID of nearby station tiles"),
129 NIV(0x6B, "station ID of nearby tiles"),
130};
131
132class NIHStation : public NIHelper {
133 bool IsInspectable(uint index) const override { return GetStationSpec(TileIndex{index}) != nullptr; }
134 uint GetParent(uint index) const override { return GetInspectWindowNumber(GSF_FAKE_TOWNS, Station::GetByTile(TileIndex{index})->town->index); }
135 const void *GetInstance(uint ) const override { return nullptr; }
136 const void *GetSpec(uint index) const override { return GetStationSpec(TileIndex{index}); }
137 void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_STATION_NAME, GetStationIndex(index), TileIndex{index}); }
138 uint32_t GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? GetStationSpec(TileIndex{index})->grf_prop.grfid : 0; }
139 std::span<const BadgeID> GetBadges(uint index) const override { return this->IsInspectable(index) ? GetStationSpec(TileIndex{index})->badges : std::span<const BadgeID>{}; }
140
141 uint Resolve(uint index, uint var, uint param, bool &avail) const override
142 {
143 TileIndex tile{index};
144 StationResolverObject ro(GetStationSpec(tile), Station::GetByTile(tile), tile);
145 return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
146 }
147};
148
149static const NIFeature _nif_station = {
150 {},
151 _nic_stations,
152 _niv_stations,
153 std::make_unique<NIHStation>(),
154};
155
156
157/*** NewGRF house tiles ***/
158
159#define NICH(cb_id, bit) NIC(cb_id, HouseSpec, callback_mask, bit)
160static const NICallback _nic_house[] = {
172 NICH(CBID_HOUSE_WATCHED_CARGO_ACCEPTED, std::monostate{}),
173 NICH(CBID_HOUSE_CUSTOM_NAME, std::monostate{}),
176};
177
178static const NIVariable _niv_house[] = {
179 NIV(0x40, "construction state of tile and pseudo-random value"),
180 NIV(0x41, "age of building in years"),
181 NIV(0x42, "town zone"),
182 NIV(0x43, "terrain type"),
183 NIV(0x44, "building counts"),
184 NIV(0x45, "town expansion bits"),
185 NIV(0x46, "current animation frame"),
186 NIV(0x47, "xy coordinate of the building"),
187 NIV(0x60, "other building counts (old house type)"),
188 NIV(0x61, "other building counts (new house type)"),
189 NIV(0x62, "land info of nearby tiles"),
190 NIV(0x63, "current animation frame of nearby house tile"),
191 NIV(0x64, "cargo acceptance history of nearby stations"),
192 NIV(0x65, "distance of nearest house matching a given criterion"),
193 NIV(0x66, "class and ID of nearby house tile"),
194 NIV(0x67, "GRFID of nearby house tile"),
195};
196
197class NIHHouse : public NIHelper {
198 bool IsInspectable(uint index) const override { return HouseSpec::Get(GetHouseType(index))->grf_prop.HasGrfFile(); }
199 uint GetParent(uint index) const override { return GetInspectWindowNumber(GSF_FAKE_TOWNS, GetTownIndex(index)); }
200 const void *GetInstance(uint)const override { return nullptr; }
201 const void *GetSpec(uint index) const override { return HouseSpec::Get(GetHouseType(index)); }
202 void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_TOWN_NAME, GetTownIndex(index), TileIndex{index}); }
203 uint32_t GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? HouseSpec::Get(GetHouseType(index))->grf_prop.grfid : 0; }
204 std::span<const BadgeID> GetBadges(uint index) const override { return HouseSpec::Get(GetHouseType(index))->badges; }
205
206 uint Resolve(uint index, uint var, uint param, bool &avail) const override
207 {
208 TileIndex tile{index};
209 HouseResolverObject ro(GetHouseType(tile), tile, Town::GetByTile(tile));
210 return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
211 }
212};
213
214static const NIFeature _nif_house = {
215 {},
216 _nic_house,
217 _niv_house,
218 std::make_unique<NIHHouse>(),
219};
220
221
222/*** NewGRF industry tiles ***/
223
224#define NICIT(cb_id, bit) NIC(cb_id, IndustryTileSpec, callback_mask, bit)
225static const NICallback _nic_industrytiles[] = {
226 NICIT(CBID_INDTILE_ANIM_START_STOP, std::monostate{}),
234};
235
236static const NIVariable _niv_industrytiles[] = {
237 NIV(0x40, "construction state of tile"),
238 NIV(0x41, "ground type"),
239 NIV(0x42, "current town zone in nearest town"),
240 NIV(0x43, "relative position"),
241 NIV(0x44, "animation frame"),
242 NIV(0x60, "land info of nearby tiles"),
243 NIV(0x61, "animation stage of nearby tiles"),
244 NIV(0x62, "get industry or airport tile ID at offset"),
245};
246
247class NIHIndustryTile : public NIHelper {
248 bool IsInspectable(uint index) const override { return GetIndustryTileSpec(GetIndustryGfx(index))->grf_prop.HasGrfFile(); }
249 uint GetParent(uint index) const override { return GetInspectWindowNumber(GSF_INDUSTRIES, GetIndustryIndex(index)); }
250 const void *GetInstance(uint)const override { return nullptr; }
251 const void *GetSpec(uint index) const override { return GetIndustryTileSpec(GetIndustryGfx(index)); }
252 void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_INDUSTRY_NAME, GetIndustryIndex(index), TileIndex{index}); }
253 uint32_t GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? GetIndustryTileSpec(GetIndustryGfx(index))->grf_prop.grfid : 0; }
254 std::span<const BadgeID> GetBadges(uint index) const override { return GetIndustryTileSpec(GetIndustryGfx(index))->badges; }
255
256 uint Resolve(uint index, uint var, uint param, bool &avail) const override
257 {
258 TileIndex tile{index};
260 return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
261 }
262};
263
264static const NIFeature _nif_industrytile = {
265 {},
266 _nic_industrytiles,
267 _niv_industrytiles,
268 std::make_unique<NIHIndustryTile>(),
269};
270
271
272/*** NewGRF industries ***/
273#define NIP_PRODUCED_CARGO(prop, base, slot, type, name) { name, [] (const void *b) -> const void * { return std::addressof(static_cast<const base *>(b)->GetProduced(slot).cargo); }, sizeof(CargoType), prop, type }
274#define NIP_ACCEPTED_CARGO(prop, base, slot, type, name) { name, [] (const void *b) -> const void * { return std::addressof(static_cast<const base *>(b)->GetAccepted(slot).cargo); }, sizeof(CargoType), prop, type }
275
276static const NIProperty _nip_industries[] = {
277 NIP_PRODUCED_CARGO(0x25, Industry, 0, NIT_CARGO, "produced cargo 0"),
278 NIP_PRODUCED_CARGO(0x25, Industry, 1, NIT_CARGO, "produced cargo 1"),
279 NIP_PRODUCED_CARGO(0x25, Industry, 2, NIT_CARGO, "produced cargo 2"),
280 NIP_PRODUCED_CARGO(0x25, Industry, 3, NIT_CARGO, "produced cargo 3"),
281 NIP_PRODUCED_CARGO(0x25, Industry, 4, NIT_CARGO, "produced cargo 4"),
282 NIP_PRODUCED_CARGO(0x25, Industry, 5, NIT_CARGO, "produced cargo 5"),
283 NIP_PRODUCED_CARGO(0x25, Industry, 6, NIT_CARGO, "produced cargo 6"),
284 NIP_PRODUCED_CARGO(0x25, Industry, 7, NIT_CARGO, "produced cargo 7"),
285 NIP_PRODUCED_CARGO(0x25, Industry, 8, NIT_CARGO, "produced cargo 8"),
286 NIP_PRODUCED_CARGO(0x25, Industry, 9, NIT_CARGO, "produced cargo 9"),
287 NIP_PRODUCED_CARGO(0x25, Industry, 10, NIT_CARGO, "produced cargo 10"),
288 NIP_PRODUCED_CARGO(0x25, Industry, 11, NIT_CARGO, "produced cargo 11"),
289 NIP_PRODUCED_CARGO(0x25, Industry, 12, NIT_CARGO, "produced cargo 12"),
290 NIP_PRODUCED_CARGO(0x25, Industry, 13, NIT_CARGO, "produced cargo 13"),
291 NIP_PRODUCED_CARGO(0x25, Industry, 14, NIT_CARGO, "produced cargo 14"),
292 NIP_PRODUCED_CARGO(0x25, Industry, 15, NIT_CARGO, "produced cargo 15"),
293 NIP_ACCEPTED_CARGO(0x26, Industry, 0, NIT_CARGO, "accepted cargo 0"),
294 NIP_ACCEPTED_CARGO(0x26, Industry, 1, NIT_CARGO, "accepted cargo 1"),
295 NIP_ACCEPTED_CARGO(0x26, Industry, 2, NIT_CARGO, "accepted cargo 2"),
296 NIP_ACCEPTED_CARGO(0x26, Industry, 3, NIT_CARGO, "accepted cargo 3"),
297 NIP_ACCEPTED_CARGO(0x26, Industry, 4, NIT_CARGO, "accepted cargo 4"),
298 NIP_ACCEPTED_CARGO(0x26, Industry, 5, NIT_CARGO, "accepted cargo 5"),
299 NIP_ACCEPTED_CARGO(0x26, Industry, 6, NIT_CARGO, "accepted cargo 6"),
300 NIP_ACCEPTED_CARGO(0x26, Industry, 7, NIT_CARGO, "accepted cargo 7"),
301 NIP_ACCEPTED_CARGO(0x26, Industry, 8, NIT_CARGO, "accepted cargo 8"),
302 NIP_ACCEPTED_CARGO(0x26, Industry, 9, NIT_CARGO, "accepted cargo 9"),
303 NIP_ACCEPTED_CARGO(0x26, Industry, 10, NIT_CARGO, "accepted cargo 10"),
304 NIP_ACCEPTED_CARGO(0x26, Industry, 11, NIT_CARGO, "accepted cargo 11"),
305 NIP_ACCEPTED_CARGO(0x26, Industry, 12, NIT_CARGO, "accepted cargo 12"),
306 NIP_ACCEPTED_CARGO(0x26, Industry, 13, NIT_CARGO, "accepted cargo 13"),
307 NIP_ACCEPTED_CARGO(0x26, Industry, 14, NIT_CARGO, "accepted cargo 14"),
308 NIP_ACCEPTED_CARGO(0x26, Industry, 15, NIT_CARGO, "accepted cargo 15"),
309};
310
311#undef NIP_PRODUCED_CARGO
312#undef NIP_ACCEPTED_CARGO
313
314#define NICI(cb_id, bit) NIC(cb_id, IndustrySpec, callback_mask, bit)
315static const NICallback _nic_industries[] = {
329};
330
331static const NIVariable _niv_industries[] = {
332 NIV(0x40, "waiting cargo 0"),
333 NIV(0x41, "waiting cargo 1"),
334 NIV(0x42, "waiting cargo 2"),
335 NIV(0x43, "distance to closest dry/land tile"),
336 NIV(0x44, "layout number"),
337 NIV(0x45, "player info"),
338 NIV(0x46, "industry construction date"),
339 NIV(0x60, "get industry tile ID at offset"),
340 NIV(0x61, "get random tile bits at offset"),
341 NIV(0x62, "land info of nearby tiles"),
342 NIV(0x63, "animation stage of nearby tiles"),
343 NIV(0x64, "distance on nearest industry with given type"),
344 NIV(0x65, "get town zone and Manhattan distance of closest town"),
345 NIV(0x66, "get square of Euclidean distance of closes town"),
346 NIV(0x67, "count of industry and distance of closest instance"),
347 NIV(0x68, "count of industry and distance of closest instance with layout filter"),
348 NIV(0x69, "produced cargo waiting"),
349 NIV(0x6A, "cargo produced this month"),
350 NIV(0x6B, "cargo transported this month"),
351 NIV(0x6C, "cargo produced last month"),
352 NIV(0x6D, "cargo transported last month"),
353 NIV(0x6E, "date since cargo was delivered"),
354 NIV(0x6F, "waiting input cargo"),
355 NIV(0x70, "production rate"),
356 NIV(0x71, "percentage of cargo transported last month"),
357};
358
359class NIHIndustry : public NIHelper {
360 bool IsInspectable(uint index) const override { return GetIndustrySpec(Industry::Get(index)->type)->grf_prop.HasGrfFile(); }
361 uint GetParent(uint index) const override { return GetInspectWindowNumber(GSF_FAKE_TOWNS, Industry::Get(index)->town->index); }
362 const void *GetInstance(uint index)const override { return Industry::Get(index); }
363 const void *GetSpec(uint index) const override { return GetIndustrySpec(Industry::Get(index)->type); }
364 void SetStringParameters(uint index) const override { this->SetSimpleStringParameters(STR_INDUSTRY_NAME, index); }
365 uint32_t GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? GetIndustrySpec(Industry::Get(index)->type)->grf_prop.grfid : 0; }
366 std::span<const BadgeID> GetBadges(uint index) const override { return GetIndustrySpec(Industry::Get(index)->type)->badges; }
367
368 uint Resolve(uint index, uint var, uint param, bool &avail) const override
369 {
370 Industry *i = Industry::Get(index);
372 return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
373 }
374
375 const std::span<int32_t> GetPSA(uint index, uint32_t) const override
376 {
377 const Industry *i = (const Industry *)this->GetInstance(index);
378 if (i->psa == nullptr) return {};
379 return i->psa->storage;
380 }
381};
382
383static const NIFeature _nif_industry = {
384 _nip_industries,
385 _nic_industries,
386 _niv_industries,
387 std::make_unique<NIHIndustry>(),
388};
389
390
391/*** NewGRF objects ***/
392
393#define NICO(cb_id, bit) NIC(cb_id, ObjectSpec, callback_mask, bit)
394static const NICallback _nic_objects[] = {
397 NICO(CBID_OBJECT_ANIMATION_START_STOP, std::monostate{}),
402};
403
404static const NIVariable _niv_objects[] = {
405 NIV(0x40, "relative position"),
406 NIV(0x41, "tile information"),
407 NIV(0x42, "construction date"),
408 NIV(0x43, "animation counter"),
409 NIV(0x44, "object founder"),
410 NIV(0x45, "get town zone and Manhattan distance of closest town"),
411 NIV(0x46, "get square of Euclidean distance of closes town"),
412 NIV(0x47, "colour"),
413 NIV(0x48, "view"),
414 NIV(0x60, "get object ID at offset"),
415 NIV(0x61, "get random tile bits at offset"),
416 NIV(0x62, "land info of nearby tiles"),
417 NIV(0x63, "animation stage of nearby tiles"),
418 NIV(0x64, "distance on nearest object with given type"),
419};
420
421class NIHObject : public NIHelper {
422 bool IsInspectable(uint index) const override { return ObjectSpec::GetByTile(TileIndex{index})->grf_prop.HasGrfFile(); }
423 uint GetParent(uint index) const override { return GetInspectWindowNumber(GSF_FAKE_TOWNS, Object::GetByTile(TileIndex{index})->town->index); }
424 const void *GetInstance(uint index)const override { return Object::GetByTile(TileIndex{index}); }
425 const void *GetSpec(uint index) const override { return ObjectSpec::GetByTile(TileIndex{index}); }
426 void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_OBJECT, INVALID_STRING_ID, TileIndex{index}); }
427 uint32_t GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? ObjectSpec::GetByTile(TileIndex{index})->grf_prop.grfid : 0; }
428 std::span<const BadgeID> GetBadges(uint index) const override { return ObjectSpec::GetByTile(TileIndex{index})->badges; }
429
430 uint Resolve(uint index, uint var, uint param, bool &avail) const override
431 {
432 TileIndex tile{index};
434 return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
435 }
436};
437
438static const NIFeature _nif_object = {
439 {},
440 _nic_objects,
441 _niv_objects,
442 std::make_unique<NIHObject>(),
443};
444
445
446/*** NewGRF rail types ***/
447
448static const NIVariable _niv_railtypes[] = {
449 NIV(0x40, "terrain type"),
450 NIV(0x41, "enhanced tunnels"),
451 NIV(0x42, "level crossing status"),
452 NIV(0x43, "construction date"),
453 NIV(0x44, "town zone"),
454};
455
456class NIHRailType : public NIHelper {
457 bool IsInspectable(uint) const override { return true; }
458 uint GetParent(uint) const override { return UINT32_MAX; }
459 const void *GetInstance(uint) const override { return nullptr; }
460 const void *GetSpec(uint) const override { return nullptr; }
461 void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_RAIL_TYPE, INVALID_STRING_ID, TileIndex{index}); }
462 uint32_t GetGRFID(uint) const override { return 0; }
463 std::span<const BadgeID> GetBadges(uint index) const override { return GetRailTypeInfo(GetRailType(TileIndex{index}))->badges; }
464
465 uint Resolve(uint index, uint var, uint param, bool &avail) const override
466 {
467 /* There is no unique GRFFile for the tile. Multiple GRFs can define different parts of the railtype.
468 * However, currently the NewGRF Debug GUI does not display variables depending on the GRF (like 0x7F) anyway. */
469 RailTypeResolverObject ro(nullptr, TileIndex{index}, TCX_NORMAL, RTSG_END);
470 return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
471 }
472};
473
474static const NIFeature _nif_railtype = {
475 {},
476 {},
477 _niv_railtypes,
478 std::make_unique<NIHRailType>(),
479};
480
481
482/*** NewGRF airport tiles ***/
483
484#define NICAT(cb_id, bit) NIC(cb_id, AirportTileSpec, callback_mask, bit)
485static const NICallback _nic_airporttiles[] = {
487 NICAT(CBID_AIRPTILE_ANIM_START_STOP, std::monostate{}),
490};
491
492class NIHAirportTile : public NIHelper {
493 bool IsInspectable(uint index) const override { return AirportTileSpec::Get(GetAirportGfx(index))->grf_prop.HasGrfFile(); }
494 uint GetParent(uint index) const override { return GetInspectWindowNumber(GSF_AIRPORTS, GetStationIndex(index)); }
495 const void *GetInstance(uint)const override { return nullptr; }
496 const void *GetSpec(uint index) const override { return AirportTileSpec::Get(GetAirportGfx(index)); }
497 void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_STATION_NAME, GetStationIndex(index), TileIndex{index}); }
498 uint32_t GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? AirportTileSpec::Get(GetAirportGfx(index))->grf_prop.grfid : 0; }
499 std::span<const BadgeID> GetBadges(uint index) const override { return AirportTileSpec::Get(GetAirportGfx(index))->badges; }
500
501 uint Resolve(uint index, uint var, uint param, bool &avail) const override
502 {
503 TileIndex tile{index};
505 return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
506 }
507};
508
509static const NIFeature _nif_airporttile = {
510 {},
511 _nic_airporttiles,
512 _niv_industrytiles, // Yes, they share this (at least now)
513 std::make_unique<NIHAirportTile>(),
514};
515
516
517/*** NewGRF airports ***/
518
519static const NIVariable _niv_airports[] = {
520 NIV(0x40, "Layout number"),
521 NIV(0x48, "bitmask of accepted cargoes"),
522 NIV(0x60, "amount of cargo waiting"),
523 NIV(0x61, "time since last cargo pickup"),
524 NIV(0x62, "rating of cargo"),
525 NIV(0x63, "time spent on route"),
526 NIV(0x64, "information about last vehicle picking cargo up"),
527 NIV(0x65, "amount of cargo acceptance"),
528 NIV(0x69, "information about cargo accepted in the past"),
529 NIV(0xF1, "type of the airport"),
530 NIV(0xF6, "airport block status"),
531 NIV(0xFA, "built date"),
532};
533
534class NIHAirport : public NIHelper {
535 bool IsInspectable(uint index) const override { return AirportSpec::Get(Station::Get(index)->airport.type)->grf_prop.HasGrfFile(); }
536 uint GetParent(uint index) const override { return GetInspectWindowNumber(GSF_FAKE_TOWNS, Station::Get(index)->town->index); }
537 const void *GetInstance(uint index)const override { return Station::Get(index); }
538 const void *GetSpec(uint index) const override { return AirportSpec::Get(Station::Get(index)->airport.type); }
539 void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_STATION_NAME, index, Station::Get(index)->airport.tile); }
540 uint32_t GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? AirportSpec::Get(Station::Get(index)->airport.type)->grf_prop.grfid : 0; }
541 std::span<const BadgeID> GetBadges(uint index) const override { return AirportSpec::Get(Station::Get(index)->airport.type)->badges; }
542
543 uint Resolve(uint index, uint var, uint param, bool &avail) const override
544 {
545 Station *st = Station::Get(index);
547 return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
548 }
549
550 const std::span<int32_t> GetPSA(uint index, uint32_t) const override
551 {
552 const Station *st = (const Station *)this->GetInstance(index);
553 if (st->airport.psa == nullptr) return {};
554 return st->airport.psa->storage;
555 }
556};
557
558static const NIFeature _nif_airport = {
559 {},
560 {},
561 _niv_airports,
562 std::make_unique<NIHAirport>(),
563};
564
565
566/*** NewGRF towns ***/
567
568static const NIVariable _niv_towns[] = {
569 NIV(0x40, "larger town effect on this town"),
570 NIV(0x41, "town index"),
571 NIV(0x82, "population"),
572 NIV(0x94, "zone radius 0"),
573 NIV(0x96, "zone radius 1"),
574 NIV(0x98, "zone radius 2"),
575 NIV(0x9A, "zone radius 3"),
576 NIV(0x9C, "zone radius 4"),
577 NIV(0xB6, "number of buildings"),
578};
579
580class NIHTown : public NIHelper {
581 bool IsInspectable(uint index) const override { return Town::IsValidID(index); }
582 uint GetParent(uint) const override { return UINT32_MAX; }
583 const void *GetInstance(uint index)const override { return Town::Get(index); }
584 const void *GetSpec(uint) const override { return nullptr; }
585 void SetStringParameters(uint index) const override { this->SetSimpleStringParameters(STR_TOWN_NAME, index); }
586 uint32_t GetGRFID(uint) const override { return 0; }
587 bool PSAWithParameter() const override { return true; }
588 std::span<const BadgeID> GetBadges(uint) const override { return {}; }
589
590 uint Resolve(uint index, uint var, uint param, bool &avail) const override
591 {
592 TownResolverObject ro(nullptr, Town::Get(index), true);
593 return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
594 }
595
596 const std::span<int32_t> GetPSA(uint index, uint32_t grfid) const override
597 {
598 Town *t = Town::Get(index);
599
600 for (const auto &it : t->psa_list) {
601 if (it->grfid == grfid) return it->storage;
602 }
603
604 return {};
605 }
606};
607
608static const NIFeature _nif_town = {
609 {},
610 {},
611 _niv_towns,
612 std::make_unique<NIHTown>(),
613};
614
615/*** NewGRF road types ***/
616
617static const NIVariable _niv_roadtypes[] = {
618 NIV(0x40, "terrain type"),
619 NIV(0x41, "enhanced tunnels"),
620 NIV(0x42, "level crossing status"),
621 NIV(0x43, "construction date"),
622 NIV(0x44, "town zone"),
623};
624
625template <RoadTramType TRoadTramType>
626class NIHRoadType : public NIHelper {
627 bool IsInspectable(uint) const override { return true; }
628 uint GetParent(uint) const override { return UINT32_MAX; }
629 const void *GetInstance(uint) const override { return nullptr; }
630 const void *GetSpec(uint) const override { return nullptr; }
631 void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_ROAD_TYPE, INVALID_STRING_ID, TileIndex{index}); }
632 uint32_t GetGRFID(uint) const override { return 0; }
633 std::span<const BadgeID> GetBadges(uint index) const override
634 {
635 RoadType rt = GetRoadType(TileIndex{index}, TRoadTramType);
636 if (rt == INVALID_ROADTYPE) return {};
637 return GetRoadTypeInfo(rt)->badges;
638 }
639
640 uint Resolve(uint index, uint var, uint param, bool &avail) const override
641 {
642 /* There is no unique GRFFile for the tile. Multiple GRFs can define different parts of the railtype.
643 * However, currently the NewGRF Debug GUI does not display variables depending on the GRF (like 0x7F) anyway. */
644 RoadTypeResolverObject ro(nullptr, TileIndex{index}, TCX_NORMAL, ROTSG_END);
645 return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
646 }
647};
648
649static const NIFeature _nif_roadtype = {
650 {},
651 {},
652 _niv_roadtypes,
653 std::make_unique<NIHRoadType<RoadTramType::RTT_ROAD>>(),
654};
655
656static const NIFeature _nif_tramtype = {
657 {},
658 {},
659 _niv_roadtypes,
660 std::make_unique<NIHRoadType<RoadTramType::RTT_TRAM>>(),
661};
662
663#define NICRS(cb_id, bit) NIC(cb_id, RoadStopSpec, callback_mask, bit)
664static const NICallback _nic_roadstops[] = {
666 NICRS(CBID_STATION_ANIM_START_STOP, std::monostate{}),
669};
670
671static const NIVariable _nif_roadstops[] = {
672 NIV(0x40, "view/rotation"),
673 NIV(0x41, "stop type"),
674 NIV(0x42, "terrain type"),
675 NIV(0x43, "road type"),
676 NIV(0x44, "tram type"),
677 NIV(0x45, "town zone and Manhattan distance of town"),
678 NIV(0x46, "square of Euclidean distance of town"),
679 NIV(0x47, "player info"),
680 NIV(0x48, "bitmask of accepted cargoes"),
681 NIV(0x49, "current animation frame"),
682 NIV(0x60, "amount of cargo waiting"),
683 NIV(0x61, "time since last cargo pickup"),
684 NIV(0x62, "rating of cargo"),
685 NIV(0x63, "time spent on route"),
686 NIV(0x64, "information about last vehicle picking cargo up"),
687 NIV(0x65, "amount of cargo acceptance"),
688 NIV(0x66, "animation frame of nearby tile"),
689 NIV(0x67, "land info of nearby tiles"),
690 NIV(0x68, "road stop info of nearby tiles"),
691 NIV(0x69, "information about cargo accepted in the past"),
692 NIV(0x6A, "GRFID of nearby road stop tiles"),
693 NIV(0x6B, "road stop ID of nearby tiles"),
694};
695
696class NIHRoadStop : public NIHelper {
697 bool IsInspectable(uint index) const override { return GetRoadStopSpec(TileIndex{index}) != nullptr; }
698 uint GetParent(uint index) const override { return GetInspectWindowNumber(GSF_FAKE_TOWNS, BaseStation::GetByTile(TileIndex{index})->town->index); }
699 const void *GetInstance(uint)const override { return nullptr; }
700 const void *GetSpec(uint index) const override { return GetRoadStopSpec(TileIndex{index}); }
701 void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_STATION_NAME, GetStationIndex(index), TileIndex{index}); }
702 uint32_t GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? GetRoadStopSpec(TileIndex{index})->grf_prop.grfid : 0; }
703 std::span<const BadgeID> GetBadges(uint index) const override { return this->IsInspectable(index) ? GetRoadStopSpec(TileIndex{index})->badges : std::span<const BadgeID>{}; }
704
705 uint Resolve(uint index, uint var, uint32_t param, bool &avail) const override
706 {
707 TileIndex tile{index};
708 StationGfx view = GetStationGfx(tile);
709 RoadStopResolverObject ro(GetRoadStopSpec(tile), BaseStation::GetByTile(tile), tile, INVALID_ROADTYPE, GetStationType(tile), view);
710 return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
711 }
712};
713
714static const NIFeature _nif_roadstop = {
715 {},
716 _nic_roadstops,
717 _nif_roadstops,
718 std::make_unique<NIHRoadStop>(),
719};
720
722static const NIFeature * const _nifeatures[] = {
723 &_nif_vehicle, // GSF_TRAINS
724 &_nif_vehicle, // GSF_ROADVEHICLES
725 &_nif_vehicle, // GSF_SHIPS
726 &_nif_vehicle, // GSF_AIRCRAFT
727 &_nif_station, // GSF_STATIONS
728 nullptr, // GSF_CANALS (no callbacks/action2 implemented)
729 nullptr, // GSF_BRIDGES (no callbacks/action2)
730 &_nif_house, // GSF_HOUSES
731 nullptr, // GSF_GLOBALVAR (has no "physical" objects)
732 &_nif_industrytile, // GSF_INDUSTRYTILES
733 &_nif_industry, // GSF_INDUSTRIES
734 nullptr, // GSF_CARGOES (has no "physical" objects)
735 nullptr, // GSF_SOUNDFX (has no "physical" objects)
736 &_nif_airport, // GSF_AIRPORTS
737 nullptr, // GSF_SIGNALS (feature not implemented)
738 &_nif_object, // GSF_OBJECTS
739 &_nif_railtype, // GSF_RAILTYPES
740 &_nif_airporttile, // GSF_AIRPORTTILES
741 &_nif_roadtype, // GSF_ROADTYPES
742 &_nif_tramtype, // GSF_TRAMTYPES
743 &_nif_roadstop, // GSF_ROADSTOPS
744 &_nif_town, // GSF_FAKE_TOWNS
745 nullptr,
746};
747static_assert(lengthof(_nifeatures) == GSF_FAKE_END);
uint GetParent(uint index) const override
Get the parent "window_number" of a given instance.
const void * GetInstance(uint) const override
Get the instance given an index.
std::span< const BadgeID > GetBadges(uint index) const override
Get the list of badges of this item.
uint Resolve(uint index, uint var, uint param, bool &avail) const override
Resolve (action2) variable for a given index.
uint32_t GetGRFID(uint index) const override
Get the GRFID of the file that includes this item.
const void * GetSpec(uint index) const override
Get (NewGRF) specs given an index.
bool IsInspectable(uint index) const override
Is the item with the given index inspectable?
void SetStringParameters(uint index) const override
Set the string parameters to write the right data for a STRINGn.
void SetStringParameters(uint index) const override
Set the string parameters to write the right data for a STRINGn.
uint Resolve(uint index, uint var, uint param, bool &avail) const override
Resolve (action2) variable for a given index.
const void * GetInstance(uint index) const override
Get the instance given an index.
bool IsInspectable(uint index) const override
Is the item with the given index inspectable?
uint GetParent(uint index) const override
Get the parent "window_number" of a given instance.
const void * GetSpec(uint index) const override
Get (NewGRF) specs given an index.
uint32_t GetGRFID(uint index) const override
Get the GRFID of the file that includes this item.
std::span< const BadgeID > GetBadges(uint index) const override
Get the list of badges of this item.
const std::span< int32_t > GetPSA(uint index, uint32_t) const override
Gets the span containing the persistent storage.
uint32_t GetGRFID(uint index) const override
Get the GRFID of the file that includes this item.
uint Resolve(uint index, uint var, uint param, bool &avail) const override
Resolve (action2) variable for a given index.
const void * GetSpec(uint index) const override
Get (NewGRF) specs given an index.
void SetStringParameters(uint index) const override
Set the string parameters to write the right data for a STRINGn.
uint GetParent(uint index) const override
Get the parent "window_number" of a given instance.
const void * GetInstance(uint) const override
Get the instance given an index.
bool IsInspectable(uint index) const override
Is the item with the given index inspectable?
std::span< const BadgeID > GetBadges(uint index) const override
Get the list of badges of this item.
const void * GetSpec(uint index) const override
Get (NewGRF) specs given an index.
void SetStringParameters(uint index) const override
Set the string parameters to write the right data for a STRINGn.
bool IsInspectable(uint index) const override
Is the item with the given index inspectable?
std::span< const BadgeID > GetBadges(uint index) const override
Get the list of badges of this item.
uint32_t GetGRFID(uint index) const override
Get the GRFID of the file that includes this item.
uint GetParent(uint index) const override
Get the parent "window_number" of a given instance.
const void * GetInstance(uint) const override
Get the instance given an index.
uint Resolve(uint index, uint var, uint param, bool &avail) const override
Resolve (action2) variable for a given index.
uint Resolve(uint index, uint var, uint param, bool &avail) const override
Resolve (action2) variable for a given index.
const void * GetSpec(uint index) const override
Get (NewGRF) specs given an index.
uint GetParent(uint index) const override
Get the parent "window_number" of a given instance.
bool IsInspectable(uint index) const override
Is the item with the given index inspectable?
const std::span< int32_t > GetPSA(uint index, uint32_t) const override
Gets the span containing the persistent storage.
std::span< const BadgeID > GetBadges(uint index) const override
Get the list of badges of this item.
uint32_t GetGRFID(uint index) const override
Get the GRFID of the file that includes this item.
void SetStringParameters(uint index) const override
Set the string parameters to write the right data for a STRINGn.
const void * GetInstance(uint index) const override
Get the instance given an index.
const void * GetSpec(uint index) const override
Get (NewGRF) specs given an index.
std::span< const BadgeID > GetBadges(uint index) const override
Get the list of badges of this item.
bool IsInspectable(uint index) const override
Is the item with the given index inspectable?
void SetStringParameters(uint index) const override
Set the string parameters to write the right data for a STRINGn.
const void * GetInstance(uint index) const override
Get the instance given an index.
uint Resolve(uint index, uint var, uint param, bool &avail) const override
Resolve (action2) variable for a given index.
uint32_t GetGRFID(uint index) const override
Get the GRFID of the file that includes this item.
uint GetParent(uint index) const override
Get the parent "window_number" of a given instance.
bool IsInspectable(uint) const override
Is the item with the given index inspectable?
uint32_t GetGRFID(uint) const override
Get the GRFID of the file that includes this item.
uint Resolve(uint index, uint var, uint param, bool &avail) const override
Resolve (action2) variable for a given index.
const void * GetInstance(uint) const override
Get the instance given an index.
void SetStringParameters(uint index) const override
Set the string parameters to write the right data for a STRINGn.
uint GetParent(uint) const override
Get the parent "window_number" of a given instance.
const void * GetSpec(uint) const override
Get (NewGRF) specs given an index.
std::span< const BadgeID > GetBadges(uint index) const override
Get the list of badges of this item.
uint GetParent(uint index) const override
Get the parent "window_number" of a given instance.
void SetStringParameters(uint index) const override
Set the string parameters to write the right data for a STRINGn.
std::span< const BadgeID > GetBadges(uint index) const override
Get the list of badges of this item.
uint32_t GetGRFID(uint index) const override
Get the GRFID of the file that includes this item.
bool IsInspectable(uint index) const override
Is the item with the given index inspectable?
const void * GetSpec(uint index) const override
Get (NewGRF) specs given an index.
const void * GetInstance(uint) const override
Get the instance given an index.
uint Resolve(uint index, uint var, uint param, bool &avail) const override
Resolve (action2) variable for a given index.
bool IsInspectable(uint) const override
Is the item with the given index inspectable?
const void * GetInstance(uint) const override
Get the instance given an index.
uint32_t GetGRFID(uint) const override
Get the GRFID of the file that includes this item.
void SetStringParameters(uint index) const override
Set the string parameters to write the right data for a STRINGn.
std::span< const BadgeID > GetBadges(uint index) const override
Get the list of badges of this item.
const void * GetSpec(uint) const override
Get (NewGRF) specs given an index.
uint GetParent(uint) const override
Get the parent "window_number" of a given instance.
void SetStringParameters(uint index) const override
Set the string parameters to write the right data for a STRINGn.
const void * GetSpec(uint index) const override
Get (NewGRF) specs given an index.
const void * GetInstance(uint) const override
Get the instance given an index.
uint GetParent(uint index) const override
Get the parent "window_number" of a given instance.
bool IsInspectable(uint index) const override
Is the item with the given index inspectable?
uint32_t GetGRFID(uint index) const override
Get the GRFID of the file that includes this item.
std::span< const BadgeID > GetBadges(uint index) const override
Get the list of badges of this item.
uint Resolve(uint index, uint var, uint param, bool &avail) const override
Resolve (action2) variable for a given index.
uint32_t GetGRFID(uint) const override
Get the GRFID of the file that includes this item.
uint Resolve(uint index, uint var, uint param, bool &avail) const override
Resolve (action2) variable for a given index.
bool PSAWithParameter() const override
Used to decide if the PSA needs a parameter or not.
const void * GetSpec(uint) const override
Get (NewGRF) specs given an index.
const void * GetInstance(uint index) const override
Get the instance given an index.
void SetStringParameters(uint index) const override
Set the string parameters to write the right data for a STRINGn.
std::span< const BadgeID > GetBadges(uint) const override
Get the list of badges of this item.
uint GetParent(uint) const override
Get the parent "window_number" of a given instance.
const std::span< int32_t > GetPSA(uint index, uint32_t grfid) const override
Gets the span containing the persistent storage.
bool IsInspectable(uint index) const override
Is the item with the given index inspectable?
uint GetParent(uint index) const override
Get the parent "window_number" of a given instance.
void SetStringParameters(uint index) const override
Set the string parameters to write the right data for a STRINGn.
std::span< const BadgeID > GetBadges(uint index) const override
Get the list of badges of this item.
const void * GetSpec(uint index) const override
Get (NewGRF) specs given an index.
uint32_t GetGRFID(uint index) const override
Get the GRFID of the file that includes this item.
bool IsInspectable(uint index) const override
Is the item with the given index inspectable?
const void * GetInstance(uint index) const override
Get the instance given an index.
uint Resolve(uint index, uint var, uint param, bool &avail) const override
Resolve (action2) variable for a given index.
Helper class to wrap some functionality/queries in.
void SetSimpleStringParameters(StringID string, uint32_t index) const
Helper to make setting the strings easier.
void SetObjectAtStringParameters(StringID string, uint32_t index, TileIndex tile) const
Helper to make setting the strings easier for objects at a specific tile.
const IndustrySpec * GetIndustrySpec(IndustryType thistype)
Accessor for array _industry_specs.
const IndustryTileSpec * GetIndustryTileSpec(IndustryGfx gfx)
Accessor for array _industry_tile_specs.
IndustryGfx GetIndustryGfx(Tile t)
Get the industry graphics ID for the given industry tile.
IndustryID GetIndustryIndex(Tile t)
Get the industry ID of the given tile.
@ GSF_FAKE_TOWNS
Fake town GrfSpecFeature for NewGRF debugging (parent scope)
Definition newgrf.h:94
@ GSF_FAKE_END
End of the fake features.
Definition newgrf.h:95
uint8_t StationGfx
Copy from station_map.h.
@ DrawFoundations
decides if default foundations need to be drawn
@ AnimationNextFrame
decides next animation frame
@ AnimationSpeed
decides animation speed
@ DrawTileLayout
Use callback to select a tile layout to use when drawing.
@ Avail
Availability of station in construction window.
@ AnimationNextFrame
Use a custom next frame callback.
@ AnimationSpeed
Customize the animation speed of the station.
@ SlopeCheck
Check slope of new station tiles.
@ VisualEffect
Visual effects and wagon power (trains, road vehicles and ships)
@ SoundEffect
Vehicle uses custom sound effects.
@ Name
Engine name.
@ RefitCapacity
Cargo capacity after refit.
@ ArticEngine
Add articulated engines (trains and road vehicles)
@ Length
Vehicle length (trains and road vehicles)
@ ColourRemap
Change colour mapping of vehicle.
@ LoadAmount
Load amount.
@ CargoSuffix
Show suffix after cargo name.
@ Probability
industry availability/probability callback
@ WindowMoreText
additional text in industry window
@ FundMoreText
additional text in fund window
@ InputCargoTypes
customize the cargoes the industry requires
@ ProductionChange
controls random production change
@ DecideColour
give a custom colour to newly build industries
@ SpecialEffect
control special effects
@ ProdChangeBuild
initialise production level on construction
@ Location
check industry construction on given area
@ MonthlyProdChange
controls monthly random production change
@ CargoSuffix
cargo sub-type display
@ RefuseCargo
option out of accepting cargo
@ OutputCargoTypes
customize the cargoes the industry produces
@ CBID_HOUSE_ANIMATION_START_STOP
Called for periodically starting or stopping the animation.
@ CBID_INDUSTRY_OUTPUT_CARGO_TYPES
Customize the output cargo types of a newly build industry.
@ CBID_VEHICLE_SOUND_EFFECT
Called to play a special sound effect.
@ CBID_INDTILE_ANIMATION_SPEED
Called to indicate how long the current animation frame should last.
@ CBID_INDTILE_ANIM_START_STOP
Called for periodically starting or stopping the animation.
@ CBID_OBJECT_FUND_MORE_TEXT
Called to determine more text in the fund object window.
@ CBID_INDUSTRY_SPECIAL_EFFECT
Called to determine industry special effects.
@ CBID_INDTILE_ANIM_NEXT_FRAME
Called to determine industry tile next animation frame.
@ CBID_INDUSTRY_PROBABILITY
Called to determine if the given industry type is available.
@ CBID_INDTILE_SHAPE_CHECK
Called to determine if the given industry tile can be built on specific tile.
@ CBID_AIRPTILE_DRAW_FOUNDATIONS
Called to determine the type (if any) of foundation to draw for an airport tile.
@ CBID_INDTILE_AUTOSLOPE
Called to determine if industry can alter the ground below industry tile.
@ CBID_VEHICLE_AUTOREPLACE_SELECTION
Return the vehicles this given vehicle can be "upgraded" to.
@ CBID_STATION_BUILD_TILE_LAYOUT
Called when building a station to customize the tile layout.
@ CBID_HOUSE_CONSTRUCTION_STATE_CHANGE
Called whenever the construction state of a house changes.
@ CBID_VEHICLE_COLOUR_MAPPING
Called to determine if a specific colour map should be used for a vehicle instead of the default live...
@ CBID_INDUSTRY_DECIDE_COLOUR
Called to determine the colour of an industry.
@ CBID_INDUSTRY_WINDOW_MORE_TEXT
Called to determine more text in the industry window.
@ CBID_VEHICLE_32DAY_CALLBACK
Called for every vehicle every 32 days (not all on same date though).
@ CBID_OBJECT_LAND_SLOPE_CHECK
Callback done for each tile of an object to check the slope.
@ CBID_VEHICLE_NAME
Called to determine the engine name to show.
@ CBID_STATION_DRAW_TILE_LAYOUT
Choose a tile layout to draw, instead of the standard range.
@ CBID_VEHICLE_CARGO_SUFFIX
Determine the cargo "suffixes" for each refit possibility of a cargo.
@ CBID_HOUSE_COLOUR
Called to determine the colour of a town building.
@ CBID_HOUSE_DRAW_FOUNDATIONS
Called to determine the type (if any) of foundation to draw for house tile.
@ CBID_AIRPTILE_ANIM_START_STOP
Called for periodically starting or stopping the animation.
@ CBID_INDTILE_DRAW_FOUNDATIONS
Called to determine the type (if any) of foundation to draw for industry tile.
@ CBID_INDUSTRY_PRODUCTION_CHANGE
Called on production changes, so it can be adjusted.
@ CBID_INDUSTRY_CARGO_SUFFIX
Called to determine text to display after cargo name.
@ CBID_OBJECT_AUTOSLOPE
Called to determine if one can alter the ground below an object tile.
@ CBID_HOUSE_CARGO_ACCEPTANCE
Called to decide how much cargo a town building can accept.
@ CBID_VEHICLE_LENGTH
Vehicle length, returns the amount of 1/8's the vehicle is shorter for trains and RVs.
@ CBID_HOUSE_ANIMATION_SPEED
Called to indicate how long the current animation frame should last.
@ CBID_HOUSE_AUTOSLOPE
Called to determine if one can alter the ground below a house tile.
@ CBID_AIRPTILE_ANIMATION_SPEED
Called to indicate how long the current animation frame should last.
@ CBID_OBJECT_ANIMATION_START_STOP
Called for periodically starting or stopping the animation.
@ CBID_INDUSTRY_REFUSE_CARGO
Called to determine if the industry can still accept or refuse more cargo arrival.
@ CBID_STATION_AVAILABILITY
Determine whether a newstation should be made available to build.
@ CBID_HOUSE_ANIMATION_NEXT_FRAME
Determine the next animation frame for a house.
@ CBID_HOUSE_CUSTOM_NAME
Called on the Get Tile Description for an house tile.
@ CBID_INDUSTRY_MONTHLYPROD_CHANGE
Called monthly on production changes, so it can be adjusted more frequently.
@ CBID_HOUSE_DENY_DESTRUCTION
Called to determine whether a town building can be destroyed.
@ CBID_VEHICLE_START_STOP_CHECK
Called when the company (or AI) tries to start or stop a vehicle.
@ CBID_STATION_ANIMATION_SPEED
Called to indicate how long the current animation frame should last.
@ CBID_HOUSE_ALLOW_CONSTRUCTION
Determine whether the house can be built on the specified tile.
@ CBID_INDUSTRY_FUND_MORE_TEXT
Called to determine more text in the fund industry window.
@ CBID_HOUSE_WATCHED_CARGO_ACCEPTED
Called when a cargo type specified in property 20 is accepted.
@ CBID_HOUSE_ACCEPT_CARGO
Called to determine which cargoes a town building should accept.
@ CBID_OBJECT_ANIMATION_NEXT_FRAME
Determine the next animation frame for a house.
@ CBID_TRAIN_ALLOW_WAGON_ATTACH
Determine whether a wagon can be attached to an already existing train.
@ CBID_HOUSE_PRODUCE_CARGO
Called to determine how much cargo a town building produces.
@ CBID_VEHICLE_MODIFY_PROPERTY
Called to modify various vehicle properties.
@ CBID_OBJECT_COLOUR
Called to determine the colour of a town building.
@ CBID_STATION_ANIM_START_STOP
Called for periodically starting or stopping the animation.
@ CBID_VEHICLE_ADDITIONAL_TEXT
This callback is called from vehicle purchase lists.
@ CBID_VEHICLE_REFIT_CAPACITY
Refit capacity, the passed vehicle needs to have its ->cargo_type set to the cargo we are refitting t...
@ CBID_OBJECT_ANIMATION_SPEED
Called to indicate how long the current animation frame should last.
@ CBID_STATION_LAND_SLOPE_CHECK
Callback done for each tile of a station to check the slope.
@ CBID_VEHICLE_LOAD_AMOUNT
Determine the amount of cargo to load per unit of time when using gradual loading.
@ CBID_HOUSE_DESTRUCTION
Called periodically to determine if a house should be destroyed.
@ CBID_VEHICLE_VISUAL_EFFECT
Visual effects and wagon power.
@ CBID_INDUSTRY_PROD_CHANGE_BUILD
Called when industry is built to set initial production level.
@ CBID_INDTILE_CARGO_ACCEPTANCE
Called to query the cargo acceptance of the industry tile.
@ CBID_INDUSTRY_LOCATION
Called to determine if the given industry can be built on specific area.
@ CBID_INDTILE_ACCEPT_CARGO
Called to determine which cargoes an industry should accept.
@ CBID_STATION_ANIM_NEXT_FRAME
Called to determine station tile next animation frame.
@ CBID_VEHICLE_ARTIC_ENGINE
Builds articulated engines for trains and RVs.
@ CBID_AIRPTILE_ANIM_NEXT_FRAME
Called to determine airport tile next animation frame.
@ CBID_INDUSTRY_INPUT_CARGO_TYPES
Customize the input cargo types of a newly build industry.
@ FundMoreText
additional text in fund window
@ Autoslope
decides allowance of autosloping
@ AnimationNextFrame
decides next animation frame
@ AnimationSpeed
decides animation speed
@ Colour
decide the colour of the building
@ SlopeCheck
decides slope suitability
@ Avail
Availability of road stop in construction window.
@ AnimationNextFrame
Use a custom next frame callback.
@ AnimationSpeed
Customize the animation speed of the road stop.
@ ShapeCheck
decides slope suitability
@ AcceptCargo
decides accepted types
@ CargoAcceptance
decides amount of cargo acceptance
@ DrawFoundations
decides if default foundations need to be drawn
@ Autoslope
decides allowance of autosloping
@ AnimationNextFrame
decides next animation frame
@ AnimationSpeed
decides animation speed
@ AllowConstruction
decide whether the house can be built on a given tile
@ AcceptCargo
decides accepted types
@ Destruction
trigger destruction of building
@ AnimationStartStop
periodically start/stop the animation
@ CargoAcceptance
decides amount of cargo acceptance
@ DrawFoundations
decides if default foundations need to be drawn
@ ProduceCargo
custom cargo production
@ Autoslope
decides allowance of autosloping
@ AnimationNextFrame
decides next animation frame
@ DenyDestruction
conditional protection
@ AnimationSpeed
decides animation speed
@ ConstructionStateChange
change animation when construction state changes
@ Colour
decide the colour of the building
@ TCX_NORMAL
Nothing special.
GrfSpecFeature GetGrfSpecFeature(TileIndex tile)
Get the GrfSpecFeature associated with the tile.
static const NIFeature *const _nifeatures[]
Table with all NIFeatures.
static uint GetInspectWindowNumber(GrfSpecFeature feature, uint index)
Get the window number for the inspect window given a feature and index.
@ NIT_CARGO
The property is a cargo.
@ VSG_SCOPE_SELF
Resolved object itself.
const RailTypeInfo * GetRailTypeInfo(RailType railtype)
Returns a pointer to the Railtype information for a given railtype.
Definition rail.h:300
RailType GetRailType(Tile t)
Gets the rail type of the given tile.
Definition rail_map.h:115
const RoadTypeInfo * GetRoadTypeInfo(RoadType roadtype)
Returns a pointer to the Roadtype information for a given roadtype.
Definition road.h:220
RoadType
The different roadtypes we support.
Definition road_type.h:25
@ INVALID_ROADTYPE
flag for invalid roadtype
Definition road_type.h:30
StationType GetStationType(Tile t)
Get the station type of this tile.
Definition station_map.h:44
StationGfx GetStationGfx(Tile t)
Get the station graphics of this tile.
Definition station_map.h:68
StationID GetStationIndex(Tile t)
Get StationID from a tile.
Definition station_map.h:28
StationGfx GetAirportGfx(Tile t)
Get the station graphics of this airport tile.
#define lengthof(array)
Return the length of an fixed size array.
Definition stdafx.h:277
static const StringID INVALID_STRING_ID
Constant representing an invalid string (16bit in case it is used in savegames)
Resolver object for airports.
ScopeResolver * GetScope(VarSpriteGroupScope scope=VSG_SCOPE_SELF, uint8_t relative=0) override
Get a resolver for the scope.
struct GRFFileProps grf_prop
Properties related to the grf file.
static const AirportSpec * Get(uint8_t type)
Retrieve airport spec for the given airport.
Resolver for tiles of an airport.
ScopeResolver * GetScope(VarSpriteGroupScope scope=VSG_SCOPE_SELF, uint8_t relative=0) override
Get a resolver for the scope.
static const AirportTileSpec * Get(StationGfx gfx)
Retrieve airport tile spec for the given airport tile.
static const AirportTileSpec * GetByTile(TileIndex tile)
Retrieve airport tile spec for the given airport tile.
GRFFileProps grf_prop
properties related the the grf file
uint8_t type
Type of this airport,.
PersistentStorage * psa
Persistent storage for NewGRF airports.
uint8_t layout
Airport layout number.
static BaseStation * GetByTile(TileIndex tile)
Get the base station belonging to a specific tile.
VehicleType type
Type of vehicle.
uint32_t grfid
grfid that introduced this entity.
bool HasGrfFile() const
Test if this entity was introduced by NewGRF.
Resolver object to be used for houses (feature 07 spritegroups).
ScopeResolver * GetScope(VarSpriteGroupScope scope=VSG_SCOPE_SELF, uint8_t relative=0) override
Get a resolver for the scope.
static HouseSpec * Get(size_t house_id)
Get the spec for a house ID.
GRFFileProps grf_prop
Properties related the the grf file.
Definition house.h:109
Resolver for industries.
ScopeResolver * GetScope(VarSpriteGroupScope scope=VSG_SCOPE_SELF, uint8_t relative=0) override
Get a resolver for the scope.
GRFFileProps grf_prop
properties related to the grf file
Resolver for industry tiles.
ScopeResolver * GetScope(VarSpriteGroupScope scope=VSG_SCOPE_SELF, uint8_t relative=0) override
Get a resolver for the scope.
GRFFileProps grf_prop
properties related to the grf file
Defines the internal data of a functional industry.
Definition industry.h:63
IndustryType type
type of industry.
Definition industry.h:99
PersistentStorage * psa
Persistent storage for NewGRF industries.
Definition industry.h:120
static Industry * GetByTile(TileIndex tile)
Get the industry of the given tile.
Definition industry.h:235
TileArea location
Location of the industry.
Definition industry.h:91
Representation of the available callbacks with information on when they actually apply.
Container for all information for a given feature.
Representation of the data from a NewGRF property.
Representation on the NewGRF variables.
A resolver object to be used with feature 0F spritegroups.
ScopeResolver * GetScope(VarSpriteGroupScope scope=VSG_SCOPE_SELF, uint8_t relative=0) override
Get a resolver for the scope.
static const ObjectSpec * GetByTile(TileIndex tile)
Get the specification associated with a tile.
static Object * GetByTile(TileIndex tile)
Get the object associated with a tile.
TileIndex tile
The base tile of the area.
StorageType storage
Memory for the storage array.
Tindex index
Index of this pool item.
static Titem * Get(auto index)
Returns Titem with given index.
static bool IsValidID(auto index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
Resolver object for rail types.
ScopeResolver * GetScope(VarSpriteGroupScope scope=VSG_SCOPE_SELF, uint8_t relative=0) override
Get a resolver for the scope.
Road stop resolver.
Resolver object for road types.
ScopeResolver * GetScope(VarSpriteGroupScope scope=VSG_SCOPE_SELF, uint8_t relative=0) override
Get a resolver for the scope.
virtual uint32_t GetVariable(uint8_t variable, uint32_t parameter, bool &available) const
Get a variable value.
static Station * Get(auto index)
Gets station with given index.
Station resolver.
ScopeResolver * GetScope(VarSpriteGroupScope scope=VSG_SCOPE_SELF, uint8_t relative=0) override
Get a resolver for the scope.
Station data structure.
Airport airport
Tile area the airport covers.
Resolver of town properties.
Definition newgrf_town.h:42
ScopeResolver * GetScope(VarSpriteGroupScope scope=VSG_SCOPE_SELF, uint8_t relative=0) override
Get a resolver for the scope.
Definition newgrf_town.h:47
Town data structure.
Definition town.h:52
Resolver for a vehicle (chain)
ScopeResolver * GetScope(VarSpriteGroupScope scope=VSG_SCOPE_SELF, uint8_t relative=0) override
Get a resolver for the scope.
@ WO_CACHED
Resolve wagon overrides using TrainCache::cached_override.
Vehicle data structure.
EngineID engine_type
The type of engine used for this vehicle.
Vehicle * First() const
Get the first vehicle of this vehicle chain.
HouseID GetHouseType(Tile t)
Get the type of this house, which is an index into the house spec array.
Definition town_map.h:60
TownID GetTownIndex(Tile t)
Get the index of which town this house/street is attached to.
Definition town_map.h:23