(svn r6151) -Codechange: DeleteStation/DeleteRoadStop removes a station/RoadStop from the pool
authortruelight
Sat, 26 Aug 2006 19:14:02 +0000
changeset 4398 e889842a75a1
parent 4397 e538e96d8f6a
child 4399 13a46403de8d
(svn r6151) -Codechange: DeleteStation/DeleteRoadStop removes a station/RoadStop from the pool
-Codechange: DestroyStation/DestroyRoadStop is called by DeleteStation/DeleteRoadStop to remove all things where a station/RoadStop depends on.
Last 2 changes to prepare for new pool system. Not pretty now, will be soon.
station.h
station_cmd.c
--- a/station.h	Sat Aug 26 18:27:15 2006 +0000
+++ b/station.h	Sat Aug 26 19:14:02 2006 +0000
@@ -184,6 +184,14 @@
 	return index < GetStationPoolSize() && IsValidStation(GetStation(index));
 }
 
+void DestroyStation(Station *st);
+
+static inline void DeleteStation(Station *st)
+{
+	DestroyStation(st);
+	st->xy = 0;
+}
+
 #define FOR_ALL_STATIONS_FROM(st, start) for (st = GetStation(start); st != NULL; st = (st->index + 1 < GetStationPoolSize()) ? GetStation(st->index + 1) : NULL) if (IsValidStation(st))
 #define FOR_ALL_STATIONS(st) FOR_ALL_STATIONS_FROM(st, 0)
 
@@ -216,6 +224,14 @@
 	return rs->used;
 }
 
+void DestroyRoadStop(RoadStop* rs);
+
+static inline void DeleteRoadStop(RoadStop *rs)
+{
+	DestroyRoadStop(rs);
+	rs->used = false;
+}
+
 #define FOR_ALL_ROADSTOPS_FROM(rs, start) for (rs = GetRoadStop(start); rs != NULL; rs = (rs->index + 1 < GetRoadStopPoolSize()) ? GetRoadStop(rs->index + 1) : NULL) if (IsValidRoadStop(rs))
 #define FOR_ALL_ROADSTOPS(rs) FOR_ALL_ROADSTOPS_FROM(rs, 0)
 
--- a/station_cmd.c	Sat Aug 26 18:27:15 2006 +0000
+++ b/station_cmd.c	Sat Aug 26 19:14:02 2006 +0000
@@ -1513,24 +1513,6 @@
 	if (!EnsureNoVehicle(tile)) return CMD_ERROR;
 
 	if (flags & DC_EXEC) {
-		Vehicle* v;
-
-		/* Clear the slot assignment of all vehicles heading for this road stop */
-		if (cur_stop->num_vehicles != 0) {
-			FOR_ALL_VEHICLES(v) {
-				if (v->type == VEH_Road && v->u.road.slot == cur_stop) {
-					ClearSlot(v);
-				}
-			}
-		}
-		assert(cur_stop->num_vehicles == 0);
-
-		DoClearSquare(tile);
-
-		cur_stop->used = false;
-		if (cur_stop->prev != NULL) cur_stop->prev->next = cur_stop->next;
-		if (cur_stop->next != NULL) cur_stop->next->prev = cur_stop->prev;
-
 		//we only had one stop left
 		if (cur_stop->next == NULL && cur_stop->prev == NULL) {
 			//so we remove ALL stops
@@ -1542,6 +1524,9 @@
 			*primary_stop = (*primary_stop)->next;
 		}
 
+		DeleteRoadStop(cur_stop);
+		DoClearSquare(tile);
+
 		UpdateStationVirtCoordDirty(st);
 		DeleteStationIfEmpty(st);
 	}
@@ -2389,27 +2374,47 @@
 	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.
+/**
+ * Cleanup a RoadStop. Make sure no vehicles try to go to this roadstop.
+ */
+void DestroyRoadStop(RoadStop* rs)
+{
+	Vehicle *v;
+
+	/* Clear the slot assignment of all vehicles heading for this road stop */
+	if (rs->num_vehicles != 0) {
+		FOR_ALL_VEHICLES(v) {
+			if (v->type == VEH_Road && v->u.road.slot == rs) {
+				ClearSlot(v);
+			}
+		}
+	}
+	assert(rs->num_vehicles == 0);
+
+	if (rs->prev != NULL) rs->prev->next = rs->next;
+	if (rs->next != NULL) rs->next->prev = rs->prev;
+}
+
+/**
+  * Clean up a station by clearing vehicle orders and invalidating windows.
   * 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)
+void DestroyStation(Station *st)
 {
 	DestinationID dest;
 	StationID index;
 	Vehicle *v;
-	st->xy = 0;
+
+	index = st->index;
 
 	DeleteName(st->string_id);
 	MarkStationDirty(st);
 	RebuildStationLists();
 	InvalidateWindowClasses(WC_STATION_LIST);
 
-	index = st->index;
 	DeleteWindowById(WC_STATION_VIEW, index);
 
 	/* Now delete all orders that go to the station */
@@ -2435,6 +2440,8 @@
 
 	//Subsidies need removal as well
 	DeleteSubsidyWithStation(index);
+
+	free(st->speclist);
 }
 
 void DeleteAllPlayerStations(void)