diff --git a/src/pathfinder/npf/npf.cpp b/src/pathfinder/npf/npf.cpp index 38c966cfd8..d444d779bf 100644 --- a/src/pathfinder/npf/npf.cpp +++ b/src/pathfinder/npf/npf.cpp @@ -105,7 +105,7 @@ static int32 NPFCalcStationOrTileHeuristic(AyStar *as, AyStarNode *current, Open /* for train-stations, we are going to aim for the closest station tile */ if (as->user_data[NPF_TYPE] == TRANSPORT_RAIL && fstd->station_index != INVALID_STATION) - to = CalcClosestStationTile(fstd->station_index, from); + to = CalcClosestStationTile(fstd->station_index, from, STATION_RAIL); if (as->user_data[NPF_TYPE] == TRANSPORT_ROAD) { /* Since roads only have diagonal pieces, we use manhattan distance here */ @@ -1089,7 +1089,7 @@ void NPFFillWithOrderData(NPFFindStationOrTileData *fstd, const Vehicle *v, bool if (v->type == VEH_TRAIN && (v->current_order.IsType(OT_GOTO_STATION) || v->current_order.IsType(OT_GOTO_WAYPOINT))) { fstd->station_index = v->current_order.GetDestination(); /* Let's take the closest tile of the station as our target for trains */ - fstd->dest_coords = CalcClosestStationTile(fstd->station_index, v->tile); + fstd->dest_coords = CalcClosestStationTile(fstd->station_index, v->tile, STATION_RAIL); } else { fstd->dest_coords = v->dest_tile; fstd->station_index = INVALID_STATION; diff --git a/src/pathfinder/pathfinder_func.h b/src/pathfinder/pathfinder_func.h index dc79c8024c..7f5226a524 100644 --- a/src/pathfinder/pathfinder_func.h +++ b/src/pathfinder/pathfinder_func.h @@ -21,19 +21,23 @@ * as defined by its tile are (st->train_station) * @param station The station to calculate the distance to * @param tile The tile from where to calculate the distance + * @param station_type the station type to get the closest tile of + * @note for simplification STATION_RAIL is also used for waypoints! * @return The closest station tile to the given tile. */ -static inline TileIndex CalcClosestStationTile(StationID station, TileIndex tile) +static inline TileIndex CalcClosestStationTile(StationID station, TileIndex tile, StationType station_type) { const BaseStation *st = BaseStation::Get(station); + TileArea ta; + st->GetTileArea(&ta, station_type); /* If the rail station is (temporarily) not present, use the station sign to drive near the station */ - if (st->train_station.tile == INVALID_TILE) return st->xy; + if (ta.tile == INVALID_TILE) return st->xy; - uint minx = TileX(st->train_station.tile); // topmost corner of station - uint miny = TileY(st->train_station.tile); - uint maxx = minx + st->train_station.w - 1; // lowermost corner of station - uint maxy = miny + st->train_station.h - 1; + uint minx = TileX(ta.tile); // topmost corner of station + uint miny = TileY(ta.tile); + uint maxx = minx + ta.w - 1; // lowermost corner of station + uint maxy = miny + ta.h - 1; /* we are going the aim for the x coordinate of the closest corner * but if we are between those coordinates, we will aim for our own x coordinate */ diff --git a/src/pathfinder/yapf/yapf_destrail.hpp b/src/pathfinder/yapf/yapf_destrail.hpp index 5a39b92b4e..7953baf257 100644 --- a/src/pathfinder/yapf/yapf_destrail.hpp +++ b/src/pathfinder/yapf/yapf_destrail.hpp @@ -137,7 +137,7 @@ public: switch (v->current_order.GetType()) { case OT_GOTO_STATION: case OT_GOTO_WAYPOINT: - m_destTile = CalcClosestStationTile(v->current_order.GetDestination(), v->tile); + m_destTile = CalcClosestStationTile(v->current_order.GetDestination(), v->tile, STATION_RAIL); m_dest_station_id = v->current_order.GetDestination(); m_destTrackdirs = INVALID_TRACKDIR_BIT; break;