Improved breakdowns: Fix smoke persisting long after vehicles have gone.
Fix animation_state not being set for limited speed/power breakdowns, such that the smoke lasted for a randomly long amount of time, instead show a short burst of smoke. Fix smoke for limited speed/power breakdowns only being shown 1/32 of the time. Make sure that a breakdown has non-zero delay before showing smoke.
This commit is contained in:
@@ -1351,7 +1351,7 @@ bool Vehicle::HandleBreakdown()
|
|||||||
(train_or_ship ? SND_10_TRAIN_BREAKDOWN : SND_0F_VEHICLE_BREAKDOWN) :
|
(train_or_ship ? SND_10_TRAIN_BREAKDOWN : SND_0F_VEHICLE_BREAKDOWN) :
|
||||||
(train_or_ship ? SND_3A_COMEDY_BREAKDOWN_2 : SND_35_COMEDY_BREAKDOWN), this);
|
(train_or_ship ? SND_3A_COMEDY_BREAKDOWN_2 : SND_35_COMEDY_BREAKDOWN), this);
|
||||||
}
|
}
|
||||||
if (!(this->vehstatus & VS_HIDDEN) && !HasBit(EngInfo(this->engine_type)->misc_flags, EF_NO_BREAKDOWN_SMOKE)) {
|
if (!(this->vehstatus & VS_HIDDEN) && !HasBit(EngInfo(this->engine_type)->misc_flags, EF_NO_BREAKDOWN_SMOKE) && this->breakdown_delay > 0) {
|
||||||
EffectVehicle *u = CreateEffectVehicleRel(this, 4, 4, 5, EV_BREAKDOWN_SMOKE);
|
EffectVehicle *u = CreateEffectVehicleRel(this, 4, 4, 5, EV_BREAKDOWN_SMOKE);
|
||||||
if (u != NULL) u->animation_state = this->breakdown_delay * 2;
|
if (u != NULL) u->animation_state = this->breakdown_delay * 2;
|
||||||
}
|
}
|
||||||
@@ -1391,9 +1391,10 @@ bool Vehicle::HandleBreakdown()
|
|||||||
SetBit(Train::From(this)->flags, VRF_BREAKDOWN_BRAKING);
|
SetBit(Train::From(this)->flags, VRF_BREAKDOWN_BRAKING);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if ((!(this->vehstatus & VS_HIDDEN)) && ((this->breakdown_type == BREAKDOWN_LOW_SPEED || this->breakdown_type == BREAKDOWN_LOW_POWER) && (this->tick_counter & 0x1F) == 0)
|
if ((!(this->vehstatus & VS_HIDDEN)) && (this->breakdown_type == BREAKDOWN_LOW_SPEED || this->breakdown_type == BREAKDOWN_LOW_POWER)
|
||||||
&& !HasBit(EngInfo(this->engine_type)->misc_flags, EF_NO_BREAKDOWN_SMOKE)) {
|
&& !HasBit(EngInfo(this->engine_type)->misc_flags, EF_NO_BREAKDOWN_SMOKE)) {
|
||||||
CreateEffectVehicleRel(this, 0, 0, 2, EV_BREAKDOWN_SMOKE); //some grey clouds to indicate a broken engine
|
EffectVehicle *u = CreateEffectVehicleRel(this, 0, 0, 2, EV_BREAKDOWN_SMOKE); //some grey clouds to indicate a broken engine
|
||||||
|
if (u != NULL) u->animation_state = 25;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
switch (this->breakdown_type) {
|
switch (this->breakdown_type) {
|
||||||
@@ -1401,7 +1402,7 @@ bool Vehicle::HandleBreakdown()
|
|||||||
if (!PlayVehicleSound(this, VSE_BREAKDOWN)) {
|
if (!PlayVehicleSound(this, VSE_BREAKDOWN)) {
|
||||||
SndPlayVehicleFx((_settings_game.game_creation.landscape != LT_TOYLAND) ? SND_0F_VEHICLE_BREAKDOWN : SND_35_COMEDY_BREAKDOWN, this);
|
SndPlayVehicleFx((_settings_game.game_creation.landscape != LT_TOYLAND) ? SND_0F_VEHICLE_BREAKDOWN : SND_35_COMEDY_BREAKDOWN, this);
|
||||||
}
|
}
|
||||||
if (!(this->vehstatus & VS_HIDDEN) && !HasBit(EngInfo(this->engine_type)->misc_flags, EF_NO_BREAKDOWN_SMOKE)) {
|
if (!(this->vehstatus & VS_HIDDEN) && !HasBit(EngInfo(this->engine_type)->misc_flags, EF_NO_BREAKDOWN_SMOKE) && this->breakdown_delay > 0) {
|
||||||
EffectVehicle *u = CreateEffectVehicleRel(this, 4, 4, 5, EV_BREAKDOWN_SMOKE);
|
EffectVehicle *u = CreateEffectVehicleRel(this, 4, 4, 5, EV_BREAKDOWN_SMOKE);
|
||||||
if (u != NULL) u->animation_state = this->breakdown_delay * 2;
|
if (u != NULL) u->animation_state = this->breakdown_delay * 2;
|
||||||
}
|
}
|
||||||
@@ -1416,10 +1417,10 @@ bool Vehicle::HandleBreakdown()
|
|||||||
default: NOT_REACHED();
|
default: NOT_REACHED();
|
||||||
}
|
}
|
||||||
if ((!(this->vehstatus & VS_HIDDEN)) &&
|
if ((!(this->vehstatus & VS_HIDDEN)) &&
|
||||||
((this->breakdown_type == BREAKDOWN_LOW_SPEED || this->breakdown_type == BREAKDOWN_LOW_POWER) &&
|
(this->breakdown_type == BREAKDOWN_LOW_SPEED || this->breakdown_type == BREAKDOWN_LOW_POWER)) {
|
||||||
(this->tick_counter & 0x1F) == 0)) {
|
|
||||||
/* Some gray clouds to indicate a broken RV */
|
/* Some gray clouds to indicate a broken RV */
|
||||||
CreateEffectVehicleRel(this, 0, 0, 2, EV_BREAKDOWN_SMOKE);
|
EffectVehicle *u = CreateEffectVehicleRel(this, 0, 0, 2, EV_BREAKDOWN_SMOKE);
|
||||||
|
if (u != NULL) u->animation_state = 25;
|
||||||
}
|
}
|
||||||
this->First()->MarkDirty();
|
this->First()->MarkDirty();
|
||||||
SetWindowDirty(WC_VEHICLE_VIEW, this->index);
|
SetWindowDirty(WC_VEHICLE_VIEW, this->index);
|
||||||
|
Reference in New Issue
Block a user