(svn r2731) -Fix [ 1244171 ]: Hangar orders are now properly invalidated as soon as the airport is removed
authorcelestar
Thu, 28 Jul 2005 05:47:54 +0000
changeset 2213 cb78ae22fe58
parent 2212 7e53bdecc115
child 2214 75d037f8dcc4
(svn r2731) -Fix [ 1244171 ]: Hangar orders are now properly invalidated as soon as the airport is removed
station_cmd.c
--- a/station_cmd.c	Wed Jul 27 21:45:34 2005 +0000
+++ b/station_cmd.c	Thu Jul 28 05:47:54 2005 +0000
@@ -1,5 +1,8 @@
 /* $Id$ */
 
+/** @file station_cmd.c
+  */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "debug.h"
@@ -2446,10 +2449,19 @@
 	return 0;
 }
 
+/** Removes a station from the list.
+  * This is done by setting the .xy property to 0,
+  * and doing some maintenance, especially clearing vehicle orders.
+  * Aircraft-Hangar orders need special treatment here, as the hangars are
+  * actually part of a station (tiletype is STATION), but the order type
+  * is OT_GOTO_DEPOT.
+  * @param st Station to be deleted
+  */
 static void DeleteStation(Station *st)
 {
 	Order order;
 	StationID index;
+	Vehicle *v;
 	st->xy = 0;
 
 	DeleteName(st->string_id);
@@ -2460,10 +2472,30 @@
 	index = st->index;
 	DeleteWindowById(WC_STATION_VIEW, index);
 
+	//Now delete all orders that go to the station
 	order.type = OT_GOTO_STATION;
 	order.station = index;
 	DeleteDestinationFromVehicleOrder(order);
 
+	//And do the same with aircraft that have the station as a hangar-stop
+	FOR_ALL_VEHICLES(v) {
+		bool invalidate = false;
+		if (v->type == VEH_Aircraft) {
+			Order *order;
+			FOR_VEHICLE_ORDERS(v, order) {
+				if (order->type == OT_GOTO_DEPOT && order->station == index) {
+					order->type = OT_DUMMY;
+					order->flags = 0;
+					invalidate = true;
+				}
+			}
+		}
+		//Orders for the vehicle have been changed, invalidate the window
+		if (invalidate)
+			InvalidateWindow(WC_VEHICLE_ORDERS, v->index);
+	}
+
+	//Subsidies need removal as well
 	DeleteSubsidyWithStation(index);
 }