OpenTTD Source 20260206-master-g4d4e37dbf1
newgrf_object.cpp
Go to the documentation of this file.
1/*
2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
6 */
7
9
10#include "stdafx.h"
11#include "company_base.h"
12#include "company_func.h"
13#include "debug.h"
14#include "genworld.h"
15#include "newgrf_badge.h"
16#include "newgrf_object.h"
17#include "newgrf_sound.h"
18#include "object_base.h"
19#include "object_map.h"
21#include "tile_cmd.h"
22#include "town.h"
23#include "water.h"
25
26#include "table/strings.h"
27
28#include "newgrf_class_func.h"
29
30#include "safeguards.h"
31
34
35extern const ObjectSpec _original_objects[NEW_OBJECT_OFFSET];
37std::vector<ObjectSpec> _object_specs;
38
39const std::vector<ObjectSpec> &ObjectSpec::Specs()
40{
41 return _object_specs;
42}
43
44size_t ObjectSpec::Count()
45{
46 return _object_specs.size();
47}
48
55{
56 /* Empty object if index is out of range -- this might happen if NewGRFs are changed. */
57 static ObjectSpec empty = {};
58
59 assert(index < NUM_OBJECTS);
60 if (index >= _object_specs.size()) return &empty;
61 return &_object_specs[index];
62}
63
70{
71 return ObjectSpec::Get(GetObjectType(tile));
72}
73
79{
80 return this->IsEnabled() && this->climate.Test(_settings_game.game_creation.landscape) &&
81 !this->flags.Test((_game_mode != GM_EDITOR && !_generating_world) ? ObjectFlag::OnlyInScenedit : ObjectFlag::OnlyInGame);
82}
83
92
98{
99 return this->WasEverAvailable() &&
101}
102
108{
109 return this - _object_specs.data();
110}
111
115/* static */ void ObjectSpec::BindToClasses()
116{
117 for (auto &spec : _object_specs) {
118 if (spec.IsEnabled() && spec.class_index != INVALID_OBJECT_CLASS) {
119 ObjectClass::Assign(&spec);
120 }
121 }
122}
123
126{
127 /* Clean the pool. */
128 _object_specs.clear();
129
130 /* And add our originals. */
131 _object_specs.reserve(lengthof(_original_objects));
132
133 for (uint16_t i = 0; i < lengthof(_original_objects); i++) {
134 ObjectSpec &spec = _object_specs.emplace_back(_original_objects[i]);
135 spec.grf_prop.local_id = i;
136 }
137
138 /* Set class for originals. */
141}
142
143template <>
145{
146 ObjectClass::Get(ObjectClass::Allocate('LTHS'))->name = STR_OBJECT_CLASS_LTHS;
147 ObjectClass::Get(ObjectClass::Allocate('TRNS'))->name = STR_OBJECT_CLASS_TRNS;
148}
149
150template <>
152{
153 return this->GetSpec(index)->IsEverAvailable();
154}
155
156/* Instantiate ObjectClass. */
158
159/* virtual */ uint32_t ObjectScopeResolver::GetRandomBits() const
160{
161 return IsValidTile(this->tile) && IsTileType(this->tile, TileType::Object) ? GetObjectRandomBits(this->tile) : 0;
162}
163
170static uint32_t GetObjectIDAtOffset(TileIndex tile, uint32_t cur_grfid)
171{
172 if (!IsTileType(tile, TileType::Object)) {
173 return 0xFFFF;
174 }
175
176 const Object *o = Object::GetByTile(tile);
177 const ObjectSpec *spec = ObjectSpec::Get(o->type);
178
179 /* Default objects have no associated NewGRF file */
180 if (!spec->grf_prop.HasGrfFile()) {
181 return 0xFFFE; // Defined in another grf file
182 }
183
184 if (spec->grf_prop.grfid == cur_grfid) { // same object, same grf ?
185 return spec->grf_prop.local_id | o->view << 16;
186 }
187
188 return 0xFFFE; // Defined in another grf file
189}
190
199static uint32_t GetNearbyObjectTileInformation(uint8_t parameter, TileIndex tile, ObjectID index, bool grf_version8)
200{
201 if (parameter != 0) tile = GetNearbyTile(parameter, tile); // only perform if it is required
202 bool is_same_object = (IsTileType(tile, TileType::Object) && GetObjectIndex(tile) == index);
203
204 return GetNearbyTileInformation(tile, grf_version8) | (is_same_object ? 1 : 0) << 8;
205}
206
214static uint32_t GetClosestObject(TileIndex tile, ObjectType type, const Object *current)
215{
216 uint32_t best_dist = UINT32_MAX;
217 for (const Object *o : Object::Iterate()) {
218 if (o->type != type || o == current) continue;
219
220 best_dist = std::min(best_dist, DistanceManhattan(tile, o->location.tile));
221 }
222
223 return best_dist;
224}
225
235static uint32_t GetCountAndDistanceOfClosestInstance(const ResolverObject &object, uint8_t local_id, uint32_t grfid, TileIndex tile, const Object *current)
236{
237 uint32_t grf_id = static_cast<uint32_t>(object.GetRegister(0x100)); // Get the GRFID of the definition to look for in register 100h
238 uint32_t idx;
239
240 /* Determine what will be the object type to look for */
241 switch (grf_id) {
242 case 0: // this is a default object type
243 idx = local_id;
244 break;
245
246 case 0xFFFFFFFF: // current grf
247 grf_id = grfid;
248 [[fallthrough]];
249
250 default: // use the grfid specified in register 100h
251 idx = _object_mngr.GetID(local_id, grf_id);
252 break;
253 }
254
255 /* If the object type is invalid, there is none and the closest is far away. */
256 if (idx >= NUM_OBJECTS) return 0 | 0xFFFF;
257
258 return Object::GetTypeCount(idx) << 16 | ClampTo<uint16_t>(GetClosestObject(tile, idx, current));
259}
260
262/* virtual */ uint32_t ObjectScopeResolver::GetVariable(uint8_t variable, [[maybe_unused]] uint32_t parameter, bool &available) const
263{
264 /* We get the town from the object, or we calculate the closest
265 * town if we need to when there's no object. */
266 const Town *t = nullptr;
267
268 if (this->obj == nullptr) {
269 switch (variable) {
270 /* Allow these when there's no object. */
271 case 0x41:
272 case 0x60:
273 case 0x61:
274 case 0x62:
275 case 0x64:
276 break;
277
278 /* Allow these, but find the closest town. */
279 case 0x45:
280 case 0x46:
281 if (!IsValidTile(this->tile)) goto unhandled;
282 t = ClosestTownFromTile(this->tile, UINT_MAX);
283 break;
284
285 /* Construction date */
286 case 0x42: return TimerGameCalendar::date.base();
287
288 /* Object founder information */
289 case 0x44: return _current_company.base();
290
291 /* Object view */
292 case 0x48: return this->view;
293
294 case 0x7A: return GetBadgeVariableResult(*this->ro.grffile, this->spec->badges, parameter);
295
296 /*
297 * Disallow the rest:
298 * 0x40: Relative position is passed as parameter during construction.
299 * 0x43: Animation counter is only for actual tiles.
300 * 0x47: Object colour is only valid when its built.
301 * 0x63: Animation counter of nearby tile, see above.
302 */
303 default:
304 goto unhandled;
305 }
306
307 /* If there's an invalid tile, then we don't have enough information at all. */
308 if (!IsValidTile(this->tile)) goto unhandled;
309 } else {
310 t = this->obj->town;
311 }
312
313 switch (variable) {
314 /* Relative position. */
315 case 0x40: {
316 TileIndex offset = this->tile - this->obj->location.tile;
317 uint offset_x = TileX(offset);
318 uint offset_y = TileY(offset);
319 return offset_y << 20 | offset_x << 16 | offset_y << 8 | offset_x;
320 }
321
322 /* Tile information. */
323 case 0x41: return GetTileSlope(this->tile) << 8 | GetTerrainType(this->tile);
324
325 /* Construction date */
326 case 0x42: return this->obj->build_date.base();
327
328 /* Animation counter */
329 case 0x43: return GetAnimationFrame(this->tile);
330
331 /* Object founder information */
332 case 0x44: return GetTileOwner(this->tile).base();
333
334 /* Get town zone and Manhattan distance of closest town */
335 case 0x45: return to_underlying(GetTownRadiusGroup(t, this->tile)) << 16 | ClampTo<uint16_t>(DistanceManhattan(this->tile, t->xy));
336
337 /* Get square of Euclidean distance of closest town */
338 case 0x46: return DistanceSquare(this->tile, t->xy);
339
340 /* Object colour */
341 case 0x47: return this->obj->colour;
342
343 /* Object view */
344 case 0x48: return this->obj->view;
345
346 /* Get object ID at offset param */
347 case 0x60: return GetObjectIDAtOffset(GetNearbyTile(parameter, this->tile), this->ro.grffile->grfid);
348
349 /* Get random tile bits at offset param */
350 case 0x61: {
351 TileIndex tile = GetNearbyTile(parameter, this->tile);
353 }
354
355 /* Land info of nearby tiles */
356 case 0x62: return GetNearbyObjectTileInformation(parameter, this->tile, this->obj == nullptr ? ObjectID::Invalid() : this->obj->index, this->ro.grffile->grf_version >= 8);
357
358 /* Animation counter of nearby tile */
359 case 0x63: {
360 TileIndex tile = GetNearbyTile(parameter, this->tile);
362 }
363
364 /* Count of object, distance of closest instance */
365 case 0x64: return GetCountAndDistanceOfClosestInstance(this->ro, parameter, this->ro.grffile->grfid, this->tile, this->obj);
366
367 case 0x7A: return GetBadgeVariableResult(*this->ro.grffile, this->spec->badges, parameter);
368 }
369
370unhandled:
371 Debug(grf, 1, "Unhandled object variable 0x{:X}", variable);
372
373 available = false;
374 return UINT_MAX;
375}
376
388 CallbackID callback, uint32_t param1, uint32_t param2)
389 : ResolverObject(spec->grf_prop.grffile, callback, param1, param2), object_scope(*this, obj, spec, tile, view)
390{
391 this->root_spritegroup = spec->grf_prop.GetSpriteGroup(obj != nullptr);
392}
393
400{
401 if (!this->town_scope.has_value()) {
402 Town *t;
403 if (this->object_scope.obj != nullptr) {
404 t = this->object_scope.obj->town;
405 } else {
406 t = ClosestTownFromTile(this->object_scope.tile, UINT_MAX);
407 }
408 if (t == nullptr) return nullptr;
409 this->town_scope.emplace(*this, t, this->object_scope.obj == nullptr);
410 }
411 return &*this->town_scope;
412}
413
415{
416 return GSF_OBJECTS;
417}
418
420{
421 return this->object_scope.spec->grf_prop.local_id;
422}
423
436uint16_t GetObjectCallback(CallbackID callback, uint32_t param1, uint32_t param2, const ObjectSpec *spec, Object *o, TileIndex tile, std::span<int32_t> regs100, uint8_t view)
437{
438 ObjectResolverObject object(spec, o, tile, view, callback, param1, param2);
439 return object.ResolveCallback(regs100);
440}
441
448static void DrawTileLayout(const TileInfo *ti, const DrawTileSpriteSpan &dts, const ObjectSpec *spec)
449{
450 PaletteID palette = (spec->flags.Test(ObjectFlag::Uses2CC) ? SPR_2CCMAP_BASE : PALETTE_RECOLOUR_START) + Object::GetByTile(ti->tile)->colour;
451
452 SpriteID image = dts.ground.sprite;
453 PaletteID pal = dts.ground.pal;
454
455 if (GB(image, 0, SPRITE_WIDTH) != 0) {
456 /* If the ground sprite is the default flat water sprite, draw also canal/river borders
457 * Do not do this if the tile's WaterClass is 'land'. */
458 if ((image == SPR_FLAT_WATER_TILE || spec->flags.Test(ObjectFlag::DrawWater)) && IsTileOnWater(ti->tile)) {
459 DrawWaterClassGround(ti);
460 } else {
461 DrawGroundSprite(image, GroundSpritePaletteTransform(image, pal, palette));
462 }
463 }
464
465 DrawNewGRFTileSeq(ti, &dts, TO_STRUCTURES, 0, palette);
466}
467
474{
475 Object *o = Object::GetByTile(ti->tile);
476 ObjectResolverObject object(spec, o, ti->tile);
477
478 const auto *group = object.Resolve<TileLayoutSpriteGroup>();
479 if (group == nullptr) return;
480
481 auto processor = group->ProcessRegisters(object, nullptr);
482 auto dts = processor.GetLayout();
483 DrawTileLayout(ti, dts, spec);
484}
485
493void DrawNewObjectTileInGUI(int x, int y, const ObjectSpec *spec, uint8_t view)
494{
495 ObjectResolverObject object(spec, nullptr, INVALID_TILE, view);
496 const auto *group = object.Resolve<TileLayoutSpriteGroup>();
497 if (group == nullptr) return;
498
499 auto processor = group->ProcessRegisters(object, nullptr);
500 auto dts = processor.GetLayout();
501
502 PaletteID palette;
504 /* Get the colours of our company! */
505 if (spec->flags.Test(ObjectFlag::Uses2CC)) {
506 const Livery &l = Company::Get(_local_company)->livery[0];
507 palette = SPR_2CCMAP_BASE + l.colour1 + l.colour2 * 16;
508 } else {
510 }
511 } else {
512 /* There's no company, so just take the base palette. */
513 palette = spec->flags.Test(ObjectFlag::Uses2CC) ? SPR_2CCMAP_BASE : PALETTE_RECOLOUR_START;
514 }
515
516 SpriteID image = dts.ground.sprite;
517 PaletteID pal = dts.ground.pal;
518
519 if (GB(image, 0, SPRITE_WIDTH) != 0) {
520 DrawSprite(image, GroundSpritePaletteTransform(image, pal, palette), x, y);
521 }
522
523 DrawNewGRFTileSeqInGUI(x, y, &dts, 0, palette);
524}
525
536uint16_t StubGetObjectCallback(CallbackID callback, uint32_t param1, uint32_t param2, const ObjectSpec *spec, Object *o, TileIndex tile, int)
537{
538 return GetObjectCallback(callback, param1, param2, spec, o, tile);
539}
540
549
555{
556 const ObjectSpec *spec = ObjectSpec::GetByTile(tile);
557 if (spec == nullptr || !spec->flags.Test(ObjectFlag::Animation)) return;
558
560}
561
562static bool DoTriggerObjectTileAnimation(Object *o, TileIndex tile, ObjectAnimationTrigger trigger, const ObjectSpec *spec, uint32_t random, uint32_t var18_extra = 0)
563{
564 if (!spec->animation.triggers.Test(trigger)) return false;
565
566 ObjectAnimationBase::ChangeAnimationFrame(CBID_OBJECT_ANIMATION_TRIGGER, spec, o, tile, random, to_underlying(trigger) | var18_extra);
567 return true;
568}
569
578{
579 return DoTriggerObjectTileAnimation(o, tile, trigger, spec, Random());
580}
581
589{
590 if (!spec->animation.triggers.Test(trigger)) return false;
591
592 bool ret = true;
593 uint32_t random = Random();
594 for (TileIndex tile : o->location) {
595 if (DoTriggerObjectTileAnimation(o, tile, trigger, spec, random)) {
596 SB(random, 0, 16, Random());
597 } else {
598 ret = false;
599 }
600 }
601
602 return ret;
603}
constexpr T SB(T &x, const uint8_t s, const uint8_t n, const U d)
Set n bits in x starting at bit s to d.
static constexpr uint GB(const T x, const uint8_t s, const uint8_t n)
Fetch n bits from x, started at bit s.
constexpr bool Test(Tvalue_type value) const
Test if the value-th bit is set.
Struct containing information relating to NewGRF classes for stations and airports.
StringID name
Name of this class.
static NewGRFClass * Get(ObjectClassID class_index)
static ObjectClassID Allocate(uint32_t global_id)
const Tspec * GetSpec(uint index) const
Get a spec from the class at a given index.
DrawTileSpriteSpan GetLayout() const
Returns the result spritelayout after preprocessing.
static Date date
Current date in days (day counter).
Definition of stuff that is very close to a company, like the company struct itself.
PaletteID GetCompanyPalette(CompanyID company)
Get the palette for recolouring with a company colour.
CompanyID _local_company
Company controlled by the human player at this client. Can also be COMPANY_SPECTATOR.
CompanyID _current_company
Company currently doing an action.
Functions related to companies.
Functions related to debugging.
#define Debug(category, level, format_string,...)
Output a line of debugging information.
Definition debug.h:37
constexpr std::underlying_type_t< enum_type > to_underlying(enum_type e)
Implementation of std::to_underlying (from C++23).
Definition enum_type.hpp:17
bool _generating_world
Whether we are generating the map or not.
Definition genworld.cpp:74
Functions related to world/map generation.
void DrawSprite(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub, ZoomLevel zoom)
Draw a sprite, not in a viewport.
Definition gfx.cpp:1038
uint32_t SpriteID
The number of a sprite, without mapping bits and colourtables.
Definition gfx_type.h:17
uint32_t PaletteID
The number of the palette.
Definition gfx_type.h:18
uint DistanceSquare(TileIndex t0, TileIndex t1)
Gets the 'Square' distance between the two given tiles.
Definition map.cpp:175
uint DistanceManhattan(TileIndex t0, TileIndex t1)
Gets the Manhattan distance between the two given tiles.
Definition map.cpp:158
static uint TileY(TileIndex tile)
Get the Y component of a tile.
Definition map_func.h:427
static uint TileX(TileIndex tile)
Get the X component of a tile.
Definition map_func.h:417
constexpr To ClampTo(From value)
Clamp the given value down to lie within the requested type.
GrfSpecFeature
Definition newgrf.h:71
Function implementations related to NewGRF animation.
uint32_t GetBadgeVariableResult(const GRFFile &grffile, std::span< const BadgeID > badges, uint32_t parameter)
Test for a matching badge in a list of badges, returning the number of matching bits.
Functions related to NewGRF badges.
CallbackID
List of implemented NewGRF callbacks.
@ CBID_OBJECT_ANIMATION_TRIGGER
Called for periodically starting or stopping the animation.
@ CBID_OBJECT_ANIMATION_NEXT_FRAME
Determine the next animation frame for a house.
@ CBID_OBJECT_ANIMATION_SPEED
Called to indicate how long the current animation frame should last.
ObjectCallbackMask
Callback masks for objects.
@ AnimationNextFrame
decides next animation frame
@ AnimationSpeed
decides animation speed
Implementation of the NewGRF class' functions.
uint32_t GetNearbyTileInformation(TileIndex tile, bool grf_version8)
Common part of station var 0x67, house var 0x62, indtile var 0x60, industry var 0x62.
uint32_t GetTerrainType(TileIndex tile, TileContext context)
Function used by houses (and soon industries) to get information on type of "terrain" the tile it is ...
TileIndex GetNearbyTile(uint8_t parameter, TileIndex tile, bool signed_offsets, Axis axis)
Get the tile at the given offset.
static uint32_t GetCountAndDistanceOfClosestInstance(const ResolverObject &object, uint8_t param_set_id, uint8_t layout_filter, bool town_filter, const Industry *current)
Implementation of both var 67 and 68 since the mechanism is almost the same, it is easier to regroup ...
std::vector< ObjectSpec > _object_specs
All the object specifications.
void ResetObjects()
This function initialize the spec arrays of objects.
void DrawNewObjectTileInGUI(int x, int y, const ObjectSpec *spec, uint8_t view)
Draw representation of an object (tile) for GUI purposes.
ObjectOverrideManager _object_mngr(NEW_OBJECT_OFFSET, NUM_OBJECTS, INVALID_OBJECT_TYPE)
The override manager for our objects.
void DrawNewObjectTile(TileInfo *ti, const ObjectSpec *spec)
Draw an object on the map.
static uint32_t GetClosestObject(TileIndex tile, ObjectType type, const Object *current)
Get the closest object of a given type.
static uint32_t GetObjectIDAtOffset(TileIndex tile, uint32_t cur_grfid)
Make an analysis of a tile and get the object type.
uint16_t StubGetObjectCallback(CallbackID callback, uint32_t param1, uint32_t param2, const ObjectSpec *spec, Object *o, TileIndex tile, int)
Perform a callback for an object.
bool TriggerObjectAnimation(Object *o, ObjectAnimationTrigger trigger, const ObjectSpec *spec)
Trigger the update of animation on a whole object.
static uint32_t GetCountAndDistanceOfClosestInstance(const ResolverObject &object, uint8_t local_id, uint32_t grfid, TileIndex tile, const Object *current)
Implementation of var 65.
static uint32_t GetNearbyObjectTileInformation(uint8_t parameter, TileIndex tile, ObjectID index, bool grf_version8)
Based on newhouses equivalent, but adapted for newobjects.
bool TriggerObjectTileAnimation(Object *o, TileIndex tile, ObjectAnimationTrigger trigger, const ObjectSpec *spec)
Trigger the update of animation on a single tile.
static void DrawTileLayout(const TileInfo *ti, const DrawTileSpriteSpan &dts, const ObjectSpec *spec)
Draw an group of sprites on the map.
void AnimateNewObjectTile(TileIndex tile)
Handle the animation of the object tile.
uint16_t GetObjectCallback(CallbackID callback, uint32_t param1, uint32_t param2, const ObjectSpec *spec, Object *o, TileIndex tile, std::span< int32_t > regs100, uint8_t view)
Perform a callback for an object.
Functions related to NewGRF objects.
@ AnimRandomBits
Object wants random bits in "next animation frame" callback.
@ OnlyInScenedit
Object can only be constructed in the scenario editor.
@ OnlyInGame
Object can only be built in game.
@ DrawWater
Object wants to be drawn on water.
@ Uses2CC
Object wants 2CC colour mapping.
@ Animation
Object has animated tiles.
@ INVALID_OBJECT_CLASS
Class for the less fortunate.
Functions related to NewGRF provided sounds.
Base for all objects.
ObjectType GetObjectType(Tile t)
Gets the ObjectType of the given object tile.
Map accessors for object tiles.
uint8_t GetObjectRandomBits(Tile t)
Get the random bits of this tile.
Definition object_map.h:59
ObjectID GetObjectIndex(Tile t)
Get the index of which object this tile is attached to.
Definition object_map.h:47
static const ObjectType OBJECT_LIGHTHOUSE
The nice lighthouse.
Definition object_type.h:19
uint16_t ObjectType
Types of objects.
Definition object_type.h:16
PoolID< uint32_t, struct ObjectIDTag, 0xFF0000, 0xFFFFFFFF > ObjectID
Unique identifier for an object.
Definition object_type.h:30
static const ObjectType INVALID_OBJECT_TYPE
An invalid object.
Definition object_type.h:27
static const ObjectType NUM_OBJECTS
Number of supported objects overall.
Definition object_type.h:25
static const ObjectType OBJECT_TRANSMITTER
The large antenna.
Definition object_type.h:18
ObjectAnimationTrigger
Animation triggers for objects.
Definition object_type.h:36
static const ObjectType NEW_OBJECT_OFFSET
Offset for new objects.
Definition object_type.h:24
A number of safeguards to prevent using unsafe methods.
GameSettings _settings_game
Game settings of a running game or the scenario editor.
Definition settings.cpp:61
void DrawNewGRFTileSeq(const struct TileInfo *ti, const DrawTileSprites *dts, TransparencyOption to, uint32_t stage, PaletteID default_palette)
Draw NewGRF industrytile or house sprite layout.
Definition sprite.h:150
void DrawNewGRFTileSeqInGUI(int x, int y, const DrawTileSprites *dts, uint32_t stage, PaletteID default_palette)
Draw NewGRF object in GUI.
Definition sprite.h:163
PaletteID GroundSpritePaletteTransform(SpriteID image, PaletteID pal, PaletteID default_pal)
Applies PALETTE_MODIFIER_COLOUR to a palette entry of a ground sprite.
Definition sprite.h:198
static const PaletteID PALETTE_RECOLOUR_START
First recolour sprite for company colours.
Definition sprites.h:1588
static constexpr uint8_t SPRITE_WIDTH
number of bits for the sprite number
Definition sprites.h:1549
Definition of base types and functions in a cross-platform compatible way.
#define lengthof(array)
Return the length of an fixed size array.
Definition stdafx.h:271
Helper class for a unified approach to NewGRF animation.
static void AnimateTile(const ObjectSpec *spec, Object *obj, TileIndex tile, bool random_animation, int extra_data=0)
static void ChangeAnimationFrame(CallbackID cb, const ObjectSpec *spec, Object *obj, TileIndex tile, uint32_t random_bits, uint32_t trigger, int extra_data=0)
Ground palette sprite of a tile, together with its sprite layout.
Definition sprite.h:67
PalSpriteID ground
Palette and sprite for the ground.
Definition sprite.h:53
uint16_t local_id
id defined by the grf file for this entity
uint32_t grfid
grfid that introduced this entity.
bool HasGrfFile() const
Test if this entity was introduced by NewGRF.
Information about a particular livery.
Definition livery.h:79
Colours colour2
Second colour, for vehicles with 2CC support.
Definition livery.h:89
Colours colour1
First colour, for all vehicles.
Definition livery.h:88
Helper class for animation control.
A resolver object to be used with feature 0F spritegroups.
ObjectScopeResolver object_scope
The object scope resolver.
std::optional< TownScopeResolver > town_scope
The town scope resolver (created on the first call).
TownScopeResolver * GetTown()
Get the town resolver scope that belongs to this object resolver.
GrfSpecFeature GetFeature() const override
Get the feature number being resolved for.
ObjectResolverObject(const ObjectSpec *spec, Object *o, TileIndex tile, uint8_t view=0, CallbackID callback=CBID_NO_CALLBACK, uint32_t param1=0, uint32_t param2=0)
Constructor of the object resolver.
uint32_t GetDebugID() const override
Get an identifier for the item being resolved.
uint32_t GetVariable(uint8_t variable, uint32_t parameter, bool &available) const override
Used by the resolver to get values for feature 0F deterministic spritegroups.
TileIndex tile
The tile related to the object.
uint8_t view
The view of the object.
uint32_t GetRandomBits() const override
Get a few random bits.
struct Object * obj
The object the callback is ran for.
Allow incrementing of ObjectClassID variables.
bool IsEnabled() const
Test if this object is enabled.
TimerGameCalendar::Date introduction_date
From when can this object be built.
StandardGRFFileProps grf_prop
Properties related the the grf file.
LandscapeTypes climate
In which climates is this object available?
bool IsEverAvailable() const
Check whether the object might be available at some point in this game with the current game mode.
static const ObjectSpec * GetByTile(TileIndex tile)
Get the specification associated with a tile.
static const ObjectSpec * Get(ObjectType index)
Get the specification associated with a specific ObjectType.
bool IsAvailable() const
Check whether the object is available at this time.
uint Index() const
Gets the index of this spec.
static void BindToClasses()
Tie all ObjectSpecs to their class.
AnimationInfo< ObjectAnimationTriggers > animation
Information about the animation.
ObjectFlags flags
Flags/settings related to the object.
bool WasEverAvailable() const
Check whether the object was available at some point in the past or present in this game with the cur...
TimerGameCalendar::Date end_of_life_date
When can't this object be built anymore.
An object, such as transmitter, on the map.
Definition object_base.h:23
ObjectType type
Type of the object.
Definition object_base.h:24
static uint16_t GetTypeCount(ObjectType type)
Get the count of objects for this type.
Definition object_base.h:66
static Object * GetByTile(TileIndex tile)
Get the object associated with a tile.
uint8_t view
The view setting for this object.
Definition object_base.h:29
TileArea location
Location of the object.
Definition object_base.h:26
uint8_t colour
Colour of the object, for display purpose.
Definition object_base.h:28
SpriteID sprite
The 'real' sprite.
Definition gfx_type.h:23
PaletteID pal
The palette (use PAL_NONE) if not needed).
Definition gfx_type.h:24
static Pool::IterateWrapper< Object > Iterate(size_t from=0)
static Company * Get(auto index)
Interface for SpriteGroup-s to access the gamestate.
const GRFFile * grffile
GRFFile the resolved SpriteGroup belongs to.
ResolverObject(const GRFFile *grffile, CallbackID callback=CBID_NO_CALLBACK, uint32_t callback_param1=0, uint32_t callback_param2=0)
Resolver constructor.
CallbackID callback
Callback being resolved.
const SpriteGroup * root_spritegroup
Root SpriteGroup to use for resolving.
ResolverObject & ro
Surrounding resolver object.
const struct SpriteGroup * GetSpriteGroup(bool entity_exists) const
Get the standard sprite group.
Tile information, used while rendering the tile.
Definition tile_cmd.h:32
TileIndex tile
Tile index.
Definition tile_cmd.h:34
Action 2 sprite layout for houses, industry tiles, objects and airport tiles.
SpriteLayoutProcessor ProcessRegisters(const ResolverObject &object, uint8_t *stage) const
Process registers and the construction stage into the sprite layout.
Scope resolver for a town.
Definition newgrf_town.h:22
Town data structure.
Definition town.h:63
TileIndex xy
town center tile
Definition town.h:64
Generic 'commands' that can be performed on all tiles.
static bool IsTileType(Tile tile, TileType type)
Checks if a tile is a given tiletype.
Definition tile_map.h:150
Owner GetTileOwner(Tile tile)
Returns the owner of a tile.
Definition tile_map.h:178
uint8_t GetAnimationFrame(Tile t)
Get the current animation frame.
Definition tile_map.h:250
bool IsValidTile(Tile tile)
Checks if a tile is valid.
Definition tile_map.h:161
Slope GetTileSlope(TileIndex tile)
Return the slope of a given tile inside the map.
Definition tile_map.h:279
StrongType::Typedef< uint32_t, struct TileIndexTag, StrongType::Compare, StrongType::Integer, StrongType::Compatible< int32_t >, StrongType::Compatible< int64_t > > TileIndex
The index/ID of a Tile.
Definition tile_type.h:92
constexpr TileIndex INVALID_TILE
The very nice invalid tile marker.
Definition tile_type.h:100
@ Object
Contains objects such as transmitters and owned land.
Definition tile_type.h:59
Definition of the game-calendar-timer.
Base of the town class.
Town * ClosestTownFromTile(TileIndex tile, uint threshold)
Return the town closest (in distance or ownership) to a given tile, within a given threshold.
HouseZone GetTownRadiusGroup(const Town *t, TileIndex tile)
Returns the bit corresponding to the town zone of the specified tile.
@ TO_STRUCTURES
other objects such as transmitters and lighthouses
void DrawGroundSprite(SpriteID image, PaletteID pal, const SubSprite *sub, int extra_offs_x, int extra_offs_y)
Draws a ground sprite for the current tile.
Definition viewport.cpp:579
Functions related to water management.
bool IsTileOnWater(Tile t)
Tests if the tile was built on water.
Definition water_map.h:138