OpenTTD Source  20241124-master-g9399a92a4f
newgrf_commons.h
Go to the documentation of this file.
1 /*
2  * This file is part of OpenTTD.
3  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6  */
7 
13 #ifndef NEWGRF_COMMONS_H
14 #define NEWGRF_COMMONS_H
15 
16 #include "sprite.h"
17 #include "core/alloc_type.hpp"
18 #include "command_type.h"
19 #include "direction_type.h"
20 #include "company_type.h"
21 
27 };
28 
33  TLF_NOTHING = 0x00,
34 
35  TLF_DODRAW = 0x01,
36  TLF_SPRITE = 0x02,
37  TLF_PALETTE = 0x04,
39 
41  TLF_BB_Z_OFFSET = 0x20,
42 
45 
48 
49  TLF_KNOWN_FLAGS = 0xFF,
50 
53 
56 
59 
62 
65 };
67 
68 
74 inline uint GetConstructionStageOffset(uint construction_stage, uint num_sprites)
75 {
76  assert(num_sprites > 0);
77  if (num_sprites > 4) num_sprites = 4;
78  switch (construction_stage) {
79  case 0: return 0;
80  case 1: return num_sprites > 2 ? 1 : 0;
81  case 2: return num_sprites > 2 ? num_sprites - 2 : 0;
82  case 3: return num_sprites - 1;
83  default: NOT_REACHED();
84  }
85 }
86 
92  uint8_t dodraw;
93  uint8_t sprite;
94  uint8_t palette;
95  uint16_t max_sprite_offset;
96  uint16_t max_palette_offset;
97  union {
98  uint8_t parent[3];
99  uint8_t child[2];
100  } delta;
101  uint8_t sprite_var10;
102  uint8_t palette_var10;
103 };
104 
105 static const uint TLR_MAX_VAR10 = 7;
106 
113  const TileLayoutRegisters *registers;
114 
120 
121  void Allocate(uint num_sprites);
122  void AllocateRegisters();
123  void Clone(const DrawTileSeqStruct *source);
124  void Clone(const NewGRFSpriteLayout *source);
125 
130  void Clone(const DrawTileSprites *source)
131  {
132  assert(source != nullptr && this != source);
133  this->ground = source->ground;
134  this->Clone(source->seq);
135  }
136 
137  virtual ~NewGRFSpriteLayout()
138  {
139  free(this->seq);
140  free(this->registers);
141  }
142 
149  bool NeedsPreprocessing() const
150  {
151  return this->registers != nullptr;
152  }
153 
154  uint32_t PrepareLayout(uint32_t orig_offset, uint32_t newgrf_ground_offset, uint32_t newgrf_offset, uint constr_stage, bool separate_ground) const;
155  void ProcessRegisters(uint8_t resolved_var10, uint32_t resolved_sprite, bool separate_ground) const;
156 
163  {
164  DrawTileSeqStruct *front = result_seq.data();
165  *ground = front->image;
166  return front + 1;
167  }
168 
169 private:
170  static std::vector<DrawTileSeqStruct> result_seq;
171 };
172 
186  uint32_t grfid;
187  uint16_t entity_id;
188  uint16_t substitute_id;
189 };
190 
192 protected:
193  std::vector<uint16_t> entity_overrides;
194  std::vector<uint32_t> grfid_overrides;
195 
196  uint16_t max_offset;
197  uint16_t max_entities;
198 
199  uint16_t invalid_id;
200  virtual bool CheckValidNewID([[maybe_unused]] uint16_t testid) { return true; }
201 
202 public:
203  std::vector<EntityIDMapping> mappings;
204 
205  OverrideManagerBase(uint16_t offset, uint16_t maximum, uint16_t invalid);
206  virtual ~OverrideManagerBase() = default;
207 
208  void ResetOverride();
209  void ResetMapping();
210 
211  void Add(uint16_t local_id, uint32_t grfid, uint entity_type);
212  virtual uint16_t AddEntityID(uint16_t grf_local_id, uint32_t grfid, uint16_t substitute_id);
213 
214  uint32_t GetGRFID(uint16_t entity_id) const;
215  uint16_t GetSubstituteID(uint16_t entity_id) const;
216  virtual uint16_t GetID(uint16_t grf_local_id, uint32_t grfid) const;
217 
218  inline uint16_t GetMaxMapping() const { return this->max_entities; }
219  inline uint16_t GetMaxOffset() const { return this->max_offset; }
220 };
221 
222 
223 struct HouseSpec;
225 public:
226  HouseOverrideManager(uint16_t offset, uint16_t maximum, uint16_t invalid) :
227  OverrideManagerBase(offset, maximum, invalid) {}
228 
229  void SetEntitySpec(const HouseSpec *hs);
230 };
231 
232 
233 struct IndustrySpec;
235 public:
236  IndustryOverrideManager(uint16_t offset, uint16_t maximum, uint16_t invalid) :
237  OverrideManagerBase(offset, maximum, invalid) {}
238 
239  uint16_t AddEntityID(uint16_t grf_local_id, uint32_t grfid, uint16_t substitute_id) override;
240  uint16_t GetID(uint16_t grf_local_id, uint32_t grfid) const override;
241 
242  void SetEntitySpec(IndustrySpec *inds);
243 };
244 
245 
246 struct IndustryTileSpec;
248 protected:
249  bool CheckValidNewID(uint16_t testid) override { return testid != 0xFF; }
250 public:
251  IndustryTileOverrideManager(uint16_t offset, uint16_t maximum, uint16_t invalid) :
252  OverrideManagerBase(offset, maximum, invalid) {}
253 
254  void SetEntitySpec(const IndustryTileSpec *indts);
255 };
256 
257 struct AirportSpec;
259 public:
260  AirportOverrideManager(uint16_t offset, uint16_t maximum, uint16_t invalid) :
261  OverrideManagerBase(offset, maximum, invalid) {}
262 
263  void SetEntitySpec(AirportSpec *inds);
264 };
265 
266 struct AirportTileSpec;
268 protected:
269  bool CheckValidNewID(uint16_t testid) override { return testid != 0xFF; }
270 public:
271  AirportTileOverrideManager(uint16_t offset, uint16_t maximum, uint16_t invalid) :
272  OverrideManagerBase(offset, maximum, invalid) {}
273 
274  void SetEntitySpec(const AirportTileSpec *ats);
275 };
276 
277 struct ObjectSpec;
279 protected:
280  bool CheckValidNewID(uint16_t testid) override { return testid != 0xFF; }
281 public:
282  ObjectOverrideManager(uint16_t offset, uint16_t maximum, uint16_t invalid) :
283  OverrideManagerBase(offset, maximum, invalid) {}
284 
285  void SetEntitySpec(ObjectSpec *spec);
286 };
287 
288 extern HouseOverrideManager _house_mngr;
289 extern IndustryOverrideManager _industry_mngr;
290 extern IndustryTileOverrideManager _industile_mngr;
291 extern AirportOverrideManager _airport_mngr;
292 extern AirportTileOverrideManager _airporttile_mngr;
294 
295 uint32_t GetTerrainType(TileIndex tile, TileContext context = TCX_NORMAL);
296 TileIndex GetNearbyTile(uint8_t parameter, TileIndex tile, bool signed_offsets = true, Axis axis = INVALID_AXIS);
297 uint32_t GetNearbyTileInformation(TileIndex tile, bool grf_version8);
298 uint32_t GetCompanyInfo(CompanyID owner, const struct Livery *l = nullptr);
299 CommandCost GetErrorMessageFromLocationCallbackResult(uint16_t cb_res, const GRFFile *grffile, StringID default_error);
300 
301 void ErrorUnknownCallbackResult(uint32_t grfid, uint16_t cbid, uint16_t cb_res);
302 bool ConvertBooleanCallback(const struct GRFFile *grffile, uint16_t cbid, uint16_t cb_res);
303 bool Convert8bitBooleanCallback(const struct GRFFile *grffile, uint16_t cbid, uint16_t cb_res);
304 
309 template <size_t Tcnt>
311  uint16_t local_id = 0;
312  const struct GRFFile *grffile = nullptr;
313  std::array<const struct SpriteGroup *, Tcnt> spritegroup{};
314 };
315 
319  constexpr GRFFileProps(uint16_t subst_id = 0) : subst_id(subst_id), override(subst_id) {}
320 
321  uint16_t subst_id;
322  uint16_t override;
323 };
324 
325 #endif /* NEWGRF_COMMONS_H */
Helper types related to the allocation of memory.
Common return value for all commands.
Definition: command_type.h:23
void SetEntitySpec(const HouseSpec *hs)
Install the specs into the HouseSpecs array It will find itself the proper slot on which it will go.
uint16_t AddEntityID(uint16_t grf_local_id, uint32_t grfid, uint16_t substitute_id) override
Method to find an entity ID and to mark it as reserved for the Industry to be included.
void SetEntitySpec(IndustrySpec *inds)
Method to install the new industry data in its proper slot The slot assignment is internal of this me...
uint16_t GetID(uint16_t grf_local_id, uint32_t grfid) const override
Return the ID (if ever available) of a previously inserted entity.
void SetEntitySpec(ObjectSpec *spec)
Method to install the new object data in its proper slot The slot assignment is internal of this meth...
uint32_t GetGRFID(uint16_t entity_id) const
Gives the GRFID of the file the entity belongs to.
void ResetMapping()
Resets the mapping, which is used while initializing game.
uint16_t max_entities
what is the amount of entities, old and new summed
virtual uint16_t GetID(uint16_t grf_local_id, uint32_t grfid) const
Return the ID (if ever available) of a previously inserted entity.
uint16_t invalid_id
ID used to detected invalid entities.
void Add(uint16_t local_id, uint32_t grfid, uint entity_type)
Since the entity IDs defined by the GRF file does not necessarily correlate to those used by the game...
OverrideManagerBase(uint16_t offset, uint16_t maximum, uint16_t invalid)
Constructor of generic class.
std::vector< EntityIDMapping > mappings
mapping of ids from grf files. Public out of convenience
void ResetOverride()
Resets the override, which is used while initializing game.
uint16_t GetSubstituteID(uint16_t entity_id) const
Gives the substitute of the entity, as specified by the grf file.
uint16_t max_offset
what is the length of the original entity's array of specs
virtual uint16_t AddEntityID(uint16_t grf_local_id, uint32_t grfid, uint16_t substitute_id)
Reserves a place in the mapping array for an entity to be installed.
Base class that provides memory initialization on dynamically created objects.
Definition: alloc_type.hpp:86
Types related to commands.
DECLARE_ENUM_AS_BIT_SET(GenderEthnicity) enum CompanyManagerFaceVariable
Bitgroups of the CompanyManagerFace variable.
Types related to companies.
Owner
Enum for all companies/owners.
Definition: company_type.h:18
Different types to 'show' directions.
Axis
Allow incrementing of DiagDirDiff variables.
@ INVALID_AXIS
Flag for an invalid Axis.
bool Convert8bitBooleanCallback(const GRFFile *grffile, uint16_t cbid, uint16_t cb_res)
Converts a callback result into a boolean.
uint32_t GetCompanyInfo(CompanyID owner, const Livery *l)
Returns company information like in vehicle var 43 or station var 43.
bool ConvertBooleanCallback(const GRFFile *grffile, uint16_t cbid, uint16_t cb_res)
Converts a callback result into a boolean.
static const uint TLR_MAX_VAR10
Maximum value for var 10.
TileContext
Context for tile accesses.
@ TCX_UPPER_HALFTILE
Querying information about the upper part of a tile with halftile foundation.
@ TCX_ON_BRIDGE
Querying information about stuff on the bridge (via some bridgehead).
@ TCX_NORMAL
Nothing special.
CommandCost GetErrorMessageFromLocationCallbackResult(uint16_t cb_res, const GRFFile *grffile, StringID default_error)
Get the error message from a shape/location/slope check callback result.
void ErrorUnknownCallbackResult(uint32_t grfid, uint16_t cbid, uint16_t cb_res)
Record that a NewGRF returned an unknown/invalid callback result.
TileLayoutFlags
Flags to enable register usage in sprite layouts.
@ TLF_BB_Z_OFFSET
Add signed offset to bounding box Z positions from register TileLayoutRegisters::delta....
@ TLF_CUSTOM_PALETTE
Palette is from Action 1 (moved to SPRITE_MODIFIER_CUSTOM_SPRITE in palette during loading).
@ TLF_SPRITE
Add signed offset to sprite from register TileLayoutRegisters::sprite.
@ TLF_CHILD_X_OFFSET
Add signed offset to child sprite X positions from register TileLayoutRegisters::delta....
@ TLF_DRAWING_FLAGS
Flags which are still required after loading the GRF.
@ TLF_DODRAW
Only draw sprite if value of register TileLayoutRegisters::dodraw is non-zero.
@ TLF_PALETTE_REG_FLAGS
Flags which require resolving the action-1-2-3 chain for the palette, even if it is no action-1 palet...
@ TLF_NON_GROUND_FLAGS
Flags which do not work for the (first) ground sprite.
@ TLF_BB_XY_OFFSET
Add signed offset to bounding box X and Y positions from register TileLayoutRegisters::delta....
@ TLF_SPRITE_REG_FLAGS
Flags which require resolving the action-1-2-3 chain for the sprite, even if it is no action-1 sprite...
@ TLF_PALETTE_VAR10
Resolve palette with a specific value in variable 10.
@ TLF_SPRITE_VAR10
Resolve sprite with a specific value in variable 10.
@ TLF_KNOWN_FLAGS
Known flags. Any unknown set flag will disable the GRF.
@ TLF_VAR10_FLAGS
Flags which refer to using multiple action-1-2-3 chains.
@ TLF_PALETTE
Add signed offset to palette from register TileLayoutRegisters::palette.
@ TLF_CHILD_Y_OFFSET
Add signed offset to child sprite Y positions from register TileLayoutRegisters::delta....
uint32_t GetTerrainType(TileIndex tile, TileContext context=TCX_NORMAL)
Function used by houses (and soon industries) to get information on type of "terrain" the tile it is ...
uint32_t GetNearbyTileInformation(TileIndex tile, bool grf_version8)
Common part of station var 0x67, house var 0x62, indtile var 0x60, industry var 0x62.
uint GetConstructionStageOffset(uint construction_stage, uint num_sprites)
Determines which sprite to use from a spriteset for a specific construction stage.
TileIndex GetNearbyTile(uint8_t parameter, TileIndex tile, bool signed_offsets=true, Axis axis=INVALID_AXIS)
Get the tile at the given offset.
ObjectOverrideManager _object_mngr(NEW_OBJECT_OFFSET, NUM_OBJECTS, INVALID_OBJECT_TYPE)
The override manager for our objects.
Base for drawing complex sprites.
void free(const void *ptr)
Version of the standard free that accepts const pointers.
Definition: stdafx.h:334
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
Definition: strings_type.h:16
Defines the data structure for an airport.
Defines the data structure of each individual tile of an airport.
A tile child sprite and palette to draw for stations etc, with 3D bounding box.
Definition: sprite.h:25
Ground palette sprite of a tile, together with its sprite layout.
Definition: sprite.h:58
const DrawTileSeqStruct * seq
Array of child sprites. Terminated with a terminator entry.
Definition: sprite.h:60
PalSpriteID ground
Palette and sprite for the ground.
Definition: sprite.h:59
Maps an entity id stored on the map to a GRF file.
uint16_t substitute_id
The (original) entity ID to use if this GRF is not available.
uint32_t grfid
The GRF ID of the file the entity belongs to.
uint16_t entity_id
The entity ID within the GRF file.
Data related to the handling of grf files.
uint16_t local_id
id defined by the grf file for this entity
const struct GRFFile * grffile
grf file that introduced this entity
std::array< const struct SpriteGroup *, Tcnt > spritegroup
pointers to the different sprites of the entity
Data related to the handling of grf files.
constexpr GRFFileProps(uint16_t subst_id=0)
Set all default data constructor for the props.
uint16_t override
id of the entity been replaced by
Dynamic data of a loaded NewGRF.
Definition: newgrf.h:108
Defines the data structure for constructing industry.
Definition: industrytype.h:101
Defines the data structure of each individual tile of an industry.
Definition: industrytype.h:149
Information about a particular livery.
Definition: livery.h:78
NewGRF supplied spritelayout.
void Clone(const DrawTileSprites *source)
Clone a spritelayout.
void Allocate(uint num_sprites)
Allocate a spritelayout for num_sprites building sprites.
uint32_t PrepareLayout(uint32_t orig_offset, uint32_t newgrf_ground_offset, uint32_t newgrf_offset, uint constr_stage, bool separate_ground) const
Prepares a sprite layout before resolving action-1-2-3 chains.
uint consistent_max_offset
Number of sprites in all referenced spritesets.
void ProcessRegisters(uint8_t resolved_var10, uint32_t resolved_sprite, bool separate_ground) const
Evaluates the register modifiers and integrates them into the preprocessed sprite layout.
void Clone(const DrawTileSeqStruct *source)
Clone the building sprites of a spritelayout.
bool NeedsPreprocessing() const
Tests whether this spritelayout needs preprocessing by PrepareLayout() and ProcessRegisters(),...
void AllocateRegisters()
Allocate memory for register modifiers.
static std::vector< DrawTileSeqStruct > result_seq
Temporary storage when preprocessing spritelayouts.
const DrawTileSeqStruct * GetLayout(PalSpriteID *ground) const
Returns the result spritelayout after preprocessing.
Allow incrementing of ObjectClassID variables.
Definition: newgrf_object.h:60
Combination of a palette sprite and a 'real' sprite.
Definition: gfx_type.h:23
Additional modifiers for items in sprite layouts.
uint8_t parent[3]
Registers for signed offsets for the bounding box position of parent sprites.
TileLayoutFlags flags
Flags defining which members are valid and to be used.
uint8_t dodraw
Register deciding whether the sprite shall be drawn at all. Non-zero means drawing.
uint16_t max_sprite_offset
Maximum offset to add to the sprite. (limited by size of the spriteset)
uint8_t palette
Register specifying a signed offset for the palette.
uint8_t sprite_var10
Value for variable 10 when resolving the sprite.
uint16_t max_palette_offset
Maximum offset to add to the palette. (limited by size of the spriteset)
uint8_t palette_var10
Value for variable 10 when resolving the palette.
uint8_t child[2]
Registers for signed offsets for the position of child sprites.
uint8_t sprite
Register specifying a signed offset for the sprite.