yapf/follow_track.hpp
branchcustombridgeheads
changeset 5604 729d54e97b94
parent 5573 afa6f92a71fd
child 5616 0570ae953222
equal deleted inserted replaced
5603:f3aa14b91b0a 5604:729d54e97b94
    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);