src/order_cmd.cpp
changeset 9061 8ebd40e86171
parent 9043 eb4f06b99146
child 9076 30574351a0ad
--- a/src/order_cmd.cpp	Sun Apr 27 18:05:48 2008 +0000
+++ b/src/order_cmd.cpp	Sun Apr 27 20:09:29 2008 +0000
@@ -1233,7 +1233,7 @@
 
 		/* 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 @@
 	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