diff --git a/src/disaster_cmd.cpp b/src/disaster_cmd.cpp index 91208520b5..a32ee6b808 100644 --- a/src/disaster_cmd.cpp +++ b/src/disaster_cmd.cpp @@ -314,10 +314,7 @@ static bool DisasterTick_Ufo(DisasterVehicle *v) } else { /* Target a vehicle */ Vehicle *u_tmp = Vehicle::Get(v->dest_tile); - if (u_tmp == NULL || u_tmp->type != VEH_ROAD || !IsRoadVehFront(u_tmp)) { - delete v; - return false; - } + assert(u_tmp != NULL && u_tmp->type == VEH_ROAD && IsRoadVehFront(u_tmp)); RoadVehicle *u = (RoadVehicle *)u_tmp; uint dist = Delta(v->x_pos, u->x_pos) + Delta(v->y_pos, u->y_pos); @@ -948,6 +945,26 @@ 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) +{ + DisasterVehicle *v; + FOR_ALL_DISASTERVEHICLES(v) { + /* primary disaster vehicles that have chosen target */ + if (v->subtype == ST_SMALL_UFO) { + if (v->current_order.GetDestination() != 0 && v->dest_tile == vehicle) { + /* Revert to target-searching */ + v->current_order.SetDestination(0); + v->dest_tile = RandomTile(); + v->z_pos = 135; + v->age = 0; + } + } + } +} + void DisasterVehicle::UpdateDeltaXY(Direction direction) { this->x_offs = -1; diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 36dca96bcf..911e687dd7 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -1841,6 +1841,19 @@ bool AfterLoadGame() } } + if (CheckSavegameVersion(121)) { + /* Delete small ufos heading for non-existing vehicles */ + Vehicle *v; + FOR_ALL_DISASTERVEHICLES(v) { + if (v->subtype == 2/*ST_SMALL_UFO*/ && v->current_order.GetDestination() != 0) { + const Vehicle *u = Vehicle::GetIfValid(v->dest_tile); + if (u == NULL || u->type != VEH_ROAD || !IsRoadVehFront(u)) { + delete v; + } + } + } + } + AfterLoadLabelMaps(); GamelogPrintDebug(1); diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 19cd6021a7..92248b95ca 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -554,6 +554,8 @@ void Vehicle::PreDestructor() extern void StopGlobalFollowVehicle(const Vehicle *v); StopGlobalFollowVehicle(this); + + ReleaseDisastersTargetingVehicle(this->index); } Vehicle::~Vehicle() diff --git a/src/vehicle_func.h b/src/vehicle_func.h index f7827112ec..fa3fbc1b90 100644 --- a/src/vehicle_func.h +++ b/src/vehicle_func.h @@ -168,4 +168,6 @@ extern uint16 _returned_refit_capacity; bool CanVehicleUseStation(EngineID engine_type, const struct Station *st); bool CanVehicleUseStation(const Vehicle *v, const struct Station *st); +void ReleaseDisastersTargetingVehicle(VehicleID vehicle); + #endif /* VEHICLE_FUNC_H */