private void UpdateValues() { if (EditorLogic.fetch != null) { numCrew = 0; maxCrew = 0; int numOccupiedParts = 0; int numOccupiableParts = 0; double food = 0; double water = 0; double oxygen = 0; double electricity = 0; foreach (Part part in EditorLogic.fetch.ship.parts) { if (part.CrewCapacity > 0) { ++numOccupiableParts; maxCrew += part.CrewCapacity; } foreach (PartResource partResource in part.Resources) { if (partResource.info.id == globalSettings.FoodId) { food += partResource.amount; } else if (partResource.info.id == globalSettings.WaterId) { water += partResource.amount; } else if (partResource.info.id == globalSettings.OxygenId) { oxygen += partResource.amount; } else if (partResource.info.id == globalSettings.ElectricityId) { electricity += partResource.amount; } } } CMAssignmentDialog dialog = EditorLogic.fetch.CrewAssignmentDialog; if (dialog != null) { VesselCrewManifest manifest = dialog.GetManifest(); if (manifest != null) { foreach (PartCrewManifest pcm in manifest) { int partCrewCount = pcm.GetPartCrew().Count(c => c != null); if (partCrewCount > 0) { ++numOccupiedParts; numCrew += partCrewCount; } } } } if (numCrew > 0) { foodDuration = Utilities.FormatTime(food / globalSettings.FoodConsumptionRate / numCrew); waterDuration = Utilities.FormatTime(water / globalSettings.WaterConsumptionRate / numCrew); oxygenDuration = Utilities.FormatTime(oxygen / globalSettings.OxygenConsumptionRate / numCrew); electricityDuration = Utilities.FormatTime(electricity / CalculateElectricityConsumptionRate(numCrew, numOccupiedParts)); } else { foodDuration = "-"; waterDuration = "-"; oxygenDuration = "-"; electricityDuration = "-"; } if (maxCrew > 0) { foodDurationMaxCrew = Utilities.FormatTime(food / globalSettings.FoodConsumptionRate / maxCrew); waterDurationMaxCrew = Utilities.FormatTime(water / globalSettings.WaterConsumptionRate / maxCrew); oxygenDurationMaxCrew = Utilities.FormatTime(oxygen / globalSettings.OxygenConsumptionRate / maxCrew); electricityDurationMaxCrew = Utilities.FormatTime(electricity / CalculateElectricityConsumptionRate(maxCrew, numOccupiableParts)); } else { foodDurationMaxCrew = "-"; waterDurationMaxCrew = "-"; oxygenDurationMaxCrew = "-"; electricityDurationMaxCrew = "-"; } } }
private void GenerateWindow() { GUILayout.BeginVertical(); scrollPos = GUILayout.BeginScrollView(scrollPos, _scrollStyle, GUILayout.Width(600), GUILayout.Height(350)); GUILayout.BeginVertical(); var useHabPenalties = (LifeSupportSetup.Instance.LSConfig.NoHomeEffectVets + LifeSupportSetup.Instance.LSConfig.NoHomeEffect > 0); if (EditorLogic.fetch != null) { var curCrew = 0; var maxCrew = 0; var supplies = 0d; var extraHabTime = 0d; var habMult = 1d; var batteryAmount = 0d; foreach (var part in EditorLogic.fetch.ship.parts) { maxCrew += part.CrewCapacity; } CMAssignmentDialog dialog = CMAssignmentDialog.Instance; if (dialog != null) { VesselCrewManifest manifest = dialog.GetManifest(); if (manifest != null) { foreach (PartCrewManifest pcm in manifest) { int partCrewCount = pcm.GetPartCrew().Count(c => c != null); if (partCrewCount > 0) { curCrew += partCrewCount; } } } } foreach (var part in EditorLogic.fetch.ship.parts) { var hab = part.Modules.GetModules <ModuleHabitation>().FirstOrDefault(); if (hab != null) { //Certain modules, in addition to crew capacity, have living space. extraHabTime += hab.KerbalMonths; //Some modules act more as 'multipliers', dramatically extending a hab's workable lifespan. habMult += hab.HabMultiplier * Math.Min(1, (hab.CrewCapacity / curCrew)); } if (part.Resources.Contains("Supplies")) { supplies += part.Resources["Supplies"].amount; } if (part.Resources.Contains("ElectricCharge")) { batteryAmount += part.Resources["ElectricCharge"].maxAmount; } } var totalHabSpace = (LifeSupportSetup.Instance.LSConfig.BaseHabTime * maxCrew) + extraHabTime; //A Kerbal month is 30 six-hour Kerbin days. var totalHabMult = habMult * LifeSupportSetup.Instance.LSConfig.HabMultiplier * 60d * 60d * 6d * 30d; var totalBatteryTime = batteryAmount / LifeSupportSetup.Instance.LSConfig.ECAmount; var totalSupplyTime = supplies / LifeSupportSetup.Instance.LSConfig.SupplyAmount; if (EditorLogic.fetch.ship.parts.Count > 0) { GUILayout.BeginHorizontal(); GUILayout.Label("Crew", _labelStyle, GUILayout.Width(90)); GUILayout.Label("Supplies", _labelStyle, GUILayout.Width(160)); GUILayout.Label("Batteries", _labelStyle, GUILayout.Width(160)); GUILayout.Label("Habitation", _labelStyle, GUILayout.Width(160)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Current (" + curCrew + ")", _labelStyle, GUILayout.Width(90)); GUILayout.Label(LifeSupportUtilities.SecondsToKerbinTime(totalSupplyTime / Math.Max(1, curCrew) / LifeSupportManager.GetRecyclerMultiplierForParts(EditorLogic.fetch.ship.parts, curCrew)), _labelStyle, GUILayout.Width(160)); GUILayout.Label(LifeSupportUtilities.SecondsToKerbinTime(totalBatteryTime / Math.Max(1, curCrew)), _labelStyle, GUILayout.Width(160)); if (useHabPenalties) { GUILayout.Label(LifeSupportUtilities.SecondsToKerbinTime(totalHabSpace / Math.Max(1, curCrew) * totalHabMult), _labelStyle, GUILayout.Width(160)); } else { GUILayout.Label("indefinite", _labelStyle, GUILayout.Width(160)); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Max (" + maxCrew + ")", _labelStyle, GUILayout.Width(90)); GUILayout.Label(LifeSupportUtilities.SecondsToKerbinTime(totalSupplyTime / Math.Max(1, maxCrew) / LifeSupportManager.GetRecyclerMultiplierForParts(EditorLogic.fetch.ship.parts, maxCrew)), _labelStyle, GUILayout.Width(160)); GUILayout.Label(LifeSupportUtilities.SecondsToKerbinTime(totalBatteryTime / Math.Max(1, maxCrew)), _labelStyle, GUILayout.Width(160)); if (useHabPenalties) { GUILayout.Label(LifeSupportUtilities.SecondsToKerbinTime(totalHabSpace / Math.Max(1, maxCrew) * totalHabMult), _labelStyle, GUILayout.Width(160)); } else { GUILayout.Label("indefinite", _labelStyle, GUILayout.Width(160)); } GUILayout.EndHorizontal(); } } GUILayout.EndVertical(); GUILayout.EndScrollView(); GUILayout.EndVertical(); GUI.DragWindow(); }
private void UpdateValues() { if (EditorLogic.fetch != null) { numCrew = 0; maxCrew = 0; int numOccupiedParts = 0; int numOccupiableParts = 0; double foodValue = 0; double waterValue = 0; double oxygenValue = 0; double electricityValue = 0; double wasteValue = 0; double wasteWaterValue = 0; double carbonDioxideValue = 0; foreach (Part part in EditorLogic.fetch.ship.parts) { if (part.CrewCapacity > 0) { ++numOccupiableParts; maxCrew += part.CrewCapacity; } foreach (PartResource partResource in part.Resources) { if (partResource.info.id == globalSettings.FoodId) { foodValue += partResource.amount; } else if (partResource.info.id == globalSettings.WaterId) { waterValue += partResource.amount; } else if (partResource.info.id == globalSettings.OxygenId) { oxygenValue += partResource.amount; } else if (partResource.info.id == globalSettings.ElectricityId) { electricityValue += partResource.amount; } else if (partResource.info.id == globalSettings.WasteId) { wasteValue += partResource.maxAmount; } else if (partResource.info.id == globalSettings.WasteWaterId) { wasteWaterValue += partResource.maxAmount; } else if (partResource.info.id == globalSettings.CO2Id) { carbonDioxideValue += partResource.maxAmount; } } } CMAssignmentDialog dialog = EditorLogic.fetch.CrewAssignmentDialog; if (dialog != null) { VesselCrewManifest manifest = dialog.GetManifest(); if (manifest != null) { foreach (PartCrewManifest pcm in manifest) { int partCrewCount = pcm.GetPartCrew().Count(c => c != null); if (partCrewCount > 0) { ++numOccupiedParts; numCrew += partCrewCount; } } } } food = foodValue.ToString("#,##0.00"); water = waterValue.ToString("#,##0.00"); oxygen = oxygenValue.ToString("#,##0.00"); electricity = electricityValue.ToString("#,##0.00"); maxWaste = wasteValue.ToString("#,##0.00"); maxWasteWater = wasteWaterValue.ToString("#,##0.00"); maxCarbonDioxide = carbonDioxideValue.ToString("#,##0.00"); if (numCrew > 0) { foodDuration = Utilities.FormatTime(foodValue / globalSettings.FoodConsumptionRate / numCrew); waterDuration = Utilities.FormatTime(waterValue / globalSettings.WaterConsumptionRate / numCrew); oxygenDuration = Utilities.FormatTime(oxygenValue / globalSettings.OxygenConsumptionRate / numCrew); electricityDuration = Utilities.FormatTime(electricityValue / CalculateElectricityConsumptionRate(numCrew, numOccupiedParts)); wasteRoom = Utilities.FormatTime(wasteValue / globalSettings.WasteProductionRate / numCrew); wasteWaterRoom = Utilities.FormatTime(wasteWaterValue / globalSettings.WasteWaterProductionRate / numCrew); carbonDioxideRoom = Utilities.FormatTime(carbonDioxideValue / globalSettings.CO2ProductionRate / numCrew); } else { foodDuration = "-"; waterDuration = "-"; oxygenDuration = "-"; electricityDuration = "-"; wasteRoom = "-"; wasteWaterRoom = "-"; carbonDioxideRoom = "-"; } if (maxCrew > 0) { foodDurationMaxCrew = Utilities.FormatTime(foodValue / globalSettings.FoodConsumptionRate / maxCrew); waterDurationMaxCrew = Utilities.FormatTime(waterValue / globalSettings.WaterConsumptionRate / maxCrew); oxygenDurationMaxCrew = Utilities.FormatTime(oxygenValue / globalSettings.OxygenConsumptionRate / maxCrew); electricityDurationMaxCrew = Utilities.FormatTime(electricityValue / CalculateElectricityConsumptionRate(maxCrew, numOccupiableParts)); wasteRoomMaxCrew = Utilities.FormatTime(wasteValue / globalSettings.WasteProductionRate / maxCrew); wasteWaterRoomMaxCrew = Utilities.FormatTime(wasteWaterValue / globalSettings.WasteWaterProductionRate / maxCrew); carbonDioxideRoomMaxCrew = Utilities.FormatTime(carbonDioxideValue / globalSettings.CO2ProductionRate / maxCrew); } else { foodDurationMaxCrew = "-"; waterDurationMaxCrew = "-"; oxygenDurationMaxCrew = "-"; electricityDurationMaxCrew = "-"; wasteRoomMaxCrew = "-"; wasteWaterRoomMaxCrew = "-"; carbonDioxideRoomMaxCrew = "-"; } } }
private void GenerateWindow() { GUILayout.BeginVertical(); scrollPos = GUILayout.BeginScrollView(scrollPos, _scrollStyle, GUILayout.Width(645), GUILayout.Height(350)); GUILayout.BeginVertical(); var useHabPenalties = (LifeSupportSetup.Instance.LSConfig.NoHomeEffectVets + LifeSupportSetup.Instance.LSConfig.NoHomeEffect > 0); if (EditorLogic.fetch != null) { var curCrew = 0; var maxCrew = 0; var supplies = 0d; var extraHabTime = 0d; var habMult = 1d; var batteryAmount = 0d; List <ModuleHabitation> habs = new List <ModuleHabitation>(); foreach (var part in EditorLogic.fetch.ship.parts) { maxCrew += part.CrewCapacity; } CMAssignmentDialog dialog = CMAssignmentDialog.Instance; if (dialog != null) { VesselCrewManifest manifest = dialog.GetManifest(); if (manifest != null) { foreach (PartCrewManifest pcm in manifest) { int partCrewCount = pcm.GetPartCrew().Count(c => c != null); if (partCrewCount > 0) { curCrew += partCrewCount; } } } } foreach (var part in EditorLogic.fetch.ship.parts) { var hab = part.Modules.GetModules <ModuleHabitation>().FirstOrDefault(); if (hab != null) { habs.Add(hab); //Certain modules, in addition to crew capacity, have living space. extraHabTime += hab.KerbalMonths; //Some modules act more as 'multipliers', dramatically extending a hab's workable lifespan. habMult += hab.HabMultiplier * Math.Min(1, (hab.CrewCapacity / curCrew)); } if (part.Resources.Contains("Supplies")) { supplies += part.Resources["Supplies"].amount; } if (part.Resources.Contains("ElectricCharge")) { batteryAmount += part.Resources["ElectricCharge"].maxAmount; } } var totalHabSpace = (LifeSupportSetup.Instance.LSConfig.BaseHabTime * maxCrew) + extraHabTime; //A Kerbal month is 30 six-hour Kerbin days. var totalHabMult = habMult * LifeSupportSetup.Instance.LSConfig.HabMultiplier * 60d * 60d * 6d * 30d; var totalBatteryTime = batteryAmount / LifeSupportSetup.Instance.LSConfig.ECAmount; var totalSupplyTime = supplies / LifeSupportSetup.Instance.LSConfig.SupplyAmount; if (EditorLogic.fetch.ship.parts.Count > 0) { List <ModuleLifeSupportRecycler> recyclers = new List <ModuleLifeSupportRecycler>(); foreach (var p in EditorLogic.fetch.ship.parts) { var mod = p.FindModuleImplementing <ModuleLifeSupportRecycler>(); if (mod == null) { continue; } recyclers.Add(mod); } var recyclerMultiplier_curCrew = LifeSupportManager.GetRecyclerMultiplierForParts(EditorLogic.fetch.ship.parts, curCrew); var recyclerMultiplier_maxCrew = LifeSupportManager.GetRecyclerMultiplierForParts(EditorLogic.fetch.ship.parts, maxCrew); var supply_curCrew = LifeSupportUtilities.SecondsToKerbinTime( totalSupplyTime / Math.Max(1, curCrew) / recyclerMultiplier_curCrew ); var supply_maxCrew = LifeSupportUtilities.SecondsToKerbinTime( totalSupplyTime / Math.Max(1, maxCrew) / recyclerMultiplier_maxCrew ); var hab_curCrew = LifeSupportUtilities.SecondsToKerbinTime(totalHabSpace / Math.Max(1, curCrew) * totalHabMult); var hab_maxCrew = LifeSupportUtilities.SecondsToKerbinTime(totalHabSpace / Math.Max(1, maxCrew) * totalHabMult); // Colors string operColor = "99FF33"; string textColor = "FFFFFF"; string crewColor = "ADD8E6"; string fadeColor = "909090"; string partColor = "FFCC00"; // SUMMARY { // column widths const int c1 = 90; const int c2 = 160; const int c3 = 160; const int c4 = 160; // LABELS GUILayout.BeginHorizontal(); GUILayout.Label("Crew", _labelStyle, GUILayout.Width(c1)); GUILayout.Label("Supplies", _labelStyle, GUILayout.Width(c2)); GUILayout.Label("Batteries", _labelStyle, GUILayout.Width(c3)); GUILayout.Label("Habitation", _labelStyle, GUILayout.Width(c4)); GUILayout.EndHorizontal(); // CURRENT CREW GUILayout.BeginHorizontal(); GUILayout.Label(CTag("Current (", textColor) + CTag(Math.Max(1, curCrew).ToString(), crewColor) + CTag(")", textColor), _labelStyle, GUILayout.Width(c1)); GUILayout.Label(CTag(supply_curCrew, textColor), _labelStyle, GUILayout.Width(c2)); GUILayout.Label( CTag(LifeSupportUtilities.SecondsToKerbinTime(totalBatteryTime / Math.Max(1, curCrew)), textColor), _labelStyle, GUILayout.Width(c3) ); if (useHabPenalties) { GUILayout.Label(CTag(hab_curCrew, textColor), _labelStyle, GUILayout.Width(160)); } else { GUILayout.Label(CTag("indefinite", textColor), _labelStyle, GUILayout.Width(c4)); } GUILayout.EndHorizontal(); // MAX CREW GUILayout.BeginHorizontal(); GUILayout.Label(CTag("Max (", textColor) + CTag(Math.Max(1, maxCrew).ToString(), crewColor) + CTag(")", textColor), _labelStyle, GUILayout.Width(c1)); GUILayout.Label(CTag(supply_maxCrew, textColor), _labelStyle, GUILayout.Width(c2)); GUILayout.Label( CTag(LifeSupportUtilities.SecondsToKerbinTime(totalBatteryTime / Math.Max(1, maxCrew)), textColor), _labelStyle, GUILayout.Width(c3) ); if (useHabPenalties) { GUILayout.Label(CTag(hab_maxCrew, textColor), _labelStyle, GUILayout.Width(160)); } else { GUILayout.Label(CTag("indefinite", textColor), _labelStyle, GUILayout.Width(160)); } GUILayout.EndHorizontal(); } GUILayout.Space(20); GUILayout.BeginHorizontal(); GUILayout.Label("<b>Details</b>", _labelStyle, GUILayout.Width(150)); GUILayout.EndHorizontal(); // HABITATION EQUATION if (useHabPenalties) { // column widths const int c1 = 150; const int c2 = 80; const int c3 = 80; const int c4 = 90; const int c5 = 80; const int c6 = 50; const int c7 = 50; // hab = ((LSConfig.BaseHabTime * maxCrew) + ExtraHabTime) * Hab-Multiplier / Crew * LSConfig.HabMultiplier[Kerbin-Months] GUILayout.BeginHorizontal(); GUILayout.Label("Habitation", _labelStyle, GUILayout.Width(c1 - 30)); GUILayout.Label(CTag("= ( (", operColor), _labelStyle, GUILayout.Width(30)); GUILayout.Label("BaseTime " + CTag("*", operColor), _labelStyle, GUILayout.Width(c2)); GUILayout.Label("MaxCrew " + CTag(") +", operColor), _labelStyle, GUILayout.Width(c3)); GUILayout.Label("ExtraTime " + CTag(") *", operColor), _labelStyle, GUILayout.Width(c4)); GUILayout.Label("Multiplier " + CTag("/", operColor), _labelStyle, GUILayout.Width(c5)); GUILayout.Label("Crew " + CTag("*", operColor), _labelStyle, GUILayout.Width(c6)); GUILayout.Label("Months", _labelStyle, GUILayout.Width(c7)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label(CTag(hab_curCrew, textColor), _labelStyle, GUILayout.Width(c1)); GUILayout.Label(CTag(LifeSupportSetup.Instance.LSConfig.BaseHabTime.ToString(), fadeColor), _labelStyle, GUILayout.Width(c2)); GUILayout.Label(CTag(maxCrew.ToString(), crewColor), _labelStyle, GUILayout.Width(c3)); GUILayout.Label(CTag(extraHabTime.ToString(), textColor), _labelStyle, GUILayout.Width(c4)); GUILayout.Label(CTag(habMult.ToString(), textColor), _labelStyle, GUILayout.Width(c5)); GUILayout.Label(CTag(Math.Max(1, curCrew).ToString(), crewColor), _labelStyle, GUILayout.Width(c6)); GUILayout.Label(CTag(LifeSupportSetup.Instance.LSConfig.HabMultiplier.ToString(), fadeColor), _labelStyle, GUILayout.Width(c7)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label(CTag(hab_maxCrew, textColor), _labelStyle, GUILayout.Width(c1)); GUILayout.Label(CTag(LifeSupportSetup.Instance.LSConfig.BaseHabTime.ToString(), fadeColor), _labelStyle, GUILayout.Width(c2)); GUILayout.Label(CTag(maxCrew.ToString(), crewColor), _labelStyle, GUILayout.Width(c3)); GUILayout.Label(CTag(extraHabTime.ToString(), textColor), _labelStyle, GUILayout.Width(c4)); GUILayout.Label(CTag(habMult.ToString(), textColor), _labelStyle, GUILayout.Width(c5)); GUILayout.Label(CTag(Math.Max(1, maxCrew).ToString(), crewColor), _labelStyle, GUILayout.Width(c6)); GUILayout.Label(CTag(LifeSupportSetup.Instance.LSConfig.HabMultiplier.ToString(), fadeColor), _labelStyle, GUILayout.Width(c7)); GUILayout.EndHorizontal(); } GUILayout.Space(20); GUILayout.BeginHorizontal(); GUILayout.Label("<b>Parts</b>", _labelStyle, GUILayout.Width(150)); GUILayout.EndHorizontal(); // RECYCLERS { // column widths const int c1 = 230; const int c2 = 80; const int c3 = 150; GUILayout.BeginHorizontal(); GUILayout.Label("Recycler", _labelStyle, GUILayout.Width(c1)); GUILayout.Label("Recycle %", _labelStyle, GUILayout.Width(c2)); GUILayout.Label("Crew-Capacity", _labelStyle, GUILayout.Width(c3)); GUILayout.EndHorizontal(); foreach (var recycler in recyclers) { GUILayout.BeginHorizontal(); GUILayout.Label(CTag(recycler.part.partInfo.title, partColor), _labelStyle, GUILayout.Width(c1)); GUILayout.Label(CTag(((int)(recycler.RecyclePercent * 100)).ToString(), textColor), _labelStyle, GUILayout.Width(c2)); GUILayout.Label(CTag(recycler.CrewCapacity.ToString(), textColor), _labelStyle, GUILayout.Width(c3)); GUILayout.EndHorizontal(); } // HABITATION if (useHabPenalties) { GUILayout.Space(10); GUILayout.BeginHorizontal(); GUILayout.Label("Habitation", _labelStyle, GUILayout.Width(c1)); GUILayout.Label("ExtraTime", _labelStyle, GUILayout.Width(c2)); GUILayout.Label("Multiplier", _labelStyle, GUILayout.Width(c3)); GUILayout.EndHorizontal(); foreach (var hab in habs) { GUILayout.BeginHorizontal(); GUILayout.Label(CTag(hab.part.partInfo.title, partColor), _labelStyle, GUILayout.Width(c1)); GUILayout.Label(CTag(hab.KerbalMonths.ToString(), textColor), _labelStyle, GUILayout.Width(c2)); GUILayout.Label(CTag(hab.HabMultiplier.ToString(), textColor), _labelStyle, GUILayout.Width(c3)); GUILayout.EndHorizontal(); } } } } } GUILayout.EndVertical(); GUILayout.EndScrollView(); GUILayout.EndVertical(); GUI.DragWindow(); }