Changeset - r8081:4b2e0b6ba8ce
[Not reviewed]
master
0 7 0
smatz - 16 years ago 2007-12-15 23:11:18
smatz@openttd.org
(svn r11642) -Codechange: VehicleFromPos does check for v->tile == tile, so remove useless checks
7 files changed with 37 insertions and 81 deletions:
0 comments (0 inline, 0 general)
src/rail_cmd.cpp
Show inline comments
 
@@ -79,27 +79,20 @@ const byte _track_sloped_sprites[14] = {
 
 * MAP5:         00abcdef => rail
 
 *               01abcdef => rail w/ signals
 
 *               10uuuuuu => unused
 
 *               11uuuudd => rail depot
 
 */
 

	
 
/** Struct used in EnsureNoTrainOnTrack() */
 
struct TrainOnTrackData {
 
	TileIndex tile;       ///< tile to check
 
	uint z;               ///< tile max Z
 
	TrackBits rail_bits;  ///< trackbits of interest
 
};
 

	
 
static void *EnsureNoTrainOnTrackProc(Vehicle *v, void *data)
 
{
 
	const TrainOnTrackData *info = (const TrainOnTrackData *)data;
 

	
 
	if (v->tile != info->tile || v->type != VEH_TRAIN) return NULL;
 
	if (v->z_pos > info->z) return NULL;
 

	
 
	if ((v->u.rail.track != info->rail_bits) && !TracksOverlap(v->u.rail.track | info->rail_bits)) return NULL;
 
	TrackBits rail_bits = *(TrackBits *)data;
 

	
 
	if (v->type != VEH_TRAIN) return NULL;
 

	
 
	if ((v->u.rail.track != rail_bits) && !TracksOverlap(v->u.rail.track | rail_bits)) return NULL;
 

	
 
	_error_message = VehicleInTheWayErrMsg(v);
 
	return v;
 
}
 

	
 
/**
 
@@ -108,19 +101,15 @@ static void *EnsureNoTrainOnTrackProc(Ve
 
 *
 
 * @param tile The tile.
 
 * @param track The track.
 
 */
 
static bool EnsureNoTrainOnTrack(TileIndex tile, Track track)
 
{
 
	TrainOnTrackData info;
 

	
 
	info.tile = tile;
 
	info.z = GetTileMaxZ(tile);
 
	info.rail_bits = TrackToTrackBits(track);
 

	
 
	return VehicleFromPos(tile, &info, EnsureNoTrainOnTrackProc) == NULL;
 
	TrackBits rail_bits = TrackToTrackBits(track);
 

	
 
	return VehicleFromPos(tile, &rail_bits, &EnsureNoTrainOnTrackProc) == NULL;
 
}
 

	
 
static bool CheckTrackCombination(TileIndex tile, TrackBits to_build, uint flags)
 
{
 
	TrackBits current; // The current track layout
 
	TrackBits future;  // The track layout we want to build
 
@@ -1157,13 +1146,13 @@ CommandCost CmdRemoveSignalTrack(TileInd
 
typedef CommandCost DoConvertRailProc(TileIndex tile, RailType totype, bool exec);
 

	
 
void *UpdateTrainPowerProc(Vehicle *v, void *data)
 
{
 
	/* Similiar checks as in TrainPowerChanged() */
 

	
 
	if (v->type == VEH_TRAIN && v->tile == *(TileIndex*)data && !IsArticulatedPart(v)) {
 
	if (v->type == VEH_TRAIN && !IsArticulatedPart(v)) {
 
		const RailVehicleInfo *rvi = RailVehInfo(v->engine_type);
 
		if (GetVehicleProperty(v, 0x0B, rvi->power) != 0) TrainPowerChanged(v->First());
 
	}
 

	
 
	return NULL;
 
}
 
@@ -1195,13 +1184,13 @@ static CommandCost DoConvertRail(TileInd
 
			/* Update build vehicle window related to this depot */
 
			InvalidateWindowData(WC_VEHICLE_DEPOT, tile);
 
			InvalidateWindowData(WC_BUILD_VEHICLE, tile);
 
		}
 

	
 
		/* update power of train engines on this tile */
 
		VehicleFromPos(tile, &tile, UpdateTrainPowerProc);
 
		VehicleFromPos(tile, NULL, &UpdateTrainPowerProc);
 
	}
 

	
 
	return CommandCost(RailConvertCost(GetRailType(tile), totype) * CountBits(GetTrackBits(tile)));
 
}
 

	
 
extern CommandCost DoConvertStationRail(TileIndex tile, RailType totype, bool exec);
 
@@ -1890,43 +1879,33 @@ static bool SetSignalsEnumProc(TileIndex
 
		return true; // don't look further if the tile is a depot
 
	}
 

	
 
	return false;
 
}
 

	
 
/* Struct to parse data from VehicleFromPos to SignalVehicleCheckProc */
 
struct SignalVehicleCheckStruct {
 
	TileIndex tile;
 
	uint track;
 
};
 

	
 
static void *SignalVehicleCheckProc(Vehicle *v, void *data)
 
{
 
	const SignalVehicleCheckStruct* dest = (SignalVehicleCheckStruct*)data;
 
	uint track = *(uint*)data;
 

	
 
	if (v->type != VEH_TRAIN) return NULL;
 

	
 
	/* Wrong tile, or no train? Not a match */
 
	if (v->tile != dest->tile) return NULL;
 

	
 
	/* Are we on the same piece of track? */
 
	if (dest->track & v->u.rail.track * 0x101) return v;
 
	if (track & v->u.rail.track * 0x101) return v;
 

	
 
	return NULL;
 
}
 

	
 
/* Special check for SetSignalsAfterProc, to see if there is a vehicle on this tile */
 
static bool SignalVehicleCheck(TileIndex tile, uint track)
 
{
 
	if (IsTileType(tile, MP_TUNNELBRIDGE)) {
 
		/* Locate vehicles in tunnels or on bridges */
 
		TileIndex endtile = IsTunnel(tile) ? GetOtherTunnelEnd(tile) : GetOtherBridgeEnd(tile);
 
		return GetVehicleTunnelBridge(tile, endtile) != NULL;
 
	} else {
 
		SignalVehicleCheckStruct dest = {tile, track};
 
		return VehicleFromPos(tile, &dest, &SignalVehicleCheckProc) != NULL;
 
		return VehicleFromPos(tile, &track, &SignalVehicleCheckProc) != NULL;
 
	}
 
}
 

	
 
static void SetSignalsAfterProc(TrackPathFinder *tpf)
 
{
 
	SetSignalsData *ssd = (SetSignalsData*)tpf->userdata;
src/road_cmd.cpp
Show inline comments
 
@@ -616,13 +616,13 @@ CommandCost DoConvertStreetRail(TileInde
 
	if (!IsLevelCrossing(tile)) return CMD_ERROR;
 

	
 
	if (exec) {
 
		SetRailType(tile, totype);
 
		MarkTileDirtyByTile(tile);
 
		YapfNotifyTrackLayoutChange(tile, FindFirstTrack(GetCrossingRailBits(tile)));
 
		VehicleFromPos(tile, &tile, UpdateTrainPowerProc);
 
		VehicleFromPos(tile, NULL, &UpdateTrainPowerProc);
 
	}
 

	
 
	return CommandCost(RailConvertCost(GetRailType(tile), totype));
 
}
 

	
 

	
src/roadveh_cmd.cpp
Show inline comments
 
@@ -1012,13 +1012,13 @@ struct OvertakeData {
 

	
 
static void* EnumFindVehToOvertake(Vehicle* v, void* data)
 
{
 
	const OvertakeData* od = (OvertakeData*)data;
 

	
 
	return
 
		v->tile == od->tile && v->type == VEH_ROAD && v->First() == v && v != od->u && v != od->v ?
 
		v->type == VEH_ROAD && v->First() == v && v != od->u && v != od->v ?
 
			v : NULL;
 
}
 

	
 
static bool FindRoadVehToOvertake(OvertakeData *od)
 
{
 
	uint32 bits;
src/station_cmd.cpp
Show inline comments
 
@@ -1303,13 +1303,13 @@ CommandCost DoConvertStationRail(TileInd
 
	if (!IsRailwayStation(tile)) return CMD_ERROR;
 

	
 
	if (exec) {
 
		SetRailType(tile, totype);
 
		MarkTileDirtyByTile(tile);
 
		YapfNotifyTrackLayoutChange(tile, GetRailStationTrack(tile));
 
		VehicleFromPos(tile, &tile, UpdateTrainPowerProc);
 
		VehicleFromPos(tile, NULL, &UpdateTrainPowerProc);
 
	}
 

	
 
	return CommandCost(RailConvertCost(GetRailType(tile), totype));
 
}
 

	
 
/**
src/train_cmd.cpp
Show inline comments
 
@@ -1525,21 +1525,21 @@ static void ReverseTrainSwapVeh(Vehicle 
 
	TrainPowerChanged(v);
 
}
 

	
 
/* Check if the vehicle is a train and is on the tile we are testing */
 
static void *TestTrainOnCrossing(Vehicle *v, void *data)
 
{
 
	if (v->tile != *(const TileIndex*)data || v->type != VEH_TRAIN) return NULL;
 
	if (v->type != VEH_TRAIN) return NULL;
 
	return v;
 
}
 

	
 
static void DisableTrainCrossing(TileIndex tile)
 
{
 
	if (IsLevelCrossingTile(tile) &&
 
			VehicleFromPos(tile, &tile, TestTrainOnCrossing) == NULL && // empty?
 
			IsCrossingBarred(tile)) {
 
			IsCrossingBarred(tile) &&
 
			VehicleFromPos(tile, NULL, &TestTrainOnCrossing) == NULL) { // empty?
 
		UnbarCrossing(tile);
 
		MarkTileDirtyByTile(tile);
 
	}
 
}
 

	
 
/**
 
@@ -2795,23 +2795,18 @@ static void CheckTrainCollision(Vehicle 
 
	);
 

	
 
	ModifyStationRatingAround(v->tile, v->owner, -160, 30);
 
	SndPlayVehicleFx(SND_13_BIG_CRASH, v);
 
}
 

	
 
struct VehicleAtSignalData {
 
	TileIndex tile;
 
	Direction direction;
 
};
 

	
 
static void *CheckVehicleAtSignal(Vehicle *v, void *data)
 
{
 
	const VehicleAtSignalData* vasd = (VehicleAtSignalData*)data;
 

	
 
	if (v->type == VEH_TRAIN && IsFrontEngine(v) && v->tile == vasd->tile) {
 
		DirDiff diff = ChangeDirDiff(DirDifference(v->direction, vasd->direction), DIRDIFF_90RIGHT);
 
	Direction dir = *(Direction*)data;
 

	
 
	if (v->type == VEH_TRAIN && IsFrontEngine(v)) {
 
		DirDiff diff = ChangeDirDiff(DirDifference(v->direction, dir), DIRDIFF_90RIGHT);
 

	
 
		if (diff == DIRDIFF_90RIGHT || (v->cur_speed <= 5 && diff <= DIRDIFF_REVERSE)) return v;
 
	}
 
	return NULL;
 
}
 

	
 
@@ -2904,18 +2899,16 @@ static void TrainController(Vehicle *v, 
 
						} else if (HasSignalOnTrackdir(gp.new_tile, i)) {
 
							v->cur_speed = 0;
 
							v->subspeed = 0;
 
							v->progress = 255 - 10;
 
							if (++v->load_unload_time_rem < _patches.wait_twoway_signal * 73) {
 
								TileIndex o_tile = gp.new_tile + TileOffsByDiagDir(enterdir);
 
								VehicleAtSignalData vasd;
 
								vasd.tile = o_tile;
 
								vasd.direction = ReverseDir(dir);
 
								Direction rdir = ReverseDir(dir);
 

	
 
								/* check if a train is waiting on the other side */
 
								if (VehicleFromPos(o_tile, &vasd, CheckVehicleAtSignal) == NULL) return;
 
								if (VehicleFromPos(o_tile, &rdir, &CheckVehicleAtSignal) == NULL) return;
 
							}
 
						}
 
						goto reverse_train_direction;
 
					}
 
				} else {
 
					static const TrackBits _matching_tracks[8] = {
src/tunnelbridge_cmd.cpp
Show inline comments
 
@@ -718,14 +718,14 @@ CommandCost DoConvertTunnelBridgeRail(Ti
 

	
 
			Track track = AxisToTrack(DiagDirToAxis(GetTunnelDirection(tile)));
 

	
 
			YapfNotifyTrackLayoutChange(tile, track);
 
			YapfNotifyTrackLayoutChange(endtile, track);
 

	
 
			VehicleFromPos(tile, &tile, UpdateTrainPowerProc);
 
			VehicleFromPos(endtile, &endtile, UpdateTrainPowerProc);
 
			VehicleFromPos(tile, NULL, &UpdateTrainPowerProc);
 
			VehicleFromPos(endtile, NULL, &UpdateTrainPowerProc);
 
		}
 

	
 
		return CommandCost((DistanceManhattan(tile, endtile) + 1) * RailConvertCost(GetRailType(tile), totype));
 
	} else if (IsBridge(tile) && GetBridgeTransportType(tile) == TRANSPORT_RAIL) {
 
		TileIndex endtile = GetOtherBridgeEnd(tile);
 

	
 
@@ -743,14 +743,14 @@ CommandCost DoConvertTunnelBridgeRail(Ti
 
			Track track = AxisToTrack(DiagDirToAxis(GetBridgeRampDirection(tile)));
 
			TileIndexDiff delta = TileOffsByDiagDir(GetBridgeRampDirection(tile));
 

	
 
			YapfNotifyTrackLayoutChange(tile, track);
 
			YapfNotifyTrackLayoutChange(endtile, track);
 

	
 
			VehicleFromPos(tile, &tile, UpdateTrainPowerProc);
 
			VehicleFromPos(endtile, &endtile, UpdateTrainPowerProc);
 
			VehicleFromPos(tile, NULL, &UpdateTrainPowerProc);
 
			VehicleFromPos(endtile, NULL, &UpdateTrainPowerProc);
 

	
 
			for (tile += delta; tile != endtile; tile += delta) {
 
				MarkTileDirtyByTile(tile); // TODO encapsulate this into a function
 
			}
 
		}
 

	
src/vehicle.cpp
Show inline comments
 
@@ -117,29 +117,24 @@ StringID VehicleInTheWayErrMsg(const Veh
 
		default:           return STR_980E_SHIP_IN_THE_WAY;
 
	}
 
}
 

	
 
static void *EnsureNoVehicleProcZ(Vehicle *v, void *data)
 
{
 
	const TileInfo *ti = (const TileInfo*)data;
 

	
 
	if (v->tile != ti->tile || v->type == VEH_DISASTER || (v->type == VEH_AIRCRAFT && v->subtype == AIR_SHADOW)) return NULL;
 
	if (v->z_pos > ti->z) return NULL;
 
	byte z = *(byte*)data;
 

	
 
	if (v->type == VEH_DISASTER || (v->type == VEH_AIRCRAFT && v->subtype == AIR_SHADOW)) return NULL;
 
	if (v->z_pos > z) return NULL;
 

	
 
	_error_message = VehicleInTheWayErrMsg(v);
 
	return v;
 
}
 

	
 
Vehicle *FindVehicleOnTileZ(TileIndex tile, byte z)
 
{
 
	TileInfo ti;
 

	
 
	ti.tile = tile;
 
	ti.z = z;
 

	
 
	return (Vehicle*)VehicleFromPos(tile, &ti, EnsureNoVehicleProcZ);
 
	return (Vehicle*)VehicleFromPos(tile, &z, &EnsureNoVehicleProcZ);
 
}
 

	
 
bool EnsureNoVehicleOnGround(TileIndex tile)
 
{
 
	return FindVehicleOnTileZ(tile, GetTileMaxZ(tile)) == NULL;
 
}
 
@@ -167,23 +162,16 @@ Vehicle *FindVehicleBetween(TileIndex fr
 
		}
 
	}
 
	return NULL;
 
}
 

	
 

	
 
