private float ReclaimResource(string resource, double amount,
								  string vessel_name, string name=null)
        {
            PartResourceDefinition res_def;
            res_def = PartResourceLibrary.Instance.GetDefinition (resource);
            VesselResources recycler = new VesselResources (vessel);

            if (res_def == null) {
            return 0;
            }

            if (name == null) {
            name = resource;
            }
            double remain = amount;
            // any resources that can't be pumped or don't flow just "evaporate"
            // FIXME: should this be a little smarter and convert certain such
            // resources into rocket parts?
            if (res_def.resourceTransferMode != ResourceTransferMode.NONE
            && res_def.resourceFlowMode != ResourceFlowMode.NO_FLOW) {
            remain = recycler.TransferResource (resource, amount);
            }
            Debug.Log (String.Format ("[EL] {0}-{1}: {2} taken {3} reclaimed, {4} lost", vessel_name, name, amount, amount - remain, remain));
            return (float) (amount * res_def.density);
        }
		internal void SetupCraftResources (Vessel vsl)
		{
			craftResources = new VesselResources (vsl);
			foreach (var br in buildCost.optional) {
				var amount = craftResources.ResourceAmount (br.name);
				craftResources.TransferResource (br.name, -amount);
			}
		}
        public float RecycleVessel(Vessel v)
        {
            float ConversionEfficiency = 0.8f;
            double amount;
            VesselResources scrap = new VesselResources (v);

            PartResourceDefinition rp_def;
            string target_resource = ExSettings.HullRecycleTarget;
            rp_def = PartResourceLibrary.Instance.GetDefinition (target_resource);

            if (FlightGlobals.ActiveVessel == v)
            FlightGlobals.ForceSetActiveVessel (this.vessel);
            float mass = 0;
            foreach (var crew in v.GetVesselCrew ()) {
            mass += RecycleKerbal (crew, null);
            }
            foreach (string resource in scrap.resources.Keys) {
            amount = scrap.ResourceAmount (resource);
            mass += ReclaimResource (resource, amount, v.name);
            scrap.TransferResource (resource, -amount);
            }
            float hull_mass = v.GetTotalMass ();
            amount = hull_mass * ConversionEfficiency / rp_def.density;
            mass += ReclaimResource (target_resource, amount, v.name, String.Format ("hull({0})", target_resource));
            v.Die ();
            return mass;
        }