changeset 15899:097904c36bde draft

(svn r20582) -Fix [FS#4044]: Autoreplace can trigger an assertion when at the vehicle limit
author rubidium <rubidium@openttd.org>
date Fri, 20 Aug 2010 17:35:10 +0000
parents cfe6456564b2
children f386e33cdd1e
files src/train_cmd.cpp
diffstat 1 files changed, 5 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -1053,9 +1053,10 @@
  * @param dst          The destination chain after constructing the train.
  * @param original_dst The original source chain.
  * @param dst          The source chain after constructing the train.
+ * @param check_limit  Whether to check the vehicle limit.
  * @return possible error of this command.
  */
-static CommandCost ValidateTrains(Train *original_dst, Train *dst, Train *original_src, Train *src)
+static CommandCost ValidateTrains(Train *original_dst, Train *dst, Train *original_src, Train *src, bool check_limit)
 {
 	/* Check whether we may actually construct the trains. */
 	CommandCost ret = CheckTrainAttachment(src);
@@ -1064,7 +1065,7 @@
 	if (ret.Failed()) return ret;
 
 	/* Check whether we need to build a new train. */
-	return CheckNewTrain(original_dst, dst, original_src, src);
+	return check_limit ? CheckNewTrain(original_dst, dst, original_src, src) : CommandCost();
 }
 
 /**
@@ -1235,7 +1236,7 @@
 		/* If the autoreplace flag is set we do not need to test for the validity
 		 * because we are going to revert the train to its original state. As we
 		 * assume the original state was correct autoreplace can skip this. */
-		CommandCost ret = ValidateTrains(original_dst_head, dst_head, original_src_head, src_head);
+		CommandCost ret = ValidateTrains(original_dst_head, dst_head, original_src_head, src_head, true);
 		if (ret.Failed()) {
 			/* Restore the train we had. */
 			RestoreTrainBackup(original_src);
@@ -1355,7 +1356,7 @@
 	ArrangeTrains(&sell_head, NULL, &new_head, v, sell_chain);
 
 	/* We don't need to validate the second train; it's going to be sold. */
-	CommandCost ret = ValidateTrains(NULL, NULL, first, new_head);
+	CommandCost ret = ValidateTrains(NULL, NULL, first, new_head, (flags & DC_AUTOREPLACE) == 0);
 	if (ret.Failed()) {
 		/* Restore the train we had. */
 		RestoreTrainBackup(original);