tron@3189: /* $Id$ */ tron@3189: tron@3189: #ifndef BRIDGE_MAP_H tron@3189: #define BRIDGE_MAP_H tron@3189: tron@3196: #include "direction.h" tron@3189: #include "macros.h" tron@3189: #include "map.h" tron@3189: #include "rail.h" tron@3189: #include "tile.h" tron@3189: tron@3189: tron@3214: static inline bool IsBridgeRamp(TileIndex t) tron@3214: { tron@3214: return !HASBIT(_m[t].m5, 6); tron@3214: } tron@3214: tron@3214: tron@3196: /** tron@3196: * Get the direction pointing onto the bridge tron@3196: */ tron@3196: static inline DiagDirection GetBridgeRampDirection(TileIndex t) tron@3196: { tron@3196: /* Heavy wizardry to convert the X/Y (bit 0) + N/S (bit 5) encoding of tron@3196: * bridges to a DiagDirection tron@3196: */ tron@3196: return (DiagDirection)((6 - (_m[t].m5 >> 4 & 2) - (_m[t].m5 & 1)) % 4); tron@3196: } tron@3196: tron@3196: tron@3216: static inline bool IsClearUnderBridge(TileIndex t) tron@3216: { tron@3216: return GB(_m[t].m5, 3, 3) == 0; tron@3216: } tron@3216: tron@3216: tron@3216: static inline bool IsTransportUnderBridge(TileIndex t) tron@3216: { tron@3216: return HASBIT(_m[t].m5, 5); tron@3216: } tron@3216: tron@3216: static inline TransportType GetTransportTypeUnderBridge(TileIndex t) tron@3216: { tron@3216: return (TransportType)GB(_m[t].m5, 3, 2); tron@3216: } tron@3216: tron@3216: tron@3214: /** tron@3214: * Starting at one bridge end finds the other bridge end tron@3214: */ tron@3214: TileIndex GetOtherBridgeEnd(TileIndex); tron@3214: tron@3214: tron@3189: static inline void SetClearUnderBridge(TileIndex t) tron@3189: { tron@3189: SetTileOwner(t, OWNER_NONE); tron@3189: SB(_m[t].m5, 3, 3, 0 << 2 | 0); tron@3189: } tron@3189: tron@3189: static inline void SetWaterUnderBridge(TileIndex t) tron@3189: { tron@3189: SetTileOwner(t, OWNER_WATER); tron@3189: SB(_m[t].m5, 3, 3, 0 << 2 | 1); tron@3189: } tron@3189: tron@3189: static inline void SetRailUnderBridge(TileIndex t, Owner o, RailType r) tron@3189: { tron@3189: SetTileOwner(t, o); tron@3189: SB(_m[t].m5, 3, 3, 1 << 2 | TRANSPORT_RAIL); tron@3189: SB(_m[t].m3, 0, 4, r); tron@3189: } tron@3189: tron@3189: static inline void SetRoadUnderBridge(TileIndex t, Owner o) tron@3189: { tron@3189: SetTileOwner(t, o); tron@3189: SB(_m[t].m5, 3, 3, 1 << 2 | TRANSPORT_ROAD); tron@3189: } tron@3189: tron@3209: tron@3209: static inline void MakeBridgeRamp(TileIndex t, Owner o, uint bridgetype, DiagDirection d, TransportType tt) tron@3209: { tron@3209: uint northsouth = (d == DIAGDIR_NE || d == DIAGDIR_NW); tron@3209: tron@3209: SetTileType(t, MP_TUNNELBRIDGE); tron@3209: SetTileOwner(t, o); tron@3209: _m[t].m2 = bridgetype << 4; tron@3209: _m[t].m4 = 0; tron@3209: _m[t].m5 = 1 << 7 | 0 << 6 | northsouth << 5 | tt << 1 | DiagDirToAxis(d); tron@3209: } tron@3209: tron@3209: static inline void MakeRoadBridgeRamp(TileIndex t, Owner o, uint bridgetype, DiagDirection d) tron@3209: { tron@3209: MakeBridgeRamp(t, o, bridgetype, d, TRANSPORT_ROAD); tron@3209: _m[t].m3 = 0; tron@3209: } tron@3209: tron@3209: static inline void MakeRailBridgeRamp(TileIndex t, Owner o, uint bridgetype, DiagDirection d, RailType r) tron@3209: { tron@3209: MakeBridgeRamp(t, o, bridgetype, d, TRANSPORT_RAIL); tron@3209: _m[t].m3 = r; tron@3209: } tron@3209: tron@3209: tron@3209: static inline void MakeBridgeMiddle(TileIndex t, uint bridgetype, uint piece, Axis a, TransportType tt) tron@3209: { tron@3209: SetTileType(t, MP_TUNNELBRIDGE); tron@3209: SetTileOwner(t, OWNER_NONE); tron@3209: _m[t].m2 = bridgetype << 4 | piece; tron@3209: _m[t].m3 = 0; tron@3209: _m[t].m4 = 0; tron@3209: _m[t].m5 = 1 << 7 | 1 << 6 | 0 << 5 | 0 << 3 | tt << 1 | a; tron@3209: } tron@3209: tron@3209: static inline void MakeRoadBridgeMiddle(TileIndex t, uint bridgetype, uint piece, Axis a) tron@3209: { tron@3209: MakeBridgeMiddle(t, bridgetype, piece, a, TRANSPORT_ROAD); tron@3209: } tron@3209: tron@3209: static inline void MakeRailBridgeMiddle(TileIndex t, uint bridgetype, uint piece, Axis a, RailType r) tron@3209: { tron@3209: MakeBridgeMiddle(t, bridgetype, piece, a, TRANSPORT_RAIL); tron@3209: SB(_m[t].m3, 4, 4, r); tron@3209: } tron@3209: tron@3209: tron@3189: #endif