Changeset - r15849:33fd4f65439e
[Not reviewed]
master
0 3 0
rubidium - 14 years ago 2010-08-18 15:58:30
rubidium@openttd.org
(svn r20541) -Fix: when removing a vehicle update the "clone orders of"-vehicle of a backed up order, or remove it if there is no vehicle sharing orders with that vehicle.
3 files changed with 31 insertions and 11 deletions:
0 comments (0 inline, 0 general)
src/order_backup.cpp
Show inline comments
 
@@ -37,15 +37,10 @@ OrderBackup::OrderBackup(const Vehicle *
 

	
 
	/* If we have shared orders, store the vehicle we share the order with. */
 
	if (v->IsOrderListShared()) {
 
		const Vehicle *u = (v->FirstShared() == v) ? v->NextShared() : v->FirstShared();
 

	
 
		this->clone = u->index;
 
		this->clone = (v->FirstShared() == v) ? v->NextShared() : v->FirstShared();
 
	} else {
 
		/* Else copy the orders */
 

	
 
		/* We do not have shared orders */
 
		this->clone = INVALID_VEHICLE;
 

	
 
		/* Count the number of orders */
 
		uint cnt = 0;
 
		const Order *order;
 
@@ -72,9 +67,9 @@ void OrderBackup::RestoreTo(const Vehicl
 
	if (this->name != NULL) DoCommandP(0, v->index, 0, CMD_RENAME_VEHICLE, NULL, this->name);
 

	
 
	/* If we had shared orders, recover that */
 
	if (this->clone != INVALID_VEHICLE) {
 
		DoCommandP(0, v->index | (this->clone << 16), CO_SHARE, CMD_CLONE_ORDER);
 
	} else {
 
	if (this->clone != NULL) {
 
		DoCommandP(0, v->index | (this->clone->index << 16), CO_SHARE, CMD_CLONE_ORDER);
 
	} else if (this->orders != NULL) {
 

	
 
		/* CMD_NO_TEST_IF_IN_NETWORK is used here, because CMD_INSERT_ORDER checks if the
 
		 *  order number is one more than the current amount of orders, and because
 
@@ -140,6 +135,20 @@ void OrderBackup::RestoreTo(const Vehicl
 
	}
 
}
 

	
 
/* static */ void OrderBackup::ClearVehicle(const Vehicle *v)
 
{
 
	assert(v != NULL);
 
	OrderBackup *ob;
 
	FOR_ALL_ORDER_BACKUPS(ob) {
 
		if (ob->clone == v) {
 
			/* Get another item in the shared list. */
 
			ob->clone = (v->FirstShared() == v) ? v->NextShared() : v->FirstShared();
 
			/* But if that isn't there, remove it. */
 
			if (ob->clone == NULL) delete ob;
 
		}
 
	}
 
}
 

	
 
void InitializeOrderBackups()
 
{
 
	_order_backup_pool.CleanPool();
src/order_backup.h
Show inline comments
 
@@ -39,7 +39,7 @@ private:
 
	uint16 service_interval;   ///< The service interval of the vehicle.
 
	char *name;                ///< The custom name of the vehicle.
 

	
 
	VehicleID clone;           ///< VehicleID this vehicle was a clone of, or INVALID_VEHICLE.
 
	const Vehicle *clone;      ///< Vehicle this vehicle was a clone of.
 
	VehicleOrderID orderindex; ///< The order-index the vehicle had.
 
	Order *orders;             ///< The actual orders if the vehicle was not a clone.
 

	
 
@@ -74,9 +74,18 @@ public:
 

	
 
	/**
 
	 * Clear the group of all backups having this group ID.
 
	 * @param group The group to clear
 
	 * @param group The group to clear.
 
	 */
 
	static void ClearGroup(GroupID group);
 

	
 
	/**
 
	 * Clear/update the (clone) vehicle from an order backup.
 
	 * @param v The vehicle to clear.
 
	 * @pre v != NULL
 
	 * @note If it is not possible to set another vehicle as clone
 
	 *       "example", then this backed up order will be removed.
 
	 */
 
	static void ClearVehicle(const Vehicle *v);
 
};
 

	
 
#define FOR_ALL_ORDER_BACKUPS_FROM(var, start) FOR_ALL_ITEMS_FROM(OrderBackup, order_backup_index, var, start)
src/vehicle.cpp
Show inline comments
 
@@ -51,6 +51,7 @@
 
#include "engine_base.h"
 
#include "newgrf.h"
 
#include "core/backup_type.hpp"
 
#include "order_backup.h"
 

	
 
#include "table/sprites.h"
 
#include "table/strings.h"
 
@@ -674,6 +675,7 @@ void Vehicle::PreDestructor()
 
		DeleteWindowById(WC_VEHICLE_DETAILS, this->index);
 
		DeleteWindowById(WC_VEHICLE_TIMETABLE, this->index);
 
		SetWindowDirty(WC_COMPANY, this->owner);
 
		OrderBackup::ClearVehicle(this);
 
	}
 
	InvalidateWindowClassesData(GetWindowClassForVehicleType(this->type), 0);
 

	
0 comments (0 inline, 0 general)