1
0
Fork 0

Change: Adapt pathfinders for extended road depots.

pull/8480/head
J0anJosep 2021-10-02 17:41:10 +02:00
parent 718b92539a
commit c270cebb59
2 changed files with 31 additions and 13 deletions

View File

@ -101,7 +101,7 @@ struct CFollowTrackT
{
assert(IsTram()); // this function shouldn't be called in other cases
if (IsNormalRoadTile(tile)) {
if (IsNormalRoadTile(tile) || IsExtendedRoadDepotTile(tile)) {
RoadBits rb = GetRoadBits(tile, RTT_TRAM);
switch (rb) {
case ROAD_NW: return DIAGDIR_NW;
@ -272,14 +272,16 @@ protected:
}
}
/* road depots can be also left in one direction only */
/* road depots can be also left in one direction sometimes */
if (IsRoadTT() && IsDepotTypeTile(m_old_tile, TT())) {
DiagDirection exitdir = GetRoadDepotDirection(m_old_tile);
if (exitdir != m_exitdir) {
RoadTramType rtt = IsTram() ? RTT_TRAM : RTT_ROAD;
RoadBits rb = GetRoadBits(m_old_tile, rtt);
if ((rb & DiagDirToRoadBits(m_exitdir)) == ROAD_NONE) {
m_err = EC_NO_WAY;
return false;
}
}
return true;
}
@ -306,16 +308,17 @@ protected:
/* road and rail depots can also be entered from one direction only */
if (IsRoadTT() && IsDepotTypeTile(m_new_tile, TT())) {
DiagDirection exitdir = GetRoadDepotDirection(m_new_tile);
if (ReverseDiagDir(exitdir) != m_exitdir) {
m_err = EC_NO_WAY;
return false;
}
/* don't try to enter other company's depots */
if (GetTileOwner(m_new_tile) != m_veh_owner) {
m_err = EC_OWNER;
return false;
}
RoadTramType rtt = IsTram() ? RTT_TRAM : RTT_ROAD;
RoadBits rb = GetRoadBits(m_new_tile, rtt);
if ((rb & DiagDirToRoadBits(ReverseDiagDir(m_exitdir))) == ROAD_NONE) {
m_err = EC_NO_WAY;
return false;
}
}
if (IsRailTT() && IsStandardRailDepotTile(m_new_tile)) {
DiagDirection exitdir = GetRailDepotDirection(m_new_tile);
@ -404,9 +407,11 @@ protected:
if (IsExtendedRailDepot(m_old_tile)) return false;
exitdir = GetRailDepotDirection(m_old_tile);
break;
case TRANSPORT_ROAD:
exitdir = GetRoadDepotDirection(m_old_tile);
case TRANSPORT_ROAD: {
if (GetRoadBits(m_old_tile, IsTram() ? RTT_TRAM : RTT_ROAD) != DiagDirToRoadBits(m_exitdir)) return false;
exitdir = ReverseDiagDir(m_exitdir);
break;
}
default: NOT_REACHED();
}

View File

@ -66,6 +66,19 @@ protected:
/* Increase the cost for level crossings */
if (IsLevelCrossing(tile)) {
cost += Yapf().PfGetSettings().road_crossing_penalty;
} else if (IsRoadDepot(tile) && IsExtendedRoadDepot(tile)) {
switch (GetDepotReservation(tile, IsDiagDirFacingSouth(TrackdirToExitdir(trackdir)))) {
case DEPOT_RESERVATION_FULL_STOPPED_VEH:
cost += 16 * YAPF_TILE_LENGTH;
break;
case DEPOT_RESERVATION_IN_USE:
cost += 8 * YAPF_TILE_LENGTH;
break;
case DEPOT_RESERVATION_EMPTY:
cost += YAPF_TILE_LENGTH;
break;
default: NOT_REACHED();
}
}
break;
@ -135,7 +148,7 @@ public:
}
/* stop if we have just entered the depot */
if (IsRoadDepotTile(tile) && trackdir == DiagDirToDiagTrackdir(ReverseDiagDir(GetRoadDepotDirection(tile)))) {
if (IsRoadDepotTile(tile) && !IsExtendedRoadDepotTile(tile) && trackdir == DiagDirToDiagTrackdir(ReverseDiagDir(GetRoadDepotDirection(tile)))) {
/* next time we will reverse and leave the depot */
break;
}
@ -201,7 +214,7 @@ public:
/** Called by YAPF to detect if node ends in the desired destination */
inline bool PfDetectDestination(Node &n)
{
return IsRoadDepotTile(n.m_segment_last_tile);
return PfDetectDestinationTile(n.m_segment_last_tile, n.m_segment_last_td);
}
inline bool PfDetectDestinationTile(TileIndex tile, Trackdir)