summaryrefslogtreecommitdiff
path: root/src/train_cmd.cpp
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2010-08-20 17:35:10 +0000
committerrubidium <rubidium@openttd.org>2010-08-20 17:35:10 +0000
commit79027229b9ab70ff7bdaa069fee3957e4b8adabc (patch)
tree6a19a42fb4ab47b4b88ac8bdb0dcc1eaef1e87d3 /src/train_cmd.cpp
parentd6cd62e633f8ec7ef15fac4c2d5c1ae120b9ad03 (diff)
downloadopenttd-79027229b9ab70ff7bdaa069fee3957e4b8adabc.tar.xz
(svn r20582) -Fix [FS#4044]: Autoreplace can trigger an assertion when at the vehicle limit
Diffstat (limited to 'src/train_cmd.cpp')
-rw-r--r--src/train_cmd.cpp9
1 files changed, 5 insertions, 4 deletions
diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp
index 0a0404bbb..8d2d49587 100644
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -1053,9 +1053,10 @@ static CommandCost CheckTrainAttachment(Train *t)
* @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 @@ static CommandCost ValidateTrains(Train *original_dst, Train *dst, Train *origin
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 @@ CommandCost CmdMoveRailVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1, u
/* 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 @@ CommandCost CmdSellRailWagon(DoCommandFlag flags, Vehicle *t, uint16 data, uint3
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);