OpenTTD

- Main Page
- Related Pages
- Modules
- Namespaces
- Data Structures
- Files

- File List
- Globals

engine_base.h
Go to the documentation of this file.
1 /* $Id: engine_base.h 27797 2017-03-18 20:43:43Z alberth $ */
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 ENGINE_BASE_H
13 #define ENGINE_BASE_H
14
15 #include "engine_type.h"
16 #include "vehicle_type.h"
17 #include "core/pool_type.hpp"
18 #include "newgrf_commons.h"
19
20 typedef Pool<Engine, EngineID, 64, 64000> EnginePool;
21 extern EnginePool _engine_pool;
22
23 struct Engine : EnginePool::PoolItem<&_engine_pool> {
24 char *name;
25 Date intro_date;
26 Date age;
27 uint16 reliability;
28 uint16 reliability_spd_dec;
29 uint16 reliability_start;
30 uint16 reliability_max;
31 uint16 reliability_final;
32 uint16 duration_phase_1;
33 uint16 duration_phase_2;
34 uint16 duration_phase_3;
35 byte flags;
36 CompanyMask preview_asked;
37 CompanyByte preview_company;
38 byte preview_wait;
39 CompanyMask company_avail;
40 CompanyMask company_hidden;
41 uint8 original_image_index;
42 VehicleType type;
43
44 EngineInfo info;
45
46 union {
47 RailVehicleInfo rail;
48 RoadVehicleInfo road;
49 ShipVehicleInfo ship;
50 AircraftVehicleInfo air;
51 } u;
52
53 /* NewGRF related data */
60 GRFFilePropsBase<NUM_CARGO + 2> grf_prop;
61 uint16 overrides_count;
62 struct WagonOverride *overrides;
63 uint16 list_position;
64
65 Engine();
66 Engine(VehicleType type, EngineID base);
67 ~Engine();
68 bool IsEnabled() const;
69
81 CargoID GetDefaultCargoType() const
82 {
83 return this->info.cargo_type;
84 }
85
86 uint DetermineCapacity(const Vehicle *v, uint16 *mail_capacity = NULL) const;
87
88 bool CanCarryCargo() const;
89
101 uint GetDisplayDefaultCapacity(uint16 *mail_capacity = NULL) const
102 {
103 return this->DetermineCapacity(NULL, mail_capacity);
104 }
105
106 Money GetRunningCost() const;
107 Money GetCost() const;
108 uint GetDisplayMaxSpeed() const;
109 uint GetPower() const;
110 uint GetDisplayWeight() const;
111 uint GetDisplayMaxTractiveEffort() const;
112 Date GetLifeLengthInDays() const;
113 uint16 GetRange() const;
114 StringID GetAircraftTypeText() const;
115
121 inline bool IsHidden(CompanyByte c) const
122 {
123 return c < MAX_COMPANIES && HasBit(this->company_hidden, c);
124 }
125
130 inline bool IsGroundVehicle() const
131 {
132 return this->type == VEH_TRAIN || this->type == VEH_ROAD;
133 }
134
140 const GRFFile *GetGRF() const
141 {
142 return this->grf_prop.grffile;
143 }
144
145 uint32 GetGRFID() const;
146 };
147
148 struct EngineIDMapping {
149 uint32 grfid;
150 uint16 internal_id;
151 VehicleTypeByte type;
152 uint8 substitute_id;
153 };
154
159 struct EngineOverrideManager : SmallVector<EngineIDMapping, 256> {
160 static const uint NUM_DEFAULT_ENGINES;
161
162 void ResetToDefaultMapping();
163 EngineID GetID(VehicleType type, uint16 grf_local_id, uint32 grfid);
164
165 static bool ResetToCurrentNewGRFConfig();
166 };
167
168 extern EngineOverrideManager _engine_mngr;
169
170 #define FOR_ALL_ENGINES_FROM(var, start) FOR_ALL_ITEMS_FROM(Engine, engine_index, var, start)
171 #define FOR_ALL_ENGINES(var) FOR_ALL_ENGINES_FROM(var, 0)
172
173 #define FOR_ALL_ENGINES_OF_TYPE(e, engine_type) FOR_ALL_ENGINES(e) if (e->type == engine_type)
174
175 static inline const EngineInfo *EngInfo(EngineID e)
176 {
177 return &Engine::Get(e)->info;
178 }
179
180 static inline const RailVehicleInfo *RailVehInfo(EngineID e)
181 {
182 return &Engine::Get(e)->u.rail;
183 }
184
185 static inline const RoadVehicleInfo *RoadVehInfo(EngineID e)
186 {
187 return &Engine::Get(e)->u.road;
188 }
189
190 static inline const ShipVehicleInfo *ShipVehInfo(EngineID e)
191 {
192 return &Engine::Get(e)->u.ship;
193 }
194
195 static inline const AircraftVehicleInfo *AircraftVehInfo(EngineID e)
196 {
197 return &Engine::Get(e)->u.air;
198 }
199
200 #endif /* ENGINE_BASE_H */