public static radiation_data analyze_radiation(List<Part> parts, environment_data env, crew_data crew) { // store data radiation_data radiation = new radiation_data(); // scan the parts foreach(Part p in parts) { // accumulate shielding amount and capacity radiation.shielding_amount += Lib.GetResourceAmount(p, "Shielding"); radiation.shielding_capacity += Lib.GetResourceCapacity(p, "Shielding"); } // calculate radiation data double shielding = Radiation.Shielding(radiation.shielding_amount, radiation.shielding_capacity); double belt_strength = Settings.BeltRadiation * Radiation.Dynamo(env.body) * 0.5; //< account for the 'ramp' if (crew.capacity > 0) { radiation.life_expectancy = new double[] { Settings.RadiationFatalThreshold / (Settings.CosmicRadiation * (1.0 - shielding)), Settings.RadiationFatalThreshold / (Settings.StormRadiation * (1.0 - shielding)), Radiation.HasBelt(env.body) ? Settings.RadiationFatalThreshold / (belt_strength * (1.0 - shielding)) : double.NaN }; } else { radiation.life_expectancy = new double[]{double.NaN, double.NaN, double.NaN}; } // return data return radiation; }
void render_radiation(radiation_data radiation, environment_data env, crew_data crew) { string magnetosphere_str = Radiation.HasMagnetosphere(env.body) ? Lib.HumanReadableRange(Radiation.MagnAltitude(env.body)) : "none"; string belt_strength_str = Radiation.HasBelt(env.body) ? " (" + (Radiation.Dynamo(env.body) * Settings.BeltRadiation * (60.0 * 60.0)).ToString("F0") + " rad/h)" : ""; string belt_str = Radiation.HasBelt(env.body) ? Lib.HumanReadableRange(Radiation.BeltAltitude(env.body)) : "none"; string shield_str = Radiation.ShieldingToString(radiation.shielding_amount, radiation.shielding_capacity); string shield_tooltip = radiation.shielding_capacity > 0 ? "average over the vessel" : ""; string life_str = Lib.HumanReadableDuration(radiation.life_expectancy[0]) + "</b> / <b>" + Lib.HumanReadableDuration(radiation.life_expectancy[1]); string life_tooltip = "cosmic / storm"; if (Radiation.HasBelt(env.body)) { life_str += "</b> / <b>" + Lib.HumanReadableDuration(radiation.life_expectancy[2]); life_tooltip += " / belt"; } render_title("RADIATION"); render_content("magnetosphere", magnetosphere_str, "protect from cosmic radiation"); render_content("radiation belt", belt_str, "abnormal radiation zone" + belt_strength_str); render_content("shielding", shield_str, shield_tooltip); render_content("life expectancy", crew.capacity > 0 ? life_str : "perpetual", crew.capacity > 0 ? life_tooltip : ""); render_space(); }
public void render() { // if there is something in the editor if (EditorLogic.RootPart != null) { // store situations and altitude multipliers string[] situations = {"Landed", "Low Orbit", "Orbit", "High Orbit"}; double[] altitude_mults = {0.0, 0.33, 1.0, 3.0}; // get body, situation and altitude multiplier CelestialBody body = FlightGlobals.Bodies[body_index]; string situation = situations[situation_index]; double altitude_mult = altitude_mults[situation_index]; // get parts recursively List<Part> parts = Lib.GetPartsRecursively(EditorLogic.RootPart); // analyze environment_data env = analyze_environment(body, altitude_mult); crew_data crew = analyze_crew(parts); food_data food = analyze_food(parts, env, crew); oxygen_data oxygen = analyze_oxygen(parts, env, crew); signal_data signal = analyze_signal(parts); qol_data qol = analyze_qol(parts, env, crew, signal); radiation_data radiation = analyze_radiation(parts, env, crew); ec_data ec = analyze_ec(parts, env, crew, food, oxygen, signal); reliability_data reliability = analyze_reliability(parts, ec, signal); // render menu GUILayout.BeginHorizontal(row_style); if (GUILayout.Button(body.name, leftmenu_style)) { body_index = (body_index + 1) % FlightGlobals.Bodies.Count; if (body_index == 0) ++body_index; } if (GUILayout.Button("["+ (page + 1) + "/2]", midmenu_style)) { page = (page + 1) % 2; } if (GUILayout.Button(situation, rightmenu_style)) { situation_index = (situation_index + 1) % situations.Length; } GUILayout.EndHorizontal(); // page 1/2 if (page == 0) { // render render_ec(ec); render_food(food); render_oxygen(oxygen); render_qol(qol); } // page 2/2 else { // render render_radiation(radiation, env, crew); render_reliability(reliability, crew); render_signal(signal, env, crew); render_environment(env); } } // if there is nothing in the editor else { // render quote GUILayout.FlexibleSpace(); GUILayout.BeginHorizontal(); GUILayout.Label("<i>In preparing for space, I have always found that\nplans are useless but planning is indispensable.\nWernher von Kerman</i>", quote_style); GUILayout.EndHorizontal(); GUILayout.Space(10.0f); } }