public static qol_data analyze_qol(List<Part> parts, environment_data env, crew_data crew, signal_data signal) { // store data qol_data qol = new qol_data(); // scan the parts foreach(Part p in parts) { // for each module foreach(PartModule m in p.Modules) { // entertainment if (m.moduleName == "Entertainment") { Entertainment mm = (Entertainment)m; qol.entertainment *= mm.rate; } } } // calculate Quality-Of-Life bonus // note: ignore kerbal-specific variance if (crew.capacity > 0) { double bonus = QualityOfLife.Bonus(crew.count, crew.capacity, qol.entertainment, env.landed, signal.range > 0.0); qol.living_space = QualityOfLife.LivingSpace(crew.count, crew.capacity); qol.time_to_instability = bonus / Settings.StressedDegradationRate; List<string> factors = new List<string>(); if (crew.count > 1) factors.Add("not-alone"); if (signal.range > 0.0) factors.Add("call-home"); if (env.landed) factors.Add("firm-ground"); if (factors.Count == 0) factors.Add("none"); qol.factors = String.Join(", ", factors.ToArray()); } else { qol.living_space = 0.0; qol.time_to_instability = double.NaN; qol.factors = "none"; } // return data return qol; }
void updateConnectedSpaces(Vessel v, vessel_info vi) { // get CLS handler var cls = CLS.get(); // calculate whole-space if (cls == null) { double living_space = QualityOfLife.LivingSpace((uint)vi.crew_count, (uint)vi.crew_capacity); double entertainment = QualityOfLife.Entertainment(v); double shielding = Radiation.Shielding(v); foreach (var c in v.loaded ? v.GetVesselCrew() : v.protoVessel.GetVesselCrew()) { kerbal_data kd = DB.KerbalData(c.name); kd.living_space = living_space; kd.entertainment = entertainment; kd.shielding = shielding; kd.space_name = ""; } } // calculate connected-space // note: avoid problem at scene change else if (cls.Vessel != null && cls.Vessel.Spaces.Count > 0) { // calculate internal spaces foreach (var space in cls.Vessel.Spaces) { double living_space = QualityOfLife.LivingSpace(space); double entertainment = QualityOfLife.Entertainment(v, space); double shielding = Radiation.Shielding(space); foreach (var c in space.Crew) { kerbal_data kd = DB.KerbalData(c.Kerbal.name); kd.living_space = living_space; kd.entertainment = entertainment; kd.shielding = shielding; kd.space_name = space.Name; } } } }