Codechange: Don't scan vehicle pool to find targeting disaster vehicle when deleting any vehicle. (#12064)
* Codechange: Don't scan vehicle pool to find targeting disaster vehicle when deleting any vehicle. When deleting a vehicle, the vehicle pool is scanned to find a targetting disaster vehicle. With lots of vehicles this can take some time, especially when deleting multiple consecutive vehicles. Disasters vehicles can actually only target road vehicles. Store the DisasterVehicle index in the road vehicle, so that no pool scan is necessary. * Change: Small UFOs no longer target a vehicle which is already a target.
This commit is contained in:
@@ -345,12 +345,18 @@ static bool DisasterTick_Ufo(DisasterVehicle *v)
|
||||
}
|
||||
|
||||
n = RandomRange(n); // Choose one of them.
|
||||
for (const RoadVehicle *u : RoadVehicle::Iterate()) {
|
||||
for (RoadVehicle *u : RoadVehicle::Iterate()) {
|
||||
/* Find (n+1)-th road vehicle. */
|
||||
if (u->IsFrontEngine() && (n-- == 0)) {
|
||||
if (u->crashed_ctr != 0 || u->disaster_vehicle != INVALID_VEHICLE) {
|
||||
/* Targetted vehicle is crashed or already a target, destroy the UFO. */
|
||||
delete v;
|
||||
return false;
|
||||
}
|
||||
/* Target it. */
|
||||
v->dest_tile = u->index;
|
||||
v->age = 0;
|
||||
u->disaster_vehicle = v->index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -379,6 +385,7 @@ static bool DisasterTick_Ufo(DisasterVehicle *v)
|
||||
v->age++;
|
||||
if (u->crashed_ctr == 0) {
|
||||
u->Crash();
|
||||
u->disaster_vehicle = INVALID_VEHICLE;
|
||||
|
||||
AddTileNewsItem(STR_NEWS_DISASTER_SMALL_UFO, NT_ACCIDENT, u->tile);
|
||||
|
||||
@@ -970,20 +977,20 @@ void ReleaseDisastersTargetingIndustry(IndustryID i)
|
||||
* Notify disasters that we are about to delete a vehicle. So make them head elsewhere.
|
||||
* @param vehicle deleted vehicle
|
||||
*/
|
||||
void ReleaseDisastersTargetingVehicle(VehicleID vehicle)
|
||||
void ReleaseDisasterVehicle(VehicleID vehicle)
|
||||
{
|
||||
for (DisasterVehicle *v : DisasterVehicle::Iterate()) {
|
||||
/* primary disaster vehicles that have chosen target */
|
||||
if (v->subtype == ST_SMALL_UFO) {
|
||||
if (v->state != 0 && v->dest_tile == vehicle) {
|
||||
/* Revert to target-searching */
|
||||
v->state = 0;
|
||||
v->dest_tile = RandomTile();
|
||||
GetAircraftFlightLevelBounds(v, &v->z_pos, nullptr);
|
||||
v->age = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
DisasterVehicle *v = DisasterVehicle::GetIfValid(vehicle);
|
||||
if (v == nullptr) return;
|
||||
|
||||
/* primary disaster vehicles that have chosen target */
|
||||
assert(v->subtype == ST_SMALL_UFO);
|
||||
assert(v->state != 0);
|
||||
|
||||
/* Revert to target-searching */
|
||||
v->state = 0;
|
||||
v->dest_tile = RandomTile();
|
||||
GetAircraftFlightLevelBounds(v, &v->z_pos, nullptr);
|
||||
v->age = 0;
|
||||
}
|
||||
|
||||
void DisasterVehicle::UpdateDeltaXY()
|
||||
|
||||
Reference in New Issue
Block a user