@ -63,7 +63,7 @@ byte FreightWagonMult(CargoID cargo)
*/
void TrainPowerChanged ( Vehicle * v )
{
uint32 power = 0 ;
uint32 total_ power = 0 ;
uint32 max_te = 0 ;
for ( const Vehicle * u = v ; u ! = NULL ; u = u - > next ) {
@ -76,19 +76,22 @@ void TrainPowerChanged(Vehicle* v)
const RailVehicleInfo * rvi_u = RailVehInfo ( u - > engine_type ) ;
if ( engine_has_power & & rvi_u - > power ! = 0 ) {
power + = rvi_u - > power ;
/* Tractive effort in (tonnes * 1000 * 10 =) N */
max_te + = ( u - > u . rail . cached_veh_weight * 10000 * rvi_u - > tractive_effort ) / 256 ;
if ( engine_has_power ) {
uint16 power = GetVehicleProperty ( u , 0x0B , rvi_u - > power ) ;
if ( power ! = 0 ) {
total_power + = power ;
/* Tractive effort in (tonnes * 1000 * 10 =) N */
max_te + = ( u - > u . rail . cached_veh_weight * 10000 * GetVehicleProperty ( u , 0x1F , rvi_u - > tractive_effort ) ) / 256 ;
}
}
if ( HASBIT ( u - > u . rail . flags , VRF_POWEREDWAGON ) & & ( wagon_has_power ) ) {
power + = RailVehInfo ( u - > u . rail . first_engine ) - > pow_wag_power ;
total_ power + = RailVehInfo ( u - > u . rail . first_engine ) - > pow_wag_power ;
}
}
if ( v - > u . rail . cached_power ! = power | | v - > u . rail . cached_max_te ! = max_te ) {
v - > u . rail . cached_power = power;
if ( v - > u . rail . cached_power ! = total_ power | | v - > u . rail . cached_max_te ! = max_te ) {
v - > u . rail . cached_power = total_ power;
v - > u . rail . cached_max_te = max_te ;
InvalidateWindow ( WC_VEHICLE_DETAILS , v - > index ) ;
InvalidateWindowWidget ( WC_VEHICLE_VIEW , v - > index , STATUS_BAR ) ;
@ -208,9 +211,10 @@ void TrainConsistChanged(Vehicle* v)
}
/* max speed is the minimum of the speed limits of all vehicles in the consist */
if ( ( rvi_u - > railveh_type ! = RAILVEH_WAGON | | _patches . wagon_speed_limits ) & &
rvi_u - > max_speed ! = 0 & & ! UsesWagonOverride ( u ) )
max_speed = min ( rvi_u - > max_speed , max_speed ) ;
if ( ( rvi_u - > railveh_type ! = RAILVEH_WAGON | | _patches . wagon_speed_limits ) & & ! UsesWagonOverride ( u ) ) {
uint16 speed = GetVehicleProperty ( u , 0x09 , rvi_u - > max_speed ) ;
if ( speed ! = 0 ) max_speed = min ( speed , max_speed ) ;
}
}
/* check the vehicle length (callback) */
@ -3473,8 +3477,11 @@ int32 GetTrainRunningCost(const Vehicle *v)
do {
const RailVehicleInfo * rvi = RailVehInfo ( v - > engine_type ) ;
if ( rvi - > running_cost_base > 0 )
cost + = rvi - > running_cost_base * _price . running_rail [ rvi - > running_cost_class ] ;
byte cost_factor = GetVehicleProperty ( v , 0x0D , rvi - > running_cost_base ) ;
if ( cost_factor = = 0 ) continue ;
cost + = cost_factor * _price . running_rail [ rvi - > running_cost_class ] ;
} while ( ( v = GetNextVehicle ( v ) ) ! = NULL ) ;
return cost ;