/** Struct used for GetVehicleTunnelBridge() */
 
struct TunnelBridgeInfo {
 
	TileIndex tile;                      ///< tile
 
};
 

	
 
/** Procedure called for every vehicle found in tunnel/bridge in the hash map */
 
static void *GetVehicleTunnelBridgeProc(Vehicle *v, void *data)
 
{
 
	TunnelBridgeInfo *tbi = (TunnelBridgeInfo*)data;
 

	
 
	if (v->tile != tbi->tile || (v->type != VEH_TRAIN && v->type != VEH_ROAD)) return NULL;
 
	if (v->type != VEH_TRAIN && v->type != VEH_ROAD) return NULL;
 

	
 
	_error_message = VehicleInTheWayErrMsg(v);
 
	return v;
 
}
 

	
 
/**
 
@@ -191,20 +179,16 @@ static void *GetVehicleTunnelBridgeProc(
 
 * @param tile first end
 
 * @param endtile second end
 
 * @return pointer to vehicle found
 
 */
 
Vehicle *GetVehicleTunnelBridge(TileIndex tile, TileIndex endtile)
 
{
 
	TunnelBridgeInfo tbi = {tile};
 

	
 
	Vehicle *v = (Vehicle*)VehicleFromPos(tile, &tbi, &GetVehicleTunnelBridgeProc);
 
	Vehicle *v = (Vehicle*)VehicleFromPos(tile, NULL, &GetVehicleTunnelBridgeProc);
 
	if (v != NULL) return v;
 

	
 
	tbi.tile = endtile;
 

	
 
	return (Vehicle*)VehicleFromPos(endtile, &tbi, &GetVehicleTunnelBridgeProc);
 
	return (Vehicle*)VehicleFromPos(endtile, NULL, &GetVehicleTunnelBridgeProc);
 
}
 

	
 

	
 
static void UpdateVehiclePosHash(Vehicle* v, int x, int y);
 

	
 
void VehiclePositionChanged(Vehicle *v)
0 comments (0 inline, 0 general)