mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-01-22 15:11:54 +00:00
(svn r3898) Add functions to find a bridge end starting at a middle tile
This commit is contained in:
parent
ca1efd3189
commit
ec33376fa3
20
bridge_map.c
20
bridge_map.c
@ -5,6 +5,26 @@
|
||||
#include "bridge_map.h"
|
||||
|
||||
|
||||
TileIndex GetBridgeEnd(TileIndex tile, DiagDirection dir)
|
||||
{
|
||||
TileIndexDiff delta = TileOffsByDir(dir);
|
||||
|
||||
assert(DiagDirToAxis(dir) == GetBridgeAxis(tile));
|
||||
|
||||
do {
|
||||
tile += delta;
|
||||
} while (!IsBridgeRamp(tile));
|
||||
|
||||
return tile;
|
||||
}
|
||||
|
||||
|
||||
TileIndex GetSouthernBridgeEnd(TileIndex t)
|
||||
{
|
||||
return GetBridgeEnd(t, AxisToDiagDir(GetBridgeAxis(t)));
|
||||
}
|
||||
|
||||
|
||||
TileIndex GetOtherBridgeEnd(TileIndex tile)
|
||||
{
|
||||
TileIndexDiff delta = TileOffsByDir(GetBridgeRampDirection(tile));
|
||||
|
23
bridge_map.h
23
bridge_map.h
@ -15,6 +15,12 @@ static inline bool IsBridgeRamp(TileIndex t)
|
||||
return !HASBIT(_m[t].m5, 6);
|
||||
}
|
||||
|
||||
static inline bool IsBridgeMiddle(TileIndex t)
|
||||
{
|
||||
return HASBIT(_m[t].m5, 6);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Get the direction pointing onto the bridge
|
||||
@ -28,6 +34,12 @@ static inline DiagDirection GetBridgeRampDirection(TileIndex t)
|
||||
}
|
||||
|
||||
|
||||
static inline Axis GetBridgeAxis(TileIndex t)
|
||||
{
|
||||
return (Axis)GB(_m[t].m5, 0, 1);
|
||||
}
|
||||
|
||||
|
||||
static inline bool IsClearUnderBridge(TileIndex t)
|
||||
{
|
||||
return GB(_m[t].m5, 3, 3) == 0;
|
||||
@ -45,6 +57,17 @@ static inline TransportType GetTransportTypeUnderBridge(TileIndex t)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Finds the end of a bridge in the specified direction starting at a middle tile
|
||||
*/
|
||||
TileIndex GetBridgeEnd(TileIndex, DiagDirection);
|
||||
|
||||
/**
|
||||
* Finds the southern end of a bridge starting at a middle tile
|
||||
*/
|
||||
TileIndex GetSouthernBridgeEnd(TileIndex t);
|
||||
|
||||
|
||||
/**
|
||||
* Starting at one bridge end finds the other bridge end
|
||||
*/
|
||||
|
@ -846,15 +846,7 @@ int32 DoConvertTunnelBridgeRail(TileIndex tile, uint totype, bool exec)
|
||||
// fast routine for getting the height of a middle bridge tile. 'tile' MUST be a middle bridge tile.
|
||||
static uint GetBridgeHeight(const TileInfo *ti)
|
||||
{
|
||||
TileIndexDiff delta;
|
||||
TileIndex tile = ti->tile;
|
||||
|
||||
// find the end tile of the bridge.
|
||||
delta = GB(_m[tile].m5, 0, 1) ? TileDiffXY(0, 1) : TileDiffXY(1, 0);
|
||||
do {
|
||||
assert((_m[tile].m5 & 0xC0) == 0xC0); // bridge and middle part
|
||||
tile += delta;
|
||||
} while (_m[tile].m5 & 0x40); // while bridge middle parts
|
||||
TileIndex tile = GetSouthernBridgeEnd(ti->tile);
|
||||
|
||||
/* Return the height there (the height of the NORTH CORNER)
|
||||
* If the end of the bridge is on a tileh 7 (all raised, except north corner),
|
||||
@ -1240,12 +1232,8 @@ static void GetTileDesc_TunnelBridge(TileIndex tile, TileDesc *td)
|
||||
} else {
|
||||
td->str = _bridge_tile_str[GB(_m[tile].m5, 1, 2) << 4 | GB(_m[tile].m2, 4, 4)];
|
||||
|
||||
/* scan to the end of the bridge, that's where the owner is stored */
|
||||
if (_m[tile].m5 & 0x40) {
|
||||
TileIndexDiff delta = GB(_m[tile].m5, 0, 1) ? TileDiffXY(0, -1) : TileDiffXY(-1, 0);
|
||||
|
||||
do tile += delta; while (_m[tile].m5 & 0x40);
|
||||
}
|
||||
// the owner is stored at the end of the bridge
|
||||
if (IsBridgeMiddle(tile)) tile = GetSouthernBridgeEnd(tile);
|
||||
}
|
||||
td->owner = GetTileOwner(tile);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user