OpenTTD
newgrf_debug_data.h
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 "../newgrf_house.h"
13 #include "../newgrf_engine.h"
14 #include "../newgrf_roadtype.h"
15 
16 /* Helper for filling property tables */
17 #define NIP(prop, base, variable, type, name) { name, (ptrdiff_t)cpp_offsetof(base, variable), cpp_sizeof(base, variable), prop, type }
18 #define NIP_END() { nullptr, 0, 0, 0, 0 }
19 
20 /* Helper for filling callback tables */
21 #define NIC(cb_id, base, variable, bit) { #cb_id, (ptrdiff_t)cpp_offsetof(base, variable), cpp_sizeof(base, variable), bit, cb_id }
22 #define NIC_END() { nullptr, 0, 0, 0, 0 }
23 
24 /* Helper for filling variable tables */
25 #define NIV(var, name) { name, var }
26 #define NIV_END() { nullptr, 0 }
27 
28 
29 /*** NewGRF Vehicles ***/
30 
31 #define NICV(cb_id, bit) NIC(cb_id, Engine, info.callback_mask, bit)
32 static const NICallback _nic_vehicles[] = {
47  NIC_END()
48 };
49 
50 
51 static const NIVariable _niv_vehicles[] = {
52  NIV(0x40, "position in consist and length"),
53  NIV(0x41, "position and length of chain of same vehicles"),
54  NIV(0x42, "transported cargo types"),
55  NIV(0x43, "player info"),
56  NIV(0x44, "aircraft info"),
57  NIV(0x45, "curvature info"),
58  NIV(0x46, "motion counter"),
59  NIV(0x47, "vehicle cargo info"),
60  NIV(0x48, "vehicle type info"),
61  NIV(0x49, "year of construction"),
62  NIV(0x4A, "current rail/road type info"),
63  NIV(0x4B, "long date of last service"),
64  NIV(0x4C, "current max speed"),
65  NIV(0x4D, "position in articulated vehicle"),
66  NIV(0x60, "count vehicle id occurrences"),
67  // 0x61 not useful, since it requires register 0x10F
68  NIV(0x62, "Curvature/position difference to other vehicle"),
69  NIV_END()
70 };
71 
72 class NIHVehicle : public NIHelper {
73  bool IsInspectable(uint index) const override { return Vehicle::Get(index)->GetGRF() != nullptr; }
74  uint GetParent(uint index) const override { const Vehicle *first = Vehicle::Get(index)->First(); return GetInspectWindowNumber(GetGrfSpecFeature(first->type), first->index); }
75  const void *GetInstance(uint index)const override { return Vehicle::Get(index); }
76  const void *GetSpec(uint index) const override { return Vehicle::Get(index)->GetEngine(); }
77  void SetStringParameters(uint index) const override { this->SetSimpleStringParameters(STR_VEHICLE_NAME, index); }
78  uint32 GetGRFID(uint index) const override { return Vehicle::Get(index)->GetGRFID(); }
79 
80  uint Resolve(uint index, uint var, uint param, bool *avail) const override
81  {
82  Vehicle *v = Vehicle::Get(index);
84  return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
85  }
86 };
87 
88 static const NIFeature _nif_vehicle = {
89  nullptr,
90  _nic_vehicles,
91  _niv_vehicles,
92  new NIHVehicle(),
93 };
94 
95 
96 /*** NewGRF station (tiles) ***/
97 
98 #define NICS(cb_id, bit) NIC(cb_id, StationSpec, callback_mask, bit)
99 static const NICallback _nic_stations[] = {
107  NIC_END()
108 };
109 
110 static const NIVariable _niv_stations[] = {
111  NIV(0x40, "platform info and relative position"),
112  NIV(0x41, "platform info and relative position for individually built sections"),
113  NIV(0x42, "terrain and track type"),
114  NIV(0x43, "player info"),
115  NIV(0x44, "path signalling info"),
116  NIV(0x45, "rail continuation info"),
117  NIV(0x46, "platform info and relative position from middle"),
118  NIV(0x47, "platform info and relative position from middle for individually built sections"),
119  NIV(0x48, "bitmask of accepted cargoes"),
120  NIV(0x49, "platform info and relative position of same-direction section"),
121  NIV(0x4A, "current animation frame"),
122  NIV(0x60, "amount of cargo waiting"),
123  NIV(0x61, "time since last cargo pickup"),
124  NIV(0x62, "rating of cargo"),
125  NIV(0x63, "time spent on route"),
126  NIV(0x64, "information about last vehicle picking cargo up"),
127  NIV(0x65, "amount of cargo acceptance"),
128  NIV(0x66, "animation frame of nearby tile"),
129  NIV(0x67, "land info of nearby tiles"),
130  NIV(0x68, "station info of nearby tiles"),
131  NIV(0x69, "information about cargo accepted in the past"),
132  NIV_END()
133 };
134 
135 class NIHStation : public NIHelper {
136  bool IsInspectable(uint index) const override { return GetStationSpec(index) != nullptr; }
137  uint GetParent(uint index) const override { return GetInspectWindowNumber(GSF_FAKE_TOWNS, Station::GetByTile(index)->town->index); }
138  const void *GetInstance(uint index)const override { return nullptr; }
139  const void *GetSpec(uint index) const override { return GetStationSpec(index); }
140  void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_STATION_NAME, GetStationIndex(index), index); }
141  uint32 GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? GetStationSpec(index)->grf_prop.grffile->grfid : 0; }
142 
143  uint Resolve(uint index, uint var, uint param, bool *avail) const override
144  {
145  StationResolverObject ro(GetStationSpec(index), Station::GetByTile(index), index);
146  return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
147  }
148 };
149 
150 static const NIFeature _nif_station = {
151  nullptr,
152  _nic_stations,
153  _niv_stations,
154  new NIHStation(),
155 };
156 
157 
158 /*** NewGRF house tiles ***/
159 
160 #define NICH(cb_id, bit) NIC(cb_id, HouseSpec, callback_mask, bit)
161 static const NICallback _nic_house[] = {
177  NIC_END()
178 };
179 
180 static const NIVariable _niv_house[] = {
181  NIV(0x40, "construction state of tile and pseudo-random value"),
182  NIV(0x41, "age of building in years"),
183  NIV(0x42, "town zone"),
184  NIV(0x43, "terrain type"),
185  NIV(0x44, "building counts"),
186  NIV(0x45, "town expansion bits"),
187  NIV(0x46, "current animation frame"),
188  NIV(0x47, "xy coordinate of the building"),
189  NIV(0x60, "other building counts (old house type)"),
190  NIV(0x61, "other building counts (new house type)"),
191  NIV(0x62, "land info of nearby tiles"),
192  NIV(0x63, "current animation frame of nearby house tile"),
193  NIV(0x64, "cargo acceptance history of nearby stations"),
194  NIV(0x65, "distance of nearest house matching a given criterion"),
195  NIV(0x66, "class and ID of nearby house tile"),
196  NIV(0x67, "GRFID of nearby house tile"),
197  NIV_END()
198 };
199 
200 class NIHHouse : public NIHelper {
201  bool IsInspectable(uint index) const override { return HouseSpec::Get(GetHouseType(index))->grf_prop.grffile != nullptr; }
202  uint GetParent(uint index) const override { return GetInspectWindowNumber(GSF_FAKE_TOWNS, GetTownIndex(index)); }
203  const void *GetInstance(uint index)const override { return nullptr; }
204  const void *GetSpec(uint index) const override { return HouseSpec::Get(GetHouseType(index)); }
205  void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_TOWN_NAME, GetTownIndex(index), index); }
206  uint32 GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? HouseSpec::Get(GetHouseType(index))->grf_prop.grffile->grfid : 0; }
207 
208  uint Resolve(uint index, uint var, uint param, bool *avail) const override
209  {
210  HouseResolverObject ro(GetHouseType(index), index, Town::GetByTile(index));
211  return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
212  }
213 };
214 
215 static const NIFeature _nif_house = {
216  nullptr,
217  _nic_house,
218  _niv_house,
219  new NIHHouse(),
220 };
221 
222 
223 /*** NewGRF industry tiles ***/
224 
225 #define NICIT(cb_id, bit) NIC(cb_id, IndustryTileSpec, callback_mask, bit)
226 static const NICallback _nic_industrytiles[] = {
235  NIC_END()
236 };
237 
238 static const NIVariable _niv_industrytiles[] = {
239  NIV(0x40, "construction state of tile"),
240  NIV(0x41, "ground type"),
241  NIV(0x42, "current town zone in nearest town"),
242  NIV(0x43, "relative position"),
243  NIV(0x44, "animation frame"),
244  NIV(0x60, "land info of nearby tiles"),
245  NIV(0x61, "animation stage of nearby tiles"),
246  NIV(0x62, "get industry or airport tile ID at offset"),
247  NIV_END()
248 };
249 
250 class NIHIndustryTile : public NIHelper {
251  bool IsInspectable(uint index) const override { return GetIndustryTileSpec(GetIndustryGfx(index))->grf_prop.grffile != nullptr; }
252  uint GetParent(uint index) const override { return GetInspectWindowNumber(GSF_INDUSTRIES, GetIndustryIndex(index)); }
253  const void *GetInstance(uint index)const override { return nullptr; }
254  const void *GetSpec(uint index) const override { return GetIndustryTileSpec(GetIndustryGfx(index)); }
255  void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_INDUSTRY_NAME, GetIndustryIndex(index), index); }
256  uint32 GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? GetIndustryTileSpec(GetIndustryGfx(index))->grf_prop.grffile->grfid : 0; }
257 
258  uint Resolve(uint index, uint var, uint param, bool *avail) const override
259  {
261  return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
262  }
263 };
264 
265 static const NIFeature _nif_industrytile = {
266  nullptr,
267  _nic_industrytiles,
268  _niv_industrytiles,
269  new NIHIndustryTile(),
270 };
271 
272 
273 /*** NewGRF industries ***/
274 
275 static const NIProperty _nip_industries[] = {
276  NIP(0x25, Industry, produced_cargo[ 0], NIT_CARGO, "produced cargo 0"),
277  NIP(0x25, Industry, produced_cargo[ 1], NIT_CARGO, "produced cargo 1"),
278  NIP(0x25, Industry, produced_cargo[ 2], NIT_CARGO, "produced cargo 2"),
279  NIP(0x25, Industry, produced_cargo[ 3], NIT_CARGO, "produced cargo 3"),
280  NIP(0x25, Industry, produced_cargo[ 4], NIT_CARGO, "produced cargo 4"),
281  NIP(0x25, Industry, produced_cargo[ 5], NIT_CARGO, "produced cargo 5"),
282  NIP(0x25, Industry, produced_cargo[ 6], NIT_CARGO, "produced cargo 6"),
283  NIP(0x25, Industry, produced_cargo[ 7], NIT_CARGO, "produced cargo 7"),
284  NIP(0x25, Industry, produced_cargo[ 8], NIT_CARGO, "produced cargo 8"),
285  NIP(0x25, Industry, produced_cargo[ 9], NIT_CARGO, "produced cargo 9"),
286  NIP(0x25, Industry, produced_cargo[10], NIT_CARGO, "produced cargo 10"),
287  NIP(0x25, Industry, produced_cargo[11], NIT_CARGO, "produced cargo 11"),
288  NIP(0x25, Industry, produced_cargo[12], NIT_CARGO, "produced cargo 12"),
289  NIP(0x25, Industry, produced_cargo[13], NIT_CARGO, "produced cargo 13"),
290  NIP(0x25, Industry, produced_cargo[14], NIT_CARGO, "produced cargo 14"),
291  NIP(0x25, Industry, produced_cargo[15], NIT_CARGO, "produced cargo 15"),
292  NIP(0x26, Industry, accepts_cargo[ 0], NIT_CARGO, "accepted cargo 0"),
293  NIP(0x26, Industry, accepts_cargo[ 1], NIT_CARGO, "accepted cargo 1"),
294  NIP(0x26, Industry, accepts_cargo[ 2], NIT_CARGO, "accepted cargo 2"),
295  NIP(0x26, Industry, accepts_cargo[ 3], NIT_CARGO, "accepted cargo 3"),
296  NIP(0x26, Industry, accepts_cargo[ 4], NIT_CARGO, "accepted cargo 4"),
297  NIP(0x26, Industry, accepts_cargo[ 5], NIT_CARGO, "accepted cargo 5"),
298  NIP(0x26, Industry, accepts_cargo[ 6], NIT_CARGO, "accepted cargo 6"),
299  NIP(0x26, Industry, accepts_cargo[ 7], NIT_CARGO, "accepted cargo 7"),
300  NIP(0x26, Industry, accepts_cargo[ 8], NIT_CARGO, "accepted cargo 8"),
301  NIP(0x26, Industry, accepts_cargo[ 9], NIT_CARGO, "accepted cargo 9"),
302  NIP(0x26, Industry, accepts_cargo[10], NIT_CARGO, "accepted cargo 10"),
303  NIP(0x26, Industry, accepts_cargo[11], NIT_CARGO, "accepted cargo 11"),
304  NIP(0x26, Industry, accepts_cargo[12], NIT_CARGO, "accepted cargo 12"),
305  NIP(0x26, Industry, accepts_cargo[13], NIT_CARGO, "accepted cargo 13"),
306  NIP(0x26, Industry, accepts_cargo[14], NIT_CARGO, "accepted cargo 14"),
307  NIP(0x26, Industry, accepts_cargo[15], NIT_CARGO, "accepted cargo 15"),
308  NIP_END()
309 };
310 
311 #define NICI(cb_id, bit) NIC(cb_id, IndustrySpec, callback_mask, bit)
312 static const NICallback _nic_industries[] = {
326  NIC_END()
327 };
328 
329 static const NIVariable _niv_industries[] = {
330  NIV(0x40, "waiting cargo 0"),
331  NIV(0x41, "waiting cargo 1"),
332  NIV(0x42, "waiting cargo 2"),
333  NIV(0x43, "distance to closest dry/land tile"),
334  NIV(0x44, "layout number"),
335  NIV(0x45, "player info"),
336  NIV(0x46, "industry construction date"),
337  NIV(0x60, "get industry tile ID at offset"),
338  NIV(0x61, "get random tile bits at offset"),
339  NIV(0x62, "land info of nearby tiles"),
340  NIV(0x63, "animation stage of nearby tiles"),
341  NIV(0x64, "distance on nearest industry with given type"),
342  NIV(0x65, "get town zone and Manhattan distance of closest town"),
343  NIV(0x66, "get square of Euclidean distance of closes town"),
344  NIV(0x67, "count of industry and distance of closest instance"),
345  NIV(0x68, "count of industry and distance of closest instance with layout filter"),
346  NIV_END()
347 };
348 
349 class NIHIndustry : public NIHelper {
350  bool IsInspectable(uint index) const override { return GetIndustrySpec(Industry::Get(index)->type)->grf_prop.grffile != nullptr; }
351  uint GetParent(uint index) const override { return GetInspectWindowNumber(GSF_FAKE_TOWNS, Industry::Get(index)->town->index); }
352  const void *GetInstance(uint index)const override { return Industry::Get(index); }
353  const void *GetSpec(uint index) const override { return GetIndustrySpec(Industry::Get(index)->type); }
354  void SetStringParameters(uint index) const override { this->SetSimpleStringParameters(STR_INDUSTRY_NAME, index); }
355  uint32 GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? GetIndustrySpec(Industry::Get(index)->type)->grf_prop.grffile->grfid : 0; }
356 
357  uint Resolve(uint index, uint var, uint param, bool *avail) const override
358  {
359  Industry *i = Industry::Get(index);
361  return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
362  }
363 
364  uint GetPSASize(uint index, uint32 grfid) const override { return cpp_lengthof(PersistentStorage, storage); }
365 
366  const int32 *GetPSAFirstPosition(uint index, uint32 grfid) const override
367  {
368  const Industry *i = (const Industry *)this->GetInstance(index);
369  if (i->psa == nullptr) return nullptr;
370  return (int32 *)(&i->psa->storage);
371  }
372 };
373 
374 static const NIFeature _nif_industry = {
375  _nip_industries,
376  _nic_industries,
377  _niv_industries,
378  new NIHIndustry(),
379 };
380 
381 
382 /*** NewGRF objects ***/
383 
384 #define NICO(cb_id, bit) NIC(cb_id, ObjectSpec, callback_mask, bit)
385 static const NICallback _nic_objects[] = {
393  NIC_END()
394 };
395 
396 static const NIVariable _niv_objects[] = {
397  NIV(0x40, "relative position"),
398  NIV(0x41, "tile information"),
399  NIV(0x42, "construction date"),
400  NIV(0x43, "animation counter"),
401  NIV(0x44, "object founder"),
402  NIV(0x45, "get town zone and Manhattan distance of closest town"),
403  NIV(0x46, "get square of Euclidean distance of closes town"),
404  NIV(0x47, "colour"),
405  NIV(0x48, "view"),
406  NIV(0x60, "get object ID at offset"),
407  NIV(0x61, "get random tile bits at offset"),
408  NIV(0x62, "land info of nearby tiles"),
409  NIV(0x63, "animation stage of nearby tiles"),
410  NIV(0x64, "distance on nearest object with given type"),
411  NIV_END()
412 };
413 
414 class NIHObject : public NIHelper {
415  bool IsInspectable(uint index) const override { return ObjectSpec::GetByTile(index)->grf_prop.grffile != nullptr; }
416  uint GetParent(uint index) const override { return GetInspectWindowNumber(GSF_FAKE_TOWNS, Object::GetByTile(index)->town->index); }
417  const void *GetInstance(uint index)const override { return Object::GetByTile(index); }
418  const void *GetSpec(uint index) const override { return ObjectSpec::GetByTile(index); }
419  void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_OBJECT, INVALID_STRING_ID, index); }
420  uint32 GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? ObjectSpec::GetByTile(index)->grf_prop.grffile->grfid : 0; }
421 
422  uint Resolve(uint index, uint var, uint param, bool *avail) const override
423  {
425  return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
426  }
427 };
428 
429 static const NIFeature _nif_object = {
430  nullptr,
431  _nic_objects,
432  _niv_objects,
433  new NIHObject(),
434 };
435 
436 
437 /*** NewGRF rail types ***/
438 
439 static const NIVariable _niv_railtypes[] = {
440  NIV(0x40, "terrain type"),
441  NIV(0x41, "enhanced tunnels"),
442  NIV(0x42, "level crossing status"),
443  NIV(0x43, "construction date"),
444  NIV(0x44, "town zone"),
445  NIV_END()
446 };
447 
448 class NIHRailType : public NIHelper {
449  bool IsInspectable(uint index) const override { return true; }
450  uint GetParent(uint index) const override { return UINT32_MAX; }
451  const void *GetInstance(uint index)const override { return nullptr; }
452  const void *GetSpec(uint index) const override { return nullptr; }
453  void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_RAIL_TYPE, INVALID_STRING_ID, index); }
454  uint32 GetGRFID(uint index) const override { return 0; }
455 
456  uint Resolve(uint index, uint var, uint param, bool *avail) const override
457  {
458  /* There is no unique GRFFile for the tile. Multiple GRFs can define different parts of the railtype.
459  * However, currently the NewGRF Debug GUI does not display variables depending on the GRF (like 0x7F) anyway. */
460  RailTypeResolverObject ro(nullptr, index, TCX_NORMAL, RTSG_END);
461  return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
462  }
463 };
464 
465 static const NIFeature _nif_railtype = {
466  nullptr,
467  nullptr,
468  _niv_railtypes,
469  new NIHRailType(),
470 };
471 
472 
473 /*** NewGRF airport tiles ***/
474 
475 #define NICAT(cb_id, bit) NIC(cb_id, AirportTileSpec, callback_mask, bit)
476 static const NICallback _nic_airporttiles[] = {
481  NIC_END()
482 };
483 
484 class NIHAirportTile : public NIHelper {
485  bool IsInspectable(uint index) const override { return AirportTileSpec::Get(GetAirportGfx(index))->grf_prop.grffile != nullptr; }
486  uint GetParent(uint index) const override { return GetInspectWindowNumber(GSF_FAKE_TOWNS, Station::GetByTile(index)->town->index); }
487  const void *GetInstance(uint index)const override { return nullptr; }
488  const void *GetSpec(uint index) const override { return AirportTileSpec::Get(GetAirportGfx(index)); }
489  void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_STATION_NAME, GetStationIndex(index), index); }
490  uint32 GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? AirportTileSpec::Get(GetAirportGfx(index))->grf_prop.grffile->grfid : 0; }
491 
492  uint Resolve(uint index, uint var, uint param, bool *avail) const override
493  {
495  return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
496  }
497 };
498 
499 static const NIFeature _nif_airporttile = {
500  nullptr,
501  _nic_airporttiles,
502  _niv_industrytiles, // Yes, they share this (at least now)
503  new NIHAirportTile(),
504 };
505 
506 
507 /*** NewGRF towns ***/
508 
509 static const NIVariable _niv_towns[] = {
510  NIV(0x40, "larger town effect on this town"),
511  NIV(0x41, "town index"),
512  NIV(0x82, "population"),
513  NIV(0x94, "zone radius 0"),
514  NIV(0x96, "zone radius 1"),
515  NIV(0x98, "zone radius 2"),
516  NIV(0x9A, "zone radius 3"),
517  NIV(0x9C, "zone radius 4"),
518  NIV(0xB6, "number of buildings"),
519  NIV_END()
520 };
521 
522 class NIHTown : public NIHelper {
523  bool IsInspectable(uint index) const override { return Town::IsValidID(index); }
524  uint GetParent(uint index) const override { return UINT32_MAX; }
525  const void *GetInstance(uint index)const override { return Town::Get(index); }
526  const void *GetSpec(uint index) const override { return nullptr; }
527  void SetStringParameters(uint index) const override { this->SetSimpleStringParameters(STR_TOWN_NAME, index); }
528  uint32 GetGRFID(uint index) const override { return 0; }
529  bool PSAWithParameter() const override { return true; }
530  uint GetPSASize(uint index, uint32 grfid) const override { return cpp_lengthof(PersistentStorage, storage); }
531 
532  uint Resolve(uint index, uint var, uint param, bool *avail) const override
533  {
534  TownResolverObject ro(nullptr, Town::Get(index), true);
535  return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
536  }
537 
538  const int32 *GetPSAFirstPosition(uint index, uint32 grfid) const override
539  {
540  Town *t = Town::Get(index);
541 
542  std::list<PersistentStorage *>::iterator iter;
543  for (iter = t->psa_list.begin(); iter != t->psa_list.end(); iter++) {
544  if ((*iter)->grfid == grfid) return (int32 *)(&(*iter)->storage[0]);
545  }
546 
547  return nullptr;
548  }
549 };
550 
551 static const NIFeature _nif_town = {
552  nullptr,
553  nullptr,
554  _niv_towns,
555  new NIHTown(),
556 };
557 
558 /*** NewGRF road types ***/
559 
560 static const NIVariable _niv_roadtypes[] = {
561  NIV(0x40, "terrain type"),
562  NIV(0x41, "enhanced tunnels"),
563  NIV(0x42, "level crossing status"),
564  NIV(0x43, "construction date"),
565  NIV(0x44, "town zone"),
566  NIV_END()
567 };
568 
569 class NIHRoadType : public NIHelper {
570  bool IsInspectable(uint index) const override { return true; }
571  uint GetParent(uint index) const override { return UINT32_MAX; }
572  const void *GetInstance(uint index) const override { return nullptr; }
573  const void *GetSpec(uint index) const override { return nullptr; }
574  void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_RAIL_TYPE, INVALID_STRING_ID, index); }
575  uint32 GetGRFID(uint index) const override { return 0; }
576 
577  uint Resolve(uint index, uint var, uint param, bool *avail) const override
578  {
579  /* There is no unique GRFFile for the tile. Multiple GRFs can define different parts of the railtype.
580  * However, currently the NewGRF Debug GUI does not display variables depending on the GRF (like 0x7F) anyway. */
581  RoadTypeResolverObject ro(nullptr, index, TCX_NORMAL, ROTSG_END);
582  return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
583  }
584 };
585 
586 static const NIFeature _nif_roadtype = {
587  nullptr,
588  nullptr,
589  _niv_roadtypes,
590  new NIHRoadType(),
591 };
592 
593 static const NIFeature _nif_tramtype = {
594  nullptr,
595  nullptr,
596  _niv_roadtypes,
597  new NIHRoadType(),
598 };
599 
601 static const NIFeature * const _nifeatures[] = {
602  &_nif_vehicle, // GSF_TRAINS
603  &_nif_vehicle, // GSF_ROADVEHICLES
604  &_nif_vehicle, // GSF_SHIPS
605  &_nif_vehicle, // GSF_AIRCRAFT
606  &_nif_station, // GSF_STATIONS
607  nullptr, // GSF_CANALS (no callbacks/action2 implemented)
608  nullptr, // GSF_BRIDGES (no callbacks/action2)
609  &_nif_house, // GSF_HOUSES
610  nullptr, // GSF_GLOBALVAR (has no "physical" objects)
611  &_nif_industrytile, // GSF_INDUSTRYTILES
612  &_nif_industry, // GSF_INDUSTRIES
613  nullptr, // GSF_CARGOES (has no "physical" objects)
614  nullptr, // GSF_SOUNDFX (has no "physical" objects)
615  nullptr, // GSF_AIRPORTS (feature not implemented)
616  nullptr, // GSF_SIGNALS (feature not implemented)
617  &_nif_object, // GSF_OBJECTS
618  &_nif_railtype, // GSF_RAILTYPES
619  &_nif_airporttile, // GSF_AIRPORTTILES
620  &_nif_roadtype, // GSF_ROADTYPES
621  &_nif_tramtype, // GSF_TRAMTYPES
622  &_nif_town, // GSF_FAKE_TOWNS
623 };
624 assert_compile(lengthof(_nifeatures) == GSF_FAKE_END);
Resolver of town properties.
Definition: newgrf_town.h:44
customize the cargoes the industry produces
initialise production level on construction
uint Resolve(uint index, uint var, uint param, bool *avail) const override
Resolve (action2) variable for a given index.
bool IsInspectable(uint index) const override
Is the item with the given index inspectable?
Called to determine if the given industry can be built on specific area.
Use callback to select a sprite layout to use.
Resolver object for rail types.
uint GetParent(uint index) const override
Get the parent "window_number" of a given instance.
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.
decides next animation frame
decides accepted types
void SetStringParameters(uint index) const override
Set the string parameters to write the right data for a STRINGn.
decides animation speed
Called to determine airport tile next animation frame.
const void * GetInstance(uint index) const override
Get the instance given an index.
uint GetParent(uint index) const override
Get the parent "window_number" of a given instance.
Called to determine more text in the fund object window.
static Titem * Get(size_t index)
Returns Titem with given index.
Definition: pool_type.hpp:246
decides animation speed
ScopeResolver * GetScope(VarSpriteGroupScope scope=VSG_SCOPE_SELF, byte relative=0)
Get a resolver for the scope.
static const AirportTileSpec * GetByTile(TileIndex tile)
Retrieve airport tile spec for the given airport tile.
Called to determine if one can alter the ground below a house tile.
const void * GetInstance(uint index) const override
Get the instance given an index.
Called to determine if the given industry tile can be built on specific tile.
void SetSimpleStringParameters(StringID string, uint32 index) const
Helper to make setting the strings easier.
Customize the input cargo types of a newly build industry.
static IndustryGfx GetIndustryGfx(TileIndex t)
Get the industry graphics ID for the given industry tile.
Definition: industry_map.h:139
GRFFilePropsBase< 2 > grf_prop
Properties related the the grf file.
Definition: newgrf_object.h:62
Builds articulated engines for trains and RVs.
Representation on the NewGRF variables.
Called periodically to determine if a house should be destroyed.
Called to indicate how long the current animation frame should last.
const void * GetSpec(uint index) const override
Get (NewGRF) specs given an index.
Return the vehicles this given vehicle can be "upgraded" to.
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?
uint GetParent(uint index) const override
Get the parent "window_number" of a given instance.
uint32 GetGRFID(uint index) const override
Get the GRFID of the file that includes this item.
Called monthly on production changes, so it can be adjusted more frequently.
Called for periodically starting or stopping the animation.
additional text in fund window
Called when the company (or AI) tries to start or stop a vehicle.
Vehicle data structure.
Definition: vehicle_base.h:212
ScopeResolver * GetScope(VarSpriteGroupScope scope=VSG_SCOPE_SELF, byte relative=0) override
Get a resolver for the scope.
Defines the internal data of a functional industry.
Definition: industry.h:42
ScopeResolver * GetScope(VarSpriteGroupScope scope=VSG_SCOPE_SELF, byte relative=0) override
Get a resolver for the scope.
static uint GetInspectWindowNumber(GrfSpecFeature feature, uint index)
Get the window number for the inspect window given a feature and index.
Tindex index
Index of this pool item.
Definition: pool_type.hpp:147
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.
static StationGfx GetAirportGfx(TileIndex t)
Get the station graphics of this airport tile.
Definition: station_map.h:246
bool IsInspectable(uint index) const override
Is the item with the given index inspectable?
The property is a cargo.
Determine the next animation frame for a house.
Cargo capacity after refit.
check industry construction on given area
change animation when construction state changes
Resolver object to be used for houses (feature 07 spritegroups).
Definition: newgrf_house.h:53
Determine whether a wagon can be attached to an already existing train.
Called to determine whether a town building can be destroyed.
Called to determine which cargoes a town building should accept.
ScopeResolver * GetScope(VarSpriteGroupScope scope=VSG_SCOPE_SELF, byte relative=0) override
Get a resolver for the scope.
Visual effects and wagon power.
uint32 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.
Nothing special.
const void * GetInstance(uint index) const override
Get the instance given an index.
Called to indicate how long the current animation frame should last.
GrfSpecFeature GetGrfSpecFeature(TileIndex tile)
Get the GrfSpecFeature associated with the tile.
Determine the cargo "suffixes" for each refit possibility of a cargo.
Callback done for each tile of an object to check the slope.
control special effects
Vehicle uses custom sound effects.
Use a custom next frame callback.
Determine whether a newstation should be made available to build.
decides animation speed
decides amount of cargo acceptance
const void * GetInstance(uint index) const override
Get the instance given an index.
uint32 GetGRFID(uint index) const override
Get the GRFID of the file that includes this item.
ScopeResolver * GetScope(VarSpriteGroupScope scope=VSG_SCOPE_SELF, byte relative=0) override
Get a resolver for the scope.
void SetStringParameters(uint index) const override
Set the string parameters to write the right data for a STRINGn.
uint32 GetGRFID(uint index) const override
Get the GRFID of the file that includes this item.
Called to determine more text in the fund industry window.
Representation of the available callbacks with information on when they actually apply.
uint32 GetGRFID(uint index) const override
Get the GRFID of the file that includes this item.
Called to determine the type (if any) of foundation to draw for house tile.
uint32 GetGRFID(uint index) const override
Get the GRFID of the file that includes this item.
Callback done for each tile of a station to check the slope.
decides allowance of autosloping
Called to determine the colour of a town building.
const void * GetInstance(uint index) const override
Get the instance given an index.
Fake town GrfSpecFeature for NewGRF debugging (parent scope)
Definition: newgrf.h:91
uint Resolve(uint index, uint var, uint param, bool *avail) const override
Resolve (action2) variable for a given index.
uint GetParent(uint index) const override
Get the parent "window_number" of a given instance.
static const NIFeature *const _nifeatures[]
Table with all NIFeatures.
void SetStringParameters(uint index) const override
Set the string parameters to write the right data for a STRINGn.
This callback is called from vehicle purchase lists.
Resolver for industry tiles.
Called on the Get Tile Description for an house tile.
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.
Customize the output cargo types of a newly build industry.
const void * GetSpec(uint index) const override
Get (NewGRF) specs given an index.
Called when a cargo type specified in property 20 is accepted.
decides if default foundations need to be drawn
Called to indicate how long the current animation frame should last.
PersistentStorage * psa
Persistent storage for NewGRF industries.
Definition: industry.h:76
Customize the animation speed of the station.
Called to play a special sound effect.
Called to determine if the given industry type is available.
Resolver for tiles of an airport.
controls random production change
decides next animation frame
static TownID GetTownIndex(TileIndex t)
Get the index of which town this house/street is attached to.
Definition: town_map.h:24
bool PSAWithParameter() const override
Used to decide if the PSA needs a parameter or not.
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.
decides if default foundations need to be drawn
Called to modify various vehicle properties.
Called to determine if industry can alter the ground below industry tile.
custom cargo production
Called to determine the type (if any) of foundation to draw for industry tile.
Resolver for a vehicle (chain)
Definition: newgrf_engine.h:49
uint GetParent(uint index) const override
Get the parent "window_number" of a given instance.
GRFFilePropsBase< NUM_CARGO+3 > grf_prop
Properties related the the grf file.
uint Resolve(uint index, uint var, uint param, bool *avail) const override
Resolve (action2) variable for a given index.
trigger destruction of building
const IndustrySpec * GetIndustrySpec(IndustryType thistype)
Accessor for array _industry_specs.
const int32 * GetPSAFirstPosition(uint index, uint32 grfid) const override
Gets the first position of the array containing the persistent storage.
Show suffix after cargo name.
Called to indicate how long the current animation frame should last.
bool IsInspectable(uint index) const override
Is the item with the given index inspectable?
IndustryType type
type of industry.
Definition: industry.h:59
Vehicle length (trains and road vehicles)
decide the colour of the building
Called for periodically starting or stopping the animation.
void SetStringParameters(uint index) const override
Set the string parameters to write the right data for a STRINGn.
decides amount of cargo acceptance
void SetObjectAtStringParameters(StringID string, uint32 index, TileIndex tile) const
Helper to make setting the strings easier for objects at a specific tile.
TileArea location
Location of the industry.
Definition: industry.h:43
TYPE storage[SIZE]
Memory to for the storage array.
additional text in industry window
bool IsInspectable(uint index) const override
Is the item with the given index inspectable?
End of the fake features.
Definition: newgrf.h:92
Change colour mapping of vehicle.
Class for pooled persistent storage of data.
uint GetParent(uint index) const override
Get the parent "window_number" of a given instance.
decides allowance of autosloping
const void * GetSpec(uint index) const override
Get (NewGRF) specs given an index.
GRFFileProps grf_prop
properties related to the grf file
Definition: industrytype.h:173
decides next animation frame
static const AirportTileSpec * Get(StationGfx gfx)
Retrieve airport tile spec for the given airport tile.
customize the cargoes the industry requires
additional text in fund window
uint GetParent(uint index) const override
Get the parent "window_number" of a given instance.
uint32 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 IndustryTileSpec * GetIndustryTileSpec(IndustryGfx gfx)
Accessor for array _industry_tile_specs.
decides animation speed
Called when building a station to customize the tile layout.
uint Resolve(uint index, uint var, uint param, bool *avail) const override
Resolve (action2) variable for a given index.
uint32 GetGRFID(uint index) const override
Get the GRFID of the file that includes this item.
Called to determine if a specific colour map should be used for a vehicle instead of the default live...
#define lengthof(x)
Return the length of an fixed size array.
Definition: depend.cpp:42
periodically start/stop the animation
GRFFileProps grf_prop
properties related to the grf file
Definition: industrytype.h:142
const void * GetInstance(uint index) const override
Get the instance given an index.
Resolved object itself.
decide the colour of the building
decides accepted types
uint Resolve(uint index, uint var, uint param, bool *avail) const override
Resolve (action2) variable for a given index.
Called to determine if the industry can still accept or refuse more cargo arrival.
Add articulated engines (trains and road vehicles)
Called whenever the construction state of a house changes.
decides slope suitability
ScopeResolver * GetScope(VarSpriteGroupScope scope=VSG_SCOPE_SELF, byte relative=0) override
Get a resolver for the scope.
uint32 GetGRFID(uint index) const override
Get the GRFID of the file that includes this item.
Called to determine the colour of an industry.
ScopeResolver * GetScope(VarSpriteGroupScope scope=VSG_SCOPE_SELF, byte relative=0) override
Get a resolver for the scope.
industry availability/probability callback
controls monthly random production change
virtual uint32 GetVariable(byte variable, uint32 parameter, bool *available) const
Get a variable value.
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.
Called to determine which cargoes an industry should accept.
Determine whether the house can be built on the specified tile.
TileIndex tile
The base tile of the area.
Definition: tilearea_type.h:19
static const int CBM_NO_BIT
Mask to show no bit needs to be enabled for the callback.
const void * GetSpec(uint index) const override
Get (NewGRF) specs given an index.
const void * GetInstance(uint index) const override
Get the instance given an index.
ScopeResolver * GetScope(VarSpriteGroupScope scope=VSG_SCOPE_SELF, byte relative=0) override
Get a resolver for the scope.
Definition: newgrf_house.h:61
void SetStringParameters(uint index) const override
Set the string parameters to write the right data for a STRINGn.
Called for every vehicle every 32 days (not all on same date though).
Called to determine the type (if any) of foundation to draw for an airport tile.
static StationID GetStationIndex(TileIndex t)
Get StationID from a tile.
Definition: station_map.h:30
Determine the amount of cargo to load per unit of time when using gradual loading.
uint GetParent(uint index) const override
Get the parent "window_number" of a given instance.
Refit capacity, the passed vehicle needs to have its ->cargo_type set to the cargo we are refitting t...
#define cpp_lengthof(base, variable)
Gets the length of an array variable within a class.
Definition: stdafx.h:415
Called to determine industry tile next animation frame.
option out of accepting cargo
uint Resolve(uint index, uint var, uint param, bool *avail) const override
Resolve (action2) variable for a given index.
static HouseID GetHouseType(TileIndex t)
Get the type of this house, which is an index into the house spec array.
Definition: town_map.h:61
Called for periodically starting or stopping the animation.
static IndustryID GetIndustryIndex(TileIndex t)
Get the industry ID of the given tile.
Definition: industry_map.h:65
Helper class to wrap some functionality/queries in.
void SetStringParameters(uint index) const override
Set the string parameters to write the right data for a STRINGn.
decides next animation frame
Availability of station in construction window.
bool IsInspectable(uint index) const override
Is the item with the given index inspectable?
Called to determine station tile next animation frame.
uint GetPSASize(uint index, uint32 grfid) const override
Allows to know the size of the persistent storage.
VehicleType type
Type of vehicle.
Definition: vehicle_type.h:54
bool IsInspectable(uint index) const override
Is the item with the given index inspectable?
Called to query the cargo acceptance of the industry tile.
bool IsInspectable(uint index) const override
Is the item with the given index inspectable?
Town data structure.
Definition: town.h:55
static Station * GetByTile(TileIndex tile)
Get the station belonging to a specific tile.
Resolver for industries.
Called to indicate how long the current animation frame should last.
cargo sub-type display
void SetStringParameters(uint index) const override
Set the string parameters to write the right data for a STRINGn.
ScopeResolver * GetScope(VarSpriteGroupScope scope=VSG_SCOPE_SELF, byte relative=0) override
Get a resolver for the scope.
Definition: newgrf_town.h:49
Resolver object for road types.
bool IsInspectable(uint index) const override
Is the item with the given index inspectable?
static bool IsValidID(size_t index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
Definition: pool_type.hpp:235
decides if default foundations need to be drawn
conditional protection
static Object * GetByTile(TileIndex tile)
Get the object associated with a tile.
Definition: object_cmd.cpp:52
ScopeResolver * GetScope(VarSpriteGroupScope scope=VSG_SCOPE_SELF, byte relative=0) override
Get a resolver for the scope.
static const StringID INVALID_STRING_ID
Constant representing an invalid string (16bit in case it is used in savegames)
Definition: strings_type.h:19
Called to determine text to display after cargo name.
A resolver object to be used with feature 0F spritegroups.
GRFFileProps grf_prop
Properties related the the grf file.
Definition: house.h:116
EngineID engine_type
The type of engine used for this vehicle.
Definition: vehicle_base.h:288
const struct GRFFile * grffile
grf file that introduced this entity
Station resolver.
Representation of the data from a NewGRF property.
Called for periodically starting or stopping the animation.
decides allowance of autosloping
Called to determine the colour of a town building.
Choose a sprite layout to draw, instead of the standard 0-7 range.
static const ObjectSpec * GetByTile(TileIndex tile)
Get the specification associated with a tile.
Called to determine more text in the industry window.
static Industry * GetByTile(TileIndex tile)
Get the industry of the given tile.
Definition: industry.h:115
Check slope of new station tiles.
Determine the next animation frame for a house.
uint32 GetGRFID(uint index) const override
Get the GRFID of the file that includes this item.
Called to determine if one can alter the ground below an object tile.
Called to determine how much cargo a town building produces.
const void * GetInstance(uint index) const override
Get the instance given an index.
Vehicle length, returns the amount of 1/8&#39;s the vehicle is shorter for trains and RVs...
decide whether the house can be built on a given tile
Called to decide how much cargo a town building can accept.
const int32 * GetPSAFirstPosition(uint index, uint32 grfid) const override
Gets the first position of the array containing the persistent storage.
Called to determine industry special effects.
Called when industry is built to set initial production level.
const void * GetSpec(uint index) const override
Get (NewGRF) specs given an index.
GRFFileProps grf_prop
properties related the the grf file
Container for all information for a given feature.
uint GetPSASize(uint index, uint32 grfid) const override
Allows to know the size of the persistent storage.
const void * GetInstance(uint index) const override
Get the instance given an index.
Called on production changes, so it can be adjusted.
Visual effects and wagon power (trains, road vehicles and ships)
Called for periodically starting or stopping the animation.
give a custom colour to newly build industries
decides slope suitability
void SetStringParameters(uint index) const override
Set the string parameters to write the right data for a STRINGn.
Resolve wagon overrides using TrainCache::cached_override.
Definition: newgrf_engine.h:54