1
0
mirror of https://github.com/OpenTTD/OpenTTD.git synced 2025-08-12 17:19:09 +00:00

(svn r12913) -Add: ability to backup and restore a player's economic data and data for a vehicle (or chain of vehicles)

Autoreplace uses this with the following benefits:
  -Mass autoreplace (the button in the depot window) will now estimate costs correctly
  -Autoreplace now either replaces correctly or manages to keep the original vehicle (no more broken trains)
  Thanks to Ammler for testing this
This commit is contained in:
bjarni
2008-04-27 20:09:29 +00:00
parent 9f5f4e59cd
commit 757de2bdf5
8 changed files with 208 additions and 30 deletions

View File

@@ -1233,7 +1233,7 @@ void BackupVehicleOrders(const Vehicle *v, BackuppedOrders *bak)
/* Copy the orders */
FOR_VEHICLE_ORDERS(v, order) {
*dest = *order;
memcpy(dest, order, sizeof(Order));
dest++;
}
/* End the list with an empty order */
@@ -1285,6 +1285,42 @@ void RestoreVehicleOrders(const Vehicle *v, const BackuppedOrders *bak)
DoCommandP(0, bak->group, v->index, NULL, CMD_ADD_VEHICLE_GROUP);
}
/** Restores vehicle orders that was previously backed up by BackupVehicleOrders()
* This will restore to the point where it was at the time of the backup meaning
* it will presume the same order indexes can be used.
* This is needed when restoring a backed up vehicle
* @param v The vehicle that should gain the orders
* @param bak the backup of the orders
*/
void RestoreVehicleOrdersBruteForce(Vehicle *v, const BackuppedOrders *bak)
{
if (bak->name != NULL) {
/* Restore the name. */
v->name = strdup(bak->name);
}
/* If we had shared orders, recover that */
if (bak->clone != INVALID_VEHICLE) {
/* We will place it at the same location in the linked list as it previously was. */
if (v->prev_shared != NULL) {
assert(v->prev_shared->next_shared == v->next_shared);
v->prev_shared->next_shared = v;
}
if (v->next_shared != NULL) {
assert(v->next_shared->prev_shared == v->prev_shared);
v->next_shared->prev_shared = v;
}
} else {
/* Restore the orders at the indexes they originally were. */
for (Order *order = bak->order; order->IsValid(); order++) {
Order *dst = GetOrder(order->index);
/* Since we are restoring something we removed a moment ago all the orders should be free. */
assert(!dst->IsValid());
memcpy(dst, order, sizeof(Order));
}
}
}
/** Restore the current order-index of a vehicle and sets service-interval.
* @param tile unused
* @param flags operation to perform