(svn r5070) Merged the bridge branch

-Feature: Bridges can now be placed above:
	Any railway track combination (excluding depots and waypoints)
	Any road combination (excluding depots)
	Clear tiles (duh), including fields
	Tunnel entrances
	Bridge heads

Thanks to Tron for idea and implementation, KUDr for the yapf synchronization and many others for hours of testing

There are still a number of visual problems remaining, especially when electric railways are on or under the bridge.
DO NOT REPORT THOSE BUGS FOR THE TIME BEING please.
This commit is contained in:
celestar
2006-06-02 13:05:41 +00:00
parent d680fcec77
commit 25a63ec7af
33 changed files with 776 additions and 981 deletions

View File

@@ -27,7 +27,7 @@ struct CFollowTrackT : public FollowTrack_t
m_new_tile = INVALID_TILE;
m_new_td_bits = TRACKDIR_BIT_NONE;
m_exitdir = INVALID_DIAGDIR;
m_is_station = m_is_tunnel = false;
m_is_station = m_is_bridge = m_is_tunnel = false;
m_tiles_skipped = 0;
}
@@ -60,6 +60,9 @@ protected:
/** Follow the m_exitdir from m_old_tile and fill m_new_tile and m_tiles_skipped */
FORCEINLINE void FollowTileExit()
{
m_is_station = m_is_bridge = m_is_tunnel = false;
m_tiles_skipped = 0;
// extra handling for tunnels in our direction
if (IsTunnelTile(m_old_tile)) {
DiagDirection tunnel_enterdir = GetTunnelDirection(m_old_tile);
@@ -73,11 +76,22 @@ protected:
}
assert(ReverseDiagDir(tunnel_enterdir) == m_exitdir);
}
// not a tunnel or station
m_is_tunnel = false;
m_tiles_skipped = 0;
// normal or station tile
// extra handling for bridge ramp in our direction
if (IsBridgeTile(m_old_tile)) {
DiagDirection bridge_enterdir = GetBridgeRampDirection(m_old_tile);
if (bridge_enterdir == m_exitdir) {
// we are entering the bridge ramp
m_new_tile = GetOtherBridgeEnd(m_old_tile);
uint32 bridge_length = GetBridgeLength(m_old_tile, m_new_tile);
m_tiles_skipped = bridge_length;
m_is_bridge = true;
return;
}
assert(ReverseDiagDir(bridge_enterdir) == m_exitdir);
}
// normal or station tile, do one step
TileIndexDiff diff = TileOffsByDir(m_exitdir);
m_new_tile = TILE_ADD(m_old_tile, diff);
@@ -148,22 +162,7 @@ protected:
// rail transport is possible only on tiles with the same owner as vehicle
if (IsRailTT() && GetTileOwner(m_new_tile) != m_veh->owner) {
// different owner
if (IsBridgeTile(m_new_tile)) {
if (IsBridgeMiddle(m_new_tile)) {
// bridge middle has no owner - tile is owned by the owner of the under-bridge track
if (GetBridgeAxis(m_new_tile) != DiagDirToAxis(m_exitdir)) {
// so it must be under bridge track (and wrong owner)
return false;
}
// in the middle of the bridge - when we came here, it should be ok
} else {
// different owner, on the bridge ramp
return false;
}
} else {
// different owner, not a bridge
return false;
}
return false;
}
// rail transport is possible only on compatible rail types
@@ -224,20 +223,10 @@ public:
int max_speed = INT_MAX; // no limit
// for now we handle only on-bridge speed limit
if (IsBridgeTile(m_old_tile) && !IsWaterTT() && IsDiagonalTrackdir(m_old_td)) {
bool is_on_bridge = true;
if (IsBridgeMiddle(m_old_tile)) {
// get track axis
Axis track_axis = DiagDirToAxis(TrackdirToExitdir(m_old_td));
// get under-bridge axis
Axis bridge_axis = GetBridgeAxis(m_old_tile);
if (track_axis != bridge_axis) is_on_bridge = false;
}
if (is_on_bridge) {
int spd = _bridge[GetBridgeType(m_old_tile)].speed;
if (IsRoadTT()) spd *= 2;
if (max_speed > spd) max_speed = spd;
}
if (!IsWaterTT() && IsBridgeTile(m_old_tile)) {
int spd = _bridge[GetBridgeType(m_old_tile)].speed;
if (IsRoadTT()) spd *= 2;
if (max_speed > spd) max_speed = spd;
}
// if min speed was requested, return it