changeset 4831:1965a9c3ce48 draft

(svn r6755) - Fix: Pass the newly created vehicle when checking for articulated engines. As this could result in more parts being added than previously counted, we check to see if we need to allocate more vehicles as we add parts.
author peter1138 <peter1138@openttd.org>
date Thu, 12 Oct 2006 15:03:19 +0000
parents 4f6ff5b2a5be
children 7616105a7370
files train_cmd.c
diffstat 1 files changed, 11 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/train_cmd.c
+++ b/train_cmd.c
@@ -508,10 +508,15 @@
 	if (!HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_ARTIC_ENGINE)) return;
 
 	for (i = 1; i < 10; i++) {
-		callback = GetVehicleCallback(CBID_TRAIN_ARTIC_ENGINE, i, 0, v->engine_type, NULL);
+		callback = GetVehicleCallback(CBID_TRAIN_ARTIC_ENGINE, i, 0, v->engine_type, v);
 		if (callback == CALLBACK_FAILED || callback == 0xFF) return;
 
+		/* Attempt to use pre-allocated vehicles until they run out. This can happen
+		 * if the callback returns different values depending on the cargo type. */
 		u->next = vl[i];
+		if (u->next == NULL) u->next = AllocateVehicle();
+		if (u->next == NULL) return;
+
 		u = u->next;
 
 		engine_type = GB(callback, 0, 7);
@@ -571,6 +576,8 @@
 		int x;
 		int y;
 
+		memset(&vl, 0, sizeof(vl));
+
 		if (!AllocateVehicles(vl, num_vehicles))
 			return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
 
@@ -742,6 +749,9 @@
 
 	if (!(flags & DC_QUERY_COST)) {
 		Vehicle *vl[12]; // Allow for upto 10 artic parts and dual-heads
+
+		memset(&vl, 0, sizeof(vl));
+
 		if (!AllocateVehicles(vl, num_vehicles) || IsOrderPoolFull())
 			return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);