Files
@ r28486:aff297ed5a05
Branch filter:
Location: cpp/openttd-patchpack/source/src/engine_type.h - annotation
r28486:aff297ed5a05
9.3 KiB
text/x-c
Codechange: Allow constexpr NWidgetPart construction.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 | r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r8777:59b04e504aa5 r8777:59b04e504aa5 r8777:59b04e504aa5 r8777:59b04e504aa5 r8777:59b04e504aa5 r13476:add6db25d711 r8777:59b04e504aa5 r23698:1872cc5b7dd7 r8777:59b04e504aa5 r27166:64e04a3ef9b1 r8777:59b04e504aa5 r8777:59b04e504aa5 r8777:59b04e504aa5 r27737:728d55b97775 r8777:59b04e504aa5 r9070:e059c65164f3 r9070:e059c65164f3 r17472:0c79f01bb563 r8777:59b04e504aa5 r8777:59b04e504aa5 r8777:59b04e504aa5 r8777:59b04e504aa5 r8777:59b04e504aa5 r8777:59b04e504aa5 r17472:0c79f01bb563 r8777:59b04e504aa5 r17472:0c79f01bb563 r17472:0c79f01bb563 r17472:0c79f01bb563 r17472:0c79f01bb563 r17472:0c79f01bb563 r8777:59b04e504aa5 r8777:59b04e504aa5 r17472:0c79f01bb563 r8777:59b04e504aa5 r8777:59b04e504aa5 r8777:59b04e504aa5 r9923:fd1b105946d0 r26720:7e74964e5c55 r26720:7e74964e5c55 r27737:728d55b97775 r27737:728d55b97775 r27737:728d55b97775 r9720:6d491d07d0a8 r13476:add6db25d711 r8777:59b04e504aa5 r9720:6d491d07d0a8 r11479:dec827fa3319 r27737:728d55b97775 r11479:dec827fa3319 r11479:dec827fa3319 r11479:dec827fa3319 r11479:dec827fa3319 r15626:21d8c9ada4af r11479:dec827fa3319 r27737:728d55b97775 r8777:59b04e504aa5 r8777:59b04e504aa5 r17472:0c79f01bb563 r8777:59b04e504aa5 r8777:59b04e504aa5 r9923:fd1b105946d0 r27737:728d55b97775 r27737:728d55b97775 r8777:59b04e504aa5 r11932:f2bc1b879057 r13183:9f8ce87db9c1 r16504:0f05656995b0 r17838:9b7a4cc981f2 r17838:9b7a4cc981f2 r18024:9fef0937e079 r18024:9fef0937e079 r18024:9fef0937e079 r18024:9fef0937e079 r18024:9fef0937e079 r18024:9fef0937e079 r18024:9fef0937e079 r8777:59b04e504aa5 r8777:59b04e504aa5 r17472:0c79f01bb563 r17472:0c79f01bb563 r8777:59b04e504aa5 r17472:0c79f01bb563 r17472:0c79f01bb563 r15173:a59afd6301a6 r8777:59b04e504aa5 r8777:59b04e504aa5 r8777:59b04e504aa5 r8777:59b04e504aa5 r8777:59b04e504aa5 r17472:0c79f01bb563 r8777:59b04e504aa5 r8777:59b04e504aa5 r9923:fd1b105946d0 r8777:59b04e504aa5 r17474:de3bcebf8038 r11932:f2bc1b879057 r8777:59b04e504aa5 r27737:728d55b97775 r17474:de3bcebf8038 r27737:728d55b97775 r27737:728d55b97775 r8777:59b04e504aa5 r8777:59b04e504aa5 r17472:0c79f01bb563 r8777:59b04e504aa5 r8777:59b04e504aa5 r9923:fd1b105946d0 r8777:59b04e504aa5 r13476:add6db25d711 r11932:f2bc1b879057 r27737:728d55b97775 r8777:59b04e504aa5 r27737:728d55b97775 r27737:728d55b97775 r27737:728d55b97775 r27737:728d55b97775 r16504:0f05656995b0 r18303:3e17bd9b946b r23698:1872cc5b7dd7 r8777:59b04e504aa5 r8777:59b04e504aa5 r27737:728d55b97775 r26684:bd3e30073232 r26684:bd3e30073232 r26684:bd3e30073232 r26684:bd3e30073232 r26684:bd3e30073232 r26684:bd3e30073232 r26684:bd3e30073232 r26684:bd3e30073232 r15610:623a23fb6560 r15610:623a23fb6560 r8777:59b04e504aa5 r8777:59b04e504aa5 r8777:59b04e504aa5 r27166:64e04a3ef9b1 r27166:64e04a3ef9b1 r27166:64e04a3ef9b1 r9468:a092e2eb1209 r8777:59b04e504aa5 r17474:de3bcebf8038 r12733:799714c0c280 r22867:9bff1c966805 r8777:59b04e504aa5 r26838:0003b17a708e r27737:728d55b97775 r27737:728d55b97775 r26838:0003b17a708e r27737:728d55b97775 r26679:1156340816b0 r26684:bd3e30073232 r8777:59b04e504aa5 r8777:59b04e504aa5 r8777:59b04e504aa5 r8777:59b04e504aa5 r8777:59b04e504aa5 r15173:a59afd6301a6 r8777:59b04e504aa5 r8777:59b04e504aa5 r8777:59b04e504aa5 r8777:59b04e504aa5 r26672:e217fb99c0ac r18241:a4322e3af754 r18995:f351efee7911 r19221:9e0441276d88 r22461:8bf6c5210cf7 r8777:59b04e504aa5 r8777:59b04e504aa5 r8777:59b04e504aa5 r8777:59b04e504aa5 r8777:59b04e504aa5 r15173:a59afd6301a6 r8777:59b04e504aa5 r10207:a1fc2f2a33db r8777:59b04e504aa5 r8777:59b04e504aa5 r26839:2bed12525c08 r26839:2bed12525c08 r26839:2bed12525c08 r27737:728d55b97775 r27110:a28b840432e6 r27110:a28b840432e6 r27110:a28b840432e6 r27110:a28b840432e6 r27110:a28b840432e6 r26839:2bed12525c08 r26839:2bed12525c08 r26839:2bed12525c08 r27737:728d55b97775 r26839:2bed12525c08 r27737:728d55b97775 r26839:2bed12525c08 r26839:2bed12525c08 r17569:79cc833a8f35 r8777:59b04e504aa5 r17472:0c79f01bb563 r8777:59b04e504aa5 r8777:59b04e504aa5 | /*
* This file is part of OpenTTD.
* 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.
* 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.
* 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/>.
*/
/** @file engine_type.h Types related to engines. */
#ifndef ENGINE_TYPE_H
#define ENGINE_TYPE_H
#include "economy_type.h"
#include "rail_type.h"
#include "road_type.h"
#include "cargo_type.h"
#include "timer/timer_game_calendar.h"
#include "sound_type.h"
#include "strings_type.h"
typedef uint16_t EngineID; ///< Unique identification number of an engine.
struct Engine;
/** Available types of rail vehicles. */
enum RailVehicleTypes {
RAILVEH_SINGLEHEAD, ///< indicates a "standalone" locomotive
RAILVEH_MULTIHEAD, ///< indicates a combination of two locomotives
RAILVEH_WAGON, ///< simple wagon, not motorized
};
/** Type of rail engine. */
enum EngineClass {
EC_STEAM, ///< Steam rail engine.
EC_DIESEL, ///< Diesel rail engine.
EC_ELECTRIC, ///< Electric rail engine.
EC_MONORAIL, ///< Mono rail engine.
EC_MAGLEV, ///< Maglev engine.
};
/** Information about a rail vehicle. */
struct RailVehicleInfo {
byte image_index;
RailVehicleTypes railveh_type;
byte cost_factor; ///< Purchase cost factor; For multiheaded engines the sum of both engine prices.
RailType railtype; ///< Railtype, mangled if elrail is disabled.
RailType intended_railtype; ///< Intended railtype, regardless of elrail being enabled or disabled.
uint16_t max_speed; ///< Maximum speed (1 unit = 1/1.6 mph = 1 km-ish/h)
uint16_t power; ///< Power of engine (hp); For multiheaded engines the sum of both engine powers.
uint16_t weight; ///< Weight of vehicle (tons); For multiheaded engines the weight of each single engine.
byte running_cost; ///< Running cost of engine; For multiheaded engines the sum of both running costs.
Price running_cost_class;
EngineClass engclass; ///< Class of engine for this vehicle
byte capacity; ///< Cargo capacity of vehicle; For multiheaded engines the capacity of each single engine.
byte ai_passenger_only; ///< Bit value to tell AI that this engine is for passenger use only
uint16_t pow_wag_power; ///< Extra power applied to consist if wagon should be powered
byte pow_wag_weight; ///< Extra weight applied to consist if wagon should be powered
byte visual_effect; ///< Bitstuffed NewGRF visual effect data
byte shorten_factor; ///< length on main map for this type is 8 - shorten_factor
byte tractive_effort; ///< Tractive effort coefficient
byte air_drag; ///< Coefficient of air drag
byte user_def_data; ///< Property 0x25: "User-defined bit mask" Used only for (very few) NewGRF vehicles
int16_t curve_speed_mod; ///< Modifier to maximum speed in curves (fixed-point binary with 8 fractional bits)
};
/** Information about a ship vehicle. */
struct ShipVehicleInfo {
byte image_index;
byte cost_factor;
uint16_t max_speed; ///< Maximum speed (1 unit = 1/3.2 mph = 0.5 km-ish/h)
uint16_t capacity;
byte running_cost;
SoundID sfx;
bool old_refittable; ///< Is ship refittable; only used during initialisation. Later use EngineInfo::refit_mask.
byte visual_effect; ///< Bitstuffed NewGRF visual effect data
byte ocean_speed_frac; ///< Fraction of maximum speed for ocean tiles.
byte canal_speed_frac; ///< Fraction of maximum speed for canal/river tiles.
/** Apply ocean/canal speed fraction to a velocity */
uint ApplyWaterClassSpeedFrac(uint raw_speed, bool is_ocean) const
{
/* speed_frac == 0 means no reduction while 0xFF means reduction to 1/256. */
return raw_speed * (256 - (is_ocean ? this->ocean_speed_frac : this->canal_speed_frac)) / 256;
}
};
/**
* AircraftVehicleInfo subtypes, bitmask type.
* If bit 0 is 0 then it is a helicopter, otherwise it is a plane
* in which case bit 1 tells us whether it's a big(fast) plane or not.
*/
enum AircraftSubTypeBits {
AIR_HELI = 0,
AIR_CTOL = 1, ///< Conventional Take Off and Landing, i.e. planes
AIR_FAST = 2
};
/** Information about a aircraft vehicle. */
struct AircraftVehicleInfo {
byte image_index;
byte cost_factor;
byte running_cost;
byte subtype; ///< Type of aircraft. @see AircraftSubTypeBits
SoundID sfx;
byte acceleration;
uint16_t max_speed; ///< Maximum speed (1 unit = 8 mph = 12.8 km-ish/h)
byte mail_capacity; ///< Mail capacity (bags).
uint16_t passenger_capacity; ///< Passenger capacity (persons).
uint16_t max_range; ///< Maximum range of this aircraft.
};
/** Information about a road vehicle. */
struct RoadVehicleInfo {
byte image_index;
byte cost_factor;
byte running_cost;
Price running_cost_class;
SoundID sfx;
uint16_t max_speed; ///< Maximum speed (1 unit = 1/3.2 mph = 0.5 km-ish/h)
byte capacity;
uint8_t weight; ///< Weight in 1/4t units
uint8_t power; ///< Power in 10hp units
uint8_t tractive_effort; ///< Coefficient of tractive effort
uint8_t air_drag; ///< Coefficient of air drag
byte visual_effect; ///< Bitstuffed NewGRF visual effect data
byte shorten_factor; ///< length on main map for this type is 8 - shorten_factor
RoadType roadtype; ///< Road type
};
enum class ExtraEngineFlags : uint32_t {
None = 0,
NoNews = (1U << 0), ///< No 'new vehicle' news will be generated.
NoPreview = (1U << 1), ///< No exclusive preview will be offered.
JoinPreview = (1U << 2), ///< Engine will join exclusive preview with variant parent.
SyncReliability = (1U << 3), ///< Engine reliability will be synced with variant parent.
};
DECLARE_ENUM_AS_BIT_SET(ExtraEngineFlags);
/**
* Information about a vehicle
* @see table/engines.h
*/
struct EngineInfo {
TimerGameCalendar::Date base_intro; ///< Basic date of engine introduction (without random parts).
TimerGameCalendar::Year lifelength; ///< Lifetime of a single vehicle
TimerGameCalendar::Year base_life; ///< Basic duration of engine availability (without random parts). \c 0xFF means infinite life.
byte decay_speed;
byte load_amount;
byte climates; ///< Climates supported by the engine.
CargoID cargo_type;
CargoTypes refit_mask;
byte refit_cost;
byte misc_flags; ///< Miscellaneous flags. @see EngineMiscFlags
uint16_t callback_mask; ///< Bitmask of vehicle callbacks that have to be called
int8_t retire_early; ///< Number of years early to retire vehicle
StringID string_id; ///< Default name of engine
uint16_t cargo_age_period; ///< Number of ticks before carried cargo is aged.
EngineID variant_id; ///< Engine variant ID. If set, will be treated specially in purchase lists.
ExtraEngineFlags extra_flags;
};
/**
* EngineInfo.misc_flags is a bitmask, with the following values
*/
enum EngineMiscFlags {
EF_RAIL_TILTS = 0, ///< Rail vehicle tilts in curves
EF_ROAD_TRAM = 0, ///< Road vehicle is a tram/light rail vehicle
EF_USES_2CC = 1, ///< Vehicle uses two company colours
EF_RAIL_IS_MU = 2, ///< Rail vehicle is a multiple-unit (DMU/EMU)
EF_RAIL_FLIPS = 3, ///< Rail vehicle has old depot-flip handling
EF_AUTO_REFIT = 4, ///< Automatic refitting is allowed
EF_NO_DEFAULT_CARGO_MULTIPLIER = 5, ///< Use the new capacity algorithm. The default cargotype of the vehicle does not affect capacity multipliers. CB 15 is also called in purchase list.
EF_NO_BREAKDOWN_SMOKE = 6, ///< Do not show black smoke during a breakdown.
EF_SPRITE_STACK = 7, ///< Draw vehicle by stacking multiple sprites.
};
/**
* Engine.flags is a bitmask, with the following values.
*/
enum EngineFlags {
ENGINE_AVAILABLE = 1, ///< This vehicle is available to everyone.
ENGINE_EXCLUSIVE_PREVIEW = 2, ///< This vehicle is in the exclusive preview stage, either being used or being offered to a company.
};
/**
* Contexts an engine name can be shown in.
*/
enum EngineNameContext : uint8_t {
Generic = 0x00, ///< No specific context available.
VehicleDetails = 0x11, ///< Name is shown in the vehicle details GUI.
PurchaseList = 0x20, ///< Name is shown in the purchase list (including autoreplace window 'Available vehicles' panel).
PreviewNews = 0x21, ///< Name is shown in exclusive preview or newspaper.
AutoreplaceVehicleInUse = 0x22, ///< Name is show in the autoreplace window 'Vehicles in use' panel.
};
/** Combine an engine ID and a name context to an engine name dparam. */
inline uint64_t PackEngineNameDParam(EngineID engine_id, EngineNameContext context, uint32_t extra_data = 0)
{
return engine_id | (static_cast<uint64_t>(context) << 32) | (static_cast<uint64_t>(extra_data) << 40);
}
static const uint MAX_LENGTH_ENGINE_NAME_CHARS = 32; ///< The maximum length of an engine name in characters including '\0'
static const EngineID INVALID_ENGINE = 0xFFFF; ///< Constant denoting an invalid engine.
#endif /* ENGINE_TYPE_H */
|