mirror of https://github.com/OpenTTD/OpenTTD
Codechange: Increase readability of track functions and pathfinders.
parent
85ebe20a76
commit
31ac11bddb
|
@ -239,7 +239,7 @@ protected:
|
|||
} else {
|
||||
m_new_td_bits = TrackStatusToTrackdirBits(GetTileTrackStatus(m_new_tile, TT(), IsRoadTT() ? RoadVehicle::From(m_veh)->compatible_roadtypes : 0));
|
||||
|
||||
if (IsTram() && m_new_td_bits == 0) {
|
||||
if (IsTram() && m_new_td_bits == TRACKDIR_BIT_NONE) {
|
||||
/* GetTileTrackStatus() returns 0 for single tram bits.
|
||||
* As we cannot change it there (easily) without breaking something, change it here */
|
||||
switch (GetSingleTramBit(m_new_tile)) {
|
||||
|
|
|
@ -807,7 +807,7 @@ static TrackdirBits GetDriveableTrackdirBits(TileIndex dst_tile, Trackdir src_tr
|
|||
{
|
||||
TrackdirBits trackdirbits = TrackStatusToTrackdirBits(GetTileTrackStatus(dst_tile, type, subtype));
|
||||
|
||||
if (trackdirbits == 0 && type == TRANSPORT_ROAD && HasBit(subtype, ROADTYPE_TRAM)) {
|
||||
if (trackdirbits == TRACKDIR_BIT_NONE && type == TRANSPORT_ROAD && HasBit(subtype, ROADTYPE_TRAM)) {
|
||||
/* GetTileTrackStatus() returns 0 for single tram bits.
|
||||
* As we cannot change it there (easily) without breaking something, change it here */
|
||||
switch (GetSingleTramBit(dst_tile)) {
|
||||
|
@ -900,7 +900,7 @@ static void NPFFollowTrack(AyStar *aystar, OpenListNode *current)
|
|||
|
||||
trackdirbits = GetDriveableTrackdirBits(dst_tile, src_trackdir, type, subtype);
|
||||
|
||||
if (trackdirbits == 0) {
|
||||
if (trackdirbits == TRACKDIR_BIT_NONE) {
|
||||
/* We cannot enter the next tile. Road vehicles can reverse, others reach dead end */
|
||||
if (type != TRANSPORT_ROAD || HasBit(subtype, ROADTYPE_TRAM)) return;
|
||||
|
||||
|
@ -924,7 +924,7 @@ static void NPFFollowTrack(AyStar *aystar, OpenListNode *current)
|
|||
|
||||
/* Enumerate possible track */
|
||||
uint i = 0;
|
||||
while (trackdirbits != 0) {
|
||||
while (trackdirbits != TRACKDIR_BIT_NONE) {
|
||||
Trackdir dst_trackdir = RemoveFirstTrackdir(&trackdirbits);
|
||||
DEBUG(npf, 5, "Expanded into trackdir: %d, remaining trackdirs: 0x%X", dst_trackdir, trackdirbits);
|
||||
|
||||
|
|
|
@ -183,9 +183,14 @@ bad:;
|
|||
}
|
||||
|
||||
/**
|
||||
* returns the track to choose on the next tile, or -1 when it's better to
|
||||
* reverse. The tile given is the tile we are about to enter, enterdir is the
|
||||
* direction in which we are entering the tile
|
||||
* Finds the best track to choose on the next tile and
|
||||
* returns INVALID_TRACK when it is better to reverse.
|
||||
* @param v The ship.
|
||||
* @param tile The tile we are about to enter.
|
||||
* @param enterdir The direction entering the tile.
|
||||
* @param tracks The tracks available on new tile.
|
||||
* @param[out] path_found Whether a path has been found.
|
||||
* @return Best track on next tile or INVALID_TRACK when better to reverse.
|
||||
*/
|
||||
Track OPFShipChooseTrack(const Ship *v, TileIndex tile, DiagDirection enterdir, TrackBits tracks, bool &path_found)
|
||||
{
|
||||
|
@ -195,13 +200,15 @@ Track OPFShipChooseTrack(const Ship *v, TileIndex tile, DiagDirection enterdir,
|
|||
Track track;
|
||||
|
||||
/* Let's find out how far it would be if we would reverse first */
|
||||
Trackdir trackdir = v->GetVehicleTrackdir();
|
||||
TrackBits b = TrackStatusToTrackBits(GetTileTrackStatus(tile2, TRANSPORT_WATER, 0)) & DiagdirReachesTracks(ReverseDiagDir(enterdir)) & TrackdirBitsToTrackBits(TrackdirToTrackdirBits(trackdir));
|
||||
uint rev_dist = UINT_MAX; // distance if we reverse
|
||||
Track cur_track = TrackdirToTrack(v->GetVehicleTrackdir()); // track on the current tile
|
||||
DiagDirection rev_enterdir = ReverseDiagDir(enterdir);
|
||||
TrackBits rev_tracks = TrackStatusToTrackBits(GetTileTrackStatus(tile2, TRANSPORT_WATER, 0)) &
|
||||
DiagdirReachesTracks(rev_enterdir);
|
||||
|
||||
uint distr = UINT_MAX; // distance if we reversed
|
||||
if (b != 0) {
|
||||
distr = FindShipTrack(v, tile2, ReverseDiagDir(enterdir), b, tile, &track);
|
||||
if (distr != UINT_MAX) distr++; // penalty for reversing
|
||||
if ((rev_tracks & TrackToTrackBits(cur_track) != TRACK_BIT_NONE) {
|
||||
rev_dist = FindShipTrack(v, tile2, rev_enterdir, TrackToTrackBits(cur_track), tile, &track);
|
||||
if (rev_dist != UINT_MAX) rev_dist++; // penalty for reversing
|
||||
}
|
||||
|
||||
/* And if we would not reverse? */
|
||||
|
@ -209,6 +216,6 @@ Track OPFShipChooseTrack(const Ship *v, TileIndex tile, DiagDirection enterdir,
|
|||
|
||||
/* Due to the way this pathfinder works we cannot determine whether we're lost or not. */
|
||||
path_found = true;
|
||||
if (dist <= distr) return track;
|
||||
if (dist <= rev_dist) return track;
|
||||
return INVALID_TRACK; // We could better reverse
|
||||
}
|
||||
|
|
|
@ -142,8 +142,7 @@ public:
|
|||
/** Called by YAPF to detect if node ends in the desired destination */
|
||||
inline bool PfDetectDestination(Node &n)
|
||||
{
|
||||
bool bDest = (n.m_key.m_tile == m_destTile) && ((m_destTrackdirs & TrackdirToTrackdirBits(n.GetTrackdir())) != TRACKDIR_BIT_NONE);
|
||||
return bDest;
|
||||
return (n.m_key.m_tile == m_destTile) && ((m_destTrackdirs & TrackdirToTrackdirBits(n.GetTrackdir())) != TRACKDIR_BIT_NONE);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -104,7 +104,7 @@ public:
|
|||
assert(IsValidTrackdir(td2));
|
||||
int cost = 0;
|
||||
if (TrackFollower::Allow90degTurns()
|
||||
&& ((TrackdirToTrackdirBits(td2) & (TrackdirBits)TrackdirCrossesTrackdirs(td1)) != 0)) {
|
||||
&& ((TrackdirToTrackdirBits(td2) & TrackdirCrossesTrackdirs(td1)) != TRACKDIR_BIT_NONE)) {
|
||||
/* 90-deg curve penalty */
|
||||
cost += Yapf().PfGetSettings().rail_curve90_penalty;
|
||||
} else if (td2 != NextTrackdir(td1)) {
|
||||
|
|
|
@ -166,16 +166,13 @@ public:
|
|||
/** Called by YAPF to detect if node ends in the desired destination */
|
||||
inline bool PfDetectDestination(TileIndex tile, Trackdir td)
|
||||
{
|
||||
bool bDest;
|
||||
if (m_dest_station_id != INVALID_STATION) {
|
||||
bDest = HasStationTileRail(tile)
|
||||
return HasStationTileRail(tile)
|
||||
&& (GetStationIndex(tile) == m_dest_station_id)
|
||||
&& (GetRailStationTrack(tile) == TrackdirToTrack(td));
|
||||
} else {
|
||||
bDest = (tile == m_destTile)
|
||||
&& ((m_destTrackdirs & TrackdirToTrackdirBits(td)) != TRACKDIR_BIT_NONE);
|
||||
}
|
||||
return bDest;
|
||||
|
||||
return (tile == m_destTile) && ((m_destTrackdirs & TrackdirToTrackdirBits(td)) != TRACKDIR_BIT_NONE);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -185,8 +185,7 @@ public:
|
|||
/** Called by YAPF to detect if node ends in the desired destination */
|
||||
inline bool PfDetectDestination(Node &n)
|
||||
{
|
||||
bool bDest = IsRoadDepotTile(n.m_segment_last_tile);
|
||||
return bDest;
|
||||
return IsRoadDepotTile(n.m_segment_last_tile);
|
||||
}
|
||||
|
||||
inline bool PfDetectDestinationTile(TileIndex tile, Trackdir trackdir)
|
||||
|
|
|
@ -61,7 +61,7 @@ static inline bool IsValidTrackdirForRoadVehicle(Trackdir trackdir)
|
|||
*/
|
||||
static inline bool IsValidTrackdir(Trackdir trackdir)
|
||||
{
|
||||
return (1 << trackdir & TRACKDIR_BIT_MASK) != 0;
|
||||
return (1 << trackdir & TRACKDIR_BIT_MASK) != TRACKDIR_BIT_NONE;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue