diff --git a/src/aircraft.h b/src/aircraft.h --- a/src/aircraft.h +++ b/src/aircraft.h @@ -127,6 +127,7 @@ struct Aircraft : public Vehicle { void Tick(); void OnNewDay(); TileIndex GetOrderStationLocation(StationID station); + bool FindClosestDepot(TileIndex *location, DestinationID *destination, bool *reverse); }; #endif /* AIRCRAFT_H */ diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp --- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -546,6 +546,25 @@ CommandCost CmdStartStopAircraft(TileInd return CommandCost(); } +bool Aircraft::FindClosestDepot(TileIndex *location, DestinationID *destination, bool *reverse) +{ + const Station *st = GetStation(this->u.air.targetairport); + /* If the station is not a valid airport or if it has no hangars */ + if (!st->IsValid() || st->airport_tile == 0 || st->Airport()->nof_depots == 0) { + /* the aircraft has to search for a hangar on its own */ + StationID station = FindNearestHangar(this); + + if (station == INVALID_STATION) return false; + + st = GetStation(station); + } + + if (location != NULL) *location = st->xy; + if (destination != NULL) *destination = st->index; + + return true; +} + /** Send an aircraft to the hangar. * @param tile unused * @param flags for command type diff --git a/src/roadveh.h b/src/roadveh.h --- a/src/roadveh.h +++ b/src/roadveh.h @@ -47,6 +47,10 @@ static inline bool RoadVehHasArticPart(c void CcBuildRoadVeh(bool success, TileIndex tile, uint32 p1, uint32 p2); +byte GetRoadVehLength(const Vehicle *v); + +void RoadVehUpdateCache(Vehicle *v); + /** * This class 'wraps' Vehicle; you do not actually instantiate this class. @@ -77,10 +81,7 @@ struct RoadVehicle : public Vehicle { void Tick(); void OnNewDay(); TileIndex GetOrderStationLocation(StationID station); + bool FindClosestDepot(TileIndex *location, DestinationID *destination, bool *reverse); }; -byte GetRoadVehLength(const Vehicle *v); - -void RoadVehUpdateCache(Vehicle *v); - #endif /* ROADVEH_H */ diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp --- a/src/roadveh_cmd.cpp +++ b/src/roadveh_cmd.cpp @@ -446,6 +446,18 @@ static const Depot* FindClosestRoadDepot return NULL; /* Target not found */ } +bool RoadVehicle::FindClosestDepot(TileIndex *location, DestinationID *destination, bool *reverse) +{ + const Depot *depot = FindClosestRoadDepot(this); + + if (depot == NULL) return false; + + if (location != NULL) *location = depot->xy; + if (destination != NULL) *destination = depot->index; + + return true; +} + /** Send a road vehicle to the depot. * @param tile unused * @param flags operation to perform diff --git a/src/ship.h b/src/ship.h --- a/src/ship.h +++ b/src/ship.h @@ -43,6 +43,7 @@ struct Ship: public Vehicle { void Tick(); void OnNewDay(); TileIndex GetOrderStationLocation(StationID station); + bool FindClosestDepot(TileIndex *location, DestinationID *destination, bool *reverse); }; #endif /* SHIP_H */ diff --git a/src/ship_cmd.cpp b/src/ship_cmd.cpp --- a/src/ship_cmd.cpp +++ b/src/ship_cmd.cpp @@ -912,6 +912,18 @@ CommandCost CmdStartStopShip(TileIndex t return CommandCost(); } +bool Ship::FindClosestDepot(TileIndex *location, DestinationID *destination, bool *reverse) +{ + const Depot *depot = FindClosestShipDepot(this); + + 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 diff --git a/src/train.h b/src/train.h --- a/src/train.h +++ b/src/train.h @@ -305,6 +305,7 @@ struct Train : public Vehicle { void Tick(); void OnNewDay(); TileIndex GetOrderStationLocation(StationID station); + bool FindClosestDepot(TileIndex *location, DestinationID *destination, bool *reverse); }; #endif /* TRAIN_H */ diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -2084,6 +2084,18 @@ static TrainFindDepotData FindClosestTra return tfdd; } +bool Train::FindClosestDepot(TileIndex *location, DestinationID *destination, bool *reverse) +{ + TrainFindDepotData tfdd = FindClosestTrainDepot(this, 0); + if (tfdd.best_length == (uint)-1) return false; + + if (location != NULL) *location = tfdd.tile; + if (destination != NULL) *destination = GetDepotByTile(tfdd.tile)->index; + if (reverse != NULL) *reverse = tfdd.reverse; + + return true; +} + /** Send a train to a depot * @param tile unused * @param flags type of operation diff --git a/src/vehicle_base.h b/src/vehicle_base.h --- a/src/vehicle_base.h +++ b/src/vehicle_base.h @@ -512,6 +512,16 @@ public: * @return the location (tile) to aim for. */ virtual TileIndex GetOrderStationLocation(StationID station) { return INVALID_TILE; } + + /** + * Find the closest depot for this vehicle and tell us the location, + * DestinationID and whether we should reverse. + * @param location where do we go to? + * @param destination what hangar do we go to? + * @param reverse should the vehicle be reversed? + * @return true if a depot could be found. + */ + virtual bool FindClosestDepot(TileIndex *location, DestinationID *destination, bool *reverse) { return false; } }; /**