summaryrefslogtreecommitdiff
path: root/station_cmd.c
diff options
context:
space:
mode:
authortruelight <truelight@openttd.org>2006-08-26 19:14:02 +0000
committertruelight <truelight@openttd.org>2006-08-26 19:14:02 +0000
commitd417827516505e27319ae4ab630161e404cc1a58 (patch)
treed964a18446017288b6c371384ad079567e48d21f /station_cmd.c
parent587b2a8826274242e400124eb5bb8704a046ff81 (diff)
downloadopenttd-d417827516505e27319ae4ab630161e404cc1a58.tar.xz
(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.
Diffstat (limited to 'station_cmd.c')
-rw-r--r--station_cmd.c55
1 files changed, 31 insertions, 24 deletions
diff --git a/station_cmd.c b/station_cmd.c
index 469d6ce81..2cd7b1bd7 100644
--- a/station_cmd.c
+++ b/station_cmd.c
@@ -1513,24 +1513,6 @@ static int32 RemoveRoadStop(Station *st, uint32 flags, TileIndex tile)
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 @@ static int32 RemoveRoadStop(Station *st, uint32 flags, TileIndex tile)
*primary_stop = (*primary_stop)->next;
}
+ DeleteRoadStop(cur_stop);
+ DoClearSquare(tile);
+
UpdateStationVirtCoordDirty(st);
DeleteStationIfEmpty(st);
}
@@ -2389,27 +2374,47 @@ static uint32 VehicleEnter_Station(Vehicle *v, TileIndex tile, int x, int y)
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 @@ static void DeleteStation(Station *st)
//Subsidies need removal as well
DeleteSubsidyWithStation(index);
+
+ free(st->speclist);
}
void DeleteAllPlayerStations(void)