summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--direction.h13
-rw-r--r--train_cmd.c33
2 files changed, 32 insertions, 14 deletions
diff --git a/direction.h b/direction.h
index 49a2b6340..8f29bdd6c 100644
--- a/direction.h
+++ b/direction.h
@@ -65,6 +65,19 @@ static inline DiagDirection ReverseDiagDir(DiagDirection d)
}
+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);
diff --git a/train_cmd.c b/train_cmd.c
index cb08e52b1..1d761aec4 100644
--- a/train_cmd.c
+++ b/train_cmd.c
@@ -1546,14 +1546,14 @@ static void ReverseTrainDirection(Vehicle *v)
/* 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 @@ static TrainFindDepotData FindClosestTrainDepot(Vehicle *v)
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 @@ static bool TrainCheckIfLineEnds(Vehicle *v)
TileIndex tile;
uint x,y;
uint16 break_speed;
- DiagDirection t;
+ DiagDirection dir;
+ int t;
uint32 ts;
t = v->breakdown_ctr;
@@ -3138,14 +3143,14 @@ static bool TrainCheckIfLineEnds(Vehicle *v)
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 @@ static bool TrainCheckIfLineEnds(Vehicle *v)
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;