Changeset - r4398:8829599de6ac
[Not reviewed]
master
0 2 0
truelight - 18 years ago 2006-08-26 19:14:02
truelight@openttd.org
(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.
2 files changed with 47 insertions and 24 deletions:
0 comments (0 inline, 0 general)
station.h
Show inline comments
 
@@ -181,12 +181,20 @@ static inline bool IsValidStation(const 
 

	
 
static inline bool IsValidStationID(StationID index)
 
{
 
	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)
 

	
 

	
 
/* Stuff for ROADSTOPS */
 

	
 
@@ -213,12 +221,20 @@ static inline uint16 GetRoadStopPoolSize
 
 */
 
static inline bool IsValidRoadStop(const RoadStop *rs)
 
{
 
	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)
 

	
 
/* End of stuff for ROADSTOPS */
 

	
 

	
station_cmd.c
Show inline comments
 
@@ -1510,41 +1510,26 @@ static int32 RemoveRoadStop(Station *st,
 

	
 
	assert(cur_stop != NULL);
 

	
 
	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
 
			*primary_stop = NULL;
 
			st->facilities &= (is_truck) ? ~FACIL_TRUCK_STOP : ~FACIL_BUS_STOP;
 
		} else if (cur_stop == *primary_stop) {
 
			//removed the first stop in the list
 
			//need to set the primary element to the next stop
 
			*primary_stop = (*primary_stop)->next;
 
		}
 

	
 
		DeleteRoadStop(cur_stop);
 
		DoClearSquare(tile);
 

	
 
		UpdateStationVirtCoordDirty(st);
 
		DeleteStationIfEmpty(st);
 
	}
 

	
 
	return (is_truck) ? _price.remove_truck_station : _price.remove_bus_station;
 
}
 
@@ -2386,33 +2371,53 @@ 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 */
 
	dest.station = index;
 
	RemoveOrderFromAllVehicles(OT_GOTO_STATION, dest);
 

	
 
@@ -2432,12 +2437,14 @@ static void DeleteStation(Station *st)
 
		//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);
 

	
 
	free(st->speclist);
 
}
 

	
 
void DeleteAllPlayerStations(void)
 
{
 
	Station *st;
 

	
0 comments (0 inline, 0 general)