OpenTTD
rail.h
Go to the documentation of this file.
1 /* $Id$ */
2 
3 /*
4  * This file is part of OpenTTD.
5  * 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.
6  * 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.
7  * 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/>.
8  */
9 
12 #ifndef RAIL_H
13 #define RAIL_H
14 
15 #include "rail_type.h"
16 #include "track_type.h"
17 #include "gfx_type.h"
18 #include "core/bitmath_func.hpp"
19 #include "economy_func.h"
20 #include "slope_type.h"
21 #include "strings_type.h"
22 #include "date_type.h"
23 #include "signal_type.h"
24 
29  RTF_HIDDEN = 2,
30 
31  RTFB_NONE = 0,
35 };
37 
38 struct SpriteGroup;
39 
54  RTSG_END,
55 };
56 
78 };
79 
87 };
88 
110 };
111 
114 
119 public:
124  struct {
137  } base_sprites;
138 
143  struct {
152  SpriteID signals[SIGTYPE_END][2][2];
153  } gui_sprites;
154 
155  struct {
164  } cursor;
165 
166  struct {
173  } strings;
174 
177 
180 
183 
188 
193 
198 
203 
208 
213 
218 
222  uint16 max_speed;
223 
227  RailTypeLabel label;
228 
233 
238 
247 
253 
258 
263 
267  const GRFFile *grffile[RTSG_END];
268 
272  const SpriteGroup *group[RTSG_END];
273 
274  inline bool UsesOverlay() const
275  {
276  return this->group[RTSG_GROUND] != NULL;
277  }
278 
286  inline uint GetRailtypeSpriteOffset() const
287  {
288  return 82 * this->fallback_railtype;
289  }
290 };
291 
292 
298 static inline const RailtypeInfo *GetRailTypeInfo(RailType railtype)
299 {
300  extern RailtypeInfo _railtypes[RAILTYPE_END];
301  assert(railtype < RAILTYPE_END);
302  return &_railtypes[railtype];
303 }
304 
313 static inline bool IsCompatibleRail(RailType enginetype, RailType tiletype)
314 {
315  return HasBit(GetRailTypeInfo(enginetype)->compatible_railtypes, tiletype);
316 }
317 
326 static inline bool HasPowerOnRail(RailType enginetype, RailType tiletype)
327 {
328  return HasBit(GetRailTypeInfo(enginetype)->powered_railtypes, tiletype);
329 }
330 
336 static inline bool RailNoLevelCrossings(RailType rt)
337 {
339 }
340 
346 static inline Money RailBuildCost(RailType railtype)
347 {
348  assert(railtype < RAILTYPE_END);
349  return (_price[PR_BUILD_RAIL] * GetRailTypeInfo(railtype)->cost_multiplier) >> 3;
350 }
351 
357 static inline Money RailClearCost(RailType railtype)
358 {
359  /* Clearing rail in fact earns money, but if the build cost is set
360  * very low then a loophole exists where money can be made.
361  * In this case we limit the removal earnings to 3/4s of the build
362  * cost.
363  */
364  assert(railtype < RAILTYPE_END);
365  return max(_price[PR_CLEAR_RAIL], -RailBuildCost(railtype) * 3 / 4);
366 }
367 
374 static inline Money RailConvertCost(RailType from, RailType to)
375 {
376  /* Get the costs for removing and building anew
377  * A conversion can never be more costly */
378  Money rebuildcost = RailBuildCost(to) + RailClearCost(from);
379 
380  /* Conversion between somewhat compatible railtypes:
381  * Pay 1/8 of the target rail cost (labour costs) and additionally any difference in the
382  * build costs, if the target type is more expensive (material upgrade costs).
383  * Upgrade can never be more expensive than re-building. */
384  if (HasPowerOnRail(from, to) || HasPowerOnRail(to, from)) {
385  Money upgradecost = RailBuildCost(to) / 8 + max((Money)0, RailBuildCost(to) - RailBuildCost(from));
386  return min(upgradecost, rebuildcost);
387  }
388 
389  /* make the price the same as remove + build new type for rail types
390  * which are not compatible in any way */
391  return rebuildcost;
392 }
393 
401 static inline Money RailMaintenanceCost(RailType railtype, uint32 num, uint32 total_num)
402 {
403  assert(railtype < RAILTYPE_END);
404  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.
405 }
406 
412 static inline Money SignalMaintenanceCost(uint32 num)
413 {
414  return (_price[PR_INFRASTRUCTURE_RAIL] * 15 * num * (1 + IntSqrt(num))) >> 8; // 1 bit fraction for the multiplier and 7 bits scaling.
415 }
416 
417 void DrawTrainDepotSprite(int x, int y, int image, RailType railtype);
418 int TicksToLeaveDepot(const Train *v);
419 
421 
422 
423 bool HasRailtypeAvail(const CompanyID company, const RailType railtype);
424 bool HasAnyRailtypesAvail(const CompanyID company);
425 bool ValParamRailtype(const RailType rail);
426 
428 
429 RailType GetBestRailtype(const CompanyID company);
431 
432 RailType GetRailTypeByLabel(RailTypeLabel label, bool allow_alternate_labels = true);
433 
434 void ResetRailTypes();
435 void InitRailTypes();
436 RailType AllocateRailType(RailTypeLabel label);
437 
438 extern RailType _sorted_railtypes[RAILTYPE_END];
439 extern uint8 _sorted_railtypes_size;
440 extern RailTypes _railtypes_hidden_mask;
441 
446 #define FOR_ALL_SORTED_RAILTYPES(var) for (uint8 index = 0; index < _sorted_railtypes_size && (var = _sorted_railtypes[index], true) ; index++)
447 
448 #endif /* RAIL_H */
All types related to tracks.
Used for iterations.
Definition: rail_type.h:35
Piece of rail on slope with north-west raised.
Definition: rail.h:71
static 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:326
SpriteID crossing
level crossing, rail in X direction
Definition: rail.h:135
DECLARE_ENUM_AS_BIT_SET(GenderEthnicity) enum CompanyManagerFaceVariable
Bitgroups of the CompanyManagerFace variable.
const SpriteGroup * group[RTSG_END]
Sprite groups for resolving sprites.
Definition: rail.h:272
RailTypeFlags
Railtype flags.
Definition: rail.h:26
static const RailtypeInfo * GetRailTypeInfo(RailType railtype)
Returns a pointer to the Railtype information for a given railtype.
Definition: rail.h:298
const GRFFile * grffile[RTSG_END]
NewGRF providing the Action3 for the railtype.
Definition: rail.h:267
Definitions of a slope.
Slope NW, Track Y, Fence NE.
Definition: rail.h:101
static Money RailConvertCost(RailType from, RailType to)
Calculates the cost of rail conversion.
Definition: rail.h:374
SpriteID single_sloped
single piece of rail for slopes
Definition: rail.h:134
SpriteID auto_rail
button for the autorail construction
Definition: rail.h:148
RailType
Enumeration for all possible railtypes.
Definition: rail_type.h:29
StringID toolbar_caption
Caption in the construction toolbar GUI for this rail type.
Definition: rail.h:168
Slope FLAT, Track Y, Fence NE.
Definition: rail.h:95
int TicksToLeaveDepot(const Train *v)
Compute number of ticks when next wagon will leave a depot.
Definition: rail_cmd.cpp:2900
byte curve_speed
Multiplier for curve maximum speed advantage.
Definition: rail.h:197
SpriteID build_y_rail
button for building single rail in Y direction
Definition: rail.h:147
Piece of rail in southern corner.
Definition: rail.h:65
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
RailTypeFlags flags
Bit mask of rail type flags.
Definition: rail.h:202
Bridge surface images.
Definition: rail.h:48
Ballast for junction &#39;pointing&#39; NE.
Definition: rail.h:74
Ballast for junction &#39;pointing&#39; NW.
Definition: rail.h:76
bool ValParamRailtype(const RailType rail)
Validate functions for rail building.
Definition: rail.cpp:208
RailTypes GetCompanyRailtypes(const CompanyID c)
Get the rail types the given company can build.
Definition: rail.cpp:267
Piece of rail on slope with north-east raised.
Definition: rail.h:68
Piece of rail in western corner.
Definition: rail.h:67
SpriteID single_e
single piece of rail in the eastern corner
Definition: rail.h:132
Fence images.
Definition: rail.h:51
RailTypeLabelList alternate_labels
Rail type labels this type provides in addition to the main label.
Definition: rail.h:232
static Money SignalMaintenanceCost(uint32 num)
Calculates the maintenance cost of a number of signals.
Definition: rail.h:412
Functions related to bit mathematics.
Slope FLAT, Track LOWER, Fence N.
Definition: rail.h:105
RailTypes compatible_railtypes
bitmask to the OTHER railtypes on which an engine of THIS railtype can physically travel ...
Definition: rail.h:182
struct RailtypeInfo::@39 cursor
Cursors associated with the rail type.
Slope FLAT, Track LEFT, Fence E.
Definition: rail.h:96
CursorID autorail
Cursor for autorail tool.
Definition: rail.h:160
static T max(const T a, const T b)
Returns the maximum of two values.
Definition: math_func.hpp:26
static bool RailNoLevelCrossings(RailType rt)
Test if a RailType disallows build of level crossings.
Definition: rail.h:336
SpriteID track_y
single piece of rail in Y direction, with ground
Definition: rail.h:125
StringID menu_text
Name of this rail type in the main toolbar dropdown.
Definition: rail.h:169
StringID new_loco
Name of an engine for this type of rail in the engine preview GUI.
Definition: rail.h:172
CursorID rail_ew
Cursor for building rail in E-W direction.
Definition: rail.h:158
Catenary pylons.
Definition: rail.h:47
StringID build_caption
Caption of the build vehicle GUI for this rail type.
Definition: rail.h:170
This struct contains all the info that is needed to draw and construct tracks.
Definition: rail.h:118
SpriteID signals[SIGTYPE_END][2][2]
signal GUI sprites (type, variant, state)
Definition: rail.h:152
RailFenceOffset
Offsets from base sprite for fence sprites.
Definition: rail.h:93
SpriteID single_y
single piece of rail in Y direction, without ground
Definition: rail.h:129
TrackBits
Bitfield corresponding to Track.
Definition: track_type.h:41
CursorID tunnel
Cursor for building a tunnel.
Definition: rail.h:162
struct RailtypeInfo::@40 strings
Strings associated with the rail type.
Types and classes related to signals.
Foundation
Enumeration for Foundations.
Definition: slope_type.h:95
SpriteID ground
ground sprite for a 3-way switch
Definition: rail.h:127
RailType AllocateRailType(RailTypeLabel label)
Allocate a new rail type label.
Definition: rail_cmd.cpp:161
Sloped rail pieces, in order NE, SE, SW, NW.
Definition: rail.h:86
Piece of rail in X direction.
Definition: rail.h:84
Level crossing overlay images.
Definition: rail.h:49
Images for overlaying track.
Definition: rail.h:43
Slope SE, Track Y, Fence SW.
Definition: rail.h:107
Slope FLAT, Track UPPER, Fence S.
Definition: rail.h:97
struct RailtypeInfo::@37 base_sprites
Struct containing the main sprites.
Piece of rail on slope with south-west raised.
Definition: rail.h:70
Piece of rail in X direction.
Definition: rail.h:62
SpriteID build_ns_rail
button for building single rail in N-S direction
Definition: rail.h:144
uint8 acceleration_type
Acceleration type of this rail type.
Definition: rail.h:217
RailTypes introduces_railtypes
Bitmask of which other railtypes are introduced when this railtype is introduced. ...
Definition: rail.h:257
byte sorting_order
The sorting order of this railtype for the toolbar dropdown.
Definition: rail.h:262
Value for drawing a catenary.
Definition: rail.h:32
Slope SW, Track X, Fence NW.
Definition: rail.h:98
Value for hiding from selection.
Definition: rail.h:34
uint16 max_speed
Maximum speed for vehicles travelling on this rail type.
Definition: rail.h:222
SpriteID single_w
single piece of rail in the western corner
Definition: rail.h:133
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:332
bool HasRailtypeAvail(const CompanyID company, const RailType railtype)
Finds out if a company has a certain buildable railtype available.
Definition: rail.cpp:188
CursorID rail_nwse
Cursor for building rail in Y direction.
Definition: rail.h:159
Bit number for drawing a catenary.
Definition: rail.h:27
Crossing of X and Y rail, with ballast.
Definition: rail.h:72
SpriteID single_x
single piece of rail in X direction, without ground
Definition: rail.h:128
SpriteID convert_rail
button for converting rail
Definition: rail.h:151
static Money RailClearCost(RailType railtype)
Returns the &#39;cost&#39; of clearing the specified railtype.
Definition: rail.h:357
Depot images.
Definition: rail.h:50
RailTrackBridgeOffset
Offsets for sprites within a bridge surface overlay set.
Definition: rail.h:83
static T min(const T a, const T b)
Returns the minimum of two values.
Definition: math_func.hpp:42
RailTypeLabel label
Unique 32 bit rail type identifier.
Definition: rail.h:227
RailTypes
The different railtypes we support, but then a bitmask of them.
Definition: rail_type.h:53
All flags cleared.
Definition: rail.h:31
Piece of rail in Y direction.
Definition: rail.h:63
uint32 StringID
Numeric value that represents a string, independent of the selected language.
Definition: strings_type.h:18
Piece of rail on slope with south-east raised.
Definition: rail.h:69
Piece of rail in Y direction.
Definition: rail.h:85
Slope FLAT, Track X, Fence SE.
Definition: rail.h:102
SpriteID single_n
single piece of rail in the northern corner
Definition: rail.h:130
Piece of rail in eastern corner.
Definition: rail.h:66
SpriteID single_s
single piece of rail in the southern corner
Definition: rail.h:131
Piece of rail in northern corner.
Definition: rail.h:64
StringID replace_text
Text used in the autoreplace GUI.
Definition: rail.h:171
Slope NE, Track X, Fence NW.
Definition: rail.h:100
SpriteID build_depot
button for building depots
Definition: rail.h:149
&#39;Train&#39; is either a loco or a wagon.
Definition: train.h:88
CursorID depot
Cursor for building a depot.
Definition: rail.h:161
Bit number for hiding from selection.
Definition: rail.h:29
CursorID convert
Cursor for converting track.
Definition: rail.h:163
Date introduction_date
Introduction date.
Definition: rail.h:246
uint16 cost_multiplier
Cost multiplier for building this rail type.
Definition: rail.h:207
RailTypeSpriteGroup
Sprite groups for a railtype.
Definition: rail.h:41
RailTypes AddDateIntroducedRailTypes(RailTypes current, Date date)
Add the rail types that are to be introduced at the given date.
Definition: rail.cpp:235
uint32 SpriteID
The number of a sprite, without mapping bits and colourtables.
Definition: gfx_type.h:19
CursorID rail_swne
Cursor for building rail in X direction.
Definition: rail.h:157
Slope FLAT, Track RIGHT, Fence W.
Definition: rail.h:104
byte fallback_railtype
Original railtype number to use when drawing non-newgrf railtypes, or when drawing stations...
Definition: rail.h:192
static Money RailBuildCost(RailType railtype)
Returns the cost of building the specified railtype.
Definition: rail.h:346
Functions related to the economy.
Value for disallowing level crossings.
Definition: rail.h:33
Cursor and toolbar icon images.
Definition: rail.h:42
Tunnel portal overlay.
Definition: rail.h:52
byte map_colour
Colour on mini-map.
Definition: rail.h:237
void InitRailTypes()
Resolve sprites of custom rail types.
Definition: rail_cmd.cpp:141
Slope
Enumeration for the slope-type.
Definition: slope_type.h:50
SpriteID build_tunnel
button for building a tunnel
Definition: rail.h:150
Ballast for junction &#39;pointing&#39; SE.
Definition: rail.h:75
Ballast for junction &#39;pointing&#39; SW.
Definition: rail.h:73
Main group of ground images.
Definition: rail.h:44
Slope SE, Track Y, Fence NE.
Definition: rail.h:99
static 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:313
RailTypes powered_railtypes
bitmask to the OTHER railtypes on which an engine of THIS railtype generates power ...
Definition: rail.h:179
Catenary wires.
Definition: rail.h:46
uint GetRailtypeSpriteOffset() const
Offset between the current railtype and normal rail.
Definition: rail.h:286
void ResetRailTypes()
Reset all rail type information to its default values.
Definition: rail_cmd.cpp:66
uint32 CursorID
The number of the cursor (sprite)
Definition: gfx_type.h:21
SmallVector< RailTypeLabel, 4 > RailTypeLabelList
List of rail type labels.
Definition: rail.h:113
Slope SW, Track X, Fence SE.
Definition: rail.h:106
RailType GetBestRailtype(const CompanyID company)
Returns the "best" railtype a company can build.
Definition: rail.cpp:220
SpriteID bridge_offset
Bridge offset.
Definition: rail.h:187
struct RailtypeInfo::@38 gui_sprites
struct containing the sprites for the rail GUI.
Types related to strings.
Types related to the dates in OpenTTD.
int32 Date
The type to store our dates in.
Definition: date_type.h:16
StringID name
Name of this rail type.
Definition: rail.h:167
RailTrackOffset
Offsets for sprites within an overlay/underlay set.
Definition: rail.h:61
uint32 IntSqrt(uint32 num)
Compute the integer square root.
Definition: math_func.cpp:79
SpriteID tunnel
tunnel sprites base
Definition: rail.h:136
CursorID rail_ns
Cursor for building rail in N-S direction.
Definition: rail.h:156
Slope NE, Track X, Fence SE.
Definition: rail.h:108
static bool HasBit(const T x, const uint8 y)
Checks if a bit in a value is set.
Main group of ground images for snow or desert.
Definition: rail.h:45
SpriteID track_ns
two pieces of rail in North and South corner (East-West direction)
Definition: rail.h:126
Ballast for full junction.
Definition: rail.h:77
Slope FLAT, Track X, Fence NW.
Definition: rail.h:94
RailType GetRailTypeByLabel(RailTypeLabel label, bool allow_alternate_labels=true)
Get the rail type for a given label.
Definition: rail.cpp:295
Owner
Enum for all companies/owners.
Definition: company_type.h:20
Signal images.
Definition: rail.h:53
SpriteID build_x_rail
button for building single rail in X direction
Definition: rail.h:145
Slope NW, Track Y, Fence SW.
Definition: rail.h:109
static Money RailMaintenanceCost(RailType railtype, uint32 num, uint32 total_num)
Calculates the maintenance cost of a number of track bits.
Definition: rail.h:401
SpriteID build_ew_rail
button for building single rail in E-W direction
Definition: rail.h:146
Bit number for disallowing level crossings.
Definition: rail.h:28
bool HasAnyRailtypesAvail(const CompanyID company)
Test if any buildable railtype is available for a company.
Definition: rail.cpp:198
Types related to the graphics and/or input devices.
Slope FLAT, Track Y, Fence SW.
Definition: rail.h:103
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
Dynamic data of a loaded NewGRF.
Definition: newgrf.h:104
uint16 maintenance_multiplier
Cost multiplier for maintenance of this rail type.
Definition: rail.h:212
The different types of rail.