changeset 3163:e6db5fc6b1e4 draft

(svn r3789) Add an enum and function to handle DiagDirection changes
author tron <tron@openttd.org>
date Wed, 08 Mar 2006 08:51:26 +0000
parents d22ae987ccd9
children eae1077887ad
files direction.h train_cmd.c
diffstat 2 files changed, 32 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/direction.h
+++ b/direction.h
@@ -65,6 +65,19 @@
 }
 
 
+typedef enum DiagDirDiff {
+	DIAGDIRDIFF_SAME    = 0,
+	DIAGDIRDIFF_90RIGHT = 1,
+	DIAGDIRDIFF_REVERSE = 2,
+	DIAGDIRDIFF_90LEFT  = 3
+} DiagDirDiff;
+
+static inline DiagDirection ChangeDiagDir(DiagDirection d, DiagDirDiff delta)
+{
+	return (DiagDirection)((d + delta) % 4);
+}
+
+
 static inline DiagDirection DirToDiagDir(Direction dir)
 {
 	return (DiagDirection)(dir >> 1);
--- a/train_cmd.c
+++ b/train_cmd.c
@@ -1546,14 +1546,14 @@
 	/* Check if we were approaching a rail/road-crossing */
 	{
 		TileIndex tile = v->tile;
-		int t;
+		DiagDirection dir = DirToDiagDir(v->direction);
+
 		/* Determine the diagonal direction in which we will exit this tile */
-		t = v->direction >> 1;
-		if (!(v->direction & 1) && v->u.rail.track != _state_dir_table[t]) {
-			t = (t - 1) & 3;
+		if (!(v->direction & 1) && v->u.rail.track != _state_dir_table[dir]) {
+			dir = ChangeDiagDir(dir, DIAGDIRDIFF_90LEFT);
 		}
 		/* Calculate next tile */
-		tile += TileOffsByDir(t);
+		tile += TileOffsByDir(dir);
 
 		/* Check if the train left a rail/road-crossing */
 		DisableTrainCrossing(tile);
@@ -1785,13 +1785,17 @@
 		DiagDirection i;
 
 		i = DirToDiagDir(v->direction);
-		if (!(v->direction & 1) && v->u.rail.track != _state_dir_table[i]) i = (i + 3) & 3;
+		if (!(v->direction & 1) && v->u.rail.track != _state_dir_table[i]) {
+			i = ChangeDiagDir(i, DIAGDIRDIFF_90LEFT);
+		}
 		NewTrainPathfind(tile, 0, i, (NTPEnumProc*)NtpCallbFindDepot, &tfdd);
 		if (tfdd.best_length == (uint)-1){
 			tfdd.reverse = true;
 			// search in backwards direction
 			i = ReverseDiagDir(DirToDiagDir(v->direction));
-			if (!(v->direction & 1) && v->u.rail.track != _state_dir_table[i]) i = (i + 3) & 3;
+			if (!(v->direction & 1) && v->u.rail.track != _state_dir_table[i]) {
+				i = ChangeDiagDir(i, DIAGDIRDIFF_90LEFT);
+			}
 			NewTrainPathfind(tile, 0, i, (NTPEnumProc*)NtpCallbFindDepot, &tfdd);
 		}
 	}
@@ -3107,7 +3111,8 @@
 	TileIndex tile;
 	uint x,y;
 	uint16 break_speed;
-	DiagDirection t;
+	DiagDirection dir;
+	int t;
 	uint32 ts;
 
 	t = v->breakdown_ctr;
@@ -3138,14 +3143,14 @@
 		return true;*/
 
 	/* Determine the non-diagonal direction in which we will exit this tile */
-	t = v->direction >> 1;
-	if (!(v->direction & 1) && v->u.rail.track != _state_dir_table[t]) {
-		t = (t - 1) & 3;
+	dir = DirToDiagDir(v->direction);
+	if (!(v->direction & 1) && v->u.rail.track != _state_dir_table[dir]) {
+		dir = ChangeDiagDir(dir, DIAGDIRDIFF_90LEFT);
 	}
 	/* Calculate next tile */
-	tile += TileOffsByDir(t);
+	tile += TileOffsByDir(dir);
 	// determine the track status on the next tile.
-	ts = GetTileTrackStatus(tile, TRANSPORT_RAIL) & _reachable_tracks[t];
+	ts = GetTileTrackStatus(tile, TRANSPORT_RAIL) & _reachable_tracks[dir];
 
 	/* Calc position within the current tile ?? */
 	x = v->x_pos & 0xF;
@@ -3166,7 +3171,7 @@
 		if (x + 4 > 15 &&
 				(!CheckCompatibleRail(v, tile) ||
 				(IsTileDepotType(tile, TRANSPORT_RAIL) &&
-				GetDepotDirection(tile, TRANSPORT_RAIL) == t))) {
+				GetDepotDirection(tile, TRANSPORT_RAIL) == dir))) {
 			v->cur_speed = 0;
 			ReverseTrainDirection(v);
 			return false;