@ -1892,31 +1892,15 @@ CommandCost Vehicle::SendToDepot(DoCommandFlag flags, DepotCommand command)
void Vehicle : : UpdateVisualEffect ( bool allow_power_change )
{
bool powered_before = HasBit ( this - > vcache . cached_vis_effect , VE_DISABLE_WAGON_POWER ) ;
this - > vcache . cached_vis_effect = 0 ;
const Engine * e = Engine : : Get ( this - > engine_type ) ;
byte visual_effect = VE_DEFAULT ;
switch ( this - > type ) {
/* Evaluate properties */
byte visual_effect ;
switch ( e - > type ) {
case VEH_TRAIN : visual_effect = e - > u . rail . visual_effect ; break ;
case VEH_ROAD : visual_effect = e - > u . road . visual_effect ; break ;
case VEH_SHIP : visual_effect = e - > u . ship . visual_effect ; break ;
default : break ;
}
if ( visual_effect = = VE_DEFAULT ) {
if ( this - > type = = VEH_TRAIN & & ! ( Train : : From ( this ) - > IsWagon ( ) | | Train : : From ( this ) - > IsArticulatedPart ( ) ) ) {
if ( e - > u . rail . engclass = = 0 ) {
/* Steam is offset by -4 units */
SB ( this - > vcache . cached_vis_effect , VE_OFFSET_START , VE_OFFSET_COUNT , VE_OFFSET_CENTRE - 4 ) ;
} else {
/* Diesel fumes and sparks come from the centre */
SB ( this - > vcache . cached_vis_effect , VE_OFFSET_START , VE_OFFSET_COUNT , VE_OFFSET_CENTRE ) ;
}
} else {
/* Non-train engines do not have a visual effect by default. */
SetBit ( this - > vcache . cached_vis_effect , VE_DISABLE_EFFECT ) ;
}
} else {
this - > vcache . cached_vis_effect = visual_effect ;
default : visual_effect = 1 < < VE_DISABLE_EFFECT ; break ;
}
/* Check powered wagon / visual effect callback */
@ -1931,10 +1915,32 @@ void Vehicle::UpdateVisualEffect(bool allow_power_change)
assert ( HasBit ( callback , VE_DISABLE_EFFECT ) ) ;
SB ( callback , VE_TYPE_START , VE_TYPE_COUNT , 0 ) ;
}
this - > vcache . cached_vis_effect = callback ;
visual_effect = callback ;
}
}
/* Apply default values */
if ( visual_effect = = VE_DEFAULT | |
( ! HasBit ( visual_effect , VE_DISABLE_EFFECT ) & & GB ( visual_effect , VE_TYPE_START , VE_TYPE_COUNT ) = = VE_TYPE_DEFAULT ) ) {
/* Only train engines have default effects.
* Note : This is independent of whether the engine is a front engine or articulated part or whatever . */
if ( e - > type ! = VEH_TRAIN | | e - > u . rail . railveh_type = = RAILVEH_WAGON | | ! IsInsideMM ( e - > u . rail . engclass , EC_STEAM , EC_MONORAIL ) ) {
if ( visual_effect = = VE_DEFAULT ) {
visual_effect = 1 < < VE_DISABLE_EFFECT ;
} else {
SetBit ( visual_effect , VE_DISABLE_EFFECT ) ;
}
} else {
if ( visual_effect = = VE_DEFAULT ) {
/* Also set the offset */
visual_effect = ( VE_OFFSET_CENTRE - ( e - > u . rail . engclass = = EC_STEAM ? 4 : 0 ) ) < < VE_OFFSET_START ;
}
SB ( visual_effect , VE_TYPE_START , VE_TYPE_COUNT , e - > u . rail . engclass - EC_STEAM + VE_TYPE_STEAM ) ;
}
}
this - > vcache . cached_vis_effect = visual_effect ;
if ( ! allow_power_change & & powered_before ! = HasBit ( this - > vcache . cached_vis_effect , VE_DISABLE_WAGON_POWER ) ) {
ToggleBit ( this - > vcache . cached_vis_effect , VE_DISABLE_WAGON_POWER ) ;
ShowNewGrfVehicleError ( this - > engine_type , STR_NEWGRF_BROKEN , STR_NEWGRF_BROKEN_POWERED_WAGON , GBUG_VEH_POWERED_WAGON , false ) ;
@ -1995,16 +2001,6 @@ void Vehicle::ShowVisualEffect() const
continue ;
}
if ( effect_type = = VE_TYPE_DEFAULT ) {
if ( v - > type = = VEH_TRAIN ) {
/* Use default effect type for engine class. */
effect_type = RailVehInfo ( v - > engine_type ) - > engclass + 1 ;
} else {
/* No default effect exists, so continue */
continue ;
}
}
int x = _vehicle_smoke_pos [ v - > direction ] * effect_offset ;
int y = _vehicle_smoke_pos [ ( v - > direction + 2 ) % 8 ] * effect_offset ;