Changeset - r8830:3bad3e96d573
[Not reviewed]
master
0 7 0
rubidium - 17 years ago 2008-04-05 12:01:34
rubidium@openttd.org
(svn r12578) -Codechange: merge the aircrafts ProcessOrder too into the 'unified' ProcessOrder.
7 files changed with 75 insertions and 88 deletions:
0 comments (0 inline, 0 general)
src/aircraft.h
Show inline comments
 
@@ -126,6 +126,7 @@ struct Aircraft : public Vehicle {
 
	bool IsInDepot() const { return (this->vehstatus & VS_HIDDEN) != 0 && IsHangarTile(this->tile); }
 
	void Tick();
 
	void OnNewDay();
 
	TileIndex GetOrderStationLocation(StationID station);
 
};
 

	
 
#endif /* AIRCRAFT_H */
src/aircraft_cmd.cpp
Show inline comments
 
@@ -1361,74 +1361,48 @@ static void HandleAircraftSmoke(Vehicle 
 
	}
 
}
 

	
 
static void ProcessAircraftOrder(Vehicle *v)
 
void HandleMissingAircraftOrders(Vehicle *v)
 
{
 
	switch (v->current_order.type) {
 
		case OT_GOTO_DEPOT:
 
			if (!(v->current_order.flags & OFB_PART_OF_ORDERS)) return;
 
			if (v->current_order.flags & OFB_SERVICE_IF_NEEDED &&
 
					!VehicleNeedsService(v)) {
 
				UpdateVehicleTimetable(v, true);
 
				v->cur_order_index++;
 
			}
 
			break;
 
	/*
 
	 * We do not have an order. This can be divided into two cases:
 
	 * 1) we are heading to an invalid station. In this case we must
 
	 *    find another airport to go to. If there is nowhere to go,
 
	 *    we will destroy the aircraft as it otherwise will enter
 
	 *    the holding pattern for the first airport, which can cause
 
	 *    the plane to go into an undefined state when building an
 
	 *    airport with the same StationID.
 
	 * 2) we are (still) heading to a (still) valid airport, then we
 
	 *    can continue going there. This can happen when you are
 
	 *    changing the aircraft's orders while in-flight or in for
 
	 *    example a depot. However, when we have a current order to
 
	 *    go to a depot, we have to keep that order so the aircraft
 
	 *    actually stops.
 
	 */
 
	const Station *st = GetStation(v->u.air.targetairport);
 
	if (!st->IsValid() || st->airport_tile == 0) {
 
		CommandCost ret;
 
		PlayerID old_player = _current_player;
 

	
 
		case OT_LOADING: return;
 
		_current_player = v->owner;
 
		ret = DoCommand(v->tile, v->index, 0, DC_EXEC, CMD_SEND_AIRCRAFT_TO_HANGAR);
 
		_current_player = old_player;
 

	
 
		default: break;
 
		if (CmdFailed(ret)) CrashAirplane(v);
 
	} else if (v->current_order.type != OT_GOTO_DEPOT) {
 
		v->current_order.Free();
 
	}
 
}
 

	
 

	
 
TileIndex Aircraft::GetOrderStationLocation(StationID station)
 
{
 
	/* Orders are changed in flight, ensure going to the right station. */
 
	if (this->u.air.state == FLYING) {
 
		AircraftNextAirportPos_and_Order(this);
 
	}
 

	
 
	if (v->cur_order_index >= v->num_orders) v->cur_order_index = 0;
 

	
 
	const Order *order = GetVehicleOrder(v, v->cur_order_index);
 

	
 
	if (order == NULL|| (order->type == OT_DUMMY && !CheckForValidOrders(v))) {
 
		/*
 
		 * We do not have an order. This can be divided into two cases:
 
		 * 1) we are heading to an invalid station. In this case we must
 
		 *    find another airport to go to. If there is nowhere to go,
 
		 *    we will destroy the aircraft as it otherwise will enter
 
		 *    the holding pattern for the first airport, which can cause
 
		 *    the plane to go into an undefined state when building an
 
		 *    airport with the same StationID.
 
		 * 2) we are (still) heading to a (still) valid airport, then we
 
		 *    can continue going there. This can happen when you are
 
		 *    changing the aircraft's orders while in-flight or in for
 
		 *    example a depot. However, when we have a current order to
 
		 *    go to a depot, we have to keep that order so the aircraft
 
		 *    actually stops.
 
		 */
 
		const Station *st = GetStation(v->u.air.targetairport);
 
		if (!st->IsValid() || st->airport_tile == 0) {
 
			CommandCost ret;
 
			PlayerID old_player = _current_player;
 

	
 
			_current_player = v->owner;
 
			ret = DoCommand(v->tile, v->index, 0, DC_EXEC, CMD_SEND_AIRCRAFT_TO_HANGAR);
 
			_current_player = old_player;
 

	
 
			if (CmdFailed(ret)) CrashAirplane(v);
 
		} else if (v->current_order.type != OT_GOTO_DEPOT) {
 
			v->current_order.Free();
 
		}
 
		return;
 
	}
 

	
 
	if (order->type  == v->current_order.type  &&
 
			order->flags == v->current_order.flags &&
 
			order->dest  == v->current_order.dest)
 
		return;
 

	
 
	v->current_order = *order;
 

	
 
	/* orders are changed in flight, ensure going to the right station */
 
	if (order->type == OT_GOTO_STATION && v->u.air.state == FLYING) {
 
		AircraftNextAirportPos_and_Order(v);
 
	}
 

	
 
	InvalidateVehicleOrder(v);
 

	
 
	InvalidateWindowClasses(WC_AIRCRAFT_LIST);
 
	/* Aircraft do not use dest-tile */
 
	return 0;
 
}
 

	
 
void Aircraft::MarkDirty()
 
@@ -2149,7 +2123,7 @@ static void AircraftEventHandler(Vehicle
 
	}
 

	
 
	HandleAircraftSmoke(v);
 
	ProcessAircraftOrder(v);
 
	ProcessOrders(v);
 
	v->HandleLoading(loop != 0);
 

	
 
	if (v->current_order.type >= OT_LOADING) return;
src/order_cmd.cpp
Show inline comments
 
@@ -1278,6 +1278,22 @@ Date GetServiceIntervalClamped(uint inde
 
}
 

	
 
/**
 
 *
 
 * Check if a vehicle has any valid orders
 
 *
 
 * @return false if there are no valid orders
 
 *
 
 */
 
static bool CheckForValidOrders(const Vehicle *v)
 
{
 
	const Order *order;
 

	
 
	FOR_VEHICLE_ORDERS(v, order) if (order->type != OT_DUMMY) return true;
 

	
 
	return false;
 
}
 

	
 
/**
 
 * Handle the orders of a vehicle and determine the next place
 
 * to go to if needed.
 
 * @param v the vehicle to do this for.
 
@@ -1298,8 +1314,11 @@ bool ProcessOrders(Vehicle *v)
 
			break;
 

	
 
		case OT_LOADING:
 
			return false;
 

	
 
		case OT_LEAVESTATION:
 
			return false;
 
			if (v->type != VEH_AIRCRAFT) return false;
 
			break;
 

	
 
		default: break;
 
	}
 
@@ -1334,7 +1353,14 @@ bool ProcessOrders(Vehicle *v)
 
	const Order *order = GetVehicleOrder(v, v->cur_order_index);
 

	
 
	/* If no order, do nothing. */
 
	if (order == NULL) {
 
	if (order == NULL || (v->type == VEH_AIRCRAFT && order->type == OT_DUMMY && !CheckForValidOrders(v))) {
 
		if (v->type == VEH_AIRCRAFT) {
 
			/* Aircraft do something vastly different here, so handle separately */
 
			extern void HandleMissingAircraftOrders(Vehicle *v);
 
			HandleMissingAircraftOrders(v);
 
			return false;
 
		}
 

	
 
		v->current_order.Free();
 
		v->dest_tile = 0;
 
		if (v->type == VEH_ROAD) ClearSlot(v);
 
@@ -1361,6 +1387,7 @@ bool ProcessOrders(Vehicle *v)
 
		case VEH_TRAIN:
 
			break;
 

	
 
		case VEH_AIRCRAFT:
 
		case VEH_SHIP:
 
			InvalidateWindowClasses(v->GetVehicleListWindowClass());
 
			break;
 
@@ -1368,14 +1395,11 @@ bool ProcessOrders(Vehicle *v)
 

	
 
	switch (order->type) {
 
		case OT_GOTO_STATION:
 
			if (order->dest == v->last_station_visited) {
 
				v->last_station_visited = INVALID_STATION;
 
			}
 
			v->dest_tile = v->GetOrderStationLocation(order->dest);
 
			break;
 

	
 
		case OT_GOTO_DEPOT:
 
			v->dest_tile = GetDepot(order->dest)->xy;
 
			if (v->type != VEH_AIRCRAFT) v->dest_tile = GetDepot(order->dest)->xy;
 
			break;
 

	
 
		case OT_GOTO_WAYPOINT:
 
@@ -1390,22 +1414,6 @@ bool ProcessOrders(Vehicle *v)
 
	return may_reverse;
 
}
 

	
 
/**
 
 *
 
 * Check if a vehicle has any valid orders
 
 *
 
 * @return false if there are no valid orders
 
 *
 
 */
 
bool CheckForValidOrders(const Vehicle* v)
 
{
 
	const Order *order;
 

	
 
	FOR_VEHICLE_ORDERS(v, order) if (order->type != OT_DUMMY) return true;
 

	
 
	return false;
 
}
 

	
 
void InitializeOrders()
 
{
 
	_Order_pool.CleanPool();
src/order_func.h
Show inline comments
 
@@ -35,7 +35,6 @@ void InvalidateVehicleOrder(const Vehicl
 
bool VehicleHasDepotOrders(const Vehicle *v);
 
void CheckOrders(const Vehicle*);
 
void DeleteVehicleOrders(Vehicle *v);
 
bool CheckForValidOrders(const Vehicle* v);
 
bool ProcessOrders(Vehicle *v);
 

	
 
#define MIN_SERVINT_PERCENT  5
src/roadveh_cmd.cpp
Show inline comments
 
@@ -756,8 +756,9 @@ static void HandleBrokenRoadVeh(Vehicle 
 

	
 
TileIndex RoadVehicle::GetOrderStationLocation(StationID station)
 
{
 
	if (station == this->last_station_visited) this->last_station_visited = INVALID_STATION;
 

	
 
	TileIndex dest = INVALID_TILE;
 

	
 
	const RoadStop *rs = GetStation(station)->GetPrimaryRoadStop(this);
 
	if (rs != NULL) {
 
		uint mindist = MAX_UVALUE(uint);
src/ship_cmd.cpp
Show inline comments
 
@@ -244,6 +244,8 @@ void Ship::PlayLeaveStationSound() const
 

	
 
TileIndex Ship::GetOrderStationLocation(StationID station)
 
{
 
	if (station == this->last_station_visited) this->last_station_visited = INVALID_STATION;
 

	
 
	Station *st = GetStation(station);
 
	if (st->dock_tile != 0) {
 
		return TILE_ADD(st->dock_tile, ToTileIndexDiff(GetDockOffset(st->dock_tile)));
src/train_cmd.cpp
Show inline comments
 
@@ -2617,6 +2617,8 @@ bad:;
 

	
 
TileIndex Train::GetOrderStationLocation(StationID station)
 
{
 
	if (station == this->last_station_visited) this->last_station_visited = INVALID_STATION;
 

	
 
	return GetStation(station)->xy;
 
}
 

	
0 comments (0 inline, 0 general)