OpenTTD Source 20260108-master-g8ba1860eaa
roadveh.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 <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
6 */
7
10#ifndef ROADVEH_H
11#define ROADVEH_H
12
13#include "ground_vehicle.hpp"
14#include "engine_base.h"
15#include "cargotype.h"
16#include "track_func.h"
17#include "road.h"
18#include "road_map.h"
19#include "newgrf_engine.h"
20
21struct RoadVehicle;
22
24enum RoadVehicleStates : uint8_t {
25 /*
26 * Lower 4 bits are used for vehicle track direction. (Trackdirs)
27 * When in a road stop (bit 5 or bit 6 set) these bits give the
28 * track direction of the entry to the road stop.
29 * As the entry direction will always be a diagonal
30 * direction (X_NE, Y_SE, X_SW or Y_NW) only bits 0 and 3
31 * are needed to hold this direction. Bit 1 is then used to show
32 * that the vehicle is using the second road stop bay.
33 * Bit 2 is then used for drive-through stops to show the vehicle
34 * is stopping at this road stop.
35 */
36
37 /* Numeric values */
40
41 /* Bit numbers */
47
48 /* Bit sets of the above specified bits */
50 RVSB_IN_ROAD_STOP_END = RVSB_IN_ROAD_STOP + TRACKDIR_END,
52 RVSB_IN_DT_ROAD_STOP_END = RVSB_IN_DT_ROAD_STOP + TRACKDIR_END,
53
55
58};
59
61static const uint RDE_NEXT_TILE = 0x80;
62static const uint RDE_TURNED = 0x40;
63
64/* Start frames for when a vehicle enters a tile/changes its state.
65 * The start frame is different for vehicles that turned around or
66 * are leaving the depot as the do not start at the edge of the tile.
67 * For trams there are a few different start frames as there are two
68 * places where trams can turn. */
69static const uint RVC_DEFAULT_START_FRAME = 0;
70static const uint RVC_TURN_AROUND_START_FRAME = 1;
71static const uint RVC_DEPOT_START_FRAME = 6;
72static const uint RVC_START_FRAME_AFTER_LONG_TRAM = 21;
73static const uint RVC_TURN_AROUND_START_FRAME_SHORT_TRAM = 16;
74/* Stop frame for a vehicle in a drive-through stop */
75static const uint RVC_DRIVE_THROUGH_STOP_FRAME = 11;
76static const uint RVC_DEPOT_STOP_FRAME = 11;
77
79static const uint8_t RV_OVERTAKE_TIMEOUT = 35;
80
81void RoadVehUpdateCache(RoadVehicle *v, bool same_length = false);
82void GetRoadVehSpriteSize(EngineID engine, uint &width, uint &height, int &xoffs, int &yoffs, EngineImageType image_type);
83
92
93using RoadVehPathCache = std::vector<RoadVehPathElement>;
94
98struct RoadVehicle final : public GroundVehicle<RoadVehicle, VEH_ROAD> {
99 RoadVehPathCache path{};
100 uint8_t state = 0;
101 uint8_t frame = 0;
102 uint16_t blocked_ctr = 0;
103 uint8_t overtaking = 0;
104 uint8_t overtaking_ctr = 0;
105 uint16_t crashed_ctr = 0;
106 uint8_t reverse_ctr = 0;
107
109 VehicleID disaster_vehicle = VehicleID::Invalid();
111
114 ~RoadVehicle() override { this->PreDestructor(); }
115
116 friend struct GroundVehicle<RoadVehicle, VEH_ROAD>; // GroundVehicle needs to use the acceleration functions defined at RoadVehicle.
117
118 void MarkDirty() override;
119 void UpdateDeltaXY() override;
120 ExpensesType GetExpenseType(bool income) const override { return income ? EXPENSES_ROADVEH_REVENUE : EXPENSES_ROADVEH_RUN; }
121 bool IsPrimaryVehicle() const override { return this->IsFrontEngine(); }
122 void GetImage(Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) const override;
123 int GetDisplaySpeed() const override { return this->gcache.last_speed / 2; }
124 int GetDisplayMaxSpeed() const override { return this->vcache.cached_max_speed / 2; }
125 Money GetRunningCost() const override;
126 int GetDisplayImageWidth(Point *offset = nullptr) const;
127 bool IsInDepot() const override { return this->state == RVSB_IN_DEPOT; }
128 bool Tick() override;
129 void OnNewCalendarDay() override;
130 void OnNewEconomyDay() override;
131 uint Crash(bool flooded = false) override;
132 Trackdir GetVehicleTrackdir() const override;
135
136 bool IsBus() const;
137
138 int GetCurrentMaxSpeed() const override;
139 int UpdateSpeed();
140 void SetDestTile(TileIndex tile) override;
141
142protected: // These functions should not be called outside acceleration code.
143
148 inline uint16_t GetPower() const
149 {
150 /* Power is not added for articulated parts */
151 if (!this->IsArticulatedPart()) {
152 /* Road vehicle power is in units of 10 HP. */
153 return 10 * GetVehicleProperty(this, PROP_ROADVEH_POWER, RoadVehInfo(this->engine_type)->power);
154 }
155 return 0;
156 }
157
162 inline uint16_t GetPoweredPartPower(const RoadVehicle *) const
163 {
164 return 0;
165 }
166
171 inline uint16_t GetWeight() const
172 {
173 uint16_t weight = CargoSpec::Get(this->cargo_type)->WeightOfNUnits(this->cargo.StoredCount());
174
175 /* Vehicle weight is not added for articulated parts. */
176 if (!this->IsArticulatedPart()) {
177 /* Road vehicle weight is in units of 1/4 t. */
178 weight += GetVehicleProperty(this, PROP_ROADVEH_WEIGHT, RoadVehInfo(this->engine_type)->weight) / 4;
179 }
180
181 return weight;
182 }
183
188 uint16_t GetMaxWeight() const override;
189
194 inline uint8_t GetTractiveEffort() const
195 {
196 /* The tractive effort coefficient is in units of 1/256. */
197 return GetVehicleProperty(this, PROP_ROADVEH_TRACTIVE_EFFORT, RoadVehInfo(this->engine_type)->tractive_effort);
198 }
199
204 inline uint8_t GetAirDragArea() const
205 {
206 return 6;
207 }
208
213 inline uint8_t GetAirDrag() const
214 {
215 return RoadVehInfo(this->engine_type)->air_drag;
216 }
217
223 {
225 }
226
231 inline uint16_t GetCurrentSpeed() const
232 {
233 return this->cur_speed / 2;
234 }
235
240 inline uint32_t GetRollingFriction() const
241 {
242 /* Trams have a slightly greater friction coefficient than trains.
243 * The rest of road vehicles have bigger values. */
244 uint32_t coeff = RoadTypeIsTram(this->roadtype) ? 40 : 75;
245 /* The friction coefficient increases with speed in a way that
246 * it doubles at 128 km/h, triples at 256 km/h and so on. */
247 return coeff * (128 + this->GetCurrentSpeed()) / 128;
248 }
249
258
263 inline uint32_t GetSlopeSteepness() const
264 {
266 }
267
272 inline uint16_t GetMaxTrackSpeed() const
273 {
274 return GetRoadTypeInfo(GetRoadType(this->tile, GetRoadTramType(this->roadtype)))->max_speed;
275 }
276
281 inline bool TileMayHaveSlopedTrack() const
282 {
283 TrackStatus ts = GetTileTrackStatus(this->tile, TRANSPORT_ROAD, GetRoadTramType(this->roadtype));
284 TrackBits trackbits = TrackStatusToTrackBits(ts);
285
286 return trackbits == TRACK_BIT_X || trackbits == TRACK_BIT_Y;
287 }
288
297 {
298 const RoadVehicle *rv = this->First();
299
300 /* Check if this vehicle is in the same direction as the road under.
301 * We already know it has either GVF_GOINGUP_BIT or GVF_GOINGDOWN_BIT set. */
302
304 /* If the first vehicle is reversing, this vehicle may be reversing too
305 * (especially if this is the first, and maybe the only, vehicle).*/
306 return true;
307 }
308
309 while (rv != this) {
310 /* If any previous vehicle has different direction,
311 * we may be in the middle of reversing. */
312 if (this->direction != rv->direction) return true;
313 rv = rv->Next();
314 }
315
316 return false;
317 }
318};
319
320#endif /* ROADVEH_H */
Types/functions related to cargoes.
constexpr bool Test(Tvalue_type value) const
Test if the value-th bit is set.
uint16_t max_speed
Maximum speed for vehicles travelling on this road type.
Definition road.h:116
uint StoredCount() const
Returns sum of cargo on board the vehicle (ie not only reserved).
Direction
Defines the 8 directions on the map.
ExpensesType
Types of expenses.
@ EXPENSES_ROADVEH_RUN
Running costs road vehicles.
@ EXPENSES_ROADVEH_REVENUE
Revenue from road vehicles.
Base class for engines.
VehicleAccelerationModel
Acceleration model of a vehicle.
Definition engine_type.h:47
@ Normal
Default acceleration model.
Base class and functions for all vehicles that move through ground.
AccelStatus
What is the status of our acceleration?
@ AS_BRAKE
We want to stop.
@ AS_ACCEL
We want to go faster, if possible of course.
TrackStatus GetTileTrackStatus(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
Returns information about trackdirs and signal states.
Functions for NewGRF engines.
@ PROP_ROADVEH_WEIGHT
Weight in 1/4 t.
@ PROP_ROADVEH_TRACTIVE_EFFORT
Tractive effort coefficient in 1/256.
@ PROP_ROADVEH_POWER
Power in 10 HP.
Road specific functions.
const RoadTypeInfo * GetRoadTypeInfo(RoadType roadtype)
Returns a pointer to the Roadtype information for a given roadtype.
Definition road.h:215
Map accessors for roads.
RoadType
The different roadtypes we support.
Definition road_type.h:23
@ INVALID_ROADTYPE
flag for invalid roadtype
Definition road_type.h:28
RoadVehicleStates
Road vehicle states.
Definition roadveh.h:24
@ RVSB_IN_DT_ROAD_STOP
The vehicle is in a drive-through road stop.
Definition roadveh.h:51
@ RVS_ENTERED_STOP
Only set when a vehicle has entered the stop.
Definition roadveh.h:43
@ RVSB_IN_ROAD_STOP
The vehicle is in a road stop.
Definition roadveh.h:49
@ RVS_USING_SECOND_BAY
Only used while in a road stop.
Definition roadveh.h:42
@ RVSB_ROAD_STOP_TRACKDIR_MASK
Only bits 0 and 3 are used to encode the trackdir for road stops.
Definition roadveh.h:57
@ RVS_IN_DT_ROAD_STOP
The vehicle is in a drive-through road stop.
Definition roadveh.h:46
@ RVSB_TRACKDIR_MASK
The mask used to extract track dirs.
Definition roadveh.h:56
@ RVSB_DRIVE_SIDE
The vehicle is at the opposite side of the road.
Definition roadveh.h:54
@ RVS_IN_ROAD_STOP
The vehicle is in a road stop.
Definition roadveh.h:45
@ RVSB_IN_DEPOT
The vehicle is in a depot.
Definition roadveh.h:38
@ RVSB_WORMHOLE
The vehicle is in a tunnel and/or bridge.
Definition roadveh.h:39
@ RVS_DRIVE_SIDE
Only used when retrieving move data.
Definition roadveh.h:44
static const uint RDE_TURNED
We just finished turning.
Definition roadveh.h:62
static const uint8_t RV_OVERTAKE_TIMEOUT
The number of ticks a vehicle has for overtaking.
Definition roadveh.h:79
void GetRoadVehSpriteSize(EngineID engine, uint &width, uint &height, int &xoffs, int &yoffs, EngineImageType image_type)
Get the size of the sprite of a road vehicle sprite heading west (used for lists).
void RoadVehUpdateCache(RoadVehicle *v, bool same_length=false)
Update the cache of a road vehicle.
static const uint RDE_NEXT_TILE
State information about the Road Vehicle controller.
Definition roadveh.h:61
GameSettings _settings_game
Game settings of a running game or the scenario editor.
Definition settings.cpp:61
static CargoSpec * Get(size_t index)
Retrieve cargo details for the given cargo type.
Definition cargotype.h:137
Structure to return information about the closest depot location, and whether it could be found.
VehicleSettings vehicle
options for vehicles
uint16_t last_speed
The last speed we did display, so we only have to redraw when this changes.
Base class for all vehicles that move through ground.
GroundVehicle< RoadVehicle, Type > GroundVehicleBase
Our type.
GroundVehicleCache gcache
Cache of often calculated values.
const Tindex index
Index of this pool item.
Element of the RoadVehPathCache.
Definition roadveh.h:85
Trackdir trackdir
Trackdir for this element.
Definition roadveh.h:86
TileIndex tile
Tile for this element.
Definition roadveh.h:87
uint8_t air_drag
Coefficient of air drag.
Buses, trucks and trams belong to this class.
Definition roadveh.h:98
uint Crash(bool flooded=false) override
Common code executed for crashed ground vehicles.
uint8_t GetAirDragArea() const
Gets the area used for calculating air drag.
Definition roadveh.h:204
TileIndex GetOrderStationLocation(StationID station) override
Determine the location for the station where the vehicle goes to next.
void OnNewEconomyDay() override
Economy day handler.
uint8_t state
Definition roadveh.h:100
int GetDisplaySpeed() const override
Gets the speed in km-ish/h that can be sent into string parameters for string processing.
Definition roadveh.h:123
VehicleAccelerationModel GetAccelerationType() const
Allows to know the acceleration type of a vehicle.
Definition roadveh.h:254
int GetDisplayImageWidth(Point *offset=nullptr) const
Get the width of a road vehicle image in the GUI.
uint32_t GetSlopeSteepness() const
Returns the slope steepness used by this vehicle.
Definition roadveh.h:263
uint16_t GetPower() const
Allows to know the power value that this vehicle will use.
Definition roadveh.h:148
Money GetRunningCost() const override
Gets the running cost of a vehicle.
bool IsPrimaryVehicle() const override
Whether this is the primary vehicle in the chain.
Definition roadveh.h:121
uint16_t GetMaxWeight() const override
Calculates the weight value that this vehicle will have when fully loaded with its current cargo.
uint16_t GetCurrentSpeed() const
Calculates the current speed of this vehicle.
Definition roadveh.h:231
RoadTypes compatible_roadtypes
NOSAVE: Roadtypes this consist is powered on.
Definition roadveh.h:110
ExpensesType GetExpenseType(bool income) const override
Sets the expense type associated to this vehicle type.
Definition roadveh.h:120
AccelStatus GetAccelerationStatus() const
Checks the current acceleration status of this vehicle.
Definition roadveh.h:222
void UpdateDeltaXY() override
Updates the x and y offsets and the size of the sprite used for this vehicle.
uint16_t crashed_ctr
Animation counter when the vehicle has crashed.
Definition roadveh.h:105
bool IsBus() const
Check whether a roadvehicle is a bus.
uint8_t overtaking_ctr
The length of the current overtake attempt.
Definition roadveh.h:104
void OnNewCalendarDay() override
Calander day handler.
uint16_t GetMaxTrackSpeed() const
Gets the maximum speed allowed by the track for this vehicle.
Definition roadveh.h:272
uint32_t GetRollingFriction() const
Returns the rolling friction coefficient of this vehicle.
Definition roadveh.h:240
uint8_t GetTractiveEffort() const
Allows to know the tractive effort value that this vehicle will use.
Definition roadveh.h:194
bool IsInDepot() const override
Check whether the vehicle is in the depot.
Definition roadveh.h:127
void GetImage(Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) const override
Gets the sprite to show for the given direction.
int GetDisplayMaxSpeed() const override
Gets the maximum speed in km-ish/h that can be sent into string parameters for string processing.
Definition roadveh.h:124
RoadVehPathCache path
Cached path.
Definition roadveh.h:99
Trackdir GetVehicleTrackdir() const override
Returns the Trackdir on which the vehicle is currently located.
bool TileMayHaveSlopedTrack() const
Checks if the vehicle is at a tile that can be sloped.
Definition roadveh.h:281
int GetCurrentMaxSpeed() const override
Calculates the maximum speed of the vehicle under its current conditions.
bool HasToUseGetSlopePixelZ()
Road vehicles have to use GetSlopePixelZ() to compute their height if they are reversing because in t...
Definition roadveh.h:296
RoadType roadtype
NOSAVE: Roadtype of this vehicle.
Definition roadveh.h:108
uint8_t overtaking
Set to RVSB_DRIVE_SIDE when overtaking, otherwise 0.
Definition roadveh.h:103
int UpdateSpeed()
This function looks at the vehicle and updates its speed (cur_speed and subspeed) variables.
uint16_t GetPoweredPartPower(const RoadVehicle *) const
Returns a value if this articulated part is powered.
Definition roadveh.h:162
bool Tick() override
Calls the tick handler of the vehicle.
VehicleID disaster_vehicle
NOSAVE: Disaster vehicle targetting this vehicle.
Definition roadveh.h:109
ClosestDepot FindClosestDepot() override
Find the closest depot for this vehicle and tell us the location, DestinationID and whether we should...
uint16_t GetWeight() const
Allows to know the weight value that this vehicle will use.
Definition roadveh.h:171
~RoadVehicle() override
We want to 'destruct' the right class.
Definition roadveh.h:114
void MarkDirty() override
Marks the vehicles to be redrawn and updates cached variables.
uint8_t GetAirDrag() const
Gets the air drag coefficient of this vehicle.
Definition roadveh.h:213
T * Next() const
Get next vehicle in the chain.
T * First() const
Get the first vehicle in the chain.
uint16_t cached_max_speed
Maximum speed of the consist (minimum of the max speed of all vehicles in the consist).
uint8_t roadveh_slope_steepness
Steepness of hills for road vehicles when using realistic acceleration.
Sprite sequence for a vehicle part.
EngineID engine_type
The type of engine used for this vehicle.
Direction direction
facing
VehicleCargoList cargo
The cargo this vehicle is carrying.
VehStates vehstatus
Status.
bool IsArticulatedPart() const
Check if the vehicle is an articulated part of an engine.
CargoType cargo_type
type of cargo this vehicle is carrying
void PreDestructor()
Destroy all stuff that (still) needs the virtual functions to work properly.
Definition vehicle.cpp:797
VehicleCache vcache
Cache of often used vehicle values.
uint16_t cur_speed
current speed
bool IsFrontEngine() const
Check if the vehicle is a front engine.
TileIndex tile
Current tile index.
constexpr TileIndex INVALID_TILE
The very nice invalid tile marker.
Definition tile_type.h:95
Different conversion functions from one kind of track to another.
bool IsReversingRoadTrackdir(Trackdir dir)
Checks whether the trackdir means that we are reversing.
Definition track_func.h:673
TrackBits TrackStatusToTrackBits(TrackStatus ts)
Returns the present-track-information of a TrackStatus.
Definition track_func.h:363
TrackBits
Allow incrementing of Track variables.
Definition track_type.h:35
@ TRACK_BIT_Y
Y-axis track.
Definition track_type.h:38
@ TRACK_BIT_X
X-axis track.
Definition track_type.h:37
Trackdir
Enumeration for tracks and directions.
Definition track_type.h:66
@ INVALID_TRACKDIR
Flag for an invalid trackdir.
Definition track_type.h:85
@ TRACKDIR_END
Used for iterations.
Definition track_type.h:84
@ TRANSPORT_ROAD
Transport by road vehicle.
@ Stopped
Vehicle is stopped by the player.
EngineImageType
Visualisation contexts of vehicles and engines.
@ VEH_ROAD
Road vehicle type.