void render_crew(Vessel v, vessel_info vi, List<ProtoCrewMember> crew) { // get degenerative rules List<Rule> degen_rules = Kerbalism.rules.FindAll(k => k.degeneration > 0.0); // do nothing if there are no degenerative rules if (degen_rules.Count == 0) return; // do nothing if there isn't a crew if (crew.Count == 0) return; // select a kerbal ProtoCrewMember kerbal = crew[crew_index % crew.Count]; // render it kerbal_data kd = DB.KerbalData(kerbal.name); render_title(Lib.Epsilon(kerbal.name.ToUpper(), 20), ref crew_index, crew.Count); foreach(Rule r in degen_rules) { var kmon = DB.KmonData(kerbal.name, r.name); var bar = Lib.ProgressBar(20, kmon.problem, r.warning_threshold, r.danger_threshold, r.fatal_threshold, kd.disabled > 0 ? "cyan" : ""); render_content(r.name.AddSpacesOnCaps().ToLower(), bar); } render_content("specialization", kerbal.trait); if (Kerbalism.detected_mods.DeepFreeze) render_content("hibernated", kd.disabled > 0 ? "yes" : "no"); if (Kerbalism.detected_mods.CLS) render_content("inside", v.isEVA ? "EVA" : Lib.Epsilon(kd.space_name.Length == 0 ? v.vesselName : kd.space_name, 24)); render_space(); }
void banner(Vessel v) { string vessel_name = Lib.BuildString("<b>", Lib.Epsilon(v.vesselName, 20), "</b>"); string situation_name = Lib.BuildString(v.situation.ToString().ToLower(), " on <b>", Lib.Epsilon(v.mainBody.bodyName, 10), "</b>"); // print banner buffer.Add(Lib.BuildString(" ╔═╗╔═╗ ", vessel_name)); buffer.Add(Lib.BuildString(" ║<color=black>D</color>║╚═╗ ", situation_name)); buffer.Add(" ╚═╝╚═╝ <b>WELCOME</b>"); buffer.Add(string.Empty); }
void render_internal_space(Vessel v, vessel_info vi, List<ProtoCrewMember> crew) { // do not render internal space info for eva vessels if (v.isEVA) return; // if there is no crew, no space will be found, so do nothing in that case if (crew.Count == 0) return; // collect set of spaces // note: this is guaranteed to get at least a space (because there is at least one crew member) List<space_details> spaces = new List<space_details>(); foreach(var c in crew) { kerbal_data kd = DB.KerbalData(c.name); space_details sd = spaces.Find(k => k.name == kd.space_name); if (sd == null) { sd = new space_details(); sd.name = kd.space_name; sd.living_space = kd.living_space; sd.entertainment = kd.entertainment; sd.shielding = kd.shielding; spaces.Add(sd); } ++sd.crew_count; } // select a space space_details space = spaces[space_index % spaces.Count]; // render it string radiation_txt = vi.radiation > double.Epsilon ? Lib.BuildString(" <i>(", Lib.HumanReadableRadiationRate(vi.radiation * (1.0 - space.shielding)), ")</i>") : ""; render_title(space.name.Length > 0 && spaces.Count > 1 ? Lib.Epsilon(space.name.ToUpper(), 20) : "VESSEL", ref space_index, spaces.Count); render_content("living space", QualityOfLife.LivingSpaceToString(space.living_space)); render_content("entertainment", QualityOfLife.EntertainmentToString(space.entertainment)); render_content("shielding", Lib.BuildString(Radiation.ShieldingToString(space.shielding), radiation_txt)); render_space(); }
// draw a vessel in the monitor // - return: 1 if vessel wasn't skipped uint render_vessel(Vessel v) { // avoid case when DB isn't ready for whatever reason if (!DB.Ready()) return 0; // skip invalid vessels if (!Lib.IsVessel(v)) return 0; // skip resque missions if (Lib.IsResqueMission(v)) return 0; // skip dead eva kerbals if (EVA.IsDead(v)) return 0; // get vessel info from cache vessel_info vi = Cache.VesselInfo(v); // get vessel data from the db vessel_data vd = DB.VesselData(v.id); // skip filtered vessels if (filtered() && vd.group != filter) return 0; // get vessel crew List<ProtoCrewMember> crew = v.loaded ? v.GetVesselCrew() : v.protoVessel.GetVesselCrew(); // get vessel name string vessel_name = v.isEVA ? crew[0].name : v.vesselName; // get body name string body_name = v.mainBody.name.ToUpper(); // get list of scrubbers List<Scrubber> scrubbers = Scrubber.GetScrubbers(v); // get list of greenhouses List<Greenhouse> greenhouses = Greenhouse.GetGreenhouses(v); // store problems icons & tooltips List<Texture> problem_icons = new List<Texture>(); List<string> problem_tooltips = new List<string>(); // detect problems problem_sunlight(vi, ref problem_icons, ref problem_tooltips); problem_storm(v, ref problem_icons, ref problem_tooltips); if (crew.Count > 0) { problem_kerbals(crew, ref problem_icons, ref problem_tooltips); problem_radiation(vi, ref problem_icons, ref problem_tooltips); problem_scrubbers(v, scrubbers, ref problem_icons, ref problem_tooltips); } problem_greenhouses(v, greenhouses, ref problem_icons, ref problem_tooltips); // choose problem icon const UInt64 problem_icon_time = 3; Texture problem_icon = icon_empty; if (problem_icons.Count > 0) { UInt64 problem_index = (Convert.ToUInt64(Time.realtimeSinceStartup) / problem_icon_time) % (UInt64)(problem_icons.Count); problem_icon = problem_icons[(int)problem_index]; } // generate problem tooltips string problem_tooltip = String.Join("\n", problem_tooltips.ToArray()); // render vessel name & icons GUILayout.BeginHorizontal(row_style); GUILayout.Label(new GUIContent("<b>" + Lib.Epsilon(vessel_name, 20) + "</b>", vessel_name.Length > 20 ? vessel_name : ""), name_style); GUILayout.Label(new GUIContent(Lib.Epsilon(body_name, 8), body_name.Length > 8 ? body_name : ""), body_style); GUILayout.Label(new GUIContent(problem_icon, problem_tooltip), icon_style); GUILayout.Label(indicator_ec(v), icon_style); GUILayout.Label(indicator_supplies(v, scrubbers, greenhouses), icon_style); GUILayout.Label(indicator_reliability(v), icon_style); GUILayout.Label(indicator_signal(v), icon_style); GUILayout.EndHorizontal(); // remember last vessel clicked if (Lib.IsClicked()) last_clicked_id = v.id; // render vessel config if (configured_id == v.id) render_config(v); // spacing between vessels GUILayout.Space(10.0f); // signal that the vessel wasn't skipped for whatever reason return 1; }
// draw a vessel in the monitor // - return: 1 if vessel wasn't skipped uint render_vessel(Vessel v) { // get vessel info from cache vessel_info vi = Cache.VesselInfo(v); // skip invalid vessels if (!vi.is_valid) return 0; // get vessel data from the db vessel_data vd = DB.VesselData(v.id); // skip filtered vessels if (filtered() && vd.group != filter) return 0; // get vessel crew List<ProtoCrewMember> crew = v.loaded ? v.GetVesselCrew() : v.protoVessel.GetVesselCrew(); // get vessel name string vessel_name = v.isEVA ? crew[0].name : v.vesselName; // get body name string body_name = v.mainBody.name.ToUpper(); // store problems icons & tooltips List<Texture> problem_icons = new List<Texture>(); List<string> problem_tooltips = new List<string>(); // detect problems problem_sunlight(vi, ref problem_icons, ref problem_tooltips); problem_storm(v, ref problem_icons, ref problem_tooltips); if (crew.Count > 0) { problem_kerbals(crew, ref problem_icons, ref problem_tooltips); problem_radiation(vi, ref problem_icons, ref problem_tooltips); problem_scrubbers(v, vi.scrubbers, ref problem_icons, ref problem_tooltips); problem_recyclers(v, vi.recyclers, ref problem_icons, ref problem_tooltips); } problem_greenhouses(v, vi.greenhouses, ref problem_icons, ref problem_tooltips); // choose problem icon const UInt64 problem_icon_time = 3; Texture problem_icon = icon_empty; if (problem_icons.Count > 0) { UInt64 problem_index = ((UInt64)Time.realtimeSinceStartup / problem_icon_time) % (UInt64)(problem_icons.Count); problem_icon = problem_icons[(int)problem_index]; } // generate problem tooltips string problem_tooltip = String.Join("\n", problem_tooltips.ToArray()); // render vessel name & icons GUILayout.BeginHorizontal(row_style); GUILayout.Label(new GUIContent(Lib.BuildString("<b>", Lib.Epsilon(vessel_name, 18), "</b>"), vessel_name.Length > 18 ? vessel_name : ""), name_style); GUILayout.Label(new GUIContent(Lib.Epsilon(body_name, 8), body_name.Length > 8 ? body_name : ""), body_style); GUILayout.Label(new GUIContent(problem_icon, problem_tooltip), icon_style); GUILayout.Label(indicator_ec(v), icon_style); if (Kerbalism.supply_rules.Count > 0) GUILayout.Label(indicator_supplies(v, vi), icon_style); if (Kerbalism.features.reliability) GUILayout.Label(indicator_reliability(v, vi), icon_style); if (Kerbalism.features.signal) GUILayout.Label(indicator_signal(v, vi), icon_style); GUILayout.EndHorizontal(); if (Lib.IsClicked(1)) Info.Toggle(v); else if (Lib.IsClicked(2) && !v.isEVA) Console.Toggle(v); // remember last vessel clicked if (Lib.IsClicked()) last_clicked_id = v.id; // render vessel config if (configured_id == v.id) render_config(v); // spacing between vessels GUILayout.Space(10.0f); // signal that the vessel wasn't skipped for whatever reason return 1; }