|
OpenTTD Source
14.0-beta1
|
30 template <
typename Tspec,
typename T
id, T
id Tmax>
40 template <
typename Tspec,
typename T
id, T
id Tmax>
48 static const uint NUM_ROADSTOPSPECS_PER_STATION = 63;
52 if (this->
st ==
nullptr)
return 0;
68 auto get_road_type_variable = [&](RoadTramType rtt) -> uint32_t {
73 rt = GetRoadType(this->
tile, rtt);
84 case 0x40:
return this->
view;
88 if (this->
type == STATION_BUS)
return 0;
89 if (this->
type == STATION_TRUCK)
return 1;
96 case 0x43:
return get_road_type_variable(RTT_ROAD);
99 case 0x44:
return get_road_type_variable(RTT_TRAM);
150 uint32_t res =
GetStationGfx(nearby_tile) << 12 | !same_orientation << 11 | !!same_station << 10;
152 if (
type == STATION_TRUCK) res |= (1 << 16);
157 res |= 1 << (ssl.
grfid != grfid ? 9 : 8) | ClampTo<uint8_t>(ssl.
localidx);
184 if (ssl.
grfid == grfid) {
204 if (group ==
nullptr)
return nullptr;
210 CallbackID callback, uint32_t param1, uint32_t param2)
211 :
ResolverObject(roadstopspec->grf_prop.grffile, callback, param1, param2), roadstop_scope(*this, st, roadstopspec, tile, roadtype, type, view)
242 RoadStopResolverObject::~RoadStopResolverObject()
256 if (t ==
nullptr)
return nullptr;
265 return object.ResolveCallback();
280 assert(spec !=
nullptr);
285 if (group ==
nullptr || group->type != SGT_TILELAYOUT)
return;
299 uint sprite_offset = 5 - view;
303 if (rti->UsesOverlay()) {
305 DrawSprite(ground + sprite_offset, PAL_NONE, x, y);
308 if (overlay)
DrawSprite(overlay + sprite_offset, PAL_NONE, x, y);
309 }
else if (RoadTypeIsTram(roadtype)) {
310 DrawSprite(SPR_TRAMWAY_TRAM + sprite_offset, PAL_NONE, x, y);
331 static byte Get(
BaseStation *st,
TileIndex tile) {
return st->GetRoadStopAnimationFrame(tile); }
332 static void Set(
BaseStation *st,
TileIndex tile,
byte frame) { st->SetRoadStopAnimationFrame(tile, frame); }
347 if (ss ==
nullptr)
return;
361 uint16_t random_bits = Random();
362 auto process_tile = [&](
TileIndex cur_tile) {
367 cargo = INVALID_CARGO;
377 process_tile(tile_data.tile);
380 process_tile(trigger_tile);
403 uint32_t whole_reseed = 0;
408 uint32_t used_triggers = 0;
409 auto process_tile = [&](
TileIndex cur_tile) {
411 if (ss ==
nullptr)
return;
424 if (group ==
nullptr)
return;
426 used_triggers |=
object.used_triggers;
428 uint32_t reseed =
object.GetReseedSum();
430 whole_reseed |= reseed;
434 uint8_t random_bits = st->GetRoadStopRandomBits(cur_tile);
435 random_bits &= ~reseed;
436 random_bits |= Random() & reseed;
437 st->SetRoadStopRandomBits(cur_tile, random_bits);
445 process_tile(tile_data.tile);
453 if ((whole_reseed & 0xFFFF) != 0) {
468 for (uint i = 0; i < RoadStopClass::GetClassCount(); i++) {
486 for (uint j = 0; j < roadstopclass->
GetSpecCount(); j++) {
502 if (roadstopspec ==
nullptr)
return true;
537 if (statspec ==
nullptr || st ==
nullptr)
return 0;
540 for (i = 1; i < st->
roadstop_speclist.size() && i < NUM_ROADSTOPSPECS_PER_STATION; i++) {
545 for (i = 1; i < st->
roadstop_speclist.size() && i < NUM_ROADSTOPSPECS_PER_STATION; i++) {
549 if (i == NUM_ROADSTOPSPECS_PER_STATION) {
566 void DeallocateSpecFromRoadStop(
BaseStation *st,
byte specindex)
569 if (specindex == 0)
return;
struct BaseStation * st
Instance of the station.
StationFacility facilities
The facilities that this station has.
@ ROTSG_GROUND
Required: Main group of ground images.
PaletteID GroundSpritePaletteTransform(SpriteID image, PaletteID pal, PaletteID default_pal)
Applies PALETTE_MODIFIER_COLOUR to a palette entry of a ground sprite.
GoodsEntry goods[NUM_CARGO]
Goods at this station.
@ ROADSTOPTYPE_ALL
This RoadStop is for both types of station road stops.
@ RSF_CB141_RANDOM_BITS
Callback 141 needs random bits.
constexpr T SetBit(T &x, const uint8_t y)
Set a bit in a variable.
CargoTypes cached_roadstop_cargo_triggers
NOSAVE: Combined cargo trigger bitmask for road stops.
static constexpr TimerGame< struct Calendar >::Date DAYS_TILL_ORIGINAL_BASE_YEAR
The date of the first day of the original base year.
RoadStopType
Types of RoadStops.
@ ROADSTOP_TRUCK
A standard stop for trucks.
std::vector< RoadStopSpecList > roadstop_speclist
List of road stop specs of this station.
Town * ClosestTownFromTile(TileIndex tile, uint threshold)
Return the town closest (in distance or ownership) to a given tile, within a given threshold.
@ SAT_250_TICKS
Trigger station every 250 ticks.
byte waiting_triggers
Waiting triggers (NewGRF) for this station.
@ SPRITE_WIDTH
number of bits for the sprite number
Town * town
The town this station is associated with.
static BaseStation * GetByTile(TileIndex tile)
Get the base station belonging to a specific tile.
uint GetSpecCount() const
Get the number of allocated specs within the class.
uint16_t triggers
The triggers that trigger animation.
@ SAT_NEW_CARGO
Trigger station on new cargo arrival.
@ RSRT_CARGO_TAKEN
Trigger roadstop when cargo is completely taken.
@ ROADSTOPTYPE_FREIGHT
This RoadStop is for freight (truck) stops.
constexpr static debug_inline uint GB(const T x, const uint8_t s, const uint8_t n)
Fetch n bits from x, started at bit s.
Tindex index
Index of this pool item.
#define INSTANTIATE_NEWGRF_CLASS_METHODS(name, Tspec, Tid, Tmax)
Force instantiation of the methods so we don't get linker errors.
SpriteID sprite
The 'real' sprite.
TileIndex tile
Tile of the station.
Interface for SpriteGroup-s to access the gamestate.
@ SAT_CARGO_TAKEN
Trigger station when cargo is completely taken.
constexpr TileIndex INVALID_TILE
The very nice invalid tile marker.
const GRFFile * grffile
GRFFile the resolved SpriteGroup belongs to.
RoadType roadtype
Road type (used when no tile)
RoadStopCallbackMask
Callback masks for road stops.
static IterateWrapper Iterate(size_t from=0)
Returns an iterable ensemble of all valid CargoSpec.
TileIndex xy
town center tile
Specification of a cargo type.
bool GetIfNewStopsByType(RoadStopType rs, RoadType roadtype)
Checks if there's any new stations by a specific RoadStopType.
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 ...
void DrawCommonTileSeqInGUI(int x, int y, const DrawTileSprites *dts, int32_t orig_offset, uint32_t newgrf_offset, PaletteID default_palette, bool child_offset_is_unsigned)
Draws a tile sprite sequence in the GUI.
CallbackID
List of implemented NewGRF callbacks.
uint32_t PaletteID
The number of the palette.
@ ROADSTOP_DRAW_MODE_OVERLAY
Drive-through stops: Draw the road overlay, e.g. pavement.
void TriggerRoadStopRandomisation(Station *st, TileIndex tile, RoadStopRandomTrigger trigger, CargoID cargo_type=INVALID_CARGO)
Trigger road stop randomisation.
Owner owner
The owner of this station.
@ INVALID_ROADTYPE
flag for invalid roadtype
uint8_t GetReverseRoadTypeTranslation(RoadType roadtype, const GRFFile *grffile)
Perform a reverse roadtype lookup to get the GRF internal ID.
uint TotalCount() const
Returns total count of cargo at the station, including cargo which is already reserved for loading.
bool GetIfClassHasNewStopsByType(RoadStopClass *roadstopclass, RoadStopType rs, RoadType roadtype)
Checks if the given RoadStopClass has any specs assigned to it, compatible with the given RoadStopTyp...
bool IsCustomRoadStopSpecIndex(Tile t)
Is there a custom road stop spec on this tile?
HouseZonesBits GetTownRadiusGroup(const Town *t, TileIndex tile)
Returns the bit corresponding to the town zone of the specified tile.
void DrawRoadStopTile(int x, int y, RoadType roadtype, const RoadStopSpec *spec, StationType type, int view)
Draw representation of a road stop tile for GUI purposes.
StationCargoList cargo
The cargo packets of cargo waiting in this station.
StationType
Station types.
PalSpriteID ground
Palette and sprite for the ground.
bool IsUIAvailable(uint index) const
Check whether the spec will be available to the user at some point in time.
SpriteID GetCustomRoadSprite(const RoadTypeInfo *rti, TileIndex tile, RoadTypeSpriteGroup rtsg, TileContext context, uint *num_results)
Get the sprite to draw for the given tile.
@ RSF_BUILD_MENU_TRAM_ONLY
Only show in the tram build menu (not road).
std::vector< const SpriteGroup * > loading
List of loading groups (can be SpriteIDs or Callback results)
uint DistanceManhattan(TileIndex t0, TileIndex t1)
Gets the Manhattan distance between the two given tiles.
@ CBM_ROAD_STOP_ANIMATION_SPEED
Customize the animation speed of the road stop.
StationGfx GetStationGfx(Tile t)
Get the station graphics of this tile.
@ CBM_ROAD_STOP_ANIMATION_NEXT_FRAME
Use a custom next frame callback.
uint32_t GetCompanyInfo(CompanyID owner, const Livery *l)
Returns company information like in vehicle var 43 or station var 43.
const SpriteGroup * root_spritegroup
Root SpriteGroup to use for resolving.
static bool IsExpected(const BaseStation *st)
Helper for checking whether the given station is of this type.
static constexpr CargoID SG_DEFAULT
Default type used when no more-specific cargo matches.
Struct containing information relating to NewGRF classes for stations and airports.
CargoTypes GetEmptyMask(const Station *st)
Get a mask of the cargo types that are empty at the station.
uint32_t GetNearbyTileInformation(TileIndex tile, bool grf_version8)
Common part of station var 0x67, house var 0x62, indtile var 0x60, industry var 0x62.
CompanyID _local_company
Company controlled by the human player at this client. Can also be COMPANY_SPECTATOR.
virtual uint32_t GetNewGRFVariable(const struct ResolverObject &object, byte variable, byte parameter, bool *available) const =0
Helper function to get a NewGRF variable that isn't implemented by the base class.
@ ROTSG_ROADSTOP
Required: Bay stop surface.
Slope GetTileSlope(TileIndex tile, int *h)
Return the slope of a given tile inside the map.
Ground palette sprite of a tile, together with its sprite layout.
@ TCX_NORMAL
Nothing special.
GRFFilePropsBase< NUM_CARGO+3 > grf_prop
Properties related the the grf file.
void DrawSprite(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub, ZoomLevel zoom)
Draw a sprite, not in a viewport.
static void ChangeAnimationFrame(CallbackID cb, const RoadStopSpec *spec, BaseStation *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.
Scope resolver for a town.
static Station * From(BaseStation *st)
Converts a BaseStation to SpecializedStation with type checking.
uint GetCustomRoadStopSpecIndex(Tile t)
Get the custom road stop spec for this tile.
@ CBID_STATION_ANIM_NEXT_FRAME
Called to determine station tile next animation frame.
uint32_t SpriteID
The number of a sprite, without mapping bits and colourtables.
static void InsertDefaults()
Initialise the defaults.
TownScopeResolver * town_scope
The town scope resolver (created on the first call).
StationType GetStationType(Tile t)
Get the station type of this tile.
uint32_t GetVariable(byte variable, [[maybe_unused]] uint32_t parameter, bool *available) const override
Get a variable value.
CargoID cargo_type
Type of cargo of the station.
uint16_t local_id
id defined by the grf file for this entity
const RoadTypeInfo * GetRoadTypeInfo(RoadType roadtype)
Returns a pointer to the Roadtype information for a given roadtype.
uint DistanceSquare(TileIndex t0, TileIndex t1)
Gets the 'Square' distance between the two given tiles.
uint32_t grfid
GRF ID of this custom road stop.
@ ROADSTOP_CLASS_WAYP
Waypoint class (unimplemented: this is reserved for future use with road waypoints).
@ ROADSTOP_BUS
A standard stop for buses.
@ ROADSTOP_CLASS_DFLT
Default road stop class.
CompanyID _current_company
Company currently doing an action.
const struct SpriteGroup * spritegroup[Tcnt]
pointer to the different sprites of the entity
@ CBID_STATION_ANIM_START_STOP
Called for periodically starting or stopping the animation.
StationID GetStationIndex(Tile t)
Get StationID from a tile.
@ ROADSTOP_DRAW_MODE_ROAD
Bay stops: Draw the road itself.
@ ROADSTOP_CLASS_MAX
Maximum number of classes.
const struct RoadStopSpec * roadstopspec
Station (type) specification.
@ ROTSG_OVERLAY
Optional: Images for overlaying track.
@ RSRT_NEW_CARGO
Trigger roadstop on arrival of new cargo.
StationAnimationTrigger
Animation triggers for station.
void MarkTileDirtyByTile(TileIndex tile, int bridge_level_offset, int tile_height_override)
Mark a tile given by its index dirty for repaint.
static constexpr CargoID SG_PURCHASE
Used in purchase lists before an item exists.
static Station * GetByTile(TileIndex tile)
Get the station belonging to a specific tile.
StringID name
Name of this class.
RoadType
The different roadtypes we support.
@ CBID_STATION_ANIMATION_SPEED
Called to indicate how long the current animation frame should last.
Base class for all station-ish types.
RoadStopScopeResolver roadstop_scope
The stop scope resolver.
static void AnimateTile(const RoadStopSpec *spec, BaseStation *obj, TileIndex tile, bool random_animation, int extra_data=0)
Animate a single tile.
@ RSF_BUILD_MENU_ROAD_ONLY
Only show in the road build menu (not tram).
uint16_t random_bits
Random bits assigned to this station.
const SpriteGroup * ResolveReal(const RealSpriteGroup *group) const override
Get the real sprites of the grf.
Helper class for a unified approach to NewGRF animation.
virtual const SpriteGroup * Resolve([[maybe_unused]] ResolverObject &object) const
Base sprite group resolver.
uint8_t cached_roadstop_anim_triggers
NOSAVE: Combined animation trigger bitmask for road stops, used to determine if trigger processing sh...
static NewGRFClass * Get(Tid cls_id)
Get a particular class.
byte CargoID
Cargo slots to indicate a cargo type within a game.
TileIndex GetNearbyTile(byte parameter, TileIndex tile, bool signed_offsets, Axis axis)
Get the tile at the given offset.
uint16_t localidx
Station ID within GRF of road stop.
static constexpr CargoID SG_DEFAULT_NA
Used only by stations and roads when no more-specific cargo matches.
bool IsValidCargoID(CargoID t)
Test whether cargo type is not INVALID_CARGO.
PaletteID pal
The palette (use PAL_NONE) if not needed)
static Date date
Current date in days (day counter).
uint32_t GetRandomBits() const override
Get a few random bits.
ResolverObject & ro
Surrounding resolver object.
void RoadStopUpdateCachedTriggers(BaseStation *st)
Update the cached animation trigger bitmask for a station.
const struct GRFFile * grffile
grf file that introduced this entity
bool IsRoadStopTile(Tile t)
Is tile t a road stop station?
uint32_t GetTriggers() const override
Get the triggers.
uint8_t view
Station axis.
Helper class for animation control.
std::vector< RoadStopTileData > custom_roadstop_tile_data
List of custom road stop tile data.
bool GetIfStopIsForType(const RoadStopSpec *roadstopspec, RoadStopType rs, RoadType roadtype)
Checks if the given RoadStopSpec is compatible with the given RoadStopType.
std::array< uint8_t, NUM_CARGO > cargo_map
Inverse cargo translation table (CargoID -> local ID)
CargoTypes cargo_triggers
Bitmask of cargo types which cause trigger re-randomizing.
StationType type
Station type.
Action 2 sprite layout for houses, industry tiles, objects and airport tiles.
@ ROADSTOPTYPE_PASSENGER
This RoadStop is for passenger (bus) stops.
TimerGameCalendar::Date build_date
Date of construction.
constexpr debug_inline bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.