|
@@ -1892,31 +1892,15 @@ CommandCost Vehicle::SendToDepot(DoComma
|
|
|
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);
|
|
|
|
|
|
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 al
|
|
|
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;
|
|
|
|