# HG changeset patch # User truelight # Date 2006-08-26 19:14:02 # Node ID 8829599de6acbbe2060d202fc6c9e6a95b6772f6 # Parent ee009589bbcb0c12f368a03497fe2562c27f51c5 (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. diff --git a/station.h b/station.h --- a/station.h +++ b/station.h @@ -184,6 +184,14 @@ static inline bool IsValidStationID(Stat 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 @@ static inline bool IsValidRoadStop(const 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) diff --git a/station_cmd.c b/station_cmd.c --- a/station_cmd.c +++ b/station_cmd.c @@ -1513,24 +1513,6 @@ static int32 RemoveRoadStop(Station *st, 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, *primary_stop = (*primary_stop)->next; } + DeleteRoadStop(cur_stop); + DoClearSquare(tile); + UpdateStationVirtCoordDirty(st); DeleteStationIfEmpty(st); } @@ -2389,27 +2374,47 @@ static uint32 VehicleEnter_Station(Vehic 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)