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;
|
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;
|
||||||
|
@@ -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;
|
||||||
|
@@ -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:");
|
||||||
|
@@ -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. */
|
||||||
|
Reference in New Issue
Block a user