OpenTTD Source 20250312-master-gcdcc6b491d
rail.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
10#ifndef RAIL_H
11#define RAIL_H
12
13#include "rail_type.h"
14#include "track_type.h"
15#include "gfx_type.h"
16#include "core/bitmath_func.hpp"
17#include "core/enum_type.hpp"
18#include "economy_func.h"
19#include "slope_type.h"
20#include "strings_type.h"
22#include "signal_type.h"
23#include "settings_type.h"
24#include "newgrf_badge_type.h"
25
27enum class RailTypeFlag : uint8_t {
28 Catenary = 0,
29 NoLevelCrossing = 1,
30 Hidden = 2,
31 NoSpriteCombine = 3,
32 Allow90Deg = 4,
33 Disallow90Deg = 5,
34};
36
37struct SpriteGroup;
38
56
79
88
111
113typedef std::vector<RailTypeLabel> RailTypeLabelList;
114
119public:
124 struct {
138
143 struct {
152 SpriteID signals[SIGTYPE_END][2][2];
154
155 struct {
165
166 struct {
174
177
180
183
188
193
197 uint8_t curve_speed;
198
203
208
213
218
222 uint16_t max_speed;
223
227 RailTypeLabel label;
228
233
237 uint8_t map_colour;
238
247
253
258
263
267 const GRFFile *grffile[RTSG_END];
268
272 const SpriteGroup *group[RTSG_END];
273
274 std::vector<BadgeID> badges;
275
276 inline bool UsesOverlay() const
277 {
278 return this->group[RTSG_GROUND] != nullptr;
279 }
280
288 inline uint GetRailtypeSpriteOffset() const
289 {
290 return 82 * this->fallback_railtype;
291 }
292};
293
294
300inline const RailTypeInfo *GetRailTypeInfo(RailType railtype)
301{
302 extern RailTypeInfo _railtypes[RAILTYPE_END];
303 assert(railtype < RAILTYPE_END);
304 return &_railtypes[railtype];
305}
306
315inline bool IsCompatibleRail(RailType enginetype, RailType tiletype)
316{
317 return HasBit(GetRailTypeInfo(enginetype)->compatible_railtypes, tiletype);
318}
319
328inline bool HasPowerOnRail(RailType enginetype, RailType tiletype)
329{
330 return HasBit(GetRailTypeInfo(enginetype)->powered_railtypes, tiletype);
331}
332
342
351{
352 if (rt1 == INVALID_RAILTYPE || rt2 == INVALID_RAILTYPE) return def;
353
354 const RailTypeInfo *rti1 = GetRailTypeInfo(rt1);
355 const RailTypeInfo *rti2 = GetRailTypeInfo(rt2);
356
357 bool rt1_90deg = rti1->flags.Test(RailTypeFlag::Disallow90Deg) || (!rti1->flags.Test(RailTypeFlag::Allow90Deg) && def);
358 bool rt2_90deg = rti2->flags.Test(RailTypeFlag::Disallow90Deg) || (!rti2->flags.Test(RailTypeFlag::Allow90Deg) && def);
359
360 return rt1_90deg || rt2_90deg;
361}
362
369{
370 assert(railtype < RAILTYPE_END);
371 return (_price[PR_BUILD_RAIL] * GetRailTypeInfo(railtype)->cost_multiplier) >> 3;
372}
373
380{
381 /* Clearing rail in fact earns money, but if the build cost is set
382 * very low then a loophole exists where money can be made.
383 * In this case we limit the removal earnings to 3/4s of the build
384 * cost.
385 */
386 assert(railtype < RAILTYPE_END);
387 return std::max(_price[PR_CLEAR_RAIL], -RailBuildCost(railtype) * 3 / 4);
388}
389
397{
398 /* Get the costs for removing and building anew
399 * A conversion can never be more costly */
400 Money rebuildcost = RailBuildCost(to) + RailClearCost(from);
401
402 /* Conversion between somewhat compatible railtypes:
403 * Pay 1/8 of the target rail cost (labour costs) and additionally any difference in the
404 * build costs, if the target type is more expensive (material upgrade costs).
405 * Upgrade can never be more expensive than re-building. */
406 if (HasPowerOnRail(from, to) || HasPowerOnRail(to, from)) {
407 Money upgradecost = RailBuildCost(to) / 8 + std::max((Money)0, RailBuildCost(to) - RailBuildCost(from));
408 return std::min(upgradecost, rebuildcost);
409 }
410
411 /* make the price the same as remove + build new type for rail types
412 * which are not compatible in any way */
413 return rebuildcost;
414}
415
423inline Money RailMaintenanceCost(RailType railtype, uint32_t num, uint32_t total_num)
424{
425 assert(railtype < RAILTYPE_END);
426 return (_price[PR_INFRASTRUCTURE_RAIL] * GetRailTypeInfo(railtype)->maintenance_multiplier * num * (1 + IntSqrt(total_num))) >> 11; // 4 bits fraction for the multiplier and 7 bits scaling.
427}
428
434inline Money SignalMaintenanceCost(uint32_t num)
435{
436 return (_price[PR_INFRASTRUCTURE_RAIL] * 15 * num * (1 + IntSqrt(num))) >> 8; // 1 bit fraction for the multiplier and 7 bits scaling.
437}
438
439void DrawTrainDepotSprite(int x, int y, int image, RailType railtype);
440int TicksToLeaveDepot(const Train *v);
441
443
444
445bool HasRailTypeAvail(const CompanyID company, const RailType railtype);
446bool HasAnyRailTypesAvail(const CompanyID company);
447bool ValParamRailType(const RailType rail);
448
449RailTypes AddDateIntroducedRailTypes(RailTypes current, TimerGameCalendar::Date date);
450
451RailTypes GetCompanyRailTypes(CompanyID company, bool introduces = true);
452RailTypes GetRailTypes(bool introduces);
453
454RailType GetRailTypeByLabel(RailTypeLabel label, bool allow_alternate_labels = true);
455
456void ResetRailTypes();
457void InitRailTypes();
458RailType AllocateRailType(RailTypeLabel label);
459
460extern std::vector<RailType> _sorted_railtypes;
461extern RailTypes _railtypes_hidden_mask;
462
463#endif /* RAIL_H */
Functions related to bit mathematics.
debug_inline constexpr bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.
constexpr bool Test(Tvalue_type value) const
Test if the value-th bit is set.
This struct contains all the info that is needed to draw and construct tracks.
Definition rail.h:118
SpriteID single_x
single piece of rail in X direction, without ground
Definition rail.h:128
SpriteID bridge_offset
Bridge offset.
Definition rail.h:187
uint16_t max_speed
Maximum speed for vehicles travelling on this rail type.
Definition rail.h:222
SpriteID build_tunnel
button for building a tunnel
Definition rail.h:150
CursorID rail_swne
Cursor for building rail in X direction.
Definition rail.h:157
SpriteID convert_rail
button for converting rail
Definition rail.h:151
CursorID convert
Cursor for converting track.
Definition rail.h:163
CursorID depot
Cursor for building a depot.
Definition rail.h:161
TimerGameCalendar::Date introduction_date
Introduction date.
Definition rail.h:246
RailTypes powered_railtypes
bitmask to the OTHER railtypes on which an engine of THIS railtype generates power
Definition rail.h:179
RailTypes introduces_railtypes
Bitmask of which other railtypes are introduced when this railtype is introduced.
Definition rail.h:257
SpriteID ground
ground sprite for a 3-way switch
Definition rail.h:127
CursorID rail_nwse
Cursor for building rail in Y direction.
Definition rail.h:159
RailTypes introduction_required_railtypes
Bitmask of railtypes that are required for this railtype to be introduced at a given introduction_dat...
Definition rail.h:252
SpriteID build_x_rail
button for building single rail in X direction
Definition rail.h:145
uint8_t sorting_order
The sorting order of this railtype for the toolbar dropdown.
Definition rail.h:262
RailTypeLabel label
Unique 32 bit rail type identifier.
Definition rail.h:227
SpriteID single_n
single piece of rail in the northern corner
Definition rail.h:130
struct RailTypeInfo::@24 strings
Strings associated with the rail type.
CursorID tunnel
Cursor for building a tunnel.
Definition rail.h:162
uint16_t maintenance_multiplier
Cost multiplier for maintenance of this rail type.
Definition rail.h:212
SpriteID crossing
level crossing, rail in X direction
Definition rail.h:135
const SpriteGroup * group[RTSG_END]
Sprite groups for resolving sprites.
Definition rail.h:272
uint8_t map_colour
Colour on mini-map.
Definition rail.h:237
CursorID rail_ew
Cursor for building rail in E-W direction.
Definition rail.h:158
SpriteID auto_rail
button for the autorail construction
Definition rail.h:148
CursorID autorail
Cursor for autorail tool.
Definition rail.h:160
SpriteID single_y
single piece of rail in Y direction, without ground
Definition rail.h:129
StringID menu_text
Name of this rail type in the main toolbar dropdown.
Definition rail.h:169
StringID name
Name of this rail type.
Definition rail.h:167
RailTypes compatible_railtypes
bitmask to the OTHER railtypes on which an engine of THIS railtype can physically travel
Definition rail.h:182
uint8_t fallback_railtype
Original railtype number to use when drawing non-newgrf railtypes, or when drawing stations.
Definition rail.h:192
uint GetRailtypeSpriteOffset() const
Offset between the current railtype and normal rail.
Definition rail.h:288
StringID toolbar_caption
Caption in the construction toolbar GUI for this rail type.
Definition rail.h:168
SpriteID single_s
single piece of rail in the southern corner
Definition rail.h:131
RailTypeFlags flags
Bit mask of rail type flags.
Definition rail.h:202
uint8_t curve_speed
Multiplier for curve maximum speed advantage.
Definition rail.h:197
SpriteID signals[SIGTYPE_END][2][2]
signal GUI sprites (type, variant, state)
Definition rail.h:152
SpriteID build_ew_rail
button for building single rail in E-W direction
Definition rail.h:146
SpriteID build_y_rail
button for building single rail in Y direction
Definition rail.h:147
uint16_t cost_multiplier
Cost multiplier for building this rail type.
Definition rail.h:207
SpriteID track_ns
two pieces of rail in North and South corner (East-West direction)
Definition rail.h:126
StringID replace_text
Text used in the autoreplace GUI.
Definition rail.h:171
RailTypeLabelList alternate_labels
Rail type labels this type provides in addition to the main label.
Definition rail.h:232
StringID build_caption
Caption of the build vehicle GUI for this rail type.
Definition rail.h:170
SpriteID snow_offset
sprite number difference between a piece of track on a snowy ground and the corresponding one on norm...
Definition rail.h:176
SpriteID track_y
single piece of rail in Y direction, with ground
Definition rail.h:125
SpriteID build_depot
button for building depots
Definition rail.h:149
struct RailTypeInfo::@23 cursor
Cursors associated with the rail type.
SpriteID single_w
single piece of rail in the western corner
Definition rail.h:133
SpriteID single_e
single piece of rail in the eastern corner
Definition rail.h:132
SpriteID build_ns_rail
button for building single rail in N-S direction
Definition rail.h:144
CursorID rail_ns
Cursor for building rail in N-S direction.
Definition rail.h:156
struct RailTypeInfo::@22 gui_sprites
struct containing the sprites for the rail GUI.
StringID new_loco
Name of an engine for this type of rail in the engine preview GUI.
Definition rail.h:172
const GRFFile * grffile[RTSG_END]
NewGRF providing the Action3 for the railtype.
Definition rail.h:267
SpriteID tunnel
tunnel sprites base
Definition rail.h:136
SpriteID single_sloped
single piece of rail for slopes
Definition rail.h:134
struct RailTypeInfo::@21 base_sprites
Struct containing the main sprites.
uint8_t acceleration_type
Acceleration type of this rail type.
Definition rail.h:217
uint32_t IntSqrt(uint32_t num)
Compute the integer square root.
Definition math_func.cpp:42
Functions related to the economy.
Type (helpers) for enums.
Types related to the graphics and/or input devices.
uint32_t SpriteID
The number of a sprite, without mapping bits and colourtables.
Definition gfx_type.h:17
uint32_t CursorID
The number of the cursor (sprite)
Definition gfx_type.h:19
Types related to NewGRF badges.
Money RailConvertCost(RailType from, RailType to)
Calculates the cost of rail conversion.
Definition rail.h:396
int TicksToLeaveDepot(const Train *v)
Compute number of ticks when next wagon will leave a depot.
RailTrackBridgeOffset
Offsets for sprites within a bridge surface overlay set.
Definition rail.h:83
@ RTBO_Y
Piece of rail in Y direction.
Definition rail.h:85
@ RTBO_X
Piece of rail in X direction.
Definition rail.h:84
@ RTBO_SLOPE
Sloped rail pieces, in order NE, SE, SW, NW.
Definition rail.h:86
Money RailClearCost(RailType railtype)
Returns the 'cost' of clearing the specified railtype.
Definition rail.h:379
Money RailBuildCost(RailType railtype)
Returns the cost of building the specified railtype.
Definition rail.h:368
RailType AllocateRailType(RailTypeLabel label)
Allocate a new rail type label.
Definition rail_cmd.cpp:150
bool HasAnyRailTypesAvail(const CompanyID company)
Test if any buildable railtype is available for a company.
Definition rail.cpp:196
RailFenceOffset
Offsets from base sprite for fence sprites.
Definition rail.h:93
@ RFO_FLAT_RIGHT
Slope FLAT, Track RIGHT, Fence W.
Definition rail.h:104
@ RFO_FLAT_Y_NE
Slope FLAT, Track Y, Fence NE.
Definition rail.h:95
@ RFO_SLOPE_NW_SW
Slope NW, Track Y, Fence SW.
Definition rail.h:109
@ RFO_FLAT_X_SE
Slope FLAT, Track X, Fence SE.
Definition rail.h:102
@ RFO_SLOPE_NW_NE
Slope NW, Track Y, Fence NE.
Definition rail.h:101
@ RFO_SLOPE_SE_SW
Slope SE, Track Y, Fence SW.
Definition rail.h:107
@ RFO_SLOPE_NE_SE
Slope NE, Track X, Fence SE.
Definition rail.h:108
@ RFO_FLAT_LOWER
Slope FLAT, Track LOWER, Fence N.
Definition rail.h:105
@ RFO_SLOPE_SW_SE
Slope SW, Track X, Fence SE.
Definition rail.h:106
@ RFO_FLAT_UPPER
Slope FLAT, Track UPPER, Fence S.
Definition rail.h:97
@ RFO_SLOPE_SE_NE
Slope SE, Track Y, Fence NE.
Definition rail.h:99
@ RFO_FLAT_Y_SW
Slope FLAT, Track Y, Fence SW.
Definition rail.h:103
@ RFO_FLAT_LEFT
Slope FLAT, Track LEFT, Fence E.
Definition rail.h:96
@ RFO_SLOPE_NE_NW
Slope NE, Track X, Fence NW.
Definition rail.h:100
@ RFO_FLAT_X_NW
Slope FLAT, Track X, Fence NW.
Definition rail.h:94
@ RFO_SLOPE_SW_NW
Slope SW, Track X, Fence NW.
Definition rail.h:98
Money RailMaintenanceCost(RailType railtype, uint32_t num, uint32_t total_num)
Calculates the maintenance cost of a number of track bits.
Definition rail.h:423
bool HasRailTypeAvail(const CompanyID company, const RailType railtype)
Finds out if a company has a certain buildable railtype available.
Definition rail.cpp:186
bool IsCompatibleRail(RailType enginetype, RailType tiletype)
Checks if an engine of the given RailType can drive on a tile with a given RailType.
Definition rail.h:315
void InitRailTypes()
Resolve sprites of custom rail types.
Definition rail_cmd.cpp:130
bool HasPowerOnRail(RailType enginetype, RailType tiletype)
Checks if an engine of the given RailType got power on a tile with a given RailType.
Definition rail.h:328
std::vector< RailTypeLabel > RailTypeLabelList
List of rail type labels.
Definition rail.h:113
RailTypes AddDateIntroducedRailTypes(RailTypes current, TimerGameCalendar::Date date)
Add the rail types that are to be introduced at the given date.
Definition rail.cpp:218
void ResetRailTypes()
Reset all rail type information to its default values.
Definition rail_cmd.cpp:65
Money SignalMaintenanceCost(uint32_t num)
Calculates the maintenance cost of a number of signals.
Definition rail.h:434
bool Rail90DegTurnDisallowed(RailType rt1, RailType rt2, bool def=_settings_game.pf.forbid_90_deg)
Test if 90 degree turns are disallowed between two railtypes.
Definition rail.h:350
const RailTypeInfo * GetRailTypeInfo(RailType railtype)
Returns a pointer to the Railtype information for a given railtype.
Definition rail.h:300
RailTypeFlag
Railtype flag bit numbers.
Definition rail.h:27
@ Catenary
Bit number for drawing a catenary.
@ Allow90Deg
Bit number for always allowed 90 degree turns, regardless of setting.
@ Disallow90Deg
Bit number for never allowed 90 degree turns, regardless of setting.
@ Hidden
Bit number for hiding from selection.
@ NoSpriteCombine
Bit number for using non-combined junctions.
@ NoLevelCrossing
Bit number for disallowing level crossings.
RailTypes GetCompanyRailTypes(CompanyID company, bool introduces=true)
Get the rail types the given company can build.
Definition rail.cpp:251
RailTypeSpriteGroup
Sprite groups for a railtype.
Definition rail.h:40
@ RTSG_GROUND
Main group of ground images.
Definition rail.h:43
@ RTSG_PYLONS
Catenary pylons.
Definition rail.h:46
@ RTSG_CURSORS
Cursor and toolbar icon images.
Definition rail.h:41
@ RTSG_GROUND_COMPLETE
Complete ground images.
Definition rail.h:53
@ RTSG_CROSSING
Level crossing overlay images.
Definition rail.h:48
@ RTSG_TUNNEL
Main group of ground images for snow or desert.
Definition rail.h:44
@ RTSG_WIRES
Catenary wires.
Definition rail.h:45
@ RTSG_OVERLAY
Images for overlaying track.
Definition rail.h:42
@ RTSG_SIGNALS
Signal images.
Definition rail.h:52
@ RTSG_DEPOT
Depot images.
Definition rail.h:49
@ RTSG_BRIDGE
Bridge surface images.
Definition rail.h:47
@ RTSG_TUNNEL_PORTAL
Tunnel portal overlay.
Definition rail.h:51
@ RTSG_FENCES
Fence images.
Definition rail.h:50
RailTypes GetRailTypes(bool introduces)
Get list of rail types, regardless of company availability.
Definition rail.cpp:282
Foundation GetRailFoundation(Slope tileh, TrackBits bits)
Checks if a track combination is valid on a specific slope and returns the needed foundation.
Definition rail_cmd.cpp:312
RailTrackOffset
Offsets for sprites within an overlay/underlay set.
Definition rail.h:61
@ RTO_Y
Piece of rail in Y direction.
Definition rail.h:63
@ RTO_S
Piece of rail in southern corner.
Definition rail.h:65
@ RTO_JUNCTION_NE
Ballast for junction 'pointing' NE.
Definition rail.h:74
@ RTO_JUNCTION_NSEW
Ballast for full junction.
Definition rail.h:77
@ RTO_JUNCTION_SW
Ballast for junction 'pointing' SW.
Definition rail.h:73
@ RTO_SLOPE_SE
Piece of rail on slope with south-east raised.
Definition rail.h:69
@ RTO_E
Piece of rail in eastern corner.
Definition rail.h:66
@ RTO_W
Piece of rail in western corner.
Definition rail.h:67
@ RTO_CROSSING_XY
Crossing of X and Y rail, with ballast.
Definition rail.h:72
@ RTO_SLOPE_SW
Piece of rail on slope with south-west raised.
Definition rail.h:70
@ RTO_SLOPE_NW
Piece of rail on slope with north-west raised.
Definition rail.h:71
@ RTO_JUNCTION_NW
Ballast for junction 'pointing' NW.
Definition rail.h:76
@ RTO_JUNCTION_SE
Ballast for junction 'pointing' SE.
Definition rail.h:75
@ RTO_SLOPE_NE
Piece of rail on slope with north-east raised.
Definition rail.h:68
@ RTO_X
Piece of rail in X direction.
Definition rail.h:62
@ RTO_N
Piece of rail in northern corner.
Definition rail.h:64
bool RailNoLevelCrossings(RailType rt)
Test if a RailType disallows build of level crossings.
Definition rail.h:338
RailType GetRailTypeByLabel(RailTypeLabel label, bool allow_alternate_labels=true)
Get the rail type for a given label.
Definition rail.cpp:311
bool ValParamRailType(const RailType rail)
Validate functions for rail building.
Definition rail.cpp:206
The different types of rail.
RailTypes
Allow incrementing of Track variables.
Definition rail_type.h:44
RailType
Enumeration for all possible railtypes.
Definition rail_type.h:27
@ RAILTYPE_END
Used for iterations.
Definition rail_type.h:33
@ INVALID_RAILTYPE
Flag for invalid railtype.
Definition rail_type.h:34
GameSettings _settings_game
Game settings of a running game or the scenario editor.
Definition settings.cpp:58
Types related to global configuration settings.
Types and classes related to signals.
Definitions of a slope.
Slope
Enumeration for the slope-type.
Definition slope_type.h:48
Foundation
Enumeration for Foundations.
Definition slope_type.h:93
Types related to strings.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
Dynamic data of a loaded NewGRF.
Definition newgrf.h:111
PathfinderSettings pf
settings for all pathfinders
bool forbid_90_deg
forbid trains to make 90 deg turns
Templated helper to make a type-safe 'typedef' representing a single POD value.
'Train' is either a loco or a wagon.
Definition train.h:90
Definition of the game-calendar-timer.
All types related to tracks.
TrackBits
Allow incrementing of Track variables.
Definition track_type.h:35