changeset 12112:527e86d95414 draft

(svn r16525) -Codechange: Notify small ufos on deletion of road vehicles, so they can head for somewhere else instead of stumbling over a ghost.
author frosch <frosch@openttd.org>
date Sat, 06 Jun 2009 14:46:50 +0000
parents faa0b6550e1f
children d1451dc437a3
files src/disaster_cmd.cpp src/saveload/afterload.cpp src/vehicle.cpp src/vehicle_func.h
diffstat 4 files changed, 38 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/disaster_cmd.cpp
+++ b/src/disaster_cmd.cpp
@@ -314,10 +314,7 @@
 	} 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 @@
 	}
 }
 
+/** 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;
--- a/src/saveload/afterload.cpp
+++ b/src/saveload/afterload.cpp
@@ -1841,6 +1841,19 @@
 		}
 	}
 
+	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);
--- a/src/vehicle.cpp
+++ b/src/vehicle.cpp
@@ -554,6 +554,8 @@
 
 	extern void StopGlobalFollowVehicle(const Vehicle *v);
 	StopGlobalFollowVehicle(this);
+
+	ReleaseDisastersTargetingVehicle(this->index);
 }
 
 Vehicle::~Vehicle()
--- a/src/vehicle_func.h
+++ b/src/vehicle_func.h
@@ -168,4 +168,6 @@
 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 */