void render_reliability(reliability_data reliability, crew_data crew) { render_title("RELIABILITY"); render_content("malfunctions", Lib.ValueOrNone(reliability.failure_year, "/y"), "per-component average case estimate"); render_content("redundancy", reliability.redundancy); render_content("quality", Malfunction.QualityToString(reliability.quality), "manufacturing quality"); render_content("engineer", crew.engineer ? "yes" : "no"); render_space(); }
public static reliability_data analyze_reliability(List<Part> parts, ec_data ec, signal_data signal) { // store data reliability_data reliability = new reliability_data(); // get manufacturing quality reliability.quality = Malfunction.DeduceQuality(); // count parts that can fail uint components = 0; // scan the parts foreach(Part p in parts) { // for each module foreach(PartModule m in p.Modules) { // malfunctions if (m.moduleName == "Malfunction") { Malfunction mm = (Malfunction)m; ++components; double avg_lifetime = (mm.min_lifetime + mm.max_lifetime) * 0.5 * reliability.quality; reliability.failure_year += (60.0 * 60.0 * Lib.HoursInDay() * Lib.DaysInYear()) / avg_lifetime; } } } // calculate reliability data if (components > 0) reliability.failure_year /= (double)components; double ec_redundancy = ec.best_ec_generator < ec.generated_sunlight ? (ec.generated_sunlight - ec.best_ec_generator) / ec.generated_sunlight : 0.0; double antenna_redundancy = signal.second_best_range > 0.0 ? signal.second_best_range / signal.range : 0.0; List<string> redundancies = new List<string>(); if (ec_redundancy >= 0.5) redundancies.Add("ec"); if (antenna_redundancy >= 0.99) redundancies.Add("antenna"); if (redundancies.Count == 0) redundancies.Add("none"); reliability.redundancy = String.Join(", ", redundancies.ToArray()); // return data return reliability; }
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); } }