diff options
-rw-r--r-- | Makefile | 1 | ||||
-rw-r--r-- | road_cmd.c | 40 | ||||
-rw-r--r-- | road_map.c | 44 | ||||
-rw-r--r-- | road_map.h | 17 | ||||
-rw-r--r-- | station.h | 2 | ||||
-rw-r--r-- | tile.h | 6 |
6 files changed, 73 insertions, 37 deletions
@@ -672,6 +672,7 @@ SRCS += rail_gui.c SRCS += rev.c SRCS += road_cmd.c SRCS += road_gui.c +SRCS += road_map.c SRCS += roadveh_cmd.c SRCS += roadveh_gui.c SRCS += saveload.c diff --git a/road_cmd.c b/road_cmd.c index f2eb1f04f..7e8f410ef 100644 --- a/road_cmd.c +++ b/road_cmd.c @@ -27,38 +27,6 @@ static bool _road_special_gettrackstatus; void RoadVehEnterDepot(Vehicle *v); -static bool HasTileRoadAt(TileIndex tile, int i) -{ - RoadBits b; - - switch (GetTileType(tile)) { - case MP_STREET: - switch (GetRoadType(tile)) { - case ROAD_NORMAL: b = GetRoadBits(tile); break; - case ROAD_CROSSING: b = GetCrossingRoadBits(tile); break; - case ROAD_DEPOT: return (~_m[tile].m5 & 3) == i; - default: return false; - } - break; - - case MP_STATION: - return - IS_BYTE_INSIDE(_m[tile].m5, 0x43, 0x43 + 8) && - (~(_m[tile].m5 - 0x43) & 3) == i; - - case MP_TUNNELBRIDGE: - // bail out, if not a bridge middle part with road underneath - if ((_m[tile].m5 & 0xF8) != 0xE8) return false; - // road direction perpendicular to bridge - b = (_m[tile].m5 & 0x01) ? ROAD_X : ROAD_Y; - - default: - return false; - } - - return HASBIT(b, i); -} - static bool CheckAllowRemoveRoad(TileIndex tile, uint br, bool *edge_road) { int blocks; @@ -90,10 +58,10 @@ static bool CheckAllowRemoveRoad(TileIndex tile, uint br, bool *edge_road) // Get a bitmask of which neighbouring roads has a tile n = 0; - if (blocks&0x25 && HasTileRoadAt(TILE_ADDXY(tile,-1, 0), 1)) n |= 8; - if (blocks&0x2A && HasTileRoadAt(TILE_ADDXY(tile, 0, 1), 0)) n |= 4; - if (blocks&0x19 && HasTileRoadAt(TILE_ADDXY(tile, 1, 0), 3)) n |= 2; - if (blocks&0x16 && HasTileRoadAt(TILE_ADDXY(tile, 0,-1), 2)) n |= 1; + if (blocks & 0x25 && GetAnyRoadBits(TILE_ADDXY(tile,-1, 0)) & ROAD_SW) n |= 8; + if (blocks & 0x2A && GetAnyRoadBits(TILE_ADDXY(tile, 0, 1)) & ROAD_NW) n |= 4; + if (blocks & 0x19 && GetAnyRoadBits(TILE_ADDXY(tile, 1, 0)) & ROAD_NE) n |= 2; + if (blocks & 0x16 && GetAnyRoadBits(TILE_ADDXY(tile, 0,-1)) & ROAD_SE) n |= 1; // If 0 or 1 bits are set in n, or if no bits that match the bits to remove, // then allow it diff --git a/road_map.c b/road_map.c new file mode 100644 index 000000000..ca35d8358 --- /dev/null +++ b/road_map.c @@ -0,0 +1,44 @@ +/* $Id$ */ + +#include "stdafx.h" +#include "openttd.h" +#include "road_map.h" +#include "station.h" + + +RoadBits GetAnyRoadBits(TileIndex tile) +{ + switch (GetTileType(tile)) { + case MP_STREET: + switch (GetRoadType(tile)) { + default: + case ROAD_NORMAL: return GetRoadBits(tile); + case ROAD_CROSSING: return GetCrossingRoadBits(tile); + case ROAD_DEPOT: return DiagDirToRoadBits(GB(_m[tile].m5, 0, 2)); + } + + case MP_STATION: + if (!IsRoadStationTile(tile)) return 0; + return DiagDirToRoadBits(GetRoadStationDir(tile)); + + case MP_TUNNELBRIDGE: + if (_m[tile].m5 & 0x80) { + // bridge + if (_m[tile].m5 & 0x40) { + // middle part + if ((_m[tile].m5 & 0x38) != 0x28) return 0; // no road under bridge + return _m[tile].m5 & 1 ? ROAD_X : ROAD_Y; + } else { + // ending + if (GB(_m[tile].m5, 1, 2) != TRANSPORT_ROAD) return 0; // not a road bridge + return _m[tile].m5 & 1 ? ROAD_Y : ROAD_X; + } + } else { + // tunnel + if (GB(_m[tile].m5, 2, 2) != TRANSPORT_ROAD) return 0; // not a road tunnel + return DiagDirToRoadBits(ReverseDiagDir(GB(_m[tile].m5, 0, 2))); + } + + default: return 0; + } +} diff --git a/road_map.h b/road_map.h index ec9cd33cc..120688474 100644 --- a/road_map.h +++ b/road_map.h @@ -22,6 +22,12 @@ static inline RoadBits ComplementRoadBits(RoadBits r) return ROAD_ALL ^ r; } +static inline RoadBits DiagDirToRoadBits(DiagDirection d) +{ + return 1 << (3 ^ d); +} + + static inline RoadBits GetRoadBits(TileIndex tile) { return GB(_m[tile].m5, 0, 4); @@ -50,6 +56,17 @@ static inline RoadType GetRoadType(TileIndex tile) } +/** + * Returns the RoadBits on an arbitrary tile + * Special behavior: + * - road depots: entrance is treated as road piece + * - road tunnels: entrance is treated as road piece + * - bridge ramps: treated as straight road + * - bridge middle parts: bridge itself is ignored + */ +RoadBits GetAnyRoadBits(TileIndex); + + static inline void MakeRoadNormal(TileIndex t, Owner owner, RoadBits bits, uint town) { SetTileType(t, MP_STREET); @@ -244,7 +244,7 @@ static inline bool IsBuoyTile(TileIndex tile) /* Get's the direction the station exit points towards. Ie, returns 0 for a * station with the exit NE. */ -static inline byte GetRoadStationDir(TileIndex tile) +static inline DiagDirection GetRoadStationDir(TileIndex tile) { assert(IsRoadStationTile(tile)); return (_m[tile].m5 - 0x43) & 3; @@ -44,6 +44,12 @@ typedef enum DiagonalDirections { INVALID_DIAGDIR = 0xFF, } DiagDirection; +static inline DiagDirection ReverseDiagDir(DiagDirection d) +{ + return 2 ^ d; +} + + /* the 2 axis */ typedef enum Axis { AXIS_X = 0, |