OpenTTD Source  20241108-master-g80f628063a
newgrf_roadstop.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 
12 #ifndef NEWGRF_ROADSTATION_H
13 #define NEWGRF_ROADSTATION_H
14 
15 #include "newgrf_animation_type.h"
16 #include "newgrf_spritegroup.h"
17 #include "newgrf_class.h"
18 #include "newgrf_commons.h"
19 #include "newgrf_town.h"
20 #include "road.h"
21 
23 static const int NUM_ROADSTOPS_PER_GRF = UINT16_MAX - 1;
24 
25 static const uint32_t ROADSTOP_CLASS_LABEL_DEFAULT = 'DFLT';
26 static const uint32_t ROADSTOP_CLASS_LABEL_WAYPOINT = 'WAYP';
27 
28 enum RoadStopClassID : uint16_t {
32  ROADSTOP_CLASS_MAX = UINT16_MAX,
33 };
35 
36 /* Some Triggers etc. */
43 };
44 
49 enum RoadStopAvailabilityType : uint8_t {
53 
54  ROADSTOPTYPE_END,
55 };
56 
61 enum RoadStopDrawMode : uint8_t {
62  ROADSTOP_DRAW_MODE_NONE = 0,
66 };
68 
77 };
78 
80  RSV_BAY_NE = 0,
81  RSV_BAY_SE = 1,
82  RSV_BAY_SW = 2,
83  RSV_BAY_NW = 3,
86 };
87 
91  struct BaseStation *st;
92  const struct RoadStopSpec *roadstopspec;
95  uint8_t view;
97 
100  {
101  }
102 
103  uint32_t GetRandomBits() const override;
104  uint32_t GetTriggers() const override;
105 
106  uint32_t GetVariable(uint8_t variable, [[maybe_unused]] uint32_t parameter, bool &available) const override;
107 };
108 
112  std::optional<TownScopeResolver> town_scope = std::nullopt;
113 
114  RoadStopResolverObject(const RoadStopSpec *roadstopspec, BaseStation *st, TileIndex tile, RoadType roadtype, StationType type, uint8_t view, CallbackID callback = CBID_NO_CALLBACK, uint32_t param1 = 0, uint32_t param2 = 0);
115 
116  ScopeResolver *GetScope(VarSpriteGroupScope scope = VSG_SCOPE_SELF, uint8_t relative = 0) override
117  {
118  switch (scope) {
119  case VSG_SCOPE_SELF: return &this->roadstop_scope;
120  case VSG_SCOPE_PARENT: {
121  TownScopeResolver *tsr = this->GetTown();
122  if (tsr != nullptr) return tsr;
123  [[fallthrough]];
124  }
125  default: return ResolverObject::GetScope(scope, relative);
126  }
127  }
128 
129  TownScopeResolver *GetTown();
130 
131  const SpriteGroup *ResolveReal(const RealSpriteGroup *group) const override;
132 };
133 
135 struct RoadStopSpec : NewGRFSpecBase<RoadStopClassID> {
144 
147  uint8_t callback_mask = 0;
148  uint16_t flags = 0;
149 
150  CargoTypes cargo_triggers = 0;
151 
152  AnimationInfo animation;
153 
154  uint8_t bridge_height[6];
156 
157  uint8_t build_cost_multiplier = 16;
158  uint8_t clear_cost_multiplier = 16;
159 
164  Money GetBuildCost(Price category) const { return GetPrice(category, this->build_cost_multiplier, this->grf_prop.grffile, -4); }
165 
170  Money GetClearCost(Price category) const { return GetPrice(category, this->clear_cost_multiplier, this->grf_prop.grffile, -4); }
171 
172  static const RoadStopSpec *Get(uint16_t index);
173 };
174 
176 
177 void DrawRoadStopTile(int x, int y, RoadType roadtype, const RoadStopSpec *spec, StationType type, int view);
178 
179 uint16_t GetRoadStopCallback(CallbackID callback, uint32_t param1, uint32_t param2, const RoadStopSpec *roadstopspec, BaseStation *st, TileIndex tile, RoadType roadtype, StationType type, uint8_t view);
180 
181 void AnimateRoadStopTile(TileIndex tile);
182 uint8_t GetRoadStopTileAnimationSpeed(TileIndex tile);
183 void TriggerRoadStopAnimation(BaseStation *st, TileIndex tile, StationAnimationTrigger trigger, CargoID cargo_type = INVALID_CARGO);
184 void TriggerRoadStopRandomisation(Station *st, TileIndex tile, RoadStopRandomTrigger trigger, CargoID cargo_type = INVALID_CARGO);
185 
186 bool GetIfNewStopsByType(RoadStopType rs, RoadType roadtype);
187 bool GetIfClassHasNewStopsByType(const RoadStopClass *roadstopclass, RoadStopType rs, RoadType roadtype);
188 bool GetIfStopIsForType(const RoadStopSpec *roadstopspec, RoadStopType rs, RoadType roadtype);
189 
190 const RoadStopSpec *GetRoadStopSpec(TileIndex t);
191 int AllocateSpecToRoadStop(const RoadStopSpec *statspec, BaseStation *st, bool exec);
192 void DeallocateSpecFromRoadStop(BaseStation *st, uint8_t specindex);
194 
200 inline bool IsWaypointClass(const RoadStopClass &cls)
201 {
202  return cls.global_id == ROADSTOP_CLASS_LABEL_WAYPOINT || GB(cls.global_id, 24, 8) == UINT8_MAX;
203 }
204 
205 #endif /* NEWGRF_ROADSTATION_H */
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.
uint8_t CargoID
Cargo slots to indicate a cargo type within a game.
Definition: cargo_type.h:22
Struct containing information relating to NewGRF classes for stations and airports.
Definition: newgrf_class.h:26
uint32_t global_id
Global ID for class, e.g. 'DFLT', 'WAYP', etc.
Definition: newgrf_class.h:48
DECLARE_ENUM_AS_BIT_SET(GenderEthnicity) enum CompanyManagerFaceVariable
Bitgroups of the CompanyManagerFace variable.
Money GetPrice(Price index, uint cost_factor, const GRFFile *grf_file, int shift)
Determine a certain price.
Definition: economy.cpp:969
Price
Enumeration of all base prices for use with Prices.
Definition: economy_type.h:89
#define DECLARE_POSTFIX_INCREMENT(enum_type)
Some enums need to have allowed incrementing (i.e.
Definition: enum_type.hpp:18
Definitions related to NewGRF animation.
StationAnimationTrigger
Animation triggers for station.
CallbackID
List of implemented NewGRF callbacks.
@ CBID_NO_CALLBACK
Set when using the callback resolve system, but not to resolve a callback.
Header file for classes to be used by e.g.
This file simplyfies and embeds a common mechanism of loading/saving and mapping of grf entities.
RoadStopDrawMode
Different draw modes to disallow rendering of some parts of the stop or road.
@ ROADSTOP_DRAW_MODE_ROAD
Bay stops: Draw the road itself.
@ ROADSTOP_DRAW_MODE_OVERLAY
Drive-through stops: Draw the road overlay, e.g. pavement.
@ ROADSTOP_DRAW_MODE_WAYP_GROUND
Waypoints: Draw the sprite layout ground tile (on top of the road)
RoadStopRandomTrigger
@ RSRT_VEH_ARRIVES
Trigger roadstop when road vehicle arrives.
@ RSRT_CARGO_TAKEN
Trigger roadstop when cargo is completely taken.
@ RSRT_NEW_CARGO
Trigger roadstop on arrival of new cargo.
@ RSRT_VEH_DEPARTS
Trigger roadstop when road vehicle leaves.
@ RSRT_VEH_LOADS
Trigger roadstop when road vehicle loads.
bool IsWaypointClass(const RoadStopClass &cls)
Test if a RoadStopClass is the waypoint class.
RoadStopView
@ RSV_BAY_NW
Bay road stop, facing Northwest.
@ RSV_BAY_SW
Bay road stop, facing Southwest.
@ RSV_BAY_SE
Bay road stop, facing Southeast.
@ RSV_BAY_NE
Bay road stop, facing Northeast.
@ RSV_DRIVE_THROUGH_X
Drive through road stop, X axis.
@ RSV_DRIVE_THROUGH_Y
Drive through road stop, Y axis.
RoadStopClassID
@ ROADSTOP_CLASS_BEGIN
The lowest valid value.
@ ROADSTOP_CLASS_DFLT
Default road stop class.
@ ROADSTOP_CLASS_MAX
Maximum number of classes.
@ ROADSTOP_CLASS_WAYP
Waypoint class.
void RoadStopUpdateCachedTriggers(BaseStation *st)
Update the cached animation trigger bitmask for a station.
RoadStopAvailabilityType
Various different options for availability, restricting the roadstop to be only for busses or for tru...
@ ROADSTOPTYPE_FREIGHT
This RoadStop is for freight (truck) stops.
@ ROADSTOPTYPE_ALL
This RoadStop is for both types of station road stops.
@ ROADSTOPTYPE_PASSENGER
This RoadStop is for passenger (bus) stops.
bool GetIfClassHasNewStopsByType(const RoadStopClass *roadstopclass, RoadStopType rs, RoadType roadtype)
Checks if the given RoadStopClass has any specs assigned to it, compatible with the given RoadStopTyp...
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.
RoadStopSpecFlags
@ RSF_NO_AUTO_ROAD_CONNECTION
No auto road connection.
@ RSF_NO_CATENARY
Do not show catenary.
@ RSF_CB141_RANDOM_BITS
Callback 141 needs random bits.
@ RSF_DRAW_MODE_REGISTER
Read draw mode from register 0x100.
@ RSF_DRIVE_THROUGH_ONLY
Stop is drive-through only.
@ RSF_BUILD_MENU_ROAD_ONLY
Only show in the road build menu (not tram).
@ RSF_BUILD_MENU_TRAM_ONLY
Only show in the tram build menu (not road).
bool GetIfNewStopsByType(RoadStopType rs, RoadType roadtype)
Checks if there's any new stations by a specific RoadStopType.
static const int NUM_ROADSTOPS_PER_GRF
The maximum amount of roadstops a single GRF is allowed to add.
bool GetIfStopIsForType(const RoadStopSpec *roadstopspec, RoadStopType rs, RoadType roadtype)
Checks if the given RoadStopSpec is compatible with the given RoadStopType.
void TriggerRoadStopRandomisation(Station *st, TileIndex tile, RoadStopRandomTrigger trigger, CargoID cargo_type=INVALID_CARGO)
Trigger road stop randomisation.
Action 2 handling.
VarSpriteGroupScope
@ VSG_SCOPE_SELF
Resolved object itself.
@ VSG_SCOPE_PARENT
Related object of the resolved one.
Functions to handle the town part of NewGRF towns.
Road specific functions.
RoadType
The different roadtypes we support.
Definition: road_type.h:25
RoadStopType
Types of RoadStops.
Definition: station_type.h:45
StationType
Station types.
Definition: station_type.h:31
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
Definition: strings_type.h:16
Information about animation.
Base class for all station-ish types.
const struct GRFFile * grffile
grf file that introduced this entity
uint16_t index
Index within class of this spec, invalid until inserted into class.
Definition: newgrf_class.h:19
Interface for SpriteGroup-s to access the gamestate.
CallbackID callback
Callback being resolved.
virtual ScopeResolver * GetScope(VarSpriteGroupScope scope=VSG_SCOPE_SELF, uint8_t relative=0)
Get a resolver for the scope.
Road stop resolver.
const SpriteGroup * ResolveReal(const RealSpriteGroup *group) const override
Get the real sprites of the grf.
std::optional< TownScopeResolver > town_scope
The town scope resolver (created on the first call).
ScopeResolver * GetScope(VarSpriteGroupScope scope=VSG_SCOPE_SELF, uint8_t relative=0) override
Get a resolver for the scope.
RoadStopScopeResolver roadstop_scope
The stop scope resolver.
Scope resolver for road stops.
uint8_t view
Station axis.
uint32_t GetTriggers() const override
Get the triggers.
RoadType roadtype
Road type (used when no tile)
StationType type
Station type.
const struct RoadStopSpec * roadstopspec
Station (type) specification.
CargoID cargo_type
Type of cargo of the station.
struct BaseStation * st
Instance of the station.
TileIndex tile
Tile of the station.
uint32_t GetVariable(uint8_t variable, [[maybe_unused]] uint32_t parameter, bool &available) const override
Get a variable value.
uint32_t GetRandomBits() const override
Get a few random bits.
Road stop specification.
StringID name
Name of this stop.
uint8_t bridge_height[6]
Minimum height for a bridge above, 0 for none.
uint8_t clear_cost_multiplier
Clear cost multiplier per tile.
Money GetBuildCost(Price category) const
Get the cost for building a road stop of this type.
uint8_t build_cost_multiplier
Build cost multiplier per tile.
CargoTypes cargo_triggers
Bitmask of cargo types which cause trigger re-randomizing.
uint8_t bridge_disallowed_pillars[6]
Disallowed pillar flags for a bridge above.
GRFFilePropsBase< NUM_CARGO+3 > grf_prop
Properties related the the grf file.
Money GetClearCost(Price category) const
Get the cost for clearing a road stop of this type.
Interface to query and set values specific to a single VarSpriteGroupScope (action 2 scope).
ResolverObject & ro
Surrounding resolver object.
Station data structure.
Definition: station_base.h:439
Scope resolver for a town.
Definition: newgrf_town.h:22