Cache the last vehicle in a consist to have a visual effect

This commit is contained in:
Jonathan G Rennison
2019-01-26 01:22:36 +00:00
parent e5b61e0b6c
commit 37adf9be4a
4 changed files with 21 additions and 0 deletions

View File

@@ -224,6 +224,7 @@ void RoadVehUpdateCache(RoadVehicle *v, bool same_length)
v->gcache.cached_total_length = 0; v->gcache.cached_total_length = 0;
Vehicle *last_vis_effect = v;
for (RoadVehicle *u = v; u != NULL; u = u->Next()) { for (RoadVehicle *u = v; u != NULL; u = u->Next()) {
/* Check the v->first cache. */ /* Check the v->first cache. */
assert(u->First() == v); assert(u->First() == v);
@@ -241,10 +242,13 @@ void RoadVehUpdateCache(RoadVehicle *v, bool same_length)
/* Update visual effect */ /* Update visual effect */
u->UpdateVisualEffect(); 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. */ /* Update cargo aging period. */
u->vcache.cached_cargo_age_period = GetVehicleProperty(u, PROP_ROADVEH_CARGO_AGE_PERIOD, EngInfo(u->engine_type)->cargo_age_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); 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; v->vcache.cached_max_speed = (max_speed != 0) ? max_speed * 4 : RoadVehInfo(v->engine_type)->max_speed;

View File

@@ -214,6 +214,7 @@ void Train::ConsistChanged(ConsistChangeFlags allowed_changes)
} }
} }
Vehicle *last_vis_effect = this;
for (Train *u = this; u != NULL; u = u->Next()) { for (Train *u = this; u != NULL; u = u->Next()) {
const Engine *e_u = u->GetEngine(); const Engine *e_u = u->GetEngine();
const RailVehicleInfo *rvi_u = &e_u->u.rail; 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 */ /* Update powered-wagon-status and visual effect */
u->UpdateVisualEffect(true); 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 && 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)) { UsesWagonOverride(u) && !HasBit(u->vcache.cached_vis_effect, VE_DISABLE_WAGON_POWER)) {
@@ -298,6 +301,7 @@ void Train::ConsistChanged(ConsistChangeFlags allowed_changes)
this->InvalidateNewGRFCache(); this->InvalidateNewGRFCache();
u->InvalidateNewGRFCache(); u->InvalidateNewGRFCache();
} }
SetBit(last_vis_effect->vcache.cached_veh_flags, VCF_LAST_VISUAL_EFFECT);
/* store consist weight/max speed in cache */ /* store consist weight/max speed in cache */
this->vcache.cached_max_speed = max_speed; this->vcache.cached_max_speed = max_speed;

View File

@@ -413,6 +413,7 @@ Vehicle::Vehicle(VehicleType type)
this->last_station_visited = INVALID_STATION; this->last_station_visited = INVALID_STATION;
this->last_loading_station = INVALID_STATION; this->last_loading_station = INVALID_STATION;
this->cur_image_valid_dir = INVALID_DIR; 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); CreateEffectVehicleRel(v, x, y, 10, evt);
} }
if (HasBit(v->vcache.cached_veh_flags, VCF_LAST_VISUAL_EFFECT)) break;
} while ((v = v->Next()) != NULL); } while ((v = v->Next()) != NULL);
if (sound) PlayVehicleSound(this, VSE_VISUAL_EFFECT); 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('x', HasBit(this->vehicle_flags, VF_LAST_LOAD_ST_SEP));
dump('s', HasBit(this->vehicle_flags, VF_TIMETABLE_SEPARATION)); dump('s', HasBit(this->vehicle_flags, VF_TIMETABLE_SEPARATION));
dump('a', HasBit(this->vehicle_flags, VF_AUTOMATE_TIMETABLE)); 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()) { if (this->IsGroundVehicle()) {
uint16 gv_flags = this->GetGroundVehicleFlags(); uint16 gv_flags = this->GetGroundVehicleFlags();
b += seprintf(b, last, ", gvf:"); b += seprintf(b, last, ", gvf:");

View File

@@ -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 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. */ /** Cached often queried values common to all vehicles. */
struct VehicleCache { struct VehicleCache {
uint16 cached_max_speed; ///< Maximum speed of the consist (minimum of the max speed of all vehicles in the consist). 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. 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_vis_effect; ///< Visual effect to show (see #VisualEffect)
byte cached_veh_flags; ///< Vehicle cache flags (see #VehicleCacheFlags)
}; };
/** Sprite sequence for a vehicle part. */ /** Sprite sequence for a vehicle part. */