Codechange: Use null pointer literal instead of the NULL macro
[openttd-github.git] / src / table / newgrf_debug_data.h
blob0b3c92499f2e7fc9eeb0a9b21d146c7c30681e84
1 /* $Id$ */
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 */
10 /** @file newgrf_debug_data.h Data 'tables' for NewGRF debugging. */
12 #include "../newgrf_house.h"
13 #include "../newgrf_engine.h"
15 /* Helper for filling property tables */
16 #define NIP(prop, base, variable, type, name) { name, (ptrdiff_t)cpp_offsetof(base, variable), cpp_sizeof(base, variable), prop, type }
17 #define NIP_END() { nullptr, 0, 0, 0, 0 }
19 /* Helper for filling callback tables */
20 #define NIC(cb_id, base, variable, bit) { #cb_id, (ptrdiff_t)cpp_offsetof(base, variable), cpp_sizeof(base, variable), bit, cb_id }
21 #define NIC_END() { nullptr, 0, 0, 0, 0 }
23 /* Helper for filling variable tables */
24 #define NIV(var, name) { name, var }
25 #define NIV_END() { nullptr, 0 }
28 /*** NewGRF Vehicles ***/
30 #define NICV(cb_id, bit) NIC(cb_id, Engine, info.callback_mask, bit)
31 static const NICallback _nic_vehicles[] = {
32 NICV(CBID_VEHICLE_VISUAL_EFFECT, CBM_VEHICLE_VISUAL_EFFECT),
33 NICV(CBID_VEHICLE_LENGTH, CBM_VEHICLE_LENGTH),
34 NICV(CBID_VEHICLE_LOAD_AMOUNT, CBM_VEHICLE_LOAD_AMOUNT),
35 NICV(CBID_VEHICLE_REFIT_CAPACITY, CBM_VEHICLE_REFIT_CAPACITY),
36 NICV(CBID_VEHICLE_ARTIC_ENGINE, CBM_VEHICLE_ARTIC_ENGINE),
37 NICV(CBID_VEHICLE_CARGO_SUFFIX, CBM_VEHICLE_CARGO_SUFFIX),
38 NICV(CBID_TRAIN_ALLOW_WAGON_ATTACH, CBM_NO_BIT),
39 NICV(CBID_VEHICLE_ADDITIONAL_TEXT, CBM_NO_BIT),
40 NICV(CBID_VEHICLE_COLOUR_MAPPING, CBM_VEHICLE_COLOUR_REMAP),
41 NICV(CBID_VEHICLE_START_STOP_CHECK, CBM_NO_BIT),
42 NICV(CBID_VEHICLE_32DAY_CALLBACK, CBM_NO_BIT),
43 NICV(CBID_VEHICLE_SOUND_EFFECT, CBM_VEHICLE_SOUND_EFFECT),
44 NICV(CBID_VEHICLE_AUTOREPLACE_SELECTION, CBM_NO_BIT),
45 NICV(CBID_VEHICLE_MODIFY_PROPERTY, CBM_NO_BIT),
46 NIC_END()
50 static const NIVariable _niv_vehicles[] = {
51 NIV(0x40, "position in consist and length"),
52 NIV(0x41, "position and length of chain of same vehicles"),
53 NIV(0x42, "transported cargo types"),
54 NIV(0x43, "player info"),
55 NIV(0x44, "aircraft info"),
56 NIV(0x45, "curvature info"),
57 NIV(0x46, "motion counter"),
58 NIV(0x47, "vehicle cargo info"),
59 NIV(0x48, "vehicle type info"),
60 NIV(0x49, "year of construction"),
61 NIV(0x4A, "current rail type info"),
62 NIV(0x4B, "long date of last service"),
63 NIV(0x4C, "current max speed"),
64 NIV(0x4D, "position in articulated vehicle"),
65 NIV(0x60, "count vehicle id occurrences"),
66 // 0x61 not useful, since it requires register 0x10F
67 NIV(0x62, "Curvature/position difference to other vehicle"),
68 NIV_END()
71 class NIHVehicle : public NIHelper {
72 bool IsInspectable(uint index) const override { return Vehicle::Get(index)->GetGRF() != nullptr; }
73 uint GetParent(uint index) const override { const Vehicle *first = Vehicle::Get(index)->First(); return GetInspectWindowNumber(GetGrfSpecFeature(first->type), first->index); }
74 const void *GetInstance(uint index)const override { return Vehicle::Get(index); }
75 const void *GetSpec(uint index) const override { return Vehicle::Get(index)->GetEngine(); }
76 void SetStringParameters(uint index) const override { this->SetSimpleStringParameters(STR_VEHICLE_NAME, index); }
77 uint32 GetGRFID(uint index) const override { return Vehicle::Get(index)->GetGRFID(); }
79 uint Resolve(uint index, uint var, uint param, bool *avail) const override
81 Vehicle *v = Vehicle::Get(index);
82 VehicleResolverObject ro(v->engine_type, v, VehicleResolverObject::WO_CACHED);
83 return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
87 static const NIFeature _nif_vehicle = {
88 nullptr,
89 _nic_vehicles,
90 _niv_vehicles,
91 new NIHVehicle(),
95 /*** NewGRF station (tiles) ***/
97 #define NICS(cb_id, bit) NIC(cb_id, StationSpec, callback_mask, bit)
98 static const NICallback _nic_stations[] = {
99 NICS(CBID_STATION_AVAILABILITY, CBM_STATION_AVAIL),
100 NICS(CBID_STATION_SPRITE_LAYOUT, CBM_STATION_SPRITE_LAYOUT),
101 NICS(CBID_STATION_TILE_LAYOUT, CBM_NO_BIT),
102 NICS(CBID_STATION_ANIM_START_STOP, CBM_NO_BIT),
103 NICS(CBID_STATION_ANIM_NEXT_FRAME, CBM_STATION_ANIMATION_NEXT_FRAME),
104 NICS(CBID_STATION_ANIMATION_SPEED, CBM_STATION_ANIMATION_SPEED),
105 NICS(CBID_STATION_LAND_SLOPE_CHECK, CBM_STATION_SLOPE_CHECK),
106 NIC_END()
109 static const NIVariable _niv_stations[] = {
110 NIV(0x40, "platform info and relative position"),
111 NIV(0x41, "platform info and relative position for individually built sections"),
112 NIV(0x42, "terrain and track type"),
113 NIV(0x43, "player info"),
114 NIV(0x44, "path signalling info"),
115 NIV(0x45, "rail continuation info"),
116 NIV(0x46, "platform info and relative position from middle"),
117 NIV(0x47, "platform info and relative position from middle for individually built sections"),
118 NIV(0x48, "bitmask of accepted cargoes"),
119 NIV(0x49, "platform info and relative position of same-direction section"),
120 NIV(0x4A, "current animation frame"),
121 NIV(0x60, "amount of cargo waiting"),
122 NIV(0x61, "time since last cargo pickup"),
123 NIV(0x62, "rating of cargo"),
124 NIV(0x63, "time spent on route"),
125 NIV(0x64, "information about last vehicle picking cargo up"),
126 NIV(0x65, "amount of cargo acceptance"),
127 NIV(0x66, "animation frame of nearby tile"),
128 NIV(0x67, "land info of nearby tiles"),
129 NIV(0x68, "station info of nearby tiles"),
130 NIV(0x69, "information about cargo accepted in the past"),
131 NIV_END()
134 class NIHStation : public NIHelper {
135 bool IsInspectable(uint index) const override { return GetStationSpec(index) != nullptr; }
136 uint GetParent(uint index) const override { return GetInspectWindowNumber(GSF_FAKE_TOWNS, Station::GetByTile(index)->town->index); }
137 const void *GetInstance(uint index)const override { return nullptr; }
138 const void *GetSpec(uint index) const override { return GetStationSpec(index); }
139 void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_STATION_NAME, GetStationIndex(index), index); }
140 uint32 GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? GetStationSpec(index)->grf_prop.grffile->grfid : 0; }
142 uint Resolve(uint index, uint var, uint param, bool *avail) const override
144 StationResolverObject ro(GetStationSpec(index), Station::GetByTile(index), index);
145 return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
149 static const NIFeature _nif_station = {
150 nullptr,
151 _nic_stations,
152 _niv_stations,
153 new NIHStation(),
157 /*** NewGRF house tiles ***/
159 #define NICH(cb_id, bit) NIC(cb_id, HouseSpec, callback_mask, bit)
160 static const NICallback _nic_house[] = {
161 NICH(CBID_HOUSE_ALLOW_CONSTRUCTION, CBM_HOUSE_ALLOW_CONSTRUCTION),
162 NICH(CBID_HOUSE_ANIMATION_NEXT_FRAME, CBM_HOUSE_ANIMATION_NEXT_FRAME),
163 NICH(CBID_HOUSE_ANIMATION_START_STOP, CBM_HOUSE_ANIMATION_START_STOP),
164 NICH(CBID_HOUSE_CONSTRUCTION_STATE_CHANGE, CBM_HOUSE_CONSTRUCTION_STATE_CHANGE),
165 NICH(CBID_HOUSE_COLOUR, CBM_HOUSE_COLOUR),
166 NICH(CBID_HOUSE_CARGO_ACCEPTANCE, CBM_HOUSE_CARGO_ACCEPTANCE),
167 NICH(CBID_HOUSE_ANIMATION_SPEED, CBM_HOUSE_ANIMATION_SPEED),
168 NICH(CBID_HOUSE_DESTRUCTION, CBM_HOUSE_DESTRUCTION),
169 NICH(CBID_HOUSE_ACCEPT_CARGO, CBM_HOUSE_ACCEPT_CARGO),
170 NICH(CBID_HOUSE_PRODUCE_CARGO, CBM_HOUSE_PRODUCE_CARGO),
171 NICH(CBID_HOUSE_DENY_DESTRUCTION, CBM_HOUSE_DENY_DESTRUCTION),
172 NICH(CBID_HOUSE_WATCHED_CARGO_ACCEPTED, CBM_NO_BIT),
173 NICH(CBID_HOUSE_CUSTOM_NAME, CBM_NO_BIT),
174 NICH(CBID_HOUSE_DRAW_FOUNDATIONS, CBM_HOUSE_DRAW_FOUNDATIONS),
175 NICH(CBID_HOUSE_AUTOSLOPE, CBM_HOUSE_AUTOSLOPE),
176 NIC_END()
179 static const NIVariable _niv_house[] = {
180 NIV(0x40, "construction state of tile and pseudo-random value"),
181 NIV(0x41, "age of building in years"),
182 NIV(0x42, "town zone"),
183 NIV(0x43, "terrain type"),
184 NIV(0x44, "building counts"),
185 NIV(0x45, "town expansion bits"),
186 NIV(0x46, "current animation frame"),
187 NIV(0x47, "xy coordinate of the building"),
188 NIV(0x60, "other building counts (old house type)"),
189 NIV(0x61, "other building counts (new house type)"),
190 NIV(0x62, "land info of nearby tiles"),
191 NIV(0x63, "current animation frame of nearby house tile"),
192 NIV(0x64, "cargo acceptance history of nearby stations"),
193 NIV(0x65, "distance of nearest house matching a given criterion"),
194 NIV(0x66, "class and ID of nearby house tile"),
195 NIV(0x67, "GRFID of nearby house tile"),
196 NIV_END()
199 class NIHHouse : public NIHelper {
200 bool IsInspectable(uint index) const override { return HouseSpec::Get(GetHouseType(index))->grf_prop.grffile != nullptr; }
201 uint GetParent(uint index) const override { return GetInspectWindowNumber(GSF_FAKE_TOWNS, GetTownIndex(index)); }
202 const void *GetInstance(uint index)const override { return nullptr; }
203 const void *GetSpec(uint index) const override { return HouseSpec::Get(GetHouseType(index)); }
204 void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_TOWN_NAME, GetTownIndex(index), index); }
205 uint32 GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? HouseSpec::Get(GetHouseType(index))->grf_prop.grffile->grfid : 0; }
207 uint Resolve(uint index, uint var, uint param, bool *avail) const override
209 HouseResolverObject ro(GetHouseType(index), index, Town::GetByTile(index));
210 return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
214 static const NIFeature _nif_house = {
215 nullptr,
216 _nic_house,
217 _niv_house,
218 new NIHHouse(),
222 /*** NewGRF industry tiles ***/
224 #define NICIT(cb_id, bit) NIC(cb_id, IndustryTileSpec, callback_mask, bit)
225 static const NICallback _nic_industrytiles[] = {
226 NICIT(CBID_INDTILE_ANIM_START_STOP, CBM_NO_BIT),
227 NICIT(CBID_INDTILE_ANIM_NEXT_FRAME, CBM_INDT_ANIM_NEXT_FRAME),
228 NICIT(CBID_INDTILE_ANIMATION_SPEED, CBM_INDT_ANIM_SPEED),
229 NICIT(CBID_INDTILE_CARGO_ACCEPTANCE, CBM_INDT_CARGO_ACCEPTANCE),
230 NICIT(CBID_INDTILE_ACCEPT_CARGO, CBM_INDT_ACCEPT_CARGO),
231 NICIT(CBID_INDTILE_SHAPE_CHECK, CBM_INDT_SHAPE_CHECK),
232 NICIT(CBID_INDTILE_DRAW_FOUNDATIONS, CBM_INDT_DRAW_FOUNDATIONS),
233 NICIT(CBID_INDTILE_AUTOSLOPE, CBM_INDT_AUTOSLOPE),
234 NIC_END()
237 static const NIVariable _niv_industrytiles[] = {
238 NIV(0x40, "construction state of tile"),
239 NIV(0x41, "ground type"),
240 NIV(0x42, "current town zone in nearest town"),
241 NIV(0x43, "relative position"),
242 NIV(0x44, "animation frame"),
243 NIV(0x60, "land info of nearby tiles"),
244 NIV(0x61, "animation stage of nearby tiles"),
245 NIV(0x62, "get industry or airport tile ID at offset"),
246 NIV_END()
249 class NIHIndustryTile : public NIHelper {
250 bool IsInspectable(uint index) const override { return GetIndustryTileSpec(GetIndustryGfx(index))->grf_prop.grffile != nullptr; }
251 uint GetParent(uint index) const override { return GetInspectWindowNumber(GSF_INDUSTRIES, GetIndustryIndex(index)); }
252 const void *GetInstance(uint index)const override { return nullptr; }
253 const void *GetSpec(uint index) const override { return GetIndustryTileSpec(GetIndustryGfx(index)); }
254 void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_INDUSTRY_NAME, GetIndustryIndex(index), index); }
255 uint32 GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? GetIndustryTileSpec(GetIndustryGfx(index))->grf_prop.grffile->grfid : 0; }
257 uint Resolve(uint index, uint var, uint param, bool *avail) const override
259 IndustryTileResolverObject ro(GetIndustryGfx(index), index, Industry::GetByTile(index));
260 return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
264 static const NIFeature _nif_industrytile = {
265 nullptr,
266 _nic_industrytiles,
267 _niv_industrytiles,
268 new NIHIndustryTile(),
272 /*** NewGRF industries ***/
274 static const NIProperty _nip_industries[] = {
275 NIP(0x25, Industry, produced_cargo[ 0], NIT_CARGO, "produced cargo 0"),
276 NIP(0x25, Industry, produced_cargo[ 1], NIT_CARGO, "produced cargo 1"),
277 NIP(0x25, Industry, produced_cargo[ 2], NIT_CARGO, "produced cargo 2"),
278 NIP(0x25, Industry, produced_cargo[ 3], NIT_CARGO, "produced cargo 3"),
279 NIP(0x25, Industry, produced_cargo[ 4], NIT_CARGO, "produced cargo 4"),
280 NIP(0x25, Industry, produced_cargo[ 5], NIT_CARGO, "produced cargo 5"),
281 NIP(0x25, Industry, produced_cargo[ 6], NIT_CARGO, "produced cargo 6"),
282 NIP(0x25, Industry, produced_cargo[ 7], NIT_CARGO, "produced cargo 7"),
283 NIP(0x25, Industry, produced_cargo[ 8], NIT_CARGO, "produced cargo 8"),
284 NIP(0x25, Industry, produced_cargo[ 9], NIT_CARGO, "produced cargo 9"),
285 NIP(0x25, Industry, produced_cargo[10], NIT_CARGO, "produced cargo 10"),
286 NIP(0x25, Industry, produced_cargo[11], NIT_CARGO, "produced cargo 11"),
287 NIP(0x25, Industry, produced_cargo[12], NIT_CARGO, "produced cargo 12"),
288 NIP(0x25, Industry, produced_cargo[13], NIT_CARGO, "produced cargo 13"),
289 NIP(0x25, Industry, produced_cargo[14], NIT_CARGO, "produced cargo 14"),
290 NIP(0x25, Industry, produced_cargo[15], NIT_CARGO, "produced cargo 15"),
291 NIP(0x26, Industry, accepts_cargo[ 0], NIT_CARGO, "accepted cargo 0"),
292 NIP(0x26, Industry, accepts_cargo[ 1], NIT_CARGO, "accepted cargo 1"),
293 NIP(0x26, Industry, accepts_cargo[ 2], NIT_CARGO, "accepted cargo 2"),
294 NIP(0x26, Industry, accepts_cargo[ 3], NIT_CARGO, "accepted cargo 3"),
295 NIP(0x26, Industry, accepts_cargo[ 4], NIT_CARGO, "accepted cargo 4"),
296 NIP(0x26, Industry, accepts_cargo[ 5], NIT_CARGO, "accepted cargo 5"),
297 NIP(0x26, Industry, accepts_cargo[ 6], NIT_CARGO, "accepted cargo 6"),
298 NIP(0x26, Industry, accepts_cargo[ 7], NIT_CARGO, "accepted cargo 7"),
299 NIP(0x26, Industry, accepts_cargo[ 8], NIT_CARGO, "accepted cargo 8"),
300 NIP(0x26, Industry, accepts_cargo[ 9], NIT_CARGO, "accepted cargo 9"),
301 NIP(0x26, Industry, accepts_cargo[10], NIT_CARGO, "accepted cargo 10"),
302 NIP(0x26, Industry, accepts_cargo[11], NIT_CARGO, "accepted cargo 11"),
303 NIP(0x26, Industry, accepts_cargo[12], NIT_CARGO, "accepted cargo 12"),
304 NIP(0x26, Industry, accepts_cargo[13], NIT_CARGO, "accepted cargo 13"),
305 NIP(0x26, Industry, accepts_cargo[14], NIT_CARGO, "accepted cargo 14"),
306 NIP(0x26, Industry, accepts_cargo[15], NIT_CARGO, "accepted cargo 15"),
307 NIP_END()
310 #define NICI(cb_id, bit) NIC(cb_id, IndustrySpec, callback_mask, bit)
311 static const NICallback _nic_industries[] = {
312 NICI(CBID_INDUSTRY_PROBABILITY, CBM_IND_PROBABILITY),
313 NICI(CBID_INDUSTRY_LOCATION, CBM_IND_LOCATION),
314 NICI(CBID_INDUSTRY_PRODUCTION_CHANGE, CBM_IND_PRODUCTION_CHANGE),
315 NICI(CBID_INDUSTRY_MONTHLYPROD_CHANGE, CBM_IND_MONTHLYPROD_CHANGE),
316 NICI(CBID_INDUSTRY_CARGO_SUFFIX, CBM_IND_CARGO_SUFFIX),
317 NICI(CBID_INDUSTRY_FUND_MORE_TEXT, CBM_IND_FUND_MORE_TEXT),
318 NICI(CBID_INDUSTRY_WINDOW_MORE_TEXT, CBM_IND_WINDOW_MORE_TEXT),
319 NICI(CBID_INDUSTRY_SPECIAL_EFFECT, CBM_IND_SPECIAL_EFFECT),
320 NICI(CBID_INDUSTRY_REFUSE_CARGO, CBM_IND_REFUSE_CARGO),
321 NICI(CBID_INDUSTRY_DECIDE_COLOUR, CBM_IND_DECIDE_COLOUR),
322 NICI(CBID_INDUSTRY_INPUT_CARGO_TYPES, CBM_IND_INPUT_CARGO_TYPES),
323 NICI(CBID_INDUSTRY_OUTPUT_CARGO_TYPES, CBM_IND_OUTPUT_CARGO_TYPES),
324 NICI(CBID_INDUSTRY_PROD_CHANGE_BUILD, CBM_IND_PROD_CHANGE_BUILD),
325 NIC_END()
328 static const NIVariable _niv_industries[] = {
329 NIV(0x40, "waiting cargo 0"),
330 NIV(0x41, "waiting cargo 1"),
331 NIV(0x42, "waiting cargo 2"),
332 NIV(0x43, "distance to closest dry/land tile"),
333 NIV(0x44, "layout number"),
334 NIV(0x45, "player info"),
335 NIV(0x46, "industry construction date"),
336 NIV(0x60, "get industry tile ID at offset"),
337 NIV(0x61, "get random tile bits at offset"),
338 NIV(0x62, "land info of nearby tiles"),
339 NIV(0x63, "animation stage of nearby tiles"),
340 NIV(0x64, "distance on nearest industry with given type"),
341 NIV(0x65, "get town zone and Manhattan distance of closest town"),
342 NIV(0x66, "get square of Euclidean distance of closes town"),
343 NIV(0x67, "count of industry and distance of closest instance"),
344 NIV(0x68, "count of industry and distance of closest instance with layout filter"),
345 NIV_END()
348 class NIHIndustry : public NIHelper {
349 bool IsInspectable(uint index) const override { return GetIndustrySpec(Industry::Get(index)->type)->grf_prop.grffile != nullptr; }
350 uint GetParent(uint index) const override { return GetInspectWindowNumber(GSF_FAKE_TOWNS, Industry::Get(index)->town->index); }
351 const void *GetInstance(uint index)const override { return Industry::Get(index); }
352 const void *GetSpec(uint index) const override { return GetIndustrySpec(Industry::Get(index)->type); }
353 void SetStringParameters(uint index) const override { this->SetSimpleStringParameters(STR_INDUSTRY_NAME, index); }
354 uint32 GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? GetIndustrySpec(Industry::Get(index)->type)->grf_prop.grffile->grfid : 0; }
356 uint Resolve(uint index, uint var, uint param, bool *avail) const override
358 Industry *i = Industry::Get(index);
359 IndustriesResolverObject ro(i->location.tile, i, i->type);
360 return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
363 uint GetPSASize(uint index, uint32 grfid) const override { return cpp_lengthof(PersistentStorage, storage); }
365 const int32 *GetPSAFirstPosition(uint index, uint32 grfid) const override
367 const Industry *i = (const Industry *)this->GetInstance(index);
368 if (i->psa == nullptr) return nullptr;
369 return (int32 *)(&i->psa->storage);
373 static const NIFeature _nif_industry = {
374 _nip_industries,
375 _nic_industries,
376 _niv_industries,
377 new NIHIndustry(),
381 /*** NewGRF objects ***/
383 #define NICO(cb_id, bit) NIC(cb_id, ObjectSpec, callback_mask, bit)
384 static const NICallback _nic_objects[] = {
385 NICO(CBID_OBJECT_LAND_SLOPE_CHECK, CBM_OBJ_SLOPE_CHECK),
386 NICO(CBID_OBJECT_ANIMATION_NEXT_FRAME, CBM_OBJ_ANIMATION_NEXT_FRAME),
387 NICO(CBID_OBJECT_ANIMATION_START_STOP, CBM_NO_BIT),
388 NICO(CBID_OBJECT_ANIMATION_SPEED, CBM_OBJ_ANIMATION_SPEED),
389 NICO(CBID_OBJECT_COLOUR, CBM_OBJ_COLOUR),
390 NICO(CBID_OBJECT_FUND_MORE_TEXT, CBM_OBJ_FUND_MORE_TEXT),
391 NICO(CBID_OBJECT_AUTOSLOPE, CBM_OBJ_AUTOSLOPE),
392 NIC_END()
395 static const NIVariable _niv_objects[] = {
396 NIV(0x40, "relative position"),
397 NIV(0x41, "tile information"),
398 NIV(0x42, "construction date"),
399 NIV(0x43, "animation counter"),
400 NIV(0x44, "object founder"),
401 NIV(0x45, "get town zone and Manhattan distance of closest town"),
402 NIV(0x46, "get square of Euclidean distance of closes town"),
403 NIV(0x47, "colour"),
404 NIV(0x48, "view"),
405 NIV(0x60, "get object ID at offset"),
406 NIV(0x61, "get random tile bits at offset"),
407 NIV(0x62, "land info of nearby tiles"),
408 NIV(0x63, "animation stage of nearby tiles"),
409 NIV(0x64, "distance on nearest object with given type"),
410 NIV_END()
413 class NIHObject : public NIHelper {
414 bool IsInspectable(uint index) const override { return ObjectSpec::GetByTile(index)->grf_prop.grffile != nullptr; }
415 uint GetParent(uint index) const override { return GetInspectWindowNumber(GSF_FAKE_TOWNS, Object::GetByTile(index)->town->index); }
416 const void *GetInstance(uint index)const override { return Object::GetByTile(index); }
417 const void *GetSpec(uint index) const override { return ObjectSpec::GetByTile(index); }
418 void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_OBJECT, INVALID_STRING_ID, index); }
419 uint32 GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? ObjectSpec::GetByTile(index)->grf_prop.grffile->grfid : 0; }
421 uint Resolve(uint index, uint var, uint param, bool *avail) const override
423 ObjectResolverObject ro(ObjectSpec::GetByTile(index), Object::GetByTile(index), index);
424 return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
428 static const NIFeature _nif_object = {
429 nullptr,
430 _nic_objects,
431 _niv_objects,
432 new NIHObject(),
436 /*** NewGRF rail types ***/
438 static const NIVariable _niv_railtypes[] = {
439 NIV(0x40, "terrain type"),
440 NIV(0x41, "enhanced tunnels"),
441 NIV(0x42, "level crossing status"),
442 NIV(0x43, "construction date"),
443 NIV(0x44, "town zone"),
444 NIV_END()
447 class NIHRailType : public NIHelper {
448 bool IsInspectable(uint index) const override { return true; }
449 uint GetParent(uint index) const override { return UINT32_MAX; }
450 const void *GetInstance(uint index)const override { return nullptr; }
451 const void *GetSpec(uint index) const override { return nullptr; }
452 void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_RAIL_TYPE, INVALID_STRING_ID, index); }
453 uint32 GetGRFID(uint index) const override { return 0; }
455 uint Resolve(uint index, uint var, uint param, bool *avail) const override
457 /* There is no unique GRFFile for the tile. Multiple GRFs can define different parts of the railtype.
458 * However, currently the NewGRF Debug GUI does not display variables depending on the GRF (like 0x7F) anyway. */
459 RailTypeResolverObject ro(nullptr, index, TCX_NORMAL, RTSG_END);
460 return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
464 static const NIFeature _nif_railtype = {
465 nullptr,
466 nullptr,
467 _niv_railtypes,
468 new NIHRailType(),
472 /*** NewGRF airport tiles ***/
474 #define NICAT(cb_id, bit) NIC(cb_id, AirportTileSpec, callback_mask, bit)
475 static const NICallback _nic_airporttiles[] = {
476 NICAT(CBID_AIRPTILE_DRAW_FOUNDATIONS, CBM_AIRT_DRAW_FOUNDATIONS),
477 NICAT(CBID_AIRPTILE_ANIM_START_STOP, CBM_NO_BIT),
478 NICAT(CBID_AIRPTILE_ANIM_NEXT_FRAME, CBM_AIRT_ANIM_NEXT_FRAME),
479 NICAT(CBID_AIRPTILE_ANIMATION_SPEED, CBM_AIRT_ANIM_SPEED),
480 NIC_END()
483 class NIHAirportTile : public NIHelper {
484 bool IsInspectable(uint index) const override { return AirportTileSpec::Get(GetAirportGfx(index))->grf_prop.grffile != nullptr; }
485 uint GetParent(uint index) const override { return GetInspectWindowNumber(GSF_FAKE_TOWNS, Station::GetByTile(index)->town->index); }
486 const void *GetInstance(uint index)const override { return nullptr; }
487 const void *GetSpec(uint index) const override { return AirportTileSpec::Get(GetAirportGfx(index)); }
488 void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_STATION_NAME, GetStationIndex(index), index); }
489 uint32 GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? AirportTileSpec::Get(GetAirportGfx(index))->grf_prop.grffile->grfid : 0; }
491 uint Resolve(uint index, uint var, uint param, bool *avail) const override
493 AirportTileResolverObject ro(AirportTileSpec::GetByTile(index), index, Station::GetByTile(index));
494 return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
498 static const NIFeature _nif_airporttile = {
499 nullptr,
500 _nic_airporttiles,
501 _niv_industrytiles, // Yes, they share this (at least now)
502 new NIHAirportTile(),
506 /*** NewGRF towns ***/
508 static const NIVariable _niv_towns[] = {
509 NIV(0x40, "larger town effect on this town"),
510 NIV(0x41, "town index"),
511 NIV(0x82, "population"),
512 NIV(0x94, "zone radius 0"),
513 NIV(0x96, "zone radius 1"),
514 NIV(0x98, "zone radius 2"),
515 NIV(0x9A, "zone radius 3"),
516 NIV(0x9C, "zone radius 4"),
517 NIV(0xB6, "number of buildings"),
518 NIV_END()
521 class NIHTown : public NIHelper {
522 bool IsInspectable(uint index) const override { return Town::IsValidID(index); }
523 uint GetParent(uint index) const override { return UINT32_MAX; }
524 const void *GetInstance(uint index)const override { return Town::Get(index); }
525 const void *GetSpec(uint index) const override { return nullptr; }
526 void SetStringParameters(uint index) const override { this->SetSimpleStringParameters(STR_TOWN_NAME, index); }
527 uint32 GetGRFID(uint index) const override { return 0; }
528 bool PSAWithParameter() const override { return true; }
529 uint GetPSASize(uint index, uint32 grfid) const override { return cpp_lengthof(PersistentStorage, storage); }
531 uint Resolve(uint index, uint var, uint param, bool *avail) const override
533 TownResolverObject ro(nullptr, Town::Get(index), true);
534 return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail);
537 const int32 *GetPSAFirstPosition(uint index, uint32 grfid) const override
539 Town *t = Town::Get(index);
541 std::list<PersistentStorage *>::iterator iter;
542 for (iter = t->psa_list.begin(); iter != t->psa_list.end(); iter++) {
543 if ((*iter)->grfid == grfid) return (int32 *)(&(*iter)->storage[0]);
546 return nullptr;
550 static const NIFeature _nif_town = {
551 nullptr,
552 nullptr,
553 _niv_towns,
554 new NIHTown(),
557 /** Table with all NIFeatures. */
558 static const NIFeature * const _nifeatures[] = {
559 &_nif_vehicle, // GSF_TRAINS
560 &_nif_vehicle, // GSF_ROADVEHICLES
561 &_nif_vehicle, // GSF_SHIPS
562 &_nif_vehicle, // GSF_AIRCRAFT
563 &_nif_station, // GSF_STATIONS
564 nullptr, // GSF_CANALS (no callbacks/action2 implemented)
565 nullptr, // GSF_BRIDGES (no callbacks/action2)
566 &_nif_house, // GSF_HOUSES
567 nullptr, // GSF_GLOBALVAR (has no "physical" objects)
568 &_nif_industrytile, // GSF_INDUSTRYTILES
569 &_nif_industry, // GSF_INDUSTRIES
570 nullptr, // GSF_CARGOES (has no "physical" objects)
571 nullptr, // GSF_SOUNDFX (has no "physical" objects)
572 nullptr, // GSF_AIRPORTS (feature not implemented)
573 nullptr, // GSF_SIGNALS (feature not implemented)
574 &_nif_object, // GSF_OBJECTS
575 &_nif_railtype, // GSF_RAILTYPES
576 &_nif_airporttile, // GSF_AIRPORTTILES
577 &_nif_town, // GSF_FAKE_TOWNS
579 assert_compile(lengthof(_nifeatures) == GSF_FAKE_END);