summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/rail.h5
-rw-r--r--src/railtypes.h12
-rw-r--r--src/train_cmd.cpp11
3 files changed, 25 insertions, 3 deletions
diff --git a/src/rail.h b/src/rail.h
index 1f940e19d..f2c35352b 100644
--- a/src/rail.h
+++ b/src/rail.h
@@ -89,6 +89,11 @@ struct RailtypeInfo {
* Offset to add to ground sprite when drawing custom waypoints / stations
*/
byte custom_ground_offset;
+
+ /**
+ * Multiplier for curve maximum speed advantage
+ */
+ byte curve_speed;
};
diff --git a/src/railtypes.h b/src/railtypes.h
index d456d66ac..db5e4a94d 100644
--- a/src/railtypes.h
+++ b/src/railtypes.h
@@ -57,6 +57,9 @@ RailtypeInfo _railtypes[] = {
/* custom ground offset */
0,
+
+ /* curve speed advantage (multiplier) */
+ 0,
},
/** Electrified railway */
@@ -110,6 +113,9 @@ RailtypeInfo _railtypes[] = {
/* custom ground offset */
0,
+
+ /* curve speed advantage (multiplier) */
+ 0,
},
/** Monorail */
@@ -159,6 +165,9 @@ RailtypeInfo _railtypes[] = {
/* custom ground offset */
1,
+
+ /* curve speed advantage (multiplier) */
+ 1,
},
/** Maglev */
@@ -208,6 +217,9 @@ RailtypeInfo _railtypes[] = {
/* custom ground offset */
2,
+
+ /* curve speed advantage (multiplier) */
+ 2,
},
};
diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp
index c47c23dae..b5c9e3c0d 100644
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -311,7 +311,8 @@ static bool TrainShouldStop(const Vehicle* v, TileIndex tile)
/** 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 @@ static int GetTrainAcceleration(Vehicle *v, bool mode)
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)) {