diff options
author | tron <tron@openttd.org> | 2006-06-04 16:04:15 +0000 |
---|---|---|
committer | tron <tron@openttd.org> | 2006-06-04 16:04:15 +0000 |
commit | fa740023567157cf18d4dd06880307e7b08b7c77 (patch) | |
tree | 7fafd1f3b5f9dd18acaf05ec2212fd5099f44243 | |
parent | 479317b1eb85ba94491e2fd6d330f38fb25e02ea (diff) | |
download | openttd-fa740023567157cf18d4dd06880307e7b08b7c77.tar.xz |
(svn r5101) Add a function to convert an axis and a flag for north/south into a DiagDirection. Use it for bridge ramps and ship depots
-rw-r--r-- | bridge_map.h | 5 | ||||
-rw-r--r-- | depot.h | 20 | ||||
-rw-r--r-- | direction.h | 10 | ||||
-rw-r--r-- | vehicle.c | 2 | ||||
-rw-r--r-- | water_map.h | 5 |
5 files changed, 23 insertions, 19 deletions
diff --git a/bridge_map.h b/bridge_map.h index 9470204e0..40113471b 100644 --- a/bridge_map.h +++ b/bridge_map.h @@ -78,10 +78,7 @@ static inline uint GetBridgeType(TileIndex t) */ static inline DiagDirection GetBridgeRampDirection(TileIndex t) { - /* Heavy wizardry to convert the X/Y (bit 0) + N/S (bit 5) encoding of - * bridges to a DiagDirection - */ - return (DiagDirection)((6 - (_m[t].m5 >> 4 & 2) - (_m[t].m5 & 1)) % 4); + return ReverseDiagDir(XYNSToDiagDir((Axis)GB(_m[t].m5, 0, 1), GB(_m[t].m5, 5, 1))); } @@ -12,6 +12,7 @@ #include "road_map.h" #include "tile.h" #include "variables.h" +#include "water_map.h" struct Depot { TileIndex xy; @@ -98,20 +99,11 @@ static inline DiagDirection GetDepotDirection(TileIndex tile, TransportType type { assert(IsTileDepotType(tile, type)); - switch (type) - { - case TRANSPORT_RAIL: return GetRailDepotDirection(tile); - case TRANSPORT_ROAD: return GetRoadDepotDirection(tile); - case TRANSPORT_WATER: - /* Water is stubborn, it stores the directions in a different order. */ - switch (GB(_m[tile].m5, 0, 2)) { - case 0: return DIAGDIR_NE; - case 1: return DIAGDIR_SW; - case 2: return DIAGDIR_NW; - case 3: return DIAGDIR_SE; - } - default: - return INVALID_DIAGDIR; /* Not reached */ + switch (type) { + case TRANSPORT_RAIL: return GetRailDepotDirection(tile); + case TRANSPORT_ROAD: return GetRoadDepotDirection(tile); + case TRANSPORT_WATER: return GetShipDepotDirection(tile); + default: return INVALID_DIAGDIR; /* Not reached */ } } diff --git a/direction.h b/direction.h index cee9ab73a..fcc6771be 100644 --- a/direction.h +++ b/direction.h @@ -113,6 +113,16 @@ static inline DiagDirection AxisToDiagDir(Axis a) return (DiagDirection)(2 - a); } +/** + * Convert an axis and a flag for north/south into a DiagDirection + * @param ns north -> 0, south -> 1 + */ +static inline DiagDirection XYNSToDiagDir(Axis xy, uint ns) +{ + return (DiagDirection)(xy * 3 ^ ns * 2); +} + + static inline bool IsValidDiagDirection(DiagDirection d) { return d < DIAGDIR_END; @@ -1989,7 +1989,7 @@ Trackdir GetVehicleTrackdir(const Vehicle* v) case VEH_Ship: if (v->u.ship.state == 0x80) /* Inside a depot? */ /* We'll assume the ship is facing outwards */ - return DiagdirToDiagTrackdir(GetDepotDirection(v->tile, TRANSPORT_WATER)); /* Ship in depot */ + return DiagdirToDiagTrackdir(GetShipDepotDirection(v->tile)); return TrackDirectionToTrackdir(FIND_FIRST_BIT(v->u.ship.state),v->direction); diff --git a/water_map.h b/water_map.h index ff8ec21a4..7a232ff74 100644 --- a/water_map.h +++ b/water_map.h @@ -63,6 +63,11 @@ static inline Axis GetShipDepotAxis(TileIndex t) return (Axis)GB(_m[t].m5, 1, 1); } +static inline DiagDirection GetShipDepotDirection(TileIndex t) +{ + return XYNSToDiagDir(GetShipDepotAxis(t), GB(_m[t].m5, 0, 1)); +} + static inline DiagDirection GetLockDirection(TileIndex t) { return (DiagDirection)GB(_m[t].m5, 0, 2); |