changeset 5868:941f6c5a4668 draft

(svn r8455) -Codechange: Give a more meaningful name (railveh_type)to member flags of RailVehInfo, as well as changing the code to reflect the fact that it was not a flag but rather a one value only variable. Doing so, some evaluations have been simplified. -Codechange: Add and use RAILVEH_SINGLEHEAD when railveh_type is set to 0, which was implicit before. -Cleanup: Remove some extraneous parenthesis.
author belugas <belugas@openttd.org>
date Tue, 30 Jan 2007 11:53:35 +0000
parents 0f2d3b2a5f01
children 39712446b736
files src/ai/default/default.cpp src/autoreplace_gui.cpp src/build_vehicle_gui.cpp src/engine.cpp src/engine.h src/engine_gui.cpp src/newgrf.cpp src/players.cpp src/table/engines.h src/train_cmd.cpp src/train_gui.cpp src/vehicle.cpp
diffstat 12 files changed, 89 insertions(+), 86 deletions(-) [+]
line wrap: on
line diff
--- a/src/ai/default/default.cpp
+++ b/src/ai/default/default.cpp
@@ -143,8 +143,8 @@
 		const Engine* e = GetEngine(i);
 
 		if (!IsCompatibleRail(rvi->railtype, railtype) ||
-				rvi->flags & RVI_WAGON ||
-				(rvi->flags & RVI_MULTIHEAD && flag & 1) ||
+				rvi->railveh_type == RAILVEH_WAGON ||
+				(rvi->railveh_type == RAILVEH_MULTIHEAD && flag & 1) ||
 				!HASBIT(e->player_avail, _current_player) ||
 				e->reliability < 0x8A3D) {
 			continue;
@@ -2366,7 +2366,7 @@
 		const Engine* e = GetEngine(i);
 
 		if (!IsCompatibleRail(rvi->railtype, railtype) ||
-				!(rvi->flags & RVI_WAGON) ||
+				rvi->railveh_type != RAILVEH_WAGON ||
 				!HASBIT(e->player_avail, _current_player)) {
 			continue;
 		}
--- a/src/autoreplace_gui.cpp
+++ b/src/autoreplace_gui.cpp
@@ -63,7 +63,7 @@
 		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 ||
+				|| (rvi->railveh_type != RAILVEH_WAGON) != is_engine ||
 				!HASBIT(e->player_avail, _local_player))
 				continue;
 #if 0
--- a/src/build_vehicle_gui.cpp
+++ b/src/build_vehicle_gui.cpp
@@ -187,8 +187,8 @@
 	const RailVehicleInfo *rvi_a = RailVehInfo(*(const EngineID*)a);
 	const RailVehicleInfo *rvi_b = RailVehInfo(*(const EngineID*)b);
 
-	int va = rvi_a->power << (rvi_a->flags & RVI_MULTIHEAD ? 1 : 0);
-	int vb = rvi_b->power << (rvi_b->flags & RVI_MULTIHEAD ? 1 : 0);
+	int va = rvi_a->power << (rvi_a->railveh_type == RAILVEH_MULTIHEAD ? 1 : 0);
+	int vb = rvi_b->power << (rvi_b->railveh_type == RAILVEH_MULTIHEAD ? 1 : 0);
 	int r = va - vb;
 
 	return _internal_sort_order ? -r : r;
@@ -199,8 +199,8 @@
 	const RailVehicleInfo *rvi_a = RailVehInfo(*(const EngineID*)a);
 	const RailVehicleInfo *rvi_b = RailVehInfo(*(const EngineID*)b);
 
