changeset 3953:ae87af7dc5f8 draft

(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
author tron <tron@openttd.org>
date Sun, 04 Jun 2006 16:04:15 +0000
parents b3db64768651
children f497c1dc3266
files bridge_map.h depot.h direction.h vehicle.c water_map.h
diffstat 5 files changed, 23 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/bridge_map.h
+++ b/bridge_map.h
@@ -78,10 +78,7 @@
  */
 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)));
 }
 
 
--- 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 @@
 {
 	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 */
 	}
 }
 
--- a/direction.h
+++ b/direction.h
@@ -113,6 +113,16 @@
 	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;
--- a/vehicle.c
+++ b/vehicle.c
@@ -1989,7 +1989,7 @@
 		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);
 
--- a/water_map.h
+++ b/water_map.h
@@ -63,6 +63,11 @@
 	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);