vehicle.c
changeset 2602 f0e2dcce3695
parent 2601 7c94a0e394a6
child 2606 7ae924de184b
--- a/vehicle.c	Sat Nov 05 14:01:00 2005 +0000
+++ b/vehicle.c	Sat Nov 05 16:07:26 2005 +0000
@@ -519,20 +519,28 @@
 
 void DeleteVehicle(Vehicle *v)
 {
-	DeleteName(v->string_id);
-	v->type = 0;
-	UpdateVehiclePosHash(v, INVALID_COORD, 0);
-	v->next_hash = INVALID_VEHICLE;
+	Vehicle *u;
+	bool has_artic_part = false;
 
-	if (v->orders != NULL)
-		DeleteVehicleOrders(v);
+	do {
+		u = v->next;
+		has_artic_part = EngineHasArticPart(v);
+		DeleteName(v->string_id);
+		v->type = 0;
+		UpdateVehiclePosHash(v, INVALID_COORD, 0);
+		v->next_hash = INVALID_VEHICLE;
+
+		if (v->orders != NULL)
+			DeleteVehicleOrders(v);
+		v = u;
+	} while (v != NULL && has_artic_part);
 }
 
 void DeleteVehicleChain(Vehicle *v)
 {
 	do {
 		Vehicle *u = v;
-		v = v->next;
+		v = GetNextVehicle(v);
 		DeleteVehicle(u);
 	} while (v != NULL);
 }
@@ -1486,6 +1494,8 @@
 			const RailVehicleInfo *rvi = RailVehInfo(v->engine_type);
 			if (rvi->flags & RVI_MULTIHEAD)
 				return GetRearEngine(v, v->engine_type);
+			if (v->next != NULL && v->next->subtype == TS_Artic_Part)
+				return v->next;
 		}
 			break;
 		case VEH_Aircraft:
@@ -1579,7 +1589,7 @@
 			}
 			w_rear = w;	// trains needs to know the last car in the train, so they can add more in next loop
 		}
-	} while (v->type == VEH_Train && (v=v->next) != NULL);
+	} while (v->type == VEH_Train && (v = GetNextVehicle(v)) != NULL);
 
 	if (flags & DC_EXEC) {
 		v = v_front;
@@ -1755,7 +1765,7 @@
 				break;
 
 			cost += temp_cost;
-		} while (w->type == VEH_Train && (w=w->next) != NULL);
+		} while (w->type == VEH_Train && (w = GetNextVehicle(w)) != NULL);
 
 		if (!(flags & DC_EXEC) && (CmdFailed(temp_cost) || p->money64 < (int32)(cost + p->engine_renew_money) || cost == 0)) {
 			if (p->money64 < (int32)(cost + p->engine_renew_money) && ( _local_player == v->owner ) && cost != 0) {