summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/newgrf.cpp2
-rw-r--r--src/rail.h5
-rw-r--r--src/table/railtypes.h12
-rw-r--r--src/train.h1
-rw-r--r--src/train_cmd.cpp11
5 files changed, 28 insertions, 3 deletions
diff --git a/src/newgrf.cpp b/src/newgrf.cpp
index 455fdfb57..d16b034bc 100644
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -2569,7 +2569,7 @@ static ChangeInfoResult RailTypeChangeInfo(uint id, int numinfo, int prop, ByteR
break;
case 0x14: // Speed limit
- buf->ReadWord();
+ rti->max_speed = buf->ReadWord();
break;
case 0x15: // Acceleration model
diff --git a/src/rail.h b/src/rail.h
index 0507dad2b..3ea708db1 100644
--- a/src/rail.h
+++ b/src/rail.h
@@ -146,6 +146,11 @@ struct RailtypeInfo {
uint8 acceleration_type;
/**
+ * Maximum speed for vehicles travelling on this rail type
+ */
+ uint16 max_speed;
+
+ /**
* Unique 32 bit rail type identifier
*/
RailTypeLabel label;
diff --git a/src/table/railtypes.h b/src/table/railtypes.h
index 8d4199a97..a01200a05 100644
--- a/src/table/railtypes.h
+++ b/src/table/railtypes.h
@@ -84,6 +84,9 @@ static const RailtypeInfo _original_railtypes[] = {
/* acceleration type */
0,
+ /* max speed */
+ 0,
+
/* rail type label */
'RAIL',
},
@@ -159,6 +162,9 @@ static const RailtypeInfo _original_railtypes[] = {
/* acceleration type */
0,
+ /* max speed */
+ 0,
+
/* rail type label */
'ELRL',
},
@@ -230,6 +236,9 @@ static const RailtypeInfo _original_railtypes[] = {
/* acceleration type */
1,
+ /* max speed */
+ 0,
+
/* rail type label */
'MONO',
},
@@ -301,6 +310,9 @@ static const RailtypeInfo _original_railtypes[] = {
/* acceleration type */
2,
+ /* max speed */
+ 0,
+
/* rail type label */
'MGLV',
},
diff --git a/src/train.h b/src/train.h
index ff5b82927..a6a90d6f0 100644
--- a/src/train.h
+++ b/src/train.h
@@ -86,6 +86,7 @@ struct TrainCache : public AccelerationCache {
/* cached max. speed / acceleration data */
uint16 cached_max_speed; ///< max speed of the consist. (minimum of the max speed of all vehicles in the consist)
+ uint16 cached_max_rail_speed; ///< max consist speed limited by rail type
int cached_max_curve_speed; ///< max consist speed limited by curves
/**
diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp
index 7f903f497..3e410d552 100644
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -99,6 +99,7 @@ void Train::PowerChanged()
uint32 total_power = 0;
uint32 max_te = 0;
uint32 number_of_parts = 0;
+ uint16 max_rail_speed = this->tcache.cached_max_speed;
for (const Train *u = this; u != NULL; u = u->Next()) {
uint32 current_power = u->GetPower();
@@ -108,6 +109,10 @@ void Train::PowerChanged()
if (current_power > 0) max_te += u->GetWeight() * u->GetTractiveEffort();
total_power += u->GetPoweredPartPower(this);
number_of_parts++;
+
+ /* Get minimum max speed for rail */
+ uint16 rail_speed = GetRailTypeInfo(GetRailType(u->tile))->max_speed;
+ if (rail_speed > 0) max_rail_speed = min(max_rail_speed, rail_speed);
}
this->tcache.cached_axle_resistance = 60 * number_of_parts;
@@ -124,6 +129,8 @@ void Train::PowerChanged()
SetWindowDirty(WC_VEHICLE_DETAILS, this->index);
SetWindowWidgetDirty(WC_VEHICLE_VIEW, this->index, VVW_WIDGET_START_STOP_VEH);
}
+
+ this->tcache.cached_max_rail_speed = max_rail_speed;
}
@@ -491,7 +498,7 @@ int Train::GetCurrentMaxSpeed() const
}
}
- return min(max_speed, this->tcache.cached_max_speed);
+ return min(max_speed, this->tcache.cached_max_rail_speed);
}
/**
@@ -557,7 +564,7 @@ void Train::UpdateAcceleration()
{
assert(this->IsFrontEngine());
- this->max_speed = this->tcache.cached_max_speed;
+ this->max_speed = this->tcache.cached_max_rail_speed;
uint power = this->tcache.cached_power;
uint weight = this->tcache.cached_weight;