(svn r2731) -Fix [ 1244171 ]: Hangar orders are now properly invalidated as soon as the airport is removed
--- 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);
}