@@ -352,26 +352,26 @@ CommandCost CmdSellRoadVeh(TileIndex til
if (flags & DC_EXEC) {
delete v;
}
return ret;
static FindDepotData FindClosestRoadDepot(const RoadVehicle *v, int max_distance)
{
if (IsRoadDepotTile(v->tile)) return FindDepotData(v->tile, 0);
switch (_settings_game.pf.pathfinder_for_roadvehs) {
case VPF_NPF: return NPFRoadVehicleFindNearestDepot(v, _settings_game.pf.npf.maximum_go_to_depot_penalty);
case VPF_YAPF: return YapfRoadVehicleFindNearestDepot(v, _settings_game.pf.yapf.maximum_go_to_depot_penalty);
case VPF_NPF: return NPFRoadVehicleFindNearestDepot(v, max_distance);
case VPF_YAPF: return YapfRoadVehicleFindNearestDepot(v, max_distance);
default: NOT_REACHED();
bool RoadVehicle::FindClosestDepot(TileIndex *location, DestinationID *destination, bool *reverse)
FindDepotData rfdd = FindClosestRoadDepot(this, 0);
if (rfdd.best_length == UINT_MAX) return false;
if (location != NULL) *location = rfdd.tile;
if (destination != NULL) *destination = GetDepotIndex(rfdd.tile);
@@ -88,30 +88,35 @@ SpriteID Ship::GetImage(Direction direct
uint8 spritenum = this->spritenum;
if (is_custom_sprite(spritenum)) {
SpriteID sprite = GetCustomVehicleSprite(this, direction);
if (sprite != 0) return sprite;
spritenum = Engine::Get(this->engine_type)->original_image_index;
return _ship_sprites[spritenum] + direction;
static const Depot *FindClosestShipDepot(const Vehicle *v)
static const Depot *FindClosestShipDepot(const Vehicle *v, uint max_distance)
/* Find the closest depot */
const Depot *depot;
const Depot *best_depot = NULL;
uint best_dist = UINT_MAX;
/* If we don't have a maximum distance, i.e. distance = 0,
* we want to find any depot so the best distance of no
* depot must be more than any correct distance. On the
* other hand if we have set a maximum distance, any depot
* further away than max_distance can safely be ignored. */
uint best_dist = max_distance == 0 ? UINT_MAX : max_distance + 1;
FOR_ALL_DEPOTS(depot) {
TileIndex tile = depot->xy;
if (IsShipDepotTile(tile) && IsTileOwner(tile, v->owner)) {
uint dist = DistanceManhattan(tile, v->tile);
if (dist < best_dist) {
best_dist = dist;
best_depot = depot;
@@ -125,27 +130,27 @@ static void CheckIfShipNeedsService(Vehi
VehicleServiceInDepot(v);
return;
uint max_distance;
switch (_settings_game.pf.pathfinder_for_ships) {
case VPF_OPF: max_distance = 12; break;
case VPF_NPF: max_distance = _settings_game.pf.npf.maximum_go_to_depot_penalty / NPF_TILE_LENGTH; break;
case VPF_YAPF: max_distance = _settings_game.pf.yapf.maximum_go_to_depot_penalty / YAPF_TILE_LENGTH; break;
const Depot *depot = FindClosestShipDepot(v);
const Depot *depot = FindClosestShipDepot(v, max_distance);
if (depot == NULL || DistanceManhattan(v->tile, depot->xy) > max_distance) {
if (depot == NULL) {
if (v->current_order.IsType(OT_GOTO_DEPOT)) {
v->current_order.MakeDummy();
SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
v->current_order.MakeGoToDepot(depot->index, ODTFB_SERVICE);
v->dest_tile = depot->xy;
@@ -715,25 +720,25 @@ CommandCost CmdSellShip(TileIndex tile,
CommandCost ret(EXPENSES_NEW_VEHICLES, -v->value);
bool Ship::FindClosestDepot(TileIndex *location, DestinationID *destination, bool *reverse)
const Depot *depot = FindClosestShipDepot(this);
const Depot *depot = FindClosestShipDepot(this, 0);
if (depot == NULL) return false;
if (location != NULL) *location = depot->xy;
if (destination != NULL) *destination = depot->index;
return true;
/** Send a ship to the depot.
* @param tile unused
* @param flags type of operation
@@ -2098,26 +2098,26 @@ CommandCost CmdRefitRailVehicle(TileInde
/** returns the tile of a depot to goto to. The given vehicle must not be
* crashed! */
static FindDepotData FindClosestTrainDepot(Train *v, int max_distance)
assert(!(v->vehstatus & VS_CRASHED));
if (IsRailDepotTile(v->tile)) return FindDepotData(v->tile, 0);
PBSTileInfo origin = FollowTrainReservation(v);
if (IsRailDepotTile(origin.tile)) return FindDepotData(origin.tile, 0);
switch (_settings_game.pf.pathfinder_for_trains) {
case VPF_NPF: return NPFTrainFindNearestDepot(v, _settings_game.pf.npf.maximum_go_to_depot_penalty);
case VPF_YAPF: return YapfTrainFindNearestDepot(v, _settings_game.pf.yapf.maximum_go_to_depot_penalty);
case VPF_NPF: return NPFTrainFindNearestDepot(v, max_distance);
case VPF_YAPF: return YapfTrainFindNearestDepot(v, max_distance);
bool Train::FindClosestDepot(TileIndex *location, DestinationID *destination, bool *reverse)
FindDepotData tfdd = FindClosestTrainDepot(this, 0);
if (tfdd.best_length == UINT_MAX) return false;
if (location != NULL) *location = tfdd.tile;
if (destination != NULL) *destination = GetDepotIndex(tfdd.tile);
Status change: