Mercurial > hg > openttd
changeset 8890:b1d45af72e04 draft
(svn r12657) -Codechange: add 'FindClosestDepot' to the vehicle class.
author | rubidium <rubidium@openttd.org> |
---|---|
date | Fri, 11 Apr 2008 08:14:43 +0000 |
parents | dfdaa97931c6 |
children | 384f81a7ba31 |
files | src/aircraft.h src/aircraft_cmd.cpp src/roadveh.h src/roadveh_cmd.cpp src/ship.h src/ship_cmd.cpp src/train.h src/train_cmd.cpp src/vehicle_base.h |
diffstat | 9 files changed, 73 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/aircraft.h +++ b/src/aircraft.h @@ -127,6 +127,7 @@ void Tick(); void OnNewDay(); TileIndex GetOrderStationLocation(StationID station); + bool FindClosestDepot(TileIndex *location, DestinationID *destination, bool *reverse); }; #endif /* AIRCRAFT_H */
--- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -546,6 +546,25 @@ 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
--- a/src/roadveh.h +++ b/src/roadveh.h @@ -47,6 +47,10 @@ 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 @@ 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 */
--- a/src/roadveh_cmd.cpp +++ b/src/roadveh_cmd.cpp @@ -446,6 +446,18 @@ 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
--- a/src/ship.h +++ b/src/ship.h @@ -43,6 +43,7 @@ void Tick(); void OnNewDay(); TileIndex GetOrderStationLocation(StationID station); + bool FindClosestDepot(TileIndex *location, DestinationID *destination, bool *reverse); }; #endif /* SHIP_H */
--- a/src/ship_cmd.cpp +++ b/src/ship_cmd.cpp @@ -912,6 +912,18 @@ 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
--- a/src/train.h +++ b/src/train.h @@ -305,6 +305,7 @@ void Tick(); void OnNewDay(); TileIndex GetOrderStationLocation(StationID station); + bool FindClosestDepot(TileIndex *location, DestinationID *destination, bool *reverse); }; #endif /* TRAIN_H */
--- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -2084,6 +2084,18 @@ 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
--- a/src/vehicle_base.h +++ b/src/vehicle_base.h @@ -512,6 +512,16 @@ * @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; } }; /**