diff --git a/src/aircraft.h b/src/aircraft.h index 8662f947bb..50611803c8 100644 --- 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 index 83d452b121..0fc9b3a3a6 100644 --- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -546,6 +546,25 @@ CommandCost CmdStartStopAircraft(TileIndex tile, uint32 flags, uint32 p1, uint32 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 index ac121d0426..9159a8784f 100644 --- a/src/roadveh.h +++ b/src/roadveh.h @@ -47,6 +47,10 @@ static inline bool RoadVehHasArticPart(const Vehicle *v) 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 index a261808375..3c90018be5 100644 --- a/src/roadveh_cmd.cpp +++ b/src/roadveh_cmd.cpp @@ -446,6 +446,18 @@ static const Depot* FindClosestRoadDepot(const Vehicle* v) 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 index 50f42611b5..b0a0400baf 100644 --- 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 index 4f5b956d97..bcd04025f7 100644 --- a/src/ship_cmd.cpp +++ b/src/ship_cmd.cpp @@ -912,6 +912,18 @@ CommandCost CmdStartStopShip(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) 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 index c6023ab37a..6aa2ad7637 100644 --- 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 index 72a0e17841..3813178d58 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -2084,6 +2084,18 @@ static TrainFindDepotData FindClosestTrainDepot(Vehicle *v, int max_distance) 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 index bd57e99c16..ac415fa649 100644 --- 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; } }; /**