changeset 8169:7962907a27a1 draft

(svn r11732) -Fix (r4150): elrail merge gave elrail, monorail & maglev unintended speed bonuses for curves, as the bonus was based on the railtype index. The bonus is now specified by a property of the railtype.
author peter1138 <peter1138@openttd.org>
date Tue, 01 Jan 2008 14:00:31 +0000
parents e321f51fe381
children a8be61a5213c
files src/rail.h src/railtypes.h src/train_cmd.cpp
diffstat 3 files changed, 25 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/rail.h
+++ b/src/rail.h
@@ -89,6 +89,11 @@
 	 * Offset to add to ground sprite when drawing custom waypoints / stations
 	 */
 	byte custom_ground_offset;
+
+	/**
+	 * Multiplier for curve maximum speed advantage
+	 */
+	byte curve_speed;
 };
 
 
--- a/src/railtypes.h
+++ b/src/railtypes.h
@@ -57,6 +57,9 @@
 
 		/* custom ground offset */
 		0,
+
+		/* curve speed advantage (multiplier) */
+		0,
 	},
 
 	/** Electrified railway */
@@ -110,6 +113,9 @@
 
 		/* custom ground offset */
 		0,
+
+		/* curve speed advantage (multiplier) */
+		0,
 	},
 
 	/** Monorail */
@@ -159,6 +165,9 @@
 
 		/* custom ground offset */
 		1,
+
+		/* curve speed advantage (multiplier) */
+		1,
 	},
 
 	/** Maglev */
@@ -208,6 +217,9 @@
 
 		/* custom ground offset */
 		2,
+
+		/* curve speed advantage (multiplier) */
+		2,
 	},
 };
 
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -311,7 +311,8 @@
 /** new acceleration*/
 static int GetTrainAcceleration(Vehicle *v, bool mode)
 {
-	int max_speed = 2000;
+	static const int absolute_max_speed = 2000;
+	int max_speed = absolute_max_speed;
 	int speed = v->cur_speed * 10 / 16; // km-ish/h -> mp/h
 	int curvecount[2] = {0, 0};
 
@@ -352,13 +353,17 @@
 		int total = curvecount[0] + curvecount[1];
 
 		if (curvecount[0] == 1 && curvecount[1] == 1) {
-			max_speed = 0xFFFF;
+			max_speed = absolute_max_speed;
 		} else if (total > 1) {
 			max_speed = 232 - (13 - Clamp(sum, 1, 12)) * (13 - Clamp(sum, 1, 12));
 		}
 	}
 
-	max_speed += (max_speed / 2) * v->u.rail.railtype;
+	if (max_speed != absolute_max_speed) {
+		/* Apply the engine's rail type curve speed advantage, if it slowed by curves */
+		const RailtypeInfo *rti = GetRailTypeInfo(v->u.rail.railtype);
+		max_speed += (max_speed / 2) * rti->curve_speed;
+	}
 
 	if (IsTileType(v->tile, MP_STATION) && IsFrontEngine(v)) {
 		if (TrainShouldStop(v, v->tile)) {