summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortron <tron@openttd.org>2006-06-04 16:04:15 +0000
committertron <tron@openttd.org>2006-06-04 16:04:15 +0000
commitfa740023567157cf18d4dd06880307e7b08b7c77 (patch)
tree7fafd1f3b5f9dd18acaf05ec2212fd5099f44243
parent479317b1eb85ba94491e2fd6d330f38fb25e02ea (diff)
downloadopenttd-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.h5
-rw-r--r--depot.h20
-rw-r--r--direction.h10
-rw-r--r--vehicle.c2
-rw-r--r--water_map.h5
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)));
}
diff --git a/depot.h b/depot.h
index 5acb0fcb5..cf8b00bc7 100644
--- a/depot.h
+++ b/depot.h
@@ -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;
diff --git a/vehicle.c b/vehicle.c
index ecb305006..ea5638273 100644
--- a/vehicle.c
+++ b/vehicle.c
@@ -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);