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; }
 };
 
 /**