-	int va = rvi_a->running_cost_base * _price.running_rail[rvi_a->running_cost_class] * (rvi_a->flags & RVI_MULTIHEAD ? 2 : 1);
-	int vb = rvi_b->running_cost_base * _price.running_rail[rvi_b->running_cost_class] * (rvi_b->flags & RVI_MULTIHEAD ? 2 : 1);
+	int va = rvi_a->running_cost_base * _price.running_rail[rvi_a->running_cost_class] * (rvi_a->railveh_type == RAILVEH_MULTIHEAD ? 2 : 1);
+	int vb = rvi_b->running_cost_base * _price.running_rail[rvi_b->running_cost_class] * (rvi_b->railveh_type == RAILVEH_MULTIHEAD ? 2 : 1);
 	int r = va - vb;
 
 	return _internal_sort_order ? -r : r;
@@ -228,8 +228,8 @@
 {
 	EngineID va = *(const EngineID*)a;
 	EngineID vb = *(const EngineID*)b;
-	int val_a = ((RailVehInfo(va)->flags & RVI_WAGON) != 0) ? 1 : 0;
-	int val_b = ((RailVehInfo(vb)->flags & RVI_WAGON) != 0) ? 1 : 0;
+	int val_a = (RailVehInfo(va)->railveh_type != RAILVEH_WAGON ? 1 : 0);
+	int val_b = (RailVehInfo(vb)->railveh_type != RAILVEH_WAGON ? 1 : 0);
 	int r = val_a - val_b;
 
 	/* Use EngineID to sort instead since we want consistent sorting */
@@ -388,7 +388,7 @@
 /* Draw locomotive specific details */
 static int DrawRailEnginePurchaseInfo(int x, int y, EngineID engine_number, const RailVehicleInfo *rvi)
 {
-	int multihead = (rvi->flags&RVI_MULTIHEAD?1:0);
+	int multihead = (rvi->railveh_type == RAILVEH_MULTIHEAD ? 1 : 0);
 
 	/* Purchase Cost - Engine weight */
 	SetDParam(0, rvi->base_cost * (_price.build_railvehicle >> 3) >> 5);
@@ -529,7 +529,7 @@
 
 			refitable = (EngInfo(engine_number)->refit_mask != 0) && (rvi->capacity > 0);
 
-			if (rvi->flags & RVI_WAGON) {
+			if (rvi->railveh_type == RAILVEH_WAGON) {
 				y = DrawRailWagonPurchaseInfo(x, y, engine_number, rvi);
 			} else {
 				y = DrawRailEnginePurchaseInfo(x, y, engine_number, rvi);
@@ -540,7 +540,7 @@
 				SetDParam(0, CT_INVALID);
 				SetDParam(2, STR_EMPTY);
 			} else {
-				int multihead = (rvi->flags & RVI_MULTIHEAD ? 1 : 0);
+				int multihead = (rvi->railveh_type == RAILVEH_MULTIHEAD ? 1 : 0);
 
 				SetDParam(0, rvi->cargo_type);
 				SetDParam(1, (rvi->capacity * (CountArticulatedParts(engine_number) + 1)) << multihead);
@@ -566,7 +566,7 @@
 	}
 
 	/* Draw details, that applies to all types except rail wagons */
-	if (e->type != VEH_Train || !(RailVehInfo(engine_number)->flags & RVI_WAGON)) {
+	if (e->type != VEH_Train || RailVehInfo(engine_number)->railveh_type != RAILVEH_WAGON) {
 		/* Design date - Life length */
 		SetDParam(0, ymd.year);
 		SetDParam(1, e->lifelength);
@@ -607,7 +607,7 @@
 		if (!IsEngineBuildable(eid, VEH_Train, _local_player)) continue;
 
 		EngList_Add(&bv->eng_list, eid);
-		if ((rvi->flags & RVI_WAGON) == 0) {
+		if (rvi->railveh_type != RAILVEH_WAGON) {
 			num_engines++;
 		} else {
 			num_wagons++;
@@ -826,7 +826,7 @@
 			if (sel_eng != INVALID_ENGINE) {
 				switch (bv->vehicle_type) {
 					case VEH_Train:
-						DoCommandP(w->window_number, sel_eng, 0, (RailVehInfo(sel_eng)->flags & RVI_WAGON) ? CcBuildWagon : CcBuildLoco,
+						DoCommandP(w->window_number, sel_eng, 0, (RailVehInfo(sel_eng)->railveh_type == RAILVEH_WAGON) ? CcBuildWagon : CcBuildLoco,
 								   CMD_BUILD_RAIL_VEHICLE | CMD_MSG(STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE));
 						break;
 					case VEH_Road:
--- a/src/engine.cpp
+++ b/src/engine.cpp
@@ -285,7 +285,7 @@
 // Determine if an engine type is a wagon (and not a loco)
 static bool IsWagon(EngineID index)
 {
-	return index < NUM_TRAIN_ENGINES && RailVehInfo(index)->flags & RVI_WAGON;
+	return index < NUM_TRAIN_ENGINES && RailVehInfo(index)->railveh_type == RAILVEH_WAGON;
 }
 
 static void NewVehicleAvailable(Engine *e)
--- a/src/engine.h
+++ b/src/engine.h
@@ -9,9 +9,15 @@
 #include "rail.h"
 #include "sound.h"
 
+enum RailVehicleTypes {
+	RAILVEH_SINGLEHEAD,
+	RAILVEH_MULTIHEAD,
+	RAILVEH_WAGON,
+};
+
 typedef struct RailVehicleInfo {
 	byte image_index;
-	byte flags; /* 1=multihead engine, 2=wagon */
+	RailVehicleTypes railveh_type;
 	byte base_cost;
 	RailTypeByte railtype;
 	uint16 max_speed;
@@ -118,11 +124,6 @@
 };
 
 enum {
-	RVI_MULTIHEAD = 1,
-	RVI_WAGON = 2,
-};
-
-enum {
 	NUM_VEHICLE_TYPES = 6
 };
 
--- a/src/engine_gui.cpp
+++ b/src/engine_gui.cpp
@@ -122,7 +122,7 @@
 static void DrawTrainEngineInfo(EngineID engine, int x, int y, int maxw)
 {
 	const RailVehicleInfo *rvi = RailVehInfo(engine);
-	uint multihead = (rvi->flags & RVI_MULTIHEAD) ? 1 : 0;
+	uint multihead = (rvi->railveh_type == RAILVEH_MULTIHEAD) ? 1 : 0;
 
 	SetDParam(0, (_price.build_railvehicle >> 3) * rvi->base_cost >> 5);
 	SetDParam(2, rvi->max_speed);
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -215,10 +215,10 @@
 
 	if (condition != 0) {
 		ei->unk2 &= ~0x80;
-		rvi->flags &= ~2;
+		rvi->railveh_type = RAILVEH_SINGLEHEAD;
 	} else {
 		ei->unk2 |= 0x80;
-		rvi->flags |= 2;
+		rvi->railveh_type = RAILVEH_WAGON;
 	}
 }
 
@@ -265,7 +265,7 @@
 			FOR_EACH_OBJECT {
 				uint16 power = grf_load_word(&buf);
 
-				if (rvi[i].flags & RVI_MULTIHEAD) power /= 2;
+				if (rvi[i].railveh_type == RAILVEH_MULTIHEAD) power /= 2;
 
 				rvi[i].power = power;
 				dewagonize(power, engine + i);
@@ -276,7 +276,7 @@
 			FOR_EACH_OBJECT {
 				uint8 runcostfact = grf_load_byte(&buf);
 
-				if (rvi[i].flags & RVI_MULTIHEAD) runcostfact /= 2;
+				if (rvi[i].railveh_type == RAILVEH_MULTIHEAD) runcostfact /= 2;
 
 				rvi[i].running_cost_base = runcostfact;
 			}
@@ -315,19 +315,19 @@
 				uint8 dual = grf_load_byte(&buf);
 
 				if (dual != 0) {
-					if (!(rvi[i].flags & RVI_MULTIHEAD)) {
+					if (rvi[i].railveh_type != RAILVEH_MULTIHEAD) {
 						// adjust power and running cost if needed
 						rvi[i].power /= 2;
 						rvi[i].running_cost_base /= 2;
 					}
-					rvi[i].flags |= RVI_MULTIHEAD;
+					rvi[i].railveh_type = RAILVEH_MULTIHEAD;
 				} else {
-					if (rvi[i].flags & RVI_MULTIHEAD) {
+					if (rvi[i].railveh_type == RAILVEH_MULTIHEAD) {
 						// adjust power and running cost if needed
 						rvi[i].power *= 2;
 						rvi[i].running_cost_base *= 2;
 					}
-					rvi[i].flags &= ~RVI_MULTIHEAD;
+					rvi[i].railveh_type = RAILVEH_SINGLEHEAD;
 				}
 			}
 			break;
@@ -3588,7 +3588,7 @@
 			if (xor_mask == 0 && (
 						GetEngine(engine)->type != VEH_Train || (
 							RailVehInfo(engine)->capacity != 0 &&
-							!(RailVehInfo(engine)->flags & RVI_WAGON)
+							RailVehInfo(engine)->railveh_type != RAILVEH_WAGON
 						)
 					)) {
 				xor_mask = _default_refitmasks[GetEngine(engine)->type - VEH_Train];
@@ -3801,3 +3801,4 @@
 
 
 
+
--- a/src/players.cpp
+++ b/src/players.cpp
@@ -656,7 +656,7 @@
 				(HASBIT(e->player_avail, p) || _date >= e->intro_date + 365)) {
 			const RailVehicleInfo *rvi = RailVehInfo(i);
 
-			if (!(rvi->flags & RVI_WAGON)) {
+			if (rvi->railveh_type != RAILVEH_WAGON) {
 				assert(rvi->railtype < RAILTYPE_END);
 				SETBIT(rt, rvi->railtype);
 			}
--- a/src/table/engines.h
+++ b/src/table/engines.h
@@ -329,8 +329,9 @@
  * 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 M RVI_MULTIHEAD
-#define W RVI_WAGON
+#define M RAILVEH_MULTIHEAD
+#define W RAILVEH_WAGON
+#define G RAILVEH_SINGLEHEAD
 #define S 0
 #define D 1
 #define E 2
@@ -346,31 +347,31 @@
 	//   |  |    base_cost     |    weight |  |   capacity
 	//   |  |    |    |        |    |      |  |   |  cargo_type
 	//   |  |    |    |        |    |      |  |   |  |
-	RVI( 2, 0,   7,  64,     300,  47,    50, S,  0, 0              ,  1, R), //   0
-	RVI(19, 0,   8,  80,     600,  65,    65, D,  0, 0              ,  4, R), //   1
-	RVI( 2, 0,  10,  72,     400,  85,    90, S,  0, 0              ,  7, R), //   2
-	RVI( 0, 0,  15,  96,     900, 130,   130, S,  0, 0              , 19, R), //   3
-	RVI( 1, 0,  19, 112,    1000, 140,   145, S,  0, 0              , 20, R), //   4
-	RVI(12, 0,  16, 120,    1400,  95,   125, D,  0, 0              , 30, R), //   5
-	RVI(14, 0,  20, 152,    2000, 120,   135, D,  0, 0              , 31, R), //   6
-	RVI( 3, 0,  14,  88,    1100, 145,   130, S,  0, 0              , 19, R), //   7
-	RVI( 0, 0,  13, 112,    1000, 131,   120, S,  0, 0              , 20, R), //   8
-	RVI( 1, 0,  19, 128,    1200, 162,   140, S,  0, 0              , 21, R), //   9
-	RVI( 0, 0,  22, 144,    1600, 170,   130, S,  0, 0              , 22, R), //  10
+	RVI( 2, G,   7,  64,     300,  47,    50, S,  0, 0              ,  1, R), //   0
+	RVI(19, G,   8,  80,     600,  65,    65, D,  0, 0              ,  4, R), //   1
+	RVI( 2, G,  10,  72,     400,  85,    90, S,  0, 0              ,  7, R), //   2
+	RVI( 0, G,  15,  96,     900, 130,   130, S,  0, 0              , 19, R), //   3
+	RVI( 1, G,  19, 112,    1000, 140,   145, S,  0, 0              , 20, R), //   4
+	RVI(12, G,  16, 120,    1400,  95,   125, D,  0, 0              , 30, R), //   5
+	RVI(14, G,  20, 152,    2000, 120,   135, D,  0, 0              , 31, R), //   6
+	RVI( 3, G,  14,  88,    1100, 145,   130, S,  0, 0              , 19, R), //   7
+	RVI( 0, G,  13, 112,    1000, 131,   120, S,  0, 0              , 20, R), //   8
+	RVI( 1, G,  19, 128,    1200, 162,   140, S,  0, 0              , 21, R), //   9
+	RVI( 0, G,  22, 144,    1600, 170,   130, S,  0, 0              , 22, R), //  10
 	RVI( 8, M,  11, 112,   600/2,32/2,  85/2, D, 38, CT_PASSENGERS  , 10, R), //  11
 	RVI(10, M,  14, 120,   700/2,38/2,  70/2, D, 40, CT_PASSENGERS  , 11, R), //  12
-	RVI( 4, 0,  15, 128,    1250,  72,    95, D,  0, 0              , 30, R), //  13
-	RVI( 5, 0,  17, 144,    1750, 101,   120, D,  0, 0              , 31, R), //  14
-	RVI( 4, 0,  18, 160,    2580, 112,   140, D,  0, 0              , 32, R), //  15
-	RVI(14, 0,  23,  96,    4000, 150,   135, D,  0, 0              , 33, R), //  16
-	RVI(12, 0,  16, 112,    2400, 120,   105, D,  0, 0              , 34, R), //  17
-	RVI(13, 0,  30, 112,    6600, 207,   155, D,  0, 0              , 35, R), //  18
-	RVI(15, 0,  18, 104,    1500, 110,   105, D,  0, 0              , 29, R), //  19
+	RVI( 4, G,  15, 128,    1250,  72,    95, D,  0, 0              , 30, R), //  13
+	RVI( 5, G,  17, 144,    1750, 101,   120, D,  0, 0              , 31, R), //  14
+	RVI( 4, G,  18, 160,    2580, 112,   140, D,  0, 0              , 32, R), //  15
+	RVI(14, G,  23,  96,    4000, 150,   135, D,  0, 0              , 33, R), //  16
+	RVI(12, G,  16, 112,    2400, 120,   105, D,  0, 0              , 34, R), //  17
+	RVI(13, G,  30, 112,    6600, 207,   155, D,  0, 0              , 35, R), //  18
+	RVI(15, G,  18, 104,    1500, 110,   105, D,  0, 0              , 29, R), //  19
 	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(18, G,  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, C), //  23
-	RVI(20, 0,  30, 176,    5000,  82,   205, E,  0, 0              , 41, C), //  24
+	RVI(20, G,  26, 160,    3600,  84,   180, E,  0, 0              , 40, C), //  23
+	RVI(20, G,  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
@@ -400,9 +401,9 @@
 	RVI(57, W, 196,   0,       0,  18,     0, 0, 22, CT_BATTERIES   ,  0, R), //  51
 	RVI(58, W, 193,   0,       0,  18,     0, 0, 25, CT_FIZZY_DRINKS,  0, R), //  52
 	RVI(59, W, 191,   0,       0,  18,     0, 0, 30, CT_PLASTIC     ,  0, R), //  53
-	RVI(25, 0,  52, 304,    9000,  95,   230, E,  0, 0              , 60, O), //  54
+	RVI(25, G,  52, 304,    9000,  95,   230, E,  0, 0              , 60, O), //  54
 	RVI(26, M,  60, 336, 10000/2,85/2, 240/2, E, 25, CT_PASSENGERS  , 62, O), //  55
-	RVI(26, 0,  53, 320,    5000,  95,   230, E,  0, 0              , 63, O), //  56
+	RVI(26, G,  53, 320,    5000,  95,   230, E,  0, 0              , 63, O), //  56
 	RVI(60, W, 247,   0,       0,  25,     0, 0, 45, CT_PASSENGERS  ,  0, O), //  57
 	RVI(62, W, 228,   0,       0,  21,     0, 0, 35, CT_MAIL        ,  0, O), //  58
 	RVI(61, W, 176,   0,       0,  18,     0, 0, 35, CT_COAL        ,  0, O), //  59
@@ -430,11 +431,11 @@
 	RVI(57, W, 196,   0,       0,  18,     0, 0, 27, CT_BATTERIES   ,  0, O), //  81
 	RVI(58, W, 193,   0,       0,  18,     0, 0, 30, CT_FIZZY_DRINKS,  0, O), //  82
 	RVI(59, W, 191,   0,       0,  18,     0, 0, 35, CT_PLASTIC     ,  0, O), //  83
-	RVI(28, 0,  70, 400,   10000, 105,   250, E,  0, 0              , 70, L), //  84
-	RVI(29, 0,  74, 448,   12000, 120,   253, E,  0, 0              , 71, L), //  85
-	RVI(30, 0,  82, 480,   15000, 130,   254, E,  0, 0              , 72, L), //  86
+	RVI(28, G,  70, 400,   10000, 105,   250, E,  0, 0              , 70, L), //  84
+	RVI(29, G,  74, 448,   12000, 120,   253, E,  0, 0              , 71, L), //  85
+	RVI(30, G,  82, 480,   15000, 130,   254, E,  0, 0              , 72, L), //  86
 	RVI(31, M,  95, 640, 20000/2,150/2,255/2, E,  0, 0              , 73, L), //  87
-	RVI(28, 0,  70, 480,   10000, 120,   250, E,  0, 0              , 74, L), //  88
+	RVI(28, G,  70, 480,   10000, 120,   250, E,  0, 0              , 74, L), //  88
 	RVI(60, W, 247,   0,       0,  25,     0, 0, 47, CT_PASSENGERS  ,  0, L), //  89
 	RVI(62, W, 228,   0,       0,  21,     0, 0, 37, CT_MAIL        ,  0, L), //  90
 	RVI(61, W, 176,   0,       0,  18,     0, 0, 37, CT_COAL        ,  0, L), //  91
@@ -470,6 +471,7 @@
 #undef E
 #undef D
 #undef S
+#undef G
 #undef W
 #undef M
 #undef RVI
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -194,11 +194,10 @@
 				if (callback != CALLBACK_FAILED) u->u.rail.cached_vis_effect = callback;
 			}
 
-			if ((rvi_v->pow_wag_power != 0) && (rvi_u->flags & RVI_WAGON) && UsesWagonOverride(u)) {
-				if (u->u.rail.cached_vis_effect < 0x40) {
-					/* wagon is powered */
-					SETBIT(u->u.rail.flags, VRF_POWEREDWAGON); // cache 'powered' status
-				}
+			if (rvi_v->pow_wag_power != 0 && rvi_u->railveh_type == RAILVEH_WAGON &&
+				UsesWagonOverride(u) && (u->u.rail.cached_vis_effect < 0x40)) {
+				/* wagon is powered */
+				SETBIT(u->u.rail.flags, VRF_POWEREDWAGON); // cache 'powered' status
 			}
 
 			/* Do not count powered wagons for the compatible railtypes, as wagons always
@@ -215,9 +214,9 @@
 			}
 
 			// max speed is the minimum of the speed limits of all vehicles in the consist
-			if (!(rvi_u->flags & RVI_WAGON) || _patches.wagon_speed_limits)
-				if (rvi_u->max_speed != 0 && !UsesWagonOverride(u))
-					max_speed = min(rvi_u->max_speed, max_speed);
+			if ((rvi_u->railveh_type != RAILVEH_WAGON || _patches.wagon_speed_limits) &&
+				rvi_u->max_speed != 0 && !UsesWagonOverride(u))
+				max_speed = min(rvi_u->max_speed, max_speed);
 		}
 
 		// check the vehicle length (callback)
@@ -490,7 +489,7 @@
 		image = (6 & _engine_sprite_and[img]) + _engine_sprite_base[img];
 	}
 
-	if (rvi->flags & RVI_MULTIHEAD) {
+	if (rvi->railveh_type == RAILVEH_MULTIHEAD) {
 		DrawSprite(image, pal, x - 14, y);
 		x += 15;
 		image = 0;
@@ -765,11 +764,11 @@
 	/* We need to see if the engine got power on the tile to avoid eletric engines in non-electric depots */
 	if (!HasPowerOnRail(rvi->railtype, GetRailType(tile))) return CMD_ERROR;
 
-	if (rvi->flags & RVI_WAGON) return CmdBuildRailWagon(p1, tile, flags);
+	if (rvi->railveh_type == RAILVEH_WAGON) return CmdBuildRailWagon(p1, tile, flags);
 
 	value = EstimateTrainCost(rvi);
 
-	num_vehicles = (rvi->flags & RVI_MULTIHEAD) ? 2 : 1;
+	num_vehicles = (rvi->railveh_type == RAILVEH_MULTIHEAD) ? 2 : 1;
 	num_vehicles += CountArticulatedParts(p1);
 
 	if (!(flags & DC_QUERY_COST)) {
@@ -834,7 +833,7 @@
 
 			VehiclePositionChanged(v);
 
-			if (rvi->flags & RVI_MULTIHEAD) {
+			if (rvi->railveh_type == RAILVEH_MULTIHEAD) {
 				SetMultiheaded(v);
 				AddRearEngineToMultiheadedTrain(vl[0], vl[1], true);
 				/* Now we need to link the front and rear engines together
@@ -1357,7 +1356,7 @@
 		if (v == first && IsFrontEngine(first)) {
 			DeleteWindowById(WC_VEHICLE_VIEW, first->index);
 		}
-		if (IsLocalPlayer() && (p1 == 1 || !(RailVehInfo(v->engine_type)->flags & RVI_WAGON))) {
+		if (IsLocalPlayer() && (p1 == 1 || RailVehInfo(v->engine_type)->railveh_type != RAILVEH_WAGON)) {
 			InvalidateWindow(WC_REPLACE_VEHICLE, VEH_Train);
 		}
 		InvalidateWindow(WC_VEHICLE_DEPOT, first->tile);
@@ -2090,7 +2089,7 @@
 		int x, y;
 
 		// no smoke?
-		if ((rvi->flags & RVI_WAGON && effect_type == 0) ||
+		if ((rvi->railveh_type == RAILVEH_WAGON && effect_type == 0) ||
 				disable_effect ||
 				rvi->railtype > RAILTYPE_ELECTRIC ||
 				v->vehstatus & VS_HIDDEN) {
@@ -3752,7 +3751,7 @@
 					CLRBIT(u->subtype, 7);
 					switch (u->subtype) {
 						case 0: /* TS_Front_Engine */
-							if (rvi->flags & RVI_MULTIHEAD) SetMultiheaded(u);
+							if (rvi->railveh_type == RAILVEH_MULTIHEAD) SetMultiheaded(u);
 							SetFrontEngine(u);
 							SetTrainEngine(u);
 							break;
@@ -3764,17 +3763,17 @@
 
 						case 2: /* TS_Not_First */
 							u->subtype = 0;
-							if (rvi->flags & RVI_WAGON) {
+							if (rvi->railveh_type == RAILVEH_WAGON) {
 								// normal wagon
 								SetTrainWagon(u);
 								break;
 							}
-							if (rvi->flags & RVI_MULTIHEAD && rvi->image_index == u->spritenum - 1) {
+							if (rvi->railveh_type == RAILVEH_MULTIHEAD && rvi->image_index == u->spritenum - 1) {
 								// rear end of a multiheaded engine
 								SetMultiheaded(u);
 								break;
 							}
-							if (rvi->flags & RVI_MULTIHEAD) SetMultiheaded(u);
+							if (rvi->railveh_type == RAILVEH_MULTIHEAD) SetMultiheaded(u);
 							SetTrainEngine(u);
 							break;
 
--- a/src/train_gui.cpp
+++ b/src/train_gui.cpp
@@ -158,7 +158,7 @@
 			/* See if any vehicle can be refitted */
 			for (u = v; u != NULL; u = u->next) {
 				if (EngInfo(u->engine_type)->refit_mask != 0 ||
-						(!(RailVehInfo(v->engine_type)->flags & RVI_WAGON) && v->cargo_cap != 0)) {
+						(RailVehInfo(v->engine_type)->railveh_type != RAILVEH_WAGON && v->cargo_cap != 0)) {
 					EnableWindowWidget(w, 12);
 					/* We have a refittable carriage, bail out */
 					break;
@@ -341,7 +341,7 @@
 
 static void TrainDetailsInfoTab(const Vehicle *v, int x, int y)
 {
-	if (RailVehInfo(v->engine_type)->flags & RVI_WAGON) {
+	if (RailVehInfo(v->engine_type)->railveh_type == RAILVEH_WAGON) {
 		SetDParam(0, GetCustomEngineName(v->engine_type));
 		SetDParam(1, v->value);
 		DrawString(x, y, STR_882D_VALUE, 0x10);
--- a/src/vehicle.cpp
+++ b/src/vehicle.cpp
@@ -787,7 +787,7 @@
 		case VEH_Road: base_cost = _price.roadveh_base; break;
 		case VEH_Aircraft: base_cost = _price.aircraft_base; break;
 		case VEH_Train:
-			base_cost = 2 * ((RailVehInfo(engine_type)->flags & RVI_WAGON) ?
+			base_cost = 2 * ((RailVehInfo(engine_type)->railveh_type == RAILVEH_WAGON) ?
 							 _price.build_railwagon : _price.build_railvehicle);
 			break;
 		default: NOT_REACHED(); break;
@@ -2243,7 +2243,7 @@
 
 		while (v->u.rail.cached_total_length > old_total_length) {
 			// the train is too long. We will remove cars one by one from the start of the train until it's short enough
-			while (w != NULL && !(RailVehInfo(w->engine_type)->flags&RVI_WAGON) ) {
+			while (w != NULL && RailVehInfo(w->engine_type)->railveh_type != RAILVEH_WAGON) {
 				w = GetNextVehicle(w);
 			}
 			if (w == NULL) {
@@ -2850,7 +2850,7 @@
 					case RAILTYPE_ELECTRIC:
 					{
 						if (cargo_type == CT_INVALID) cargo_type = rvi->cargo_type;
-						if (rvi->flags & RVI_WAGON) {
+						if (rvi->railveh_type == RAILVEH_WAGON) {
 							if (cargo_type == CT_PASSENGERS || cargo_type == CT_MAIL || cargo_type == CT_VALUABLES) {
 								if (parent_engine_type == INVALID_ENGINE) {
 									scheme = LS_PASSENGER_WAGON_STEAM;