Mercurial > hg > openttd
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;