# HG changeset patch # User peter1138 # Date 2006-10-12 15:03:19 # Node ID c6aa0c225e5646c554dc76c0e98c12daedc08e29 # Parent b1b68e7108e72dcabdb95702c06a5913bd596843 (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. diff --git a/train_cmd.c b/train_cmd.c --- a/train_cmd.c +++ b/train_cmd.c @@ -508,10 +508,15 @@ static void AddArticulatedParts(Vehicle 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 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 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);