(svn r243) -Fix: [1022689] When destroying a part of a train with a 2 side engine the second engine was also deleted [Celestar]
authorsignde
Tue, 14 Sep 2004 08:13:15 +0000
changeset 242 f4894a2cdfe8
parent 241 e6e62a5e7f52
child 243 9a40daa560ae
(svn r243) -Fix: [1022689] When destroying a part of a train with a 2 side engine the second engine was also deleted [Celestar]
train_cmd.c
--- a/train_cmd.c	Tue Sep 14 01:21:07 2004 +0000
+++ b/train_cmd.c	Tue Sep 14 08:13:15 2004 +0000
@@ -773,7 +773,17 @@
 	first = v;
 	if (first->subtype != 0) {
 		first = GetFirstVehicleInChain(first);
-		last = NULL;
+		last = GetLastVehicleInChain(first);
+		//now if:
+		// 1) we delete a whole a chain, and
+		// 2) the first and the last vehicle of that train are of the same type, and
+		// 3) the first and the last vehicle of the chain are not identical, and
+		// 4) and of "engine" type (i.e. not a carriage)
+		// then let the last vehicle live
+		if ( (p2 == 1) && ( last->engine_type == first->engine_type ) && (last != first) && (first->subtype == 0) )
+			last = GetPrevVehicleInChain(last);
+		else
+			last = NULL;
 	} else {
 		if (p2 != 1) {
 			// sell last part of multiheaded?
@@ -825,7 +835,7 @@
 			tmp = v;
 			v = v->next;
 			DeleteVehicle(tmp);
-			if (v == NULL || p2 != 1) break;
+			if (v == last || p2 != 1) break;
 		}
 
 		// delete last vehicle of multiheaded train?
@@ -844,7 +854,7 @@
 		cost = 0;
 		for(;;) {
 			cost -= v->value;
-			if ((v=v->next) == NULL || p2 != 1) break;
+			if ((v=v->next) == last || p2 != 1) break;
 		}
 		if (last) cost -= last->value;
 	}