changeset 9208:aa4576e5111a draft

(svn r13074) -Fix: For multiheaded engines, halve power and running cost when used instead of when loading, to allow callback values to work properly.
author peter1138 <peter1138@openttd.org>
date Tue, 13 May 2008 20:39:57 +0000
parents 839a532bf0f6
children 638c2e249af7
files src/build_vehicle_gui.cpp src/newgrf.cpp src/table/engines.h src/train_cmd.cpp
diffstat 4 files changed, 26 insertions(+), 38 deletions(-) [+]
line wrap: on
line diff
--- a/src/build_vehicle_gui.cpp
+++ b/src/build_vehicle_gui.cpp
@@ -154,8 +154,8 @@
 	const RailVehicleInfo *rvi_a = RailVehInfo(*(const EngineID*)a);
 	const RailVehicleInfo *rvi_b = RailVehInfo(*(const EngineID*)b);
 
-	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 va = rvi_a->power;
+	int vb = rvi_b->power;
 	int r = va - vb;
 
 	return _internal_sort_order ? -r : r;
@@ -538,7 +538,7 @@
 
 	/* Max speed - Engine power */
 	SetDParam(0, GetEngineProperty(engine_number, 0x09, rvi->max_speed) * 10 / 16);
-	SetDParam(1, GetEngineProperty(engine_number, 0x0B, rvi->power) << multihead);
+	SetDParam(1, GetEngineProperty(engine_number, 0x0B, rvi->power));
 	DrawString(x, y, STR_PURCHASE_INFO_SPEED_POWER, TC_FROMSTRING);
 	y += 10;
 
@@ -551,7 +551,7 @@
 
 	/* Running cost */
 	if (rvi->running_cost_class != 0xFF) {
-		SetDParam(0, (GetEngineProperty(engine_number, 0x0D, rvi->running_cost) * GetPriceByIndex(rvi->running_cost_class) >> 8) << multihead);
+		SetDParam(0, GetEngineProperty(engine_number, 0x0D, rvi->running_cost) * GetPriceByIndex(rvi->running_cost_class) >> 8);
 		DrawString(x, y, STR_PURCHASE_INFO_RUNNINGCOST, TC_FROMSTRING);
 		y += 10;
 	}
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -466,22 +466,14 @@
 				rvi->max_speed = speed;
 			} break;
 
