summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpeter1138 <peter1138@openttd.org>2006-10-12 15:03:19 +0000
committerpeter1138 <peter1138@openttd.org>2006-10-12 15:03:19 +0000
commitfd3fd176e50fdacf5b48ff024b7f182dbb88782d (patch)
tree12a55299d1f4b802004d47291b3d265b444778e6
parentcad526ef3658ad6420939a6d51707c9dbfee97c3 (diff)
downloadopenttd-fd3fd176e50fdacf5b48ff024b7f182dbb88782d.tar.xz
(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.
-rw-r--r--train_cmd.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/train_cmd.c b/train_cmd.c
index 25a5b9884..bd9b9bd86 100644
--- a/train_cmd.c
+++ b/train_cmd.c
@@ -508,10 +508,15 @@ static void AddArticulatedParts(Vehicle **vl)
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 @@ static int32 CmdBuildRailWagon(EngineID engine, TileIndex tile, uint32 flags)
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 @@ int32 CmdBuildRailVehicle(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
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);