(svn r8385) -Fix
authortron
Wed, 24 Jan 2007 07:14:09 +0000
changeset 6074 e70d63ef4d62
parent 6073 d8dae377c879
child 6075 33cdb35f9af5
(svn r8385) -Fix

-Regression (r8314): I only did half the necessary changes to move railtype from Engine to RailVehicleInfo. Now do the rest.
src/ai/default/default.cpp
src/autoreplace_gui.cpp
src/build_vehicle_gui.cpp
src/elrail.cpp
src/engine.cpp
src/engine.h
src/engine_gui.cpp
src/oldloader.cpp
src/openttd.cpp
src/players.cpp
src/table/engines.h
src/train_cmd.cpp
src/vehicle.cpp
--- a/src/ai/default/default.cpp	Wed Jan 24 02:36:55 2007 +0000
+++ b/src/ai/default/default.cpp	Wed Jan 24 07:14:09 2007 +0000
@@ -142,7 +142,7 @@
 		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 @@
 		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;
--- a/src/autoreplace_gui.cpp	Wed Jan 24 02:36:55 2007 +0000
+++ b/src/autoreplace_gui.cpp	Wed Jan 24 07:14:09 2007 +0000
@@ -60,9 +60,9 @@
 
 
 		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 @@
 			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++;
 					}
--- a/src/build_vehicle_gui.cpp	Wed Jan 24 02:36:55 2007 +0000
+++ b/src/build_vehicle_gui.cpp	Wed Jan 24 07:14:09 2007 +0000
@@ -386,7 +386,7 @@
 }
 
 /* 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 @@
 	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 @@
 			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 @@
 		* 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);
--- a/src/elrail.cpp	Wed Jan 24 02:36:55 2007 +0000
+++ b/src/elrail.cpp	Wed Jan 24 07:14:09 2007 +0000
@@ -406,12 +406,11 @@
 
 	/* 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;
 		}
 	}
 
--- a/src/engine.cpp	Wed Jan 24 02:36:55 2007 +0000
+++ b/src/engine.cpp	Wed Jan 24 07:14:09 2007 +0000
@@ -180,13 +180,18 @@
 	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 @@
 
 				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 @@
 	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 @@
 	// 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);
 		}
-	}
 
-	if (index < NUM_TRAIN_ENGINES) {
 		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 @@
 	    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)
--- a/src/engine.h	Wed Jan 24 02:36:55 2007 +0000
+++ b/src/engine.h	Wed Jan 24 07:14:09 2007 +0000
@@ -13,7 +13,7 @@
 	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 @@
 	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;
--- a/src/engine_gui.cpp	Wed Jan 24 02:36:55 2007 +0000
+++ b/src/engine_gui.cpp	Wed Jan 24 07:14:09 2007 +0000
@@ -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;
--- a/src/oldloader.cpp	Wed Jan 24 02:36:55 2007 +0000
+++ b/src/oldloader.cpp	Wed Jan 24 07:14:09 2007 +0000
@@ -1249,9 +1249,8 @@
 	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()
 };
--- a/src/openttd.cpp	Wed Jan 24 02:36:55 2007 +0000
+++ b/src/openttd.cpp	Wed Jan 24 07:14:09 2007 +0000
@@ -1413,20 +1413,11 @@
 	/* 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;
--- a/src/players.cpp	Wed Jan 24 02:36:55 2007 +0000
+++ b/src/players.cpp	Wed Jan 24 07:14:09 2007 +0000
@@ -653,10 +653,13 @@
 		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);
+			}
 		}
 	}
 
--- a/src/table/engines.h	Wed Jan 24 02:36:55 2007 +0000
+++ b/src/table/engines.h	Wed Jan 24 07:14:09 2007 +0000
@@ -328,18 +328,17 @@
  * @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 @@
 	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
--- a/src/train_cmd.cpp	Wed Jan 24 02:36:55 2007 +0000
+++ b/src/train_cmd.cpp	Wed Jan 24 07:14:09 2007 +0000
@@ -164,7 +164,7 @@
 
 		// 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 @@
 			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 @@
 	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 @@
 	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 @@
 
 			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 @@
 	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 @@
 
 		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 @@
 
 	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);
--- a/src/vehicle.cpp	Wed Jan 24 02:36:55 2007 +0000
+++ b/src/vehicle.cpp	Wed Jan 24 07:14:09 2007 +0000
@@ -2837,6 +2837,7 @@
 				const RailVehicleInfo *rvi = RailVehInfo(engine_type);
 
 				switch (rvi->railtype) {
+					default: NOT_REACHED();
 					case RAILTYPE_RAIL:
 					case RAILTYPE_ELECTRIC:
 					{