-			case 0x0B: { // Power
-				uint16 power = grf_load_word(&buf);
-
-				if (rvi->railveh_type == RAILVEH_MULTIHEAD) power /= 2;
-
-				rvi->power = power;
-				dewagonize(power, e);
-			} break;
-
-			case 0x0D: { // Running cost factor
-				uint8 runcostfact = grf_load_byte(&buf);
-
-				if (rvi->railveh_type == RAILVEH_MULTIHEAD) runcostfact /= 2;
-
-				rvi->running_cost = runcostfact;
-			} break;
+			case 0x0B: // Power
+				rvi->power = grf_load_word(&buf);
+				dewagonize(rvi->power, e);
+				break;
+
+			case 0x0D: // Running cost factor
+				rvi->running_cost = grf_load_byte(&buf);
+				break;
 
 			case 0x0E: { // Running cost base
 				uint32 base = grf_load_dword(&buf);
@@ -513,18 +505,8 @@
 				uint8 dual = grf_load_byte(&buf);
 
 				if (dual != 0) {
-					if (rvi->railveh_type != RAILVEH_MULTIHEAD) {
-						// adjust power and running cost if needed
-						rvi->power /= 2;
-						rvi->running_cost /= 2;
-					}
 					rvi->railveh_type = RAILVEH_MULTIHEAD;
 				} else {
-					if (rvi->railveh_type == RAILVEH_MULTIHEAD) {
-						// adjust power and running cost if needed
-						rvi->power *= 2;
-						rvi->running_cost *= 2;
-					}
 					rvi->railveh_type = rvi->power == 0 ?
 						RAILVEH_WAGON : RAILVEH_SINGLEHEAD;
 				}
--- a/src/table/engines.h
+++ b/src/table/engines.h
@@ -387,8 +387,8 @@
 	RVI( 0, G,  13, 112,    1000, 131,   120, RC_S,  0, 0              , 20, R, S), //   8
 	RVI( 1, G,  19, 128,    1200, 162,   140, RC_S,  0, 0              , 21, R, S), //   9
 	RVI( 0, G,  22, 144,    1600, 170,   130, RC_S,  0, 0              , 22, R, S), //  10
-	RVI( 8, M,  11, 112,   600/2,  32,  85/2, RC_D, 38, CT_PASSENGERS  , 10, R, D), //  11
-	RVI(10, M,  14, 120,   700/2,  38,  70/2, RC_D, 40, CT_PASSENGERS  , 11, R, D), //  12
+	RVI( 8, M,  11, 112,     600,  32,    85, RC_D, 38, CT_PASSENGERS  , 10, R, D), //  11
+	RVI(10, M,  14, 120,     700,  38,    70, RC_D, 40, CT_PASSENGERS  , 11, R, D), //  12
 	RVI( 4, G,  15, 128,    1250,  72,    95, RC_D,  0, 0              , 30, R, D), //  13
 	RVI( 5, G,  17, 144,    1750, 101,   120, RC_D,  0, 0              , 31, R, D), //  14
 	RVI( 4, G,  18, 160,    2580, 112,   140, RC_D,  0, 0              , 32, R, D), //  15
@@ -396,13 +396,13 @@
 	RVI(12, G,  16, 112,    2400, 120,   105, RC_D,  0, 0              , 34, R, D), //  17
 	RVI(13, G,  30, 112,    6600, 207,   155, RC_D,  0, 0              , 35, R, D), //  18
 	RVI(15, G,  18, 104,    1500, 110,   105, RC_D,  0, 0              , 29, R, D), //  19
-	RVI(16, M,  35, 160,  3500/2,  95, 205/2, RC_D,  0, 0              , 45, R, D), //  20
+	RVI(16, M,  35, 160,    3500,  95,   205, RC_D,  0, 0              , 45, R, D), //  20
 	RVI(18, G,  21, 104,    2200, 120,   145, RC_D,  0, 0              , 32, R, D), //  21
-	RVI( 6, M,  20, 200,  4500/2,  70, 190/2, RC_D,  4, CT_MAIL        , 50, R, D), //  22
+	RVI( 6, M,  20, 200,    4500,  70,   190, RC_D,  4, CT_MAIL        , 50, R, D), //  22
 	RVI(20, G,  26, 160,    3600,  84,   180, RC_E,  0, 0              , 40, C, E), //  23
 	RVI(20, G,  30, 176,    5000,  82,   205, RC_E,  0, 0              , 41, C, E), //  24
-	RVI(21, M,  40, 240,  7000/2,  90, 240/2, RC_E,  0, 0              , 51, C, E), //  25
-	RVI(23, M,  43, 264,  8000/2,  95, 250/2, RC_E,  0, 0              , 52, C, E), //  26
+	RVI(21, M,  40, 240,    7000,  90,   240, RC_E,  0, 0              , 51, C, E), //  25
+	RVI(23, M,  43, 264,    8000,  95,   250, RC_E,  0, 0              , 52, C, E), //  26
 	RVI(33, W, 247,   0,       0,  25,     0, RC_W, 40, CT_PASSENGERS  ,  0, R, A), //  27
 	RVI(35, W, 228,   0,       0,  21,     0, RC_W, 30, CT_MAIL        ,  0, R, A), //  28
 	RVI(34, W, 176,   0,       0,  18,     0, RC_W, 30, CT_COAL        ,  0, R, A), //  29
@@ -431,7 +431,7 @@
 	RVI(58, W, 193,   0,       0,  18,     0, RC_W, 25, CT_FIZZY_DRINKS,  0, R, A), //  52
 	RVI(59, W, 191,   0,       0,  18,     0, RC_W, 30, CT_PLASTIC     ,  0, R, A), //  53
 	RVI(25, G,  52, 304,    9000,  95,   230, RC_E,  0, 0              , 60, O, N), //  54
-	RVI(26, M,  60, 336, 10000/2,  85, 240/2, RC_E, 25, CT_PASSENGERS  , 62, O, N), //  55
+	RVI(26, M,  60, 336,   10000,  85,   240, RC_E, 25, CT_PASSENGERS  , 62, O, N), //  55
 	RVI(26, G,  53, 320,    5000,  95,   230, RC_E,  0, 0              , 63, O, N), //  56
 	RVI(60, W, 247,   0,       0,  25,     0, RC_W, 45, CT_PASSENGERS  ,  0, O, A), //  57
 	RVI(62, W, 228,   0,       0,  21,     0, RC_W, 35, CT_MAIL        ,  0, O, A), //  58
@@ -463,7 +463,7 @@
 	RVI(28, G,  70, 400,   10000, 105,   250, RC_E,  0, 0              , 70, L, V), //  84
 	RVI(29, G,  74, 448,   12000, 120,   253, RC_E,  0, 0              , 71, L, V), //  85
 	RVI(30, G,  82, 480,   15000, 130,   254, RC_E,  0, 0              , 72, L, V), //  86
-	RVI(31, M,  95, 640, 20000/2, 150, 255/2, RC_E,  0, 0              , 73, L, V), //  87
+	RVI(31, M,  95, 640,   20000, 150,   255, RC_E,  0, 0              , 73, L, V), //  87
 	RVI(28, G,  70, 480,   10000, 120,   250, RC_E,  0, 0              , 74, L, V), //  88
 	RVI(60, W, 247,   0,       0,  25,     0, RC_W, 47, CT_PASSENGERS  ,  0, L, A), //  89
 	RVI(62, W, 228,   0,       0,  21,     0, RC_W, 37, CT_MAIL        ,  0, L, A), //  90
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -118,6 +118,9 @@
 		if (engine_has_power) {
 			uint16 power = GetVehicleProperty(u, 0x0B, rvi_u->power);
 			if (power != 0) {
+				/* Halve power for multiheaded parts */
+				if (IsMultiheaded(u)) power /= 2;
+
 				total_power += power;
 				/* Tractive effort in (tonnes * 1000 * 10 =) N */
 				max_te += (u->u.rail.cached_veh_weight * 10000 * GetVehicleProperty(u, 0x1F, rvi_u->tractive_effort)) / 256;
@@ -3499,6 +3502,9 @@
 		byte cost_factor = GetVehicleProperty(v, 0x0D, rvi->running_cost);
 		if (cost_factor == 0) continue;
 
+		/* Halve running cost for multiheaded parts */
+		if (IsMultiheaded(v)) cost_factor /= 2;
+
 		cost += cost_factor * GetPriceByIndex(rvi->running_cost_class);
 	} while ((v = GetNextVehicle(v)) != NULL);