22#include "table/strings.h"
37 if (parameter != 0) tile =
GetNearbyTile(parameter, tile, signed_offsets);
59 return ((y & 0xF) << 20) | ((x & 0xF) << 16) | (y << 8) | x;
99 Debug(grf, 1,
"Unhandled industry tile variable 0x{:X}", variable);
117 if (this->
industry->
index == IndustryID::Invalid())
return 0;
142 CallbackID callback, uint32_t callback_param1, uint32_t callback_param2)
144 indtile_scope(*this, indus, tile),
145 ind_scope(*this, tile, indus, indus->type),
153 return GSF_INDUSTRYTILES;
173 DrawWaterClassGround(ti);
182uint16_t GetIndustryTileCallback(
CallbackID callback, uint32_t param1, uint32_t param2, IndustryGfx gfx_id,
Industry *industry,
TileIndex tile, std::span<int32_t> regs100)
188 return object.ResolveCallback(regs100);
194 bool draw_old_one =
true;
207 if (group ==
nullptr)
return false;
211 auto processor = group->ProcessRegisters(
object, &stage);
212 auto dts = processor.GetLayout();
217extern bool IsSlopeRefused(
Slope current,
Slope refused);
235 ind.
index = IndustryID::Invalid();
239 ind.
random = initial_random_bits;
242 std::array<int32_t, 16> regs100;
243 uint16_t callback_res = GetIndustryTileCallback(
CBID_INDTILE_SHAPE_CHECK, 0, creation_type << 8 |
static_cast<uint32_t
>(layout_index), gfx, &ind, ind_tile, regs100);
259 return GetIndustryTileCallback(callback, param1, param2, spec -
GetIndustryTileSpec(0), ind, tile);
263struct IndustryAnimationBase :
public AnimationBase<IndustryAnimationBase, IndustryTileSpec, Industry, int, GetSimpleIndustryCallback, TileAnimationFrameAnimationHelper<Industry> > {
271void AnimateNewIndustryTile(
TileIndex tile)
274 if (itspec ==
nullptr)
return;
282 if (!itspec->
animation.triggers.Test(iat))
return false;
288bool TriggerIndustryTileAnimation_ConstructionStageChanged(
TileIndex tile,
bool first_call)
291 return DoTriggerIndustryTileAnimation(tile, iat,
Random(), first_call ? 0x100 : 0);
297 return DoTriggerIndustryTileAnimation(tile, iat,
Random());
303 uint32_t random =
Random();
306 if (DoTriggerIndustryTileAnimation(tile, iat, random)) {
335 waiting_random_triggers.Set(trigger);
337 object.SetWaitingRandomTriggers(waiting_random_triggers);
339 object.ResolveRerandomisation();
342 waiting_random_triggers.Reset(
object.GetUsedRandomTriggers());
346 uint8_t new_random_bits =
Random();
363 if (reseed == 0 || ind ==
nullptr)
return;
365 uint16_t random_bits =
Random();
367 ind->
random |= random_bits & reseed;
377 uint32_t reseed_industry = 0;
390 uint32_t reseed_industry = 0;
debug_inline constexpr bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.
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.
debug_inline 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.
constexpr Tstorage base() const noexcept
Retrieve the raw value behind this bit set.
Common return value for all commands.
Functions related to commands.
Functions related to debugging.
#define Debug(category, level, format_string,...)
Output a line of debugging information.
constexpr std::underlying_type_t< enum_type > to_underlying(enum_type e)
Implementation of std::to_underlying (from C++23)
uint32_t SpriteID
The number of a sprite, without mapping bits and colourtables.
uint32_t PaletteID
The number of the palette.
void MarkTileDirtyByTile(TileIndex tile, int bridge_level_offset, int tile_height_override)
Mark a tile given by its index dirty for repaint.
const IndustryTileSpec * GetIndustryTileSpec(IndustryGfx gfx)
Accessor for array _industry_tile_specs.
uint8_t GetIndustryRandomBits(Tile tile)
Get the random bits for this tile.
IndustryGfx GetIndustryGfx(Tile t)
Get the industry graphics ID for the given industry tile.
IndustryID GetIndustryIndex(Tile t)
Get the industry ID of the given tile.
void SetIndustryRandomBits(Tile tile, uint8_t bits)
Set the random bits for this tile.
void SetIndustryRandomTriggers(Tile tile, IndustryRandomTriggers triggers)
Set the activated triggers bits for this industry tile Used for grf callbacks.
IndustryRandomTriggers GetIndustryRandomTriggers(Tile tile)
Get the activated triggers bits for this industry tile Used for grf callbacks.
uint8_t GetIndustryConstructionStage(Tile tile)
Returns the industry construction stage of the specified tile.
IndustryRandomTrigger
Available industry random triggers.
IndustryAnimationTrigger
Animation triggers of the industries.
@ ConstructionStageChanged
Trigger whenever the construction stage changes.
@ NextFrameRandomBits
Callback 0x26 needs random bits.
void DrawFoundation(TileInfo *ti, Foundation f)
Draw foundation f at tile ti.
Functions related to OTTD's landscape.
@ Random
Randomise borders.
static debug_inline uint TileY(TileIndex tile)
Get the Y component of a tile.
static debug_inline uint TileX(TileIndex tile)
Get the X component of a tile.
uint32_t GetRelativePosition(TileIndex tile, TileIndex ind_tile)
This is the position of the tile relative to the northernmost tile of the industry.
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_INDTILE_ANIMATION_SPEED
Called to indicate how long the current animation frame should last.
@ CBID_INDTILE_SHAPE_CHECK
Called to determine if the given industry tile can be built on specific tile.
@ CBID_INDTILE_DRAW_FOUNDATIONS
Called to determine the type (if any) of foundation to draw for industry tile.
@ CBID_RANDOM_TRIGGER
Set when calling a randomizing trigger (almost undocumented).
@ CBID_INDTILE_ANIMATION_TRIGGER
Called for periodically starting or stopping the animation.
@ CBID_INDTILE_ANIMATION_NEXT_FRAME
Called to determine industry tile next animation frame.
static const uint CALLBACK_FAILED
Different values for Callback result evaluations.
IndustryTileCallbackMask
Callback masks for industry tiles.
@ DrawFoundations
decides if default foundations need to be drawn
@ AnimationNextFrame
decides next animation frame
@ AnimationSpeed
decides animation speed
CommandCost GetErrorMessageFromLocationCallbackResult(uint16_t cb_res, std::span< const int32_t > textstack, const GRFFile *grffile, StringID default_error)
Get the error message from a shape/location/slope check callback result.
uint32_t GetNearbyTileInformation(TileIndex tile, bool grf_version8)
Common part of station var 0x67, house var 0x62, indtile var 0x60, industry var 0x62.
bool ConvertBooleanCallback(const GRFFile *grffile, uint16_t cbid, uint16_t cb_res)
Converts a callback result into a boolean.
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.
uint32_t GetIndustryIDAtOffset(TileIndex tile, const Industry *i, uint32_t cur_grfid)
Make an analysis of a tile and check for its belonging to the same industry, and/or the same grf file...
IndustryAvailabilityCallType
From where has callback CBID_INDUSTRY_PROBABILITY been called.
uint32_t GetNearbyIndustryTileInformation(uint8_t parameter, TileIndex tile, IndustryID index, bool signed_offsets, bool grf_version8)
Based on newhouses equivalent, but adapted for newindustries.
void TriggerIndustryTileRandomisation(TileIndex tile, IndustryRandomTrigger trigger)
Trigger a random trigger for a single industry tile.
static void DoTriggerIndustryTileRandomisation(TileIndex tile, IndustryRandomTrigger trigger, Industry *ind, uint32_t &reseed_industry)
Trigger random triggers for an industry tile and reseed its random bits.
uint32_t GetRelativePosition(TileIndex tile, TileIndex ind_tile)
This is the position of the tile relative to the northernmost tile of the industry.
CommandCost PerformIndustryTileSlopeCheck(TileIndex ind_base_tile, TileIndex ind_tile, const IndustryTileSpec *its, IndustryType type, IndustryGfx gfx, size_t layout_index, uint16_t initial_random_bits, Owner founder, IndustryAvailabilityCallType creation_type)
Check the slope of a tile of a new industry.
static const GRFFile * GetIndTileGrffile(IndustryGfx gfx)
Get the associated NewGRF file from the industry graphics.
void TriggerIndustryRandomisation(Industry *ind, IndustryRandomTrigger trigger)
Trigger a random trigger for all industry tiles.
static void DoReseedIndustry(Industry *ind, uint32_t reseed)
Reseeds the random bits of an industry.
uint32_t GetNearbyIndustryTileInformation(uint8_t parameter, TileIndex tile, IndustryID index, bool signed_offsets, bool grf_version8)
Based on newhouses equivalent, but adapted for newindustries.
NewGRF handling of industry tiles.
Functions related to NewGRF provided sounds.
@ VSG_SCOPE_SELF
Resolved object itself.
@ VSG_SCOPE_PARENT
Related object of the resolved one.
A number of safeguards to prevent using unsafe methods.
Slope
Enumeration for the slope-type.
@ FOUNDATION_LEVELED
The tile is leveled up to a flat slope.
static PaletteID GetColourPalette(Colours colour)
Get recolour palette for a colour.
void DrawNewGRFTileSeq(const struct TileInfo *ti, const DrawTileSprites *dts, TransparencyOption to, uint32_t stage, PaletteID default_palette)
Draw NewGRF industrytile or house sprite layout.
PaletteID GroundSpritePaletteTransform(SpriteID image, PaletteID pal, PaletteID default_pal)
Applies PALETTE_MODIFIER_COLOUR to a palette entry of a ground sprite.
static constexpr uint8_t SPRITE_MODIFIER_CUSTOM_SPRITE
these masks change the colours of the palette for a sprite.
static constexpr uint8_t SPRITE_WIDTH
number of bits for the sprite number
Definition of base types and functions in a cross-platform compatible way.
Helper class for a unified approach to NewGRF animation.
static void AnimateTile(const IndustryTileSpec *spec, Industry *obj, TileIndex tile, bool random_animation, int extra_data=0)
Animate a single tile.
static void ChangeAnimationFrame(CallbackID cb, const IndustryTileSpec *spec, Industry *obj, TileIndex tile, uint32_t random_bits, uint32_t trigger, int extra_data=0)
Check a callback to determine what the next animation step is and execute that step.
Ground palette sprite of a tile, together with its sprite layout.
PalSpriteID ground
Palette and sprite for the ground.
const struct GRFFile * grffile
grf file that introduced this entity
uint16_t local_id
id defined by the grf file for this entity
Dynamic data of a loaded NewGRF.
Helper class for animation control.
Resolver for industry tiles.
GrfSpecFeature GetFeature() const override
Get the feature number being resolved for.
uint32_t GetDebugID() const override
Get an identifier for the item being resolved.
IndustryTileResolverObject(IndustryGfx gfx, TileIndex tile, Industry *indus, CallbackID callback=CBID_NO_CALLBACK, uint32_t callback_param1=0, uint32_t callback_param2=0)
Constructor of the industry tiles scope resolver.
uint32_t GetRandomBits() const override
Get a few random bits.
Industry * industry
Industry owning the tiles.
uint32_t GetVariable(uint8_t variable, uint32_t parameter, bool &available) const override
Get a variable value.
TileIndex tile
Tile being resolved.
uint32_t GetRandomTriggers() const override
Get the triggers.
Defines the data structure of each individual tile of an industry.
IndustryTileSpecialFlags special_flags
Bitmask of extra flags used by the tile.
Slope slopes_refused
slope pattern on which this tile cannot be built
AnimationInfo< IndustryAnimationTriggers > animation
Information about the animation (is it looping, how many loops etc)
SubstituteGRFFileProps grf_prop
properties related to the grf file
IndustryTileCallbackMasks callback_mask
Bitmask of industry tile callbacks that have to be called.
Defines the internal data of a functional industry.
IndustryType type
type of industry.
Colours random_colour
randomized colour of the industry, for display purpose
uint16_t random
Random value used for randomisation of all kinds of things.
Owner founder
Founder of the industry.
static Industry * GetByTile(TileIndex tile)
Get the industry of the given tile.
TileArea location
Location of the industry.
bool TileBelongsToIndustry(TileIndex tile) const
Check if a given tile belongs to this industry.
uint16_t w
The width of the area.
TileIndex tile
The base tile of the area.
SpriteID sprite
The 'real' sprite.
PaletteID pal
The palette (use PAL_NONE) if not needed)
Templated helper to make a PoolID a single POD value.
Tindex index
Index of this pool item.
const GRFFile * grffile
GRFFile the resolved SpriteGroup belongs to.
const SpriteGroup * root_spritegroup
Root SpriteGroup to use for resolving.
ResolverObject & ro
Surrounding resolver object.
Specialization of ResolverObject with type-safe access to RandomTriggers.
const struct SpriteGroup * GetSpriteGroup(bool entity_exists) const
Get the standard sprite group.
bool HasSpriteGroups() const
Check whether the entity has sprite groups.
Tile information, used while rendering the tile.
Slope tileh
Slope of the tile.
TileIndex tile
Tile index.
Action 2 sprite layout for houses, industry tiles, objects and airport tiles.
uint8_t GetAnimationFrame(Tile t)
Get the current animation frame.
bool IsValidTile(Tile tile)
Checks if a tile is valid.
static debug_inline bool IsTileType(Tile tile, TileType type)
Checks if a tile is a given tiletype.
Slope GetTileSlope(TileIndex tile)
Return the slope of a given tile inside the map.
@ MP_INDUSTRY
Part of an industry.
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_INDUSTRIES
industries
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.
Functions related to water (management)
bool IsTileOnWater(Tile t)
Tests if the tile was built on water.