mirror of https://github.com/OpenTTD/OpenTTD.git
(svn r8385) -Fix
-Regression (r8314): I only did half the necessary changes to move railtype from Engine to RailVehicleInfo. Now do the rest.
This commit is contained in:
parent
e2f72cbf1f
commit
0996de79df
|
@ -142,7 +142,7 @@ static EngineID AiChooseTrainToBuild(RailType railtype, int32 money, byte flag,
|
|||
const RailVehicleInfo *rvi = RailVehInfo(i);
|
||||
const Engine* e = GetEngine(i);
|
||||
|
||||
if (!IsCompatibleRail(e->railtype, railtype) ||
|
||||
if (!IsCompatibleRail(rvi->railtype, railtype) ||
|
||||
rvi->flags & RVI_WAGON ||
|
||||
(rvi->flags & RVI_MULTIHEAD && flag & 1) ||
|
||||
!HASBIT(e->player_avail, _current_player) ||
|
||||
|
@ -2365,7 +2365,7 @@ static EngineID AiFindBestWagon(CargoID cargo, RailType railtype)
|
|||
const RailVehicleInfo *rvi = RailVehInfo(i);
|
||||
const Engine* e = GetEngine(i);
|
||||
|
||||
if (!IsCompatibleRail(e->railtype, railtype) ||
|
||||
if (!IsCompatibleRail(rvi->railtype, railtype) ||
|
||||
!(rvi->flags & RVI_WAGON) ||
|
||||
!HASBIT(e->player_avail, _current_player)) {
|
||||
continue;
|
||||
|
|
|
@ -60,9 +60,9 @@ static void train_engine_drawing_loop(int *x, int *y, int *pos, int *sel, Engine
|
|||
|
||||
|
||||
colour = *sel == 0 ? 0xC : 0x10;
|
||||
if (!(ENGINE_AVAILABLE && show_outdated && RailVehInfo(i)->power && IsCompatibleRail(e->railtype, railtype))) {
|
||||
if ((!IsCompatibleRail(e->railtype, railtype) && show_compatible)
|
||||
|| (e->railtype != railtype && !show_compatible)
|
||||
if (!(ENGINE_AVAILABLE && show_outdated && RailVehInfo(i)->power && IsCompatibleRail(rvi->railtype, railtype))) {
|
||||
if ((!IsCompatibleRail(rvi->railtype, railtype) && show_compatible)
|
||||
|| (rvi->railtype != railtype && !show_compatible)
|
||||
|| !(rvi->flags & RVI_WAGON) != is_engine ||
|
||||
!HASBIT(e->player_avail, _local_player))
|
||||
continue;
|
||||
|
@ -113,16 +113,17 @@ static void SetupScrollStuffForReplaceWindow(Window *w)
|
|||
for (i = 0; i < NUM_TRAIN_ENGINES; i++) {
|
||||
EngineID eid = GetRailVehAtPosition(i);
|
||||
const Engine* e = GetEngine(eid);
|
||||
const RailVehicleInfo *rvi = RailVehInfo(eid);
|
||||
const EngineInfo* info = EngInfo(eid);
|
||||
|
||||
// left window contains compatible engines while right window only contains engines of the selected type
|
||||
if (ENGINE_AVAILABLE &&
|
||||
(RailVehInfo(eid)->power != 0) == (WP(w, replaceveh_d).wagon_btnstate != 0)) {
|
||||
if (IsCompatibleRail(e->railtype, railtype) && (p->num_engines[eid] > 0 || EngineHasReplacementForPlayer(p, eid))) {
|
||||
(rvi->power != 0) == (WP(w, replaceveh_d).wagon_btnstate != 0)) {
|
||||
if (IsCompatibleRail(rvi->railtype, railtype) && (p->num_engines[eid] > 0 || EngineHasReplacementForPlayer(p, eid))) {
|
||||
if (sel[0] == count) selected_id[0] = eid;
|
||||
count++;
|
||||
}
|
||||
if (e->railtype == railtype && HASBIT(e->player_avail, _local_player)) {
|
||||
if (rvi->railtype == railtype && HASBIT(e->player_avail, _local_player)) {
|
||||
if (sel[1] == count2) selected_id[1] = eid;
|
||||
count2++;
|
||||
}
|
||||
|
|
|
@ -386,7 +386,7 @@ static int DrawRailWagonPurchaseInfo(int x, int y, EngineID engine_number, const
|
|||
}
|
||||
|
||||
/* Draw locomotive specific details */
|
||||
static int DrawRailEnginePurchaseInfo(int x, int y, EngineID engine_number, const RailVehicleInfo *rvi, const Engine *e)
|
||||
static int DrawRailEnginePurchaseInfo(int x, int y, EngineID engine_number, const RailVehicleInfo *rvi)
|
||||
{
|
||||
int multihead = (rvi->flags&RVI_MULTIHEAD?1:0);
|
||||
|
||||
|
@ -403,7 +403,7 @@ static int DrawRailEnginePurchaseInfo(int x, int y, EngineID engine_number, cons
|
|||
y += 10;
|
||||
|
||||
/* Max tractive effort - not applicable if old acceleration or maglev */
|
||||
if (_patches.realistic_acceleration && e->railtype != RAILTYPE_MAGLEV) {
|
||||
if (_patches.realistic_acceleration && rvi->railtype != RAILTYPE_MAGLEV) {
|
||||
SetDParam(0, ((rvi->weight << multihead) * 10 * rvi->tractive_effort) / 256);
|
||||
DrawString(x, y, STR_PURCHASE_INFO_MAX_TE, 0);
|
||||
y += 10;
|
||||
|
@ -532,7 +532,7 @@ void DrawVehiclePurchaseInfo(int x, int y, uint w, EngineID engine_number)
|
|||
if (rvi->flags & RVI_WAGON) {
|
||||
y = DrawRailWagonPurchaseInfo(x, y, engine_number, rvi);
|
||||
} else {
|
||||
y = DrawRailEnginePurchaseInfo(x, y, engine_number, rvi, e);
|
||||
y = DrawRailEnginePurchaseInfo(x, y, engine_number, rvi);
|
||||
}
|
||||
|
||||
/* Cargo type + capacity, or N/A */
|
||||
|
@ -601,10 +601,9 @@ static void GenerateBuildTrainList(Window *w)
|
|||
* and if not, reset selection to INVALID_ENGINE. This could be the case
|
||||
* when engines become obsolete and are removed */
|
||||
for (sel_id = INVALID_ENGINE, eid = 0; eid < NUM_TRAIN_ENGINES; eid++) {
|
||||
const Engine *e = GetEngine(eid);
|
||||
const RailVehicleInfo *rvi = RailVehInfo(eid);
|
||||
|
||||
if (bv->filter.railtype != RAILTYPE_END && !HasPowerOnRail(e->railtype, bv->filter.railtype)) continue;
|
||||
if (bv->filter.railtype != RAILTYPE_END && !HasPowerOnRail(rvi->railtype, bv->filter.railtype)) continue;
|
||||
if (!IsEngineBuildable(eid, VEH_Train, _local_player)) continue;
|
||||
|
||||
EngList_Add(&bv->eng_list, eid);
|
||||
|
|
|
@ -406,12 +406,11 @@ int32 SettingsDisableElrail(int32 p1)
|
|||
|
||||
/* walk through all train engines */
|
||||
for (e_id = 0; e_id < NUM_TRAIN_ENGINES; e_id++) {
|
||||
const RailVehicleInfo *rv_info = RailVehInfo(e_id);
|
||||
Engine *e = GetEngine(e_id);
|
||||
RailVehicleInfo *rv_info = &_rail_vehicle_info[e_id];
|
||||
/* if it is an electric rail engine and its railtype is the wrong one */
|
||||
if (rv_info->engclass == 2 && e->railtype == old_railtype) {
|
||||
if (rv_info->engclass == 2 && rv_info->railtype == old_railtype) {
|
||||
/* change it to the proper one */
|
||||
e->railtype = new_railtype;
|
||||
rv_info->railtype = new_railtype;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -180,13 +180,18 @@ void StartupEngines(void)
|
|||
AdjustAvailAircraft();
|
||||
}
|
||||
|
||||
static void AcceptEnginePreview(Engine *e, PlayerID player)
|
||||
static void AcceptEnginePreview(EngineID eid, PlayerID player)
|
||||
{
|
||||
Player *p = GetPlayer(player);
|
||||
Engine *e = GetEngine(eid);
|
||||
|
||||
assert(e->railtype < RAILTYPE_END);
|
||||
SETBIT(e->player_avail, player);
|
||||
SETBIT(p->avail_railtypes, e->railtype);
|
||||
if (e->type == VEH_Train) {
|
||||
const RailVehicleInfo *rvi = RailVehInfo(eid);
|
||||
Player *p = GetPlayer(player);
|
||||
|
||||
assert(rvi->railtype < RAILTYPE_END);
|
||||
SETBIT(p->avail_railtypes, rvi->railtype);
|
||||
}
|
||||
|
||||
e->preview_player = INVALID_PLAYER;
|
||||
if (player == _local_player) {
|
||||
|
@ -247,7 +252,7 @@ void EnginesDailyLoop(void)
|
|||
|
||||
if (!IsHumanPlayer(best_player)) {
|
||||
/* XXX - TTDBUG: TTD has a bug here ???? */
|
||||
AcceptEnginePreview(e, best_player);
|
||||
AcceptEnginePreview(i, best_player);
|
||||
} else {
|
||||
e->flags |= ENGINE_PREVIEWING;
|
||||
e->preview_wait = 20;
|
||||
|
@ -272,7 +277,7 @@ int32 CmdWantEnginePreview(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
|
|||
e = GetEngine(p1);
|
||||
if (GetBestPlayer(e->preview_player) != _current_player) return CMD_ERROR;
|
||||
|
||||
if (flags & DC_EXEC) AcceptEnginePreview(e, _current_player);
|
||||
if (flags & DC_EXEC) AcceptEnginePreview(p1, _current_player);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -323,15 +328,14 @@ static void NewVehicleAvailable(Engine *e)
|
|||
// Do not introduce new rail wagons
|
||||
if (IsWagon(index)) return;
|
||||
|
||||
// make maglev / monorail available
|
||||
FOR_ALL_PLAYERS(p) {
|
||||
if (p->is_active) {
|
||||
assert(e->railtype < RAILTYPE_END);
|
||||
SETBIT(p->avail_railtypes, e->railtype);
|
||||
}
|
||||
}
|
||||
|
||||
if (index < NUM_TRAIN_ENGINES) {
|
||||
// maybe make another rail type available
|
||||
RailType railtype = RailVehInfo(index)->railtype;
|
||||
assert(railtype < RAILTYPE_END);
|
||||
FOR_ALL_PLAYERS(p) {
|
||||
if (p->is_active) SETBIT(p->avail_railtypes, railtype);
|
||||
}
|
||||
|
||||
AddNewsItem(index, NEWS_FLAGS(NM_CALLBACK, 0, NT_NEW_VEHICLES, DNC_TRAINAVAIL), 0, 0);
|
||||
} else if (index < NUM_TRAIN_ENGINES + NUM_ROAD_ENGINES) {
|
||||
AddNewsItem(index, NEWS_FLAGS(NM_CALLBACK, 0, NT_NEW_VEHICLES, DNC_ROADAVAIL), 0, 0);
|
||||
|
@ -603,7 +607,7 @@ static const SaveLoad _engine_desc[] = {
|
|||
SLE_VAR(Engine, flags, SLE_UINT8),
|
||||
SLE_VAR(Engine, preview_player, SLE_UINT8),
|
||||
SLE_VAR(Engine, preview_wait, SLE_UINT8),
|
||||
SLE_VAR(Engine, railtype, SLE_UINT8),
|
||||
SLE_CONDNULL(1, 0, 44),
|
||||
SLE_VAR(Engine, player_avail, SLE_UINT8),
|
||||
|
||||
// reserve extra space in savegame here. (currently 16 bytes)
|
||||
|
|
|
@ -13,7 +13,7 @@ typedef struct RailVehicleInfo {
|
|||
byte image_index;
|
||||
byte flags; /* 1=multihead engine, 2=wagon */
|
||||
byte base_cost;
|
||||
byte railtype;
|
||||
RailTypeByte railtype;
|
||||
uint16 max_speed;
|
||||
uint16 power;
|
||||
uint16 weight;
|
||||
|
@ -100,7 +100,6 @@ typedef struct Engine {
|
|||
byte flags;
|
||||
PlayerByte preview_player;
|
||||
byte preview_wait;
|
||||
RailTypeByte railtype;
|
||||
byte player_avail;
|
||||
byte type; // type, ie VEH_Road, VEH_Train, etc. Same as in vehicle.h
|
||||
} Engine;
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
static StringID GetEngineCategoryName(EngineID engine)
|
||||
{
|
||||
if (engine < NUM_TRAIN_ENGINES) {
|
||||
switch (GetEngine(engine)->railtype) {
|
||||
switch (RailVehInfo(engine)->railtype) {
|
||||
case RAILTYPE_RAIL: return STR_8102_RAILROAD_LOCOMOTIVE;
|
||||
case RAILTYPE_ELECTRIC: return STR_8102_RAILROAD_LOCOMOTIVE;
|
||||
case RAILTYPE_MONO: return STR_8106_MONORAIL_LOCOMOTIVE;
|
||||
|
|
|
@ -1249,9 +1249,8 @@ static const OldChunks engine_chunk[] = {
|
|||
OCL_SVAR( OC_UINT8, Engine, flags ),
|
||||
OCL_SVAR( OC_UINT8, Engine, preview_player ),
|
||||
OCL_SVAR( OC_UINT8, Engine, preview_wait ),
|
||||
OCL_SVAR( OC_UINT8, Engine, railtype ),
|
||||
|
||||
OCL_NULL( 1 ), // Junk
|
||||
OCL_NULL( 2 ), // Junk
|
||||
|
||||
OCL_END()
|
||||
};
|
||||
|
|
|
@ -1413,20 +1413,11 @@ bool AfterLoadGame(void)
|
|||
/* Elrails got added in rev 24 */
|
||||
if (CheckSavegameVersion(24)) {
|
||||
Vehicle *v;
|
||||
uint i;
|
||||
RailType min_rail = RAILTYPE_ELECTRIC;
|
||||
|
||||
for (i = 0; i < lengthof(_engines); i++) {
|
||||
Engine *e = GetEngine(i);
|
||||
if (e->type == VEH_Train &&
|
||||
(e->railtype != RAILTYPE_RAIL || RailVehInfo(i)->engclass == 2)) {
|
||||
e->railtype++;
|
||||
}
|
||||
}
|
||||
|
||||
FOR_ALL_VEHICLES(v) {
|
||||
if (v->type == VEH_Train) {
|
||||
RailType rt = GetEngine(v->engine_type)->railtype;
|
||||
RailType rt = RailVehInfo(v->engine_type)->railtype;
|
||||
|
||||
v->u.rail.railtype = rt;
|
||||
if (rt == RAILTYPE_ELECTRIC) min_rail = RAILTYPE_RAIL;
|
||||
|
|
|
@ -653,10 +653,13 @@ byte GetPlayerRailtypes(PlayerID p)
|
|||
const EngineInfo *ei = EngInfo(i);
|
||||
|
||||
if (e->type == VEH_Train && HASBIT(ei->climates, _opt.landscape) &&
|
||||
(HASBIT(e->player_avail, p) || _date >= (e->intro_date + 365)) &&
|
||||
!(RailVehInfo(i)->flags & RVI_WAGON)) {
|
||||
assert(e->railtype < RAILTYPE_END);
|
||||
SETBIT(rt, e->railtype);
|
||||
(HASBIT(e->player_avail, p) || _date >= e->intro_date + 365)) {
|
||||
const RailVehicleInfo *rvi = RailVehInfo(i);
|
||||
|
||||
if (!(rvi->flags & RVI_WAGON)) {
|
||||
assert(rvi->railtype < RAILTYPE_END);
|
||||
SETBIT(rt, rvi->railtype);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -328,18 +328,17 @@ const EngineInfo orig_engine_info[] = {
|
|||
* @param l railtype
|
||||
* Tractive effort coefficient by default is the same as TTDPatch, 0.30*256=76
|
||||
*/
|
||||
#define RVI(a, b, c, d, e, f, g, h, i, j, k, l) { a, b, c, l, d, e, f, g, h, h, i, j, k, 0, 0, 0, 0, 76, 0 }
|
||||
#define RVI(a, b, c, d, e, f, g, h, i, j, k, l) { a, b, c, {l}, d, e, f, g, h, h, i, j, k, 0, 0, 0, 0, 76, 0 }
|
||||
#define M RVI_MULTIHEAD
|
||||
#define W RVI_WAGON
|
||||
#define S 0
|
||||
#define D 1
|
||||
#define E 2
|
||||
|
||||
// Rail types
|
||||
#define R 0 // Conventional railway
|
||||
#define C 1 // Electrified railway
|
||||
#define O 2 // Monorail
|
||||
#define L 3 // MagLev
|
||||
#define R RAILTYPE_RAIL
|
||||
#define C RAILTYPE_ELECTRIC
|
||||
#define O RAILTYPE_MONO
|
||||
#define L RAILTYPE_MAGLEV
|
||||
|
||||
const RailVehicleInfo orig_rail_vehicle_info[NUM_TRAIN_ENGINES] = {
|
||||
// image_index max_speed (kph) running_cost_base
|
||||
|
@ -370,10 +369,10 @@ const RailVehicleInfo orig_rail_vehicle_info[NUM_TRAIN_ENGINES] = {
|
|||
RVI(16, M, 35, 160, 3500/2,95/2, 205/2, D, 0, 0 , 45, R), // 20
|
||||
RVI(18, 0, 21, 104, 2200, 120, 145, D, 0, 0 , 32, R), // 21
|
||||
RVI( 6, M, 20, 200, 4500/2,70/2, 190/2, D, 4, CT_MAIL , 50, R), // 22
|
||||
RVI(20, 0, 26, 160, 3600, 84, 180, E, 0, 0 , 40, E), // 23
|
||||
RVI(20, 0, 30, 176, 5000, 82, 205, E, 0, 0 , 41, E), // 24
|
||||
RVI(21, M, 40, 240, 7000/2,90/2, 240/2, E, 0, 0 , 51, E), // 25
|
||||
RVI(23, M, 43, 264, 8000/2,95/2, 250/2, E, 0, 0 , 52, E), // 26
|
||||
RVI(20, 0, 26, 160, 3600, 84, 180, E, 0, 0 , 40, C), // 23
|
||||
RVI(20, 0, 30, 176, 5000, 82, 205, E, 0, 0 , 41, C), // 24
|
||||
RVI(21, M, 40, 240, 7000/2,90/2, 240/2, E, 0, 0 , 51, C), // 25
|
||||
RVI(23, M, 43, 264, 8000/2,95/2, 250/2, E, 0, 0 , 52, C), // 26
|
||||
RVI(33, W, 247, 0, 0, 25, 0, 0, 40, CT_PASSENGERS , 0, R), // 27
|
||||
RVI(35, W, 228, 0, 0, 21, 0, 0, 30, CT_MAIL , 0, R), // 28
|
||||
RVI(34, W, 176, 0, 0, 18, 0, 0, 30, CT_COAL , 0, R), // 29
|
||||
|
|
|
@ -164,7 +164,7 @@ void TrainConsistChanged(Vehicle* v)
|
|||
|
||||
// update the 'first engine'
|
||||
u->u.rail.first_engine = (v == u) ? (EngineID)INVALID_ENGINE : first_engine;
|
||||
u->u.rail.railtype = GetEngine(u->engine_type)->railtype;
|
||||
u->u.rail.railtype = rvi_u->railtype;
|
||||
|
||||
if (IsTrainEngine(u)) first_engine = u->engine_type;
|
||||
|
||||
|
@ -658,7 +658,7 @@ static int32 CmdBuildRailWagon(EngineID engine, TileIndex tile, uint32 flags)
|
|||
v->value = value;
|
||||
// v->day_counter = 0;
|
||||
|
||||
v->u.rail.railtype = GetEngine(engine)->railtype;
|
||||
v->u.rail.railtype = rvi->railtype;
|
||||
|
||||
v->build_year = _cur_year;
|
||||
v->type = VEH_Train;
|
||||
|
@ -745,7 +745,6 @@ int32 CmdBuildRailVehicle(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
|
|||
int value;
|
||||
Vehicle *v;
|
||||
UnitID unit_num;
|
||||
Engine *e;
|
||||
uint num_vehicles;
|
||||
|
||||
/* Check if the engine-type is valid (for the player) */
|
||||
|
@ -761,11 +760,10 @@ int32 CmdBuildRailVehicle(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
|
|||
SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
|
||||
|
||||
rvi = RailVehInfo(p1);
|
||||
e = GetEngine(p1);
|
||||
|
||||
/* Check if depot and new engine uses the same kind of tracks */
|
||||
/* We need to see if the engine got power on the tile to avoid eletric engines in non-electric depots */
|
||||
if (!HasPowerOnRail(e->railtype, GetRailType(tile))) return CMD_ERROR;
|
||||
if (!HasPowerOnRail(rvi->railtype, GetRailType(tile))) return CMD_ERROR;
|
||||
|
||||
if (rvi->flags & RVI_WAGON) return CmdBuildRailWagon(p1, tile, flags);
|
||||
|
||||
|
@ -814,12 +812,13 @@ int32 CmdBuildRailVehicle(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
|
|||
|
||||
v->engine_type = p1;
|
||||
|
||||
const Engine *e = GetEngine(p1);
|
||||
v->reliability = e->reliability;
|
||||
v->reliability_spd_dec = e->reliability_spd_dec;
|
||||
v->max_age = e->lifelength * 366;
|
||||
|
||||
v->string_id = STR_SV_TRAIN_NAME;
|
||||
v->u.rail.railtype = e->railtype;
|
||||
v->u.rail.railtype = rvi->railtype;
|
||||
_new_vehicle_id = v->index;
|
||||
|
||||
v->service_interval = _patches.servint_trains;
|
||||
|
@ -2084,16 +2083,16 @@ static void HandleLocomotiveSmokeCloud(const Vehicle* v)
|
|||
u = v;
|
||||
|
||||
do {
|
||||
EngineID engtype = v->engine_type;
|
||||
const RailVehicleInfo *rvi = RailVehInfo(v->engine_type);
|
||||
int effect_offset = GB(v->u.rail.cached_vis_effect, 0, 4) - 8;
|
||||
byte effect_type = GB(v->u.rail.cached_vis_effect, 4, 2);
|
||||
bool disable_effect = HASBIT(v->u.rail.cached_vis_effect, 6);
|
||||
int x, y;
|
||||
|
||||
// no smoke?
|
||||
if ((RailVehInfo(engtype)->flags & RVI_WAGON && effect_type == 0) ||
|
||||
if ((rvi->flags & RVI_WAGON && effect_type == 0) ||
|
||||
disable_effect ||
|
||||
GetEngine(engtype)->railtype > RAILTYPE_ELECTRIC ||
|
||||
rvi->railtype > RAILTYPE_ELECTRIC ||
|
||||
v->vehstatus & VS_HIDDEN) {
|
||||
continue;
|
||||
}
|
||||
|
@ -2106,7 +2105,7 @@ static void HandleLocomotiveSmokeCloud(const Vehicle* v)
|
|||
|
||||
if (effect_type == 0) {
|
||||
// Use default effect type for engine class.
|
||||
effect_type = RailVehInfo(engtype)->engclass;
|
||||
effect_type = rvi->engclass;
|
||||
} else {
|
||||
effect_type--;
|
||||
}
|
||||
|
@ -2161,7 +2160,7 @@ static void TrainPlayLeaveStationSound(const Vehicle* v)
|
|||
|
||||
if (PlayVehicleSound(v, VSE_START)) return;
|
||||
|
||||
switch (GetEngine(engtype)->railtype) {
|
||||
switch (RailVehInfo(engtype)->railtype) {
|
||||
case RAILTYPE_RAIL:
|
||||
case RAILTYPE_ELECTRIC:
|
||||
SndPlayVehicleFx(sfx[RailVehInfo(engtype)->engclass], v);
|
||||
|
|
|
@ -2837,6 +2837,7 @@ static SpriteID GetEngineColourMap(EngineID engine_type, PlayerID player, Engine
|
|||
const RailVehicleInfo *rvi = RailVehInfo(engine_type);
|
||||
|
||||
switch (rvi->railtype) {
|
||||
default: NOT_REACHED();
|
||||
case RAILTYPE_RAIL:
|
||||
case RAILTYPE_ELECTRIC:
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue