47 m_exitdir = TrackdirToExitdir(m_old_td); |
47 m_exitdir = TrackdirToExitdir(m_old_td); |
48 if (EnteredDepot()) return true; |
48 if (EnteredDepot()) return true; |
49 if (!CanExitOldTile()) return false; |
49 if (!CanExitOldTile()) return false; |
50 FollowTileExit(); |
50 FollowTileExit(); |
51 if (!QueryNewTileTrackStatus()) return TryReverse(); |
51 if (!QueryNewTileTrackStatus()) return TryReverse(); |
52 if (!CanEnterNewTile()) return false; |
|
53 m_new_td_bits &= DiagdirReachesTrackdirs(m_exitdir); |
52 m_new_td_bits &= DiagdirReachesTrackdirs(m_exitdir); |
54 if (!Allow90degTurns()) |
53 if (!Allow90degTurns()) |
55 m_new_td_bits &= (TrackdirBits)~(int)TrackdirCrossesTrackdirs(m_old_td); |
54 m_new_td_bits &= (TrackdirBits)~(int)TrackdirCrossesTrackdirs(m_old_td); |
56 return (m_new_td_bits != TRACKDIR_BIT_NONE); |
55 if (m_new_td_bits == TRACKDIR_BIT_NONE) return false; |
|
56 if (!CanEnterNewTile()) return false; |
|
57 return true; |
57 } |
58 } |
58 |
59 |
59 protected: |
60 protected: |
60 /** Follow the m_exitdir from m_old_tile and fill m_new_tile and m_tiles_skipped */ |
61 /** Follow the m_exitdir from m_old_tile and fill m_new_tile and m_tiles_skipped */ |
61 FORCEINLINE void FollowTileExit() |
62 FORCEINLINE void FollowTileExit() |
75 return; |
76 return; |
76 } |
77 } |
77 assert(ReverseDiagDir(tunnel_enterdir) == m_exitdir); |
78 assert(ReverseDiagDir(tunnel_enterdir) == m_exitdir); |
78 } |
79 } |
79 |
80 |
80 // extra handling for bridge ramp in our direction |
81 // extra handling when leaving bridge ramp and entering the bridge |
81 if (IsBridgeTile(m_old_tile)) { |
82 if (IsBridgeTile(m_old_tile)) { |
82 DiagDirection bridge_enterdir = GetBridgeRampDirection(m_old_tile); |
83 DiagDirection bridge_enterdir = GetBridgeRampDirection(m_old_tile); |
83 if (bridge_enterdir == m_exitdir) { |
84 if (bridge_enterdir == m_exitdir) { |
84 // we are entering the bridge ramp |
85 // we are entering the bridge |
85 m_new_tile = GetOtherBridgeEnd(m_old_tile); |
86 m_new_tile = GetOtherBridgeEnd(m_old_tile); |
86 uint32 bridge_length = GetBridgeLength(m_old_tile, m_new_tile); |
87 uint32 bridge_length = GetBridgeLength(m_old_tile, m_new_tile); |
87 m_tiles_skipped = bridge_length; |
88 m_tiles_skipped = bridge_length; |
88 m_is_bridge = true; |
89 m_is_bridge = true; |
89 return; |
90 return; |
90 } |
91 } |
91 assert(ReverseDiagDir(bridge_enterdir) == m_exitdir); |
|
92 } |
92 } |
93 |
93 |
94 // normal or station tile, do one step |
94 // normal or station tile, do one step |
95 TileIndexDiff diff = TileOffsByDiagDir(m_exitdir); |
95 TileIndexDiff diff = TileOffsByDiagDir(m_exitdir); |
96 m_new_tile = TILE_ADD(m_old_tile, diff); |
96 m_new_tile = TILE_ADD(m_old_tile, diff); |