diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 455fdfb579..d16b034bc0 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 0507dad2b0..3ea708db10 100644 --- a/src/rail.h +++ b/src/rail.h @@ -145,6 +145,11 @@ struct RailtypeInfo { */ uint8 acceleration_type; + /** + * Maximum speed for vehicles travelling on this rail type + */ + uint16 max_speed; + /** * Unique 32 bit rail type identifier */ diff --git a/src/table/railtypes.h b/src/table/railtypes.h index 8d4199a97c..a01200a057 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 ff5b829272..a6a90d6f09 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 7f903f497c..3e410d5524 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;