diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp index 2d9d082a2e..a180e6f204 100644 --- a/src/roadveh_cmd.cpp +++ b/src/roadveh_cmd.cpp @@ -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; diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index a2f83bb74a..bf3b08ed37 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -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; diff --git a/src/vehicle.cpp b/src/vehicle.cpp index b98ef2ea02..65f690d07a 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -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:"); diff --git a/src/vehicle_base.h b/src/vehicle_base.h index 5caa0747ac..1d0a883969 100644 --- a/src/vehicle_base.h +++ b/src/vehicle_base.h @@ -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. */