Пример #1
0
        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 = "-";
                }
            }
        }
Пример #2
0
        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();
        }
Пример #3
0
        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   = "-";
                }
            }
        }
Пример #4
0
        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();
        }