changeset 4121:e37aa6dacfdd draft

(svn r5465) -Feature: [autoreplace] replacing from a train engine without cargo capacity to one with cargo capacity will now make autoreplace refit the engine to carry the cargo type from the last wagon in the train if the train is carrying the type of cargo, that is default for the engine, it will not be refitted if the last wagon do not carry cargo, the refit will be to the type of the last wagon, that do carry cargo
author bjarni <bjarni@openttd.org>
date Fri, 07 Jul 2006 07:19:38 +0000
parents 425e74ecec82
children bcbbf0b6d7af
files vehicle.c
diffstat 1 files changed, 24 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/vehicle.c
+++ b/vehicle.c
@@ -1659,13 +1659,35 @@
 	if (flags & DC_EXEC) {
 		new_v = GetVehicle(_new_vehicle_id);
 		*w = new_v;	//we changed the vehicle, so MaybeReplaceVehicle needs to work on the new one. Now we tell it what the new one is
+		CargoID new_cargo_type = old_v->cargo_type;
 
 		/* refit if needed */
-		if (old_v->cargo_type != new_v->cargo_type && old_v->cargo_cap != 0 && new_v->cargo_cap != 0) {// some train engines do not have cargo capacity
+		if (old_v->type == VEH_Train && old_v->cargo_cap == 0 && new_v->cargo_cap != 0) {
+			// the old engine didn't have cargo capacity, but the new one does
+			// now we will figure out what cargo the train is carrying and refit to fit this
+			Vehicle *v = old_v;
+			CargoID cargo_type_buffer = new_v->cargo_type;
+			printf("A: %d\n", cargo_type_buffer);
+			do {
+				if (v->cargo_cap == 0) continue;
+				printf("B: %d\n", cargo_type_buffer);
+				if (v->cargo_type == new_v->cargo_type) {
+					// the default type is already being carried on the train. No need to refit
+					cargo_type_buffer = new_v->cargo_type;
+					break;
+				}
+				printf("C: %d\n", cargo_type_buffer);
+				// now we know that the vehicle is carrying cargo and that it's not the same as
+				cargo_type_buffer = v->cargo_type;
+			} while ((v=v->next) != NULL);
+			new_cargo_type = cargo_type_buffer;
+		}
+
+		if (new_cargo_type != new_v->cargo_type && new_v->cargo_cap != 0) {
 			// we add the refit cost to cost, so it's added to the cost animation
 			// it's not in the calculation of having enough money to actually do the replace since it's rather hard to do by design, but since
 			// we pay for it, it's nice to make the cost animation include it
-			int32 temp_cost = DoCommand(0, new_v->index, old_v->cargo_type, DC_EXEC, CMD_REFIT_VEH(new_v->type));
+			int32 temp_cost = DoCommand(0, new_v->index, new_cargo_type, DC_EXEC, CMD_REFIT_VEH(new_v->type));
 			if (!CmdFailed(temp_cost)) cost += temp_cost;
 		}
 		if (new_v->type == VEH_Train && HASBIT(old_v->u.rail.flags, VRF_REVERSE_DIRECTION) && !IsMultiheaded(new_v) && !(new_v->next != NULL && IsArticulatedPart(new_v->next))) {