mirror of https://github.com/OpenTTD/OpenTTD
(svn r18972) -Add: [NewGRF] Per-rail type speed limits.
parent
2331ccd589
commit
2b820780a1
|
@ -2569,7 +2569,7 @@ static ChangeInfoResult RailTypeChangeInfo(uint id, int numinfo, int prop, ByteR
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x14: // Speed limit
|
case 0x14: // Speed limit
|
||||||
buf->ReadWord();
|
rti->max_speed = buf->ReadWord();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x15: // Acceleration model
|
case 0x15: // Acceleration model
|
||||||
|
|
|
@ -145,6 +145,11 @@ struct RailtypeInfo {
|
||||||
*/
|
*/
|
||||||
uint8 acceleration_type;
|
uint8 acceleration_type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maximum speed for vehicles travelling on this rail type
|
||||||
|
*/
|
||||||
|
uint16 max_speed;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unique 32 bit rail type identifier
|
* Unique 32 bit rail type identifier
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -84,6 +84,9 @@ static const RailtypeInfo _original_railtypes[] = {
|
||||||
/* acceleration type */
|
/* acceleration type */
|
||||||
0,
|
0,
|
||||||
|
|
||||||
|
/* max speed */
|
||||||
|
0,
|
||||||
|
|
||||||
/* rail type label */
|
/* rail type label */
|
||||||
'RAIL',
|
'RAIL',
|
||||||
},
|
},
|
||||||
|
@ -159,6 +162,9 @@ static const RailtypeInfo _original_railtypes[] = {
|
||||||
/* acceleration type */
|
/* acceleration type */
|
||||||
0,
|
0,
|
||||||
|
|
||||||
|
/* max speed */
|
||||||
|
0,
|
||||||
|
|
||||||
/* rail type label */
|
/* rail type label */
|
||||||
'ELRL',
|
'ELRL',
|
||||||
},
|
},
|
||||||
|
@ -230,6 +236,9 @@ static const RailtypeInfo _original_railtypes[] = {
|
||||||
/* acceleration type */
|
/* acceleration type */
|
||||||
1,
|
1,
|
||||||
|
|
||||||
|
/* max speed */
|
||||||
|
0,
|
||||||
|
|
||||||
/* rail type label */
|
/* rail type label */
|
||||||
'MONO',
|
'MONO',
|
||||||
},
|
},
|
||||||
|
@ -301,6 +310,9 @@ static const RailtypeInfo _original_railtypes[] = {
|
||||||
/* acceleration type */
|
/* acceleration type */
|
||||||
2,
|
2,
|
||||||
|
|
||||||
|
/* max speed */
|
||||||
|
0,
|
||||||
|
|
||||||
/* rail type label */
|
/* rail type label */
|
||||||
'MGLV',
|
'MGLV',
|
||||||
},
|
},
|
||||||
|
|
|
@ -86,6 +86,7 @@ struct TrainCache : public AccelerationCache {
|
||||||
|
|
||||||
/* cached max. speed / acceleration data */
|
/* 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_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
|
int cached_max_curve_speed; ///< max consist speed limited by curves
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -99,6 +99,7 @@ void Train::PowerChanged()
|
||||||
uint32 total_power = 0;
|
uint32 total_power = 0;
|
||||||
uint32 max_te = 0;
|
uint32 max_te = 0;
|
||||||
uint32 number_of_parts = 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()) {
|
for (const Train *u = this; u != NULL; u = u->Next()) {
|
||||||
uint32 current_power = u->GetPower();
|
uint32 current_power = u->GetPower();
|
||||||
|
@ -108,6 +109,10 @@ void Train::PowerChanged()
|
||||||
if (current_power > 0) max_te += u->GetWeight() * u->GetTractiveEffort();
|
if (current_power > 0) max_te += u->GetWeight() * u->GetTractiveEffort();
|
||||||
total_power += u->GetPoweredPartPower(this);
|
total_power += u->GetPoweredPartPower(this);
|
||||||
number_of_parts++;
|
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;
|
this->tcache.cached_axle_resistance = 60 * number_of_parts;
|
||||||
|
@ -124,6 +129,8 @@ void Train::PowerChanged()
|
||||||
SetWindowDirty(WC_VEHICLE_DETAILS, this->index);
|
SetWindowDirty(WC_VEHICLE_DETAILS, this->index);
|
||||||
SetWindowWidgetDirty(WC_VEHICLE_VIEW, this->index, VVW_WIDGET_START_STOP_VEH);
|
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());
|
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 power = this->tcache.cached_power;
|
||||||
uint weight = this->tcache.cached_weight;
|
uint weight = this->tcache.cached_weight;
|
||||||
|
|
Loading…
Reference in New Issue