Changeset - r12452:737113301015
[Not reviewed]
master
0 6 0
rubidium - 15 years ago 2009-07-21 11:11:05
rubidium@openttd.org
(svn r16896) -Codechange: make station spec allocation and station animation functions work for both stations and waypoints
6 files changed with 125 insertions and 53 deletions:
0 comments (0 inline, 0 general)
src/newgrf_station.cpp
Show inline comments
 
@@ -31,6 +31,48 @@ enum {
 
	MAX_SPECLIST = 255,
 
};
 

	
 
enum TriggerArea {
 
	TA_TILE,
 
	TA_PLATFORM,
 
	TA_WHOLE,
 
};
 

	
 
struct ETileArea : TileArea {
 
	ETileArea(const BaseStation *st, TileIndex tile, TriggerArea ta)
 
	{
 
		switch (ta) {
 
			default: NOT_REACHED();
 

	
 
			case TA_TILE:
 
				this->tile = tile;
 
				this->w    = 1;
 
				this->h    = 1;
 
				break;
 

	
 
			case TA_PLATFORM: {
 
				TileIndex start, end;
 
				Axis axis = GetRailStationAxis(tile);
 
				TileIndexDiff delta = TileOffsByDiagDir(AxisToDiagDir(axis));
 

	
 
				for (end = tile; IsRailwayStationTile(end + delta) && IsCompatibleTrainStationTile(tile, end + delta); end += delta) { /* Nothing */ }
 
				for (start = tile; IsRailwayStationTile(start - delta) && IsCompatibleTrainStationTile(tile, start - delta); start -= delta) { /* Nothing */ }
 

	
 
				this->tile = start;
 
				this->w = TileX(end) - TileX(start) + 1;
 
				this->h = TileY(end) - TileY(start) + 1;
 
				break;
 
			}
 

	
 
			case TA_WHOLE:
 
				st->GetTileArea(this, Station::IsExpected(st) ? STATION_RAIL : STATION_WAYPOINT);
 
				this->w++;
 
				this->h++;
 
				break;
 
		}
 
	}
 
};
 

	
 

	
 
/**
 
 * Reset station classes to their default state.
 
 * This includes initialising the Default and Waypoint classes with an empty
 
@@ -734,7 +776,7 @@ uint16 GetStationCallback(CallbackID cal
 
 * @param exec Whether to actually allocate the spec.
 
 * @return Index within the Station's spec list, or -1 if the allocation failed.
 
 */
 
int AllocateSpecToStation(const StationSpec *statspec, Station *st, bool exec)
 
int AllocateSpecToStation(const StationSpec *statspec, BaseStation *st, bool exec)
 
{
 
	uint i;
 

	
 
@@ -784,17 +826,22 @@ int AllocateSpecToStation(const StationS
 
 * @param specindex Index of the custom station within the Station's spec list.
 
 * @return Indicates whether the StationSpec was deallocated.
 
 */
 
void DeallocateSpecFromStation(Station *st, byte specindex)
 
void DeallocateSpecFromStation(BaseStation *st, byte specindex)
 
{
 
	/* specindex of 0 (default) is never freeable */
 
	if (specindex == 0) return;
 

	
 
	ETileArea area = ETileArea(st, INVALID_TILE, TA_WHOLE);
 
	/* Check all tiles over the station to check if the specindex is still in use */
 
	BEGIN_TILE_LOOP(tile, st->trainst_w, st->trainst_h, st->train_tile) {
 
		if (IsRailwayStationTile(tile) && GetStationIndex(tile) == st->index && GetCustomStationSpecIndex(tile) == specindex) {
 
	for (uint y = 0; y < area.h; y++) {
 
		for (uint x = 0; x < area.w; x++) {
 
			if (st->TileBelongsToRailStation(area.tile) && GetCustomStationSpecIndex(area.tile) == specindex) {
 
			return;
 
		}
 
	} END_TILE_LOOP(tile, st->trainst_w, st->trainst_h, st->train_tile)
 
			area.tile += TileDiffXY(1, 0);
 
		}
 
		area.tile += TileDiffXY(-area.w, 1);
 
	}
 

	
 
	/* This specindex is no longer in use, so deallocate it */
 
	st->speclist[specindex].spec     = NULL;
 
@@ -1020,51 +1067,6 @@ static void ChangeStationAnimationFrame(
 
	if (GB(callback, 8, 7) != 0) PlayTileSound(ss->grffile, GB(callback, 8, 7), tile);
 
}
 

	
 
enum TriggerArea {
 
	TA_TILE,
 
	TA_PLATFORM,
 
	TA_WHOLE,
 
};
 

	
 
struct TileArea {
 
	TileIndex tile;
 
	uint8 w;
 
	uint8 h;
 

	
 
	TileArea(const Station *st, TileIndex tile, TriggerArea ta)
 
	{
 
		switch (ta) {
 
			default: NOT_REACHED();
 

	
 
			case TA_TILE:
 
				this->tile = tile;
 
				this->w    = 1;
 
				this->h    = 1;
 
				break;
 

	
 
			case TA_PLATFORM: {
 
				TileIndex start, end;
 
				Axis axis = GetRailStationAxis(tile);
 
				TileIndexDiff delta = TileOffsByDiagDir(AxisToDiagDir(axis));
 

	
 
				for (end = tile; IsRailwayStationTile(end + delta) && IsCompatibleTrainStationTile(tile, end + delta); end += delta) { /* Nothing */ }
 
				for (start = tile; IsRailwayStationTile(start - delta) && IsCompatibleTrainStationTile(tile, start - delta); start -= delta) { /* Nothing */ }
 

	
 
				this->tile = start;
 
				this->w = TileX(end) - TileX(start) + 1;
 
				this->h = TileY(end) - TileY(start) + 1;
 
				break;
 
			}
 

	
 
			case TA_WHOLE:
 
				this->tile = st->train_tile;
 
				this->w    = st->trainst_w + 1;
 
				this->h    = st->trainst_h + 1;
 
				break;
 
		}
 
	}
 
};
 

	
 
void StationAnimationTrigger(const BaseStation *st, TileIndex tile, StatAnimTrigger trigger, CargoID cargo_type)
 
{
 
	/* List of coverage areas for each animation trigger */
 
@@ -1080,8 +1082,9 @@ void StationAnimationTrigger(const BaseS
 
	if (!HasBit(st->cached_anim_triggers, trigger)) return;
 

	
 
	uint16 random_bits = Random();
 
	TileArea area = TileArea(Station::From(st), tile, tas[trigger]);
 
	ETileArea area = ETileArea(st, tile, tas[trigger]);
 

	
 
	/* Check all tiles over the station to check if the specindex is still in use */
 
	for (uint y = 0; y < area.h; y++) {
 
		for (uint x = 0; x < area.w; x++) {
 
			if (st->TileBelongsToRailStation(area.tile)) {
src/newgrf_station.h
Show inline comments
 
@@ -136,10 +136,10 @@ SpriteID GetCustomStationGroundRelocatio
 
uint16 GetStationCallback(CallbackID callback, uint32 param1, uint32 param2, const StationSpec *statspec, const BaseStation *st, TileIndex tile);
 

	
 
/* Allocate a StationSpec to a Station. This is called once per build operation. */
 
int AllocateSpecToStation(const StationSpec *statspec, Station *st, bool exec);
 
int AllocateSpecToStation(const StationSpec *statspec, BaseStation *st, bool exec);
 

	
 
/* Deallocate a StationSpec from a Station. Called when removing a single station tile. */
 
void DeallocateSpecFromStation(Station *st, byte specindex);
 
void DeallocateSpecFromStation(BaseStation *st, byte specindex);
 

	
 
/* Draw representation of a station tile for GUI purposes. */
 
bool DrawStationTile(int x, int y, RailType railtype, Axis axis, StationClassID sclass, uint station);
src/station_base.h
Show inline comments
 
@@ -77,6 +77,13 @@ struct StationRect : public Rect {
 
	StationRect& operator = (Rect src);
 
};
 

	
 
/** Represents the covered area */
 
struct TileArea {
 
	TileIndex tile; ///< The base tile of the area
 
	uint8 w;        ///< The width of the area
 
	uint8 h;        ///< The height of the area
 
};
 

	
 
/** Base class for all station-ish types */
 
struct BaseStation {
 
	TileIndex xy;                   ///< Base tile of the station
 
@@ -126,6 +133,13 @@ struct BaseStation {
 
	virtual void UpdateVirtCoord() = 0;
 

	
 
	/**
 
	 * Get the tile area for a given station type.
 
	 * @param ta tile area to fill.
 
	 * @param type the type of the area
 
	 */
 
	virtual void GetTileArea(TileArea *ta, StationType type) const = 0;
 

	
 
	/**
 
	 * Get the base station belonging to a specific tile.
 
	 * @param tile The tile to get the base station from.
 
	 * @return the station associated with that tile.
 
@@ -258,6 +272,8 @@ public:
 

	
 
	/* virtual */ uint32 GetNewGRFVariable(const ResolverObject *object, byte variable, byte parameter, bool *available) const;
 

	
 
	/* virtual */ void GetTileArea(TileArea *ta, StationType type) const;
 

	
 
	/**
 
	 * Determines whether a station is a buoy only.
 
	 * @todo Ditch this encoding of buoys
src/station_cmd.cpp
Show inline comments
 
@@ -368,6 +368,42 @@ static Station *GetClosestDeletedStation
 
	return best_station;
 
}
 

	
 

	
 
void Station::GetTileArea(TileArea *ta, StationType type) const
 
{
 
	switch (type) {
 
		case STATION_RAIL:
 
			ta->tile = this->train_tile;
 
			ta->w    = this->trainst_w;
 
			ta->h    = this->trainst_h;
 
			return;
 

	
 
		case STATION_AIRPORT:
 
			ta->tile = this->airport_tile;
 
			ta->w    = this->Airport()->size_x;
 
			ta->h    = this->Airport()->size_y;
 

	
 
		case STATION_TRUCK:
 
			ta->tile = this->truck_stops != NULL ? this->truck_stops->xy : INVALID_TILE;
 
			break;
 

	
 
		case STATION_BUS:
 
			ta->tile = this->bus_stops != NULL ? this->bus_stops->xy : INVALID_TILE;
 
			break;
 

	
 
		case STATION_DOCK:
 
		case STATION_OILRIG:
 
		case STATION_BUOY:
 
			ta->tile = this->dock_tile;
 
			break;
 

	
 
		default: NOT_REACHED();
 
	}
 

	
 
	ta->w = 1;
 
	ta->h = 1;
 
}
 

	
 
/**
 
 * Update the virtual coords needed to draw the station sign.
 
 */
src/waypoint.cpp
Show inline comments
 
@@ -44,6 +44,21 @@ void DrawWaypointSprite(int x, int y, in
 
	}
 
}
 

	
 
void Waypoint::GetTileArea(TileArea *ta, StationType type) const
 
{
 
	switch (type) {
 
		case STATION_BUOY:
 
		case STATION_WAYPOINT:
 
			break;
 

	
 
		default: NOT_REACHED();
 
	}
 

	
 
	ta->tile = this->xy;
 
	ta->w    = 1;
 
	ta->h    = 1;
 
}
 

	
 
Waypoint::~Waypoint()
 
{
 
	if (CleaningPool()) return;
src/waypoint.h
Show inline comments
 
@@ -32,6 +32,8 @@ struct Waypoint : WaypointPool::PoolItem
 

	
 
	/* virtual */ uint32 GetNewGRFVariable(const struct ResolverObject *object, byte variable, byte parameter, bool *available) const;
 

	
 
	/* virtual */ void GetTileArea(TileArea *ta, StationType type) const;
 

	
 
	void AssignStationSpec(uint index);
 

	
 
	/**
0 comments (0 inline, 0 general)