Cache the last vehicle in a consist to have a visual effect
This commit is contained in:
@@ -224,6 +224,7 @@ void RoadVehUpdateCache(RoadVehicle *v, bool same_length)
|
||||
|
||||
v->gcache.cached_total_length = 0;
|
||||
|
||||
Vehicle *last_vis_effect = v;
|
||||
for (RoadVehicle *u = v; u != NULL; u = u->Next()) {
|
||||
/* Check the v->first cache. */
|
||||
assert(u->First() == v);
|
||||
@@ -241,10 +242,13 @@ void RoadVehUpdateCache(RoadVehicle *v, bool same_length)
|
||||
|
||||
/* Update visual effect */
|
||||
u->UpdateVisualEffect();
|
||||
ClrBit(u->vcache.cached_veh_flags, VCF_LAST_VISUAL_EFFECT);
|
||||
if (!(HasBit(u->vcache.cached_vis_effect, VE_ADVANCED_EFFECT) && GB(u->vcache.cached_vis_effect, 0, VE_ADVANCED_EFFECT) == VESM_NONE)) last_vis_effect = u;
|
||||
|
||||
/* Update cargo aging period. */
|
||||
u->vcache.cached_cargo_age_period = GetVehicleProperty(u, PROP_ROADVEH_CARGO_AGE_PERIOD, EngInfo(u->engine_type)->cargo_age_period);
|
||||
}
|
||||
SetBit(last_vis_effect->vcache.cached_veh_flags, VCF_LAST_VISUAL_EFFECT);
|
||||
|
||||
uint max_speed = GetVehicleProperty(v, PROP_ROADVEH_SPEED, 0);
|
||||
v->vcache.cached_max_speed = (max_speed != 0) ? max_speed * 4 : RoadVehInfo(v->engine_type)->max_speed;
|
||||
|
@@ -214,6 +214,7 @@ void Train::ConsistChanged(ConsistChangeFlags allowed_changes)
|
||||
}
|
||||
}
|
||||
|
||||
Vehicle *last_vis_effect = this;
|
||||
for (Train *u = this; u != NULL; u = u->Next()) {
|
||||
const Engine *e_u = u->GetEngine();
|
||||
const RailVehicleInfo *rvi_u = &e_u->u.rail;
|
||||
@@ -228,6 +229,8 @@ void Train::ConsistChanged(ConsistChangeFlags allowed_changes)
|
||||
|
||||
/* Update powered-wagon-status and visual effect */
|
||||
u->UpdateVisualEffect(true);
|
||||
ClrBit(u->vcache.cached_veh_flags, VCF_LAST_VISUAL_EFFECT);
|
||||
if (!(HasBit(u->vcache.cached_vis_effect, VE_ADVANCED_EFFECT) && GB(u->vcache.cached_vis_effect, 0, VE_ADVANCED_EFFECT) == VESM_NONE)) last_vis_effect = u;
|
||||
|
||||
if (rvi_v->pow_wag_power != 0 && rvi_u->railveh_type == RAILVEH_WAGON &&
|
||||
UsesWagonOverride(u) && !HasBit(u->vcache.cached_vis_effect, VE_DISABLE_WAGON_POWER)) {
|
||||
@@ -298,6 +301,7 @@ void Train::ConsistChanged(ConsistChangeFlags allowed_changes)
|
||||
this->InvalidateNewGRFCache();
|
||||
u->InvalidateNewGRFCache();
|
||||
}
|
||||
SetBit(last_vis_effect->vcache.cached_veh_flags, VCF_LAST_VISUAL_EFFECT);
|
||||
|
||||
/* store consist weight/max speed in cache */
|
||||
this->vcache.cached_max_speed = max_speed;
|
||||
|
@@ -413,6 +413,7 @@ Vehicle::Vehicle(VehicleType type)
|
||||
this->last_station_visited = INVALID_STATION;
|
||||
this->last_loading_station = INVALID_STATION;
|
||||
this->cur_image_valid_dir = INVALID_DIR;
|
||||
this->vcache.cached_veh_flags = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -3486,6 +3487,8 @@ void Vehicle::ShowVisualEffect() const
|
||||
|
||||
CreateEffectVehicleRel(v, x, y, 10, evt);
|
||||
}
|
||||
|
||||
if (HasBit(v->vcache.cached_veh_flags, VCF_LAST_VISUAL_EFFECT)) break;
|
||||
} while ((v = v->Next()) != NULL);
|
||||
|
||||
if (sound) PlayVehicleSound(this, VSE_VISUAL_EFFECT);
|
||||
@@ -3668,6 +3671,8 @@ char *Vehicle::DumpVehicleFlags(char *b, const char *last) const
|
||||
dump('x', HasBit(this->vehicle_flags, VF_LAST_LOAD_ST_SEP));
|
||||
dump('s', HasBit(this->vehicle_flags, VF_TIMETABLE_SEPARATION));
|
||||
dump('a', HasBit(this->vehicle_flags, VF_AUTOMATE_TIMETABLE));
|
||||
b += seprintf(b, last, ", vcf:");
|
||||
dump('l', HasBit(this->vcache.cached_veh_flags, VCF_LAST_VISUAL_EFFECT));
|
||||
if (this->IsGroundVehicle()) {
|
||||
uint16 gv_flags = this->GetGroundVehicleFlags();
|
||||
b += seprintf(b, last, ", gvf:");
|
||||
|
@@ -130,12 +130,20 @@ enum GroundVehicleSubtypeFlags {
|
||||
GVSF_VIRTUAL = 6, ///< Used for virtual trains during template design, it is needed to skip checks for tile or depot status
|
||||
};
|
||||
|
||||
/**
|
||||
* Enum to handle vehicle cache flags.
|
||||
*/
|
||||
enum VehicleCacheFlags {
|
||||
VCF_LAST_VISUAL_EFFECT = 0, ///< Last vehicle in the consist with a visual effect.
|
||||
};
|
||||
|
||||
/** Cached often queried values common to all vehicles. */
|
||||
struct VehicleCache {
|
||||
uint16 cached_max_speed; ///< Maximum speed of the consist (minimum of the max speed of all vehicles in the consist).
|
||||
uint16 cached_cargo_age_period; ///< Number of ticks before carried cargo is aged.
|
||||
|
||||
byte cached_vis_effect; ///< Visual effect to show (see #VisualEffect)
|
||||
byte cached_veh_flags; ///< Vehicle cache flags (see #VehicleCacheFlags)
|
||||
};
|
||||
|
||||
/** Sprite sequence for a vehicle part. */
|
||||
|
Reference in New Issue
Block a user