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:
Peter Nelson
2024-02-11 23:04:29 +00:00
committed by GitHub
parent fa6f270f23
commit df691eb31e
5 changed files with 44 additions and 17 deletions

View File

@@ -496,6 +496,24 @@ void AfterLoadVehicles(bool part_of_load)
UpdateAircraftCache(Aircraft::From(v), true);
}
break;
case VEH_DISASTER: {
auto *dv = DisasterVehicle::From(v);
if (dv->subtype == ST_SMALL_UFO && dv->state != 0) {
RoadVehicle *u = RoadVehicle::GetIfValid(v->dest_tile.base());
if (u != nullptr && u->IsFrontEngine()) {
/* Delete UFO targetting a vehicle which is already a target. */
if (u->disaster_vehicle != INVALID_VEHICLE) {
delete v;
continue;
} else {
u->disaster_vehicle = dv->index;
}
}
}
break;
}
default: break;
}