(svn r20545) -Codechange: make sure an OrderBackup gets cleared when the depot it belongs to gets removed, the depot window gets closed or when another vehicle gets sold in a depot

This commit is contained in:
rubidium 2010-08-18 18:52:16 +00:00
parent e242294530
commit 019878118d
6 changed files with 42 additions and 25 deletions

View File

@ -11,6 +11,7 @@
#include "stdafx.h" #include "stdafx.h"
#include "depot_base.h" #include "depot_base.h"
#include "order_backup.h"
#include "order_func.h" #include "order_func.h"
#include "window_func.h" #include "window_func.h"
#include "core/pool_func.hpp" #include "core/pool_func.hpp"
@ -31,6 +32,7 @@ Depot::~Depot()
/* Delete the depot-window */ /* Delete the depot-window */
DeleteWindowById(WC_VEHICLE_DEPOT, this->xy); DeleteWindowById(WC_VEHICLE_DEPOT, this->xy);
OrderBackup::Reset(this->xy);
/* Delete the depot list */ /* Delete the depot list */
WindowNumber wno = (this->index << 16) | VLW_DEPOT_LIST | GetTileOwner(this->xy); WindowNumber wno = (this->index << 16) | VLW_DEPOT_LIST | GetTileOwner(this->xy);

View File

@ -261,6 +261,7 @@ struct DepotWindow : Window {
~DepotWindow() ~DepotWindow()
{ {
DeleteWindowById(WC_BUILD_VEHICLE, this->window_number); DeleteWindowById(WC_BUILD_VEHICLE, this->window_number);
OrderBackup::Reset(this->window_number);
} }
/** /**
@ -978,12 +979,9 @@ struct DepotWindow : Window {
bool is_engine = (v->type != VEH_TRAIN || Train::From(v)->IsFrontEngine()); bool is_engine = (v->type != VEH_TRAIN || Train::From(v)->IsFrontEngine());
if (is_engine) { if (is_engine) OrderBackup::Backup(v);
OrderBackup::Reset();
new OrderBackup(v);
}
if (!DoCommandP(v->tile, v->index | sell_cmd << 16, 0, GetCmdSellVeh(v->type)) && is_engine) OrderBackup::Reset(); if (!DoCommandP(v->tile, v->index | sell_cmd << 16, 0, GetCmdSellVeh(v->type)) && is_engine) OrderBackup::Reset(this->window_number);
break; break;
} }

View File

@ -61,7 +61,7 @@ OrderBackup::OrderBackup(const Vehicle *v)
} }
} }
void OrderBackup::RestoreTo(const Vehicle *v) void OrderBackup::DoRestore(const Vehicle *v)
{ {
/* If we have a custom name, process that */ /* If we have a custom name, process that */
if (this->name != NULL) DoCommandP(0, v->index, 0, CMD_RENAME_VEHICLE, NULL, this->name); if (this->name != NULL) DoCommandP(0, v->index, 0, CMD_RENAME_VEHICLE, NULL, this->name);
@ -109,22 +109,31 @@ void OrderBackup::RestoreTo(const Vehicle *v)
/* Restore vehicle group */ /* Restore vehicle group */
DoCommandP(0, this->group, v->index, CMD_ADD_VEHICLE_GROUP); DoCommandP(0, this->group, v->index, CMD_ADD_VEHICLE_GROUP);
delete this;
} }
/* static */ OrderBackup *OrderBackup::GetByTile(TileIndex t) /* static */ void OrderBackup::Backup(const Vehicle *v)
{
OrderBackup::Reset();
new OrderBackup(v);
}
/* static */ void OrderBackup::Restore(const Vehicle *v)
{ {
OrderBackup *ob; OrderBackup *ob;
FOR_ALL_ORDER_BACKUPS(ob) { FOR_ALL_ORDER_BACKUPS(ob) {
if (ob->tile == t) return ob; if (v->tile != ob->tile) continue;
ob->DoRestore(v);
delete ob;
} }
return NULL;
} }
/* static */ void OrderBackup::Reset() /* static */ void OrderBackup::Reset(TileIndex t)
{ {
_order_backup_pool.CleanPool(); OrderBackup *ob;
FOR_ALL_ORDER_BACKUPS(ob) {
if (t == INVALID_TILE || t == ob->tile) delete ob;
}
} }
/* static */ void OrderBackup::ClearGroup(GroupID group) /* static */ void OrderBackup::ClearGroup(GroupID group)

View File

@ -43,34 +43,41 @@ private:
VehicleOrderID orderindex; ///< The order-index the vehicle had. VehicleOrderID orderindex; ///< The order-index the vehicle had.
Order *orders; ///< The actual orders if the vehicle was not a clone. Order *orders; ///< The actual orders if the vehicle was not a clone.
public:
/** /**
* Create an order backup for the given vehicle. * Create an order backup for the given vehicle.
* @param v The vehicle to make a backup of. * @param v The vehicle to make a backup of.
*/ */
OrderBackup(const Vehicle *v); OrderBackup(const Vehicle *v);
/**
* Restore the data of this order to the given vehicle.
* @param v The vehicle to restore to.
*/
void DoRestore(const Vehicle *v);
public:
/** Free everything that is allocated. */ /** Free everything that is allocated. */
~OrderBackup(); ~OrderBackup();
/**
* Create an order backup for the given vehicle.
* @param v The vehicle to make a backup of.
* @note Will automatically remove any previous backups of this user.
*/
static void Backup(const Vehicle *v);
/** /**
* Restore the data of this order to the given vehicle. * Restore the data of this order to the given vehicle.
* @param v The vehicle to restore to. * @param v The vehicle to restore to.
* @note After restoration the backup will automatically be removed. * @note After restoration the backup will automatically be removed.
*/ */
void RestoreTo(const Vehicle *v); static void Restore(const Vehicle *v);
/**
* Get the order backup associated with a given tile.
* @param t The tile to get the order backup for.
* @return The order backup, or NULL if it doesn't exist.
*/
static OrderBackup *GetByTile(TileIndex t);
/** /**
* Reset the OrderBackups. * Reset the OrderBackups.
* @param tile The tile of the order backup.
*/ */
static void Reset(); static void Reset(TileIndex tile = INVALID_TILE);
/** /**
* Clear the group of all backups having this group ID. * Clear the group of all backups having this group ID.

View File

@ -49,6 +49,7 @@
#include "newgrf.h" #include "newgrf.h"
#include "table/airporttile_ids.h" #include "table/airporttile_ids.h"
#include "newgrf_airporttiles.h" #include "newgrf_airporttiles.h"
#include "order_backup.h"
#include "table/strings.h" #include "table/strings.h"
@ -2287,6 +2288,7 @@ static CommandCost RemoveAirport(TileIndex tile, DoCommandFlag flags)
cost.AddCost(_price[PR_CLEAR_STATION_AIRPORT]); cost.AddCost(_price[PR_CLEAR_STATION_AIRPORT]);
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
if (IsHangarTile(tile_cur)) OrderBackup::Reset(tile_cur);
DeleteAnimatedTile(tile_cur); DeleteAnimatedTile(tile_cur);
DoClearSquare(tile_cur); DoClearSquare(tile_cur);
DeleteNewGRFInspectWindow(GSF_AIRPORTTILES, tile_cur); DeleteNewGRFInspectWindow(GSF_AIRPORTTILES, tile_cur);

View File

@ -2373,7 +2373,6 @@ void CcBuildPrimaryVehicle(const CommandCost &result, TileIndex tile, uint32 p1,
if (result.Failed()) return; if (result.Failed()) return;
const Vehicle *v = Vehicle::Get(_new_vehicle_id); const Vehicle *v = Vehicle::Get(_new_vehicle_id);
OrderBackup *ob = OrderBackup::GetByTile(v->tile); OrderBackup::Restore(v);
if (ob != NULL) ob->RestoreTo(v);
ShowVehicleViewWindow(v); ShowVehicleViewWindow(v);
} }