Ejemplo n.º 1
0
        public void Load(ConfigNode node)
        {
            if (node.HasNode(configNodeName))
            {
                ConfigNode settingsNode = node.GetNode(configNodeName);

                settingsNode.TryGetValue("IsNewSave", ref IsNewSave);

                knownCrew.Clear();
                var crewNodes = settingsNode.GetNodes(CrewMemberInfo.ConfigNodeName);
                foreach (ConfigNode crewNode in crewNodes)
                {
                    CrewMemberInfo crewMemberInfo = CrewMemberInfo.Load(crewNode);
                    knownCrew[crewMemberInfo.name] = crewMemberInfo;
                }

                knownVessels.Clear();
                var vesselNodes = settingsNode.GetNodes(VesselInfo.ConfigNodeName);
                foreach (ConfigNode vesselNode in vesselNodes)
                {
                    if (vesselNode.HasValue("Guid"))
                    {
                        Guid       id         = new Guid(vesselNode.GetValue("Guid"));
                        VesselInfo vesselInfo = VesselInfo.Load(vesselNode);
                        knownVessels[id] = vesselInfo;
                    }
                }
            }
        }
Ejemplo n.º 2
0
        public static CrewMemberInfo Load(ConfigNode node)
        {
            string name       = Utilities.GetValue(node, "name", "Unknown");
            double lastUpdate = Utilities.GetValue(node, "lastUpdate", 0.0);
            string vesselName = Utilities.GetValue(node, "vesselName", "Unknown");
            Guid   vesselId;

            if (node.HasValue("vesselId"))
            {
                vesselId = new Guid(node.GetValue("vesselId"));
            }
            else
            {
                vesselId = Guid.Empty;
            }

            CrewMemberInfo info = new CrewMemberInfo(name, vesselName, vesselId, lastUpdate);

            info.vesselIsPreLaunch = Utilities.GetValue(node, "vesselIsPreLaunch", true);
            info.lastFood          = Utilities.GetValue(node, "lastFood", lastUpdate);
            info.lastWater         = Utilities.GetValue(node, "lastWater", lastUpdate);
            info.hibernating       = Utilities.GetValue(node, "hibernating", false);
            info.DFfrozen          = Utilities.GetValue(node, "DFFrozen", false);
            info.recoverykerbal    = Utilities.GetValue(node, "recoverykerbal", false);
            info.crewType          = Utilities.GetValue(node, "crewType", info.crewType);
            return(info);
        }
Ejemplo n.º 3
0
        public void Load(ConfigNode node)
        {
            if (node.HasNode(configNodeName))
            {
                ConfigNode settingsNode = node.GetNode(configNodeName);

                IsNewSave = Utilities.GetValue(settingsNode, "IsNewSave", IsNewSave);
                Enabled   = Utilities.GetValue(settingsNode, "Enabled", Enabled);
                HibernateInsteadOfKill = Utilities.GetValue(settingsNode, "HibernateInsteadOfKill", HibernateInsteadOfKill);
                RespawnDelay           = Utilities.GetValue(settingsNode, "RespawnDelay", RespawnDelay);

                knownCrew.Clear();
                var crewNodes = settingsNode.GetNodes(CrewMemberInfo.ConfigNodeName);
                foreach (ConfigNode crewNode in crewNodes)
                {
                    CrewMemberInfo crewMemberInfo = CrewMemberInfo.Load(crewNode);
                    knownCrew[crewMemberInfo.name] = crewMemberInfo;
                }

                knownVessels.Clear();
                var vesselNodes = settingsNode.GetNodes(VesselInfo.ConfigNodeName);
                foreach (ConfigNode vesselNode in vesselNodes)
                {
                    if (vesselNode.HasValue("Guid"))
                    {
                        Guid       id         = new Guid(vesselNode.GetValue("Guid"));
                        VesselInfo vesselInfo = VesselInfo.Load(vesselNode);
                        knownVessels[id] = vesselInfo;
                    }
                }
            }
        }
        private void EmptyEvaSuit(CrewMemberInfo crewMemberInfo, Part part)
        {
            VesselInfo lastVesselInfo = knownVessels[crewMemberInfo.vesselId];

            RequestResource(settings.Food, -lastVesselInfo.remainingFood, part);
            RequestResource(settings.Water, -lastVesselInfo.remainingWater, part);
            RequestResource(settings.Oxygen, -lastVesselInfo.remainingOxygen, part);
            RequestResource(settings.Electricity, -lastVesselInfo.remainingElectricity, part);
            RequestResource(settings.CO2, -lastVesselInfo.remainingCO2, part);
            RequestResource(settings.Waste, -lastVesselInfo.remainingWaste, part);
            RequestResource(settings.WasteWater, -lastVesselInfo.remainingWasteWater, part);
        }
        private void ConsumeResources(double currentTime, Vessel vessel, VesselInfo vesselInfo)
        {
            ConsumeElectricity(currentTime, vessel, vesselInfo);
            ConsumeOxygen(currentTime, vessel, vesselInfo);

            vesselInfo.lastFood    = currentTime;
            vesselInfo.lastWater   = currentTime;
            vesselInfo.hibernating = false;

            List <ProtoCrewMember> crew = vessel.GetVesselCrew();
            var knownCrew = gameSettings.knownCrew;

            foreach (ProtoCrewMember crewMember in crew)
            {
                if (knownCrew.ContainsKey(crewMember.name))
                {
                    CrewMemberInfo crewMemberInfo = knownCrew[crewMember.name];
                    Part           part           = (crewMember.KerbalRef != null) ? crewMember.KerbalRef.InPart : vessel.rootPart;

                    ConsumeFood(currentTime, vessel, vesselInfo, crewMember, crewMemberInfo, part);
                    ConsumeWater(currentTime, vessel, vesselInfo, crewMember, crewMemberInfo, part);

                    crewMemberInfo.lastUpdate = currentTime;
                    crewMemberInfo.vesselId   = vessel.id;
                    crewMemberInfo.vesselName = (!vessel.isEVA) ? vessel.vesselName : "EVA";

                    if (vesselInfo.lastFood > crewMemberInfo.lastFood)
                    {
                        vesselInfo.lastFood = crewMemberInfo.lastFood;
                    }
                    if (vesselInfo.lastWater > crewMemberInfo.lastWater)
                    {
                        vesselInfo.lastWater = crewMemberInfo.lastWater;
                    }
                    if (crewMemberInfo.hibernating)
                    {
                        vesselInfo.hibernating = true;
                    }
                }
                else
                {
                    this.LogWarning("Unknown crew member: " + crewMember.name);
                    knownCrew[crewMember.name] = new CrewMemberInfo(crewMember.name, vessel.vesselName, vessel.id, currentTime);
                }
            }

            vesselInfo.lastUpdate = currentTime;
            vesselInfo.vesselName = vessel.vesselName;
            vesselInfo.vesselType = vessel.vesselType.ToString();
        }
Ejemplo n.º 6
0
        public override void OnLoad(ConfigNode node)
        {
            Debug.Log("TAC Life Support (LifeSupportModule) [" + this.GetInstanceID().ToString("X") + "][" + Time.time + "]: OnLoad");
            base.OnLoad(node);

            if (LifeSupportController.Instance != null)
            {
                Dictionary <string, CrewMemberInfo> knownCrew = LifeSupportController.Instance.knownCrew;
                var crewNodes = node.GetNodes("CrewMemberInfo");
                foreach (ConfigNode crewNode in crewNodes)
                {
                    CrewMemberInfo crewMemberInfo = new CrewMemberInfo(crewNode, vessel);
                    knownCrew[crewMemberInfo.name] = crewMemberInfo;
                }
            }
        }
Ejemplo n.º 7
0
        public override void OnLoad(ConfigNode node)
        {
            Debug.Log("TAC Life Support (LifeSupportModule) [" + this.GetInstanceID().ToString("X") + "][" + Time.time + "]: OnLoad");
            base.OnLoad(node);

            if (LifeSupportController.Instance != null)
            {
                Dictionary<string, CrewMemberInfo> knownCrew = LifeSupportController.Instance.knownCrew;
                var crewNodes = node.GetNodes("CrewMemberInfo");
                foreach (ConfigNode crewNode in crewNodes)
                {
                    CrewMemberInfo crewMemberInfo = new CrewMemberInfo(crewNode, vessel);
                    knownCrew[crewMemberInfo.name] = crewMemberInfo;
                }
            }
        }
Ejemplo n.º 8
0
        public void Load(ConfigNode node)
        {
            if (node.HasNode(configNodeName))
            {
                ConfigNode settingsNode = node.GetNode(configNodeName);
                settingsNode.TryGetValue("Version", ref file_full_version);
                settingsNode.TryGetValue("IsNewSave", ref IsNewSave);
                if (IsNewSave)
                {
                    GetNewFileVersion();
                    compatible = true;
                }
                else
                {
                    CheckFileVersion();
                }

                knownVessels.Clear();
                var vesselNodes = settingsNode.GetNodes(VesselInfo.ConfigNodeName);
                foreach (ConfigNode vesselNode in vesselNodes)
                {
                    if (vesselNode.HasValue("Guid"))
                    {
                        Guid       id         = new Guid(vesselNode.GetValue("Guid"));
                        VesselInfo vesselInfo = VesselInfo.Load(vesselNode);
                        knownVessels[id] = vesselInfo;
                    }
                }

                knownCrew.Clear();
                var crewNodes = settingsNode.GetNodes(CrewMemberInfo.ConfigNodeName);
                foreach (ConfigNode crewNode in crewNodes)
                {
                    CrewMemberInfo crewMemberInfo = CrewMemberInfo.Load(crewNode);
                    knownCrew[crewMemberInfo.name] = crewMemberInfo;
                    if (knownVessels.Contains(crewMemberInfo.vesselId))
                    {
                        knownVessels[crewMemberInfo.vesselId].CrewInVessel.Add(crewMemberInfo);
                    }
                }
            }

            if (!compatible)
            {
                ProcessSaveUpgrade();
            }
        }
Ejemplo n.º 9
0
        public override void OnSave(ConfigNode node)
        {
            Debug.Log("TAC Life Support (LifeSupportModule) [" + this.GetInstanceID().ToString("X") + "][" + Time.time + "]: OnSave");
            base.OnSave(node);

            if (LifeSupportController.Instance != null)
            {
                Dictionary <string, CrewMemberInfo> knownCrew = LifeSupportController.Instance.knownCrew;
                foreach (ProtoCrewMember crewMember in part.protoModuleCrew)
                {
                    CrewMemberInfo crewMemberInfo = knownCrew[crewMember.name];
                    if (crewMemberInfo != null)
                    {
                        crewMemberInfo.Save(node);
                    }
                }
            }
        }
        private void ConsumeResources(double currentTime, Vessel vessel, VesselInfo vesselInfo)
        {
            // Electricity
            ConsumeElectricity(currentTime, vessel, vesselInfo);

            List <ProtoCrewMember> crew = vessel.GetVesselCrew();

            foreach (ProtoCrewMember crewMember in crew)
            {
                if (knownCrew.ContainsKey(crewMember.name))
                {
                    CrewMemberInfo crewMemberInfo = knownCrew[crewMember.name];
                    var            part           = (crewMember.KerbalRef != null) ? crewMember.KerbalRef.InPart : vessel.rootPart;

                    if (crewMemberInfo.vesselId != vessel.id && crewMemberInfo.isEVA)
                    {
                        // The crewmember came back inside after EVA, return the remaining resources out of the suit
                        EmptyEvaSuit(crewMemberInfo, part);
                    }

                    // Oxygen
                    ConsumeOxygen(currentTime, vessel, vesselInfo, crewMember, crewMemberInfo, part);

                    // Water
                    ConsumeWater(currentTime, vessel, vesselInfo, crewMember, crewMemberInfo, part);

                    // Food
                    ConsumeFood(currentTime, vessel, vesselInfo, crewMember, crewMemberInfo, part);

                    crewMemberInfo.lastUpdate = currentTime;
                    crewMemberInfo.vesselId   = vessel.id;
                    crewMemberInfo.isEVA      = vessel.isEVA;
                }
                else
                {
                    Debug.Log("TAC Life Support (LifeSupportController) [" + this.GetInstanceID().ToString("X") + "][" + Time.time + "]: Unknown crew member: " + crewMember.name);
                    knownCrew[crewMember.name] = new CrewMemberInfo(crewMember.name, vessel, currentTime);
                }
            }

            vesselInfo.lastUpdate = currentTime;
        }
        private void FillEvaSuit(Vessel evaVessel)
        {
            ProtoCrewMember crewMember     = evaVessel.GetVesselCrew()[0];
            CrewMemberInfo  crewMemberInfo = knownCrew[crewMember.name];

            if (crewMemberInfo.vesselId != evaVessel.id)
            {
                Debug.Log("TAC Life Support (LifeSupportController) [" + this.GetInstanceID().ToString("X") + "][" + Time.time + "]: Filling EVA suit for " + crewMember.name);

                Vessel     lastVessel     = FlightGlobals.Vessels.Find(v => v.id.Equals(crewMemberInfo.vesselId));
                VesselInfo lastVesselInfo = knownVessels[crewMemberInfo.vesselId];

                double desiredFood        = settings.FoodConsumptionRate * settings.EvaDefaultResourceAmount;
                double desiredWater       = settings.WaterConsumptionRate * settings.EvaDefaultResourceAmount;
                double desiredOxygen      = settings.OxygenConsumptionRate * settings.EvaDefaultResourceAmount;
                double desiredElectricity = settings.EvaElectricityConsumptionRate * settings.EvaDefaultResourceAmount;

                Part oldPart = lastVessel.rootPart;
                int  numCrew = lastVessel.GetCrewCount() + 1;

                double foodObtained        = RequestResource(settings.Food, Min(desiredFood, lastVesselInfo.remainingFood / numCrew, lastVesselInfo.remainingFood * 0.95), oldPart);
                double waterObtained       = RequestResource(settings.Water, Min(desiredWater, lastVesselInfo.remainingWater / numCrew, lastVesselInfo.remainingWater * 0.95), oldPart);
                double oxygenObtained      = RequestResource(settings.Oxygen, Min(desiredOxygen, lastVesselInfo.remainingOxygen / numCrew, lastVesselInfo.remainingOxygen * 0.95), oldPart);
                double electricityObtained = RequestResource(settings.Electricity, Min(desiredElectricity, lastVesselInfo.remainingElectricity / numCrew, lastVesselInfo.remainingElectricity * 0.95), oldPart);

                Part newPart = evaVessel.rootPart;
                RequestResource(settings.Food, -foodObtained, newPart);
                RequestResource(settings.Water, -waterObtained, newPart);
                RequestResource(settings.Oxygen, -oxygenObtained, newPart);
                RequestResource(settings.Electricity, -electricityObtained, newPart);

                crewMemberInfo.vesselId = evaVessel.id;
                crewMemberInfo.isEVA    = true;
            }
            else
            {
                Debug.Log("TAC Life Support (LifeSupportController) [" + this.GetInstanceID().ToString("X") + "][" + Time.time + "]: EVA suit for " + crewMember.name + " has already been filled.");
            }
        }
Ejemplo n.º 12
0
        public static CrewMemberInfo Load(ConfigNode node)
        {
            string name       = Utilities.GetValue(node, "name", "Unknown");
            double lastUpdate = Utilities.GetValue(node, "lastUpdate", 0.0);
            string vesselName = Utilities.GetValue(node, "vesselName", "Unknown");
            Guid   vesselId;

            if (node.HasValue("vesselId"))
            {
                vesselId = new Guid(node.GetValue("vesselId"));
            }
            else
            {
                vesselId = Guid.Empty;
            }

            CrewMemberInfo info = new CrewMemberInfo(name, vesselName, vesselId, lastUpdate);

            info.lastFood    = Utilities.GetValue(node, "lastFood", lastUpdate);
            info.lastWater   = Utilities.GetValue(node, "lastWater", lastUpdate);
            info.hibernating = Utilities.GetValue(node, "hibernating", false);

            return(info);
        }
        private void ConsumeFood(double currentTime, Vessel vessel, VesselInfo vesselInfo, ProtoCrewMember crewMember, CrewMemberInfo crewMemberInfo, Part part)
        {
            if (vesselInfo.remainingFood >= settings.FoodConsumptionRate)
            {
                double desiredFood = settings.FoodConsumptionRate * (currentTime - crewMemberInfo.lastUpdate);
                double foodObtained = RequestResource(settings.Food, Min(desiredFood, vesselInfo.remainingFood / vesselInfo.numCrew, vesselInfo.remainingFood * 0.95), part);

                double wasteProduced = foodObtained * settings.WasteProductionRate / settings.FoodConsumptionRate;
                RequestResource(settings.Waste, -wasteProduced, part);

                crewMemberInfo.lastFood = currentTime - ((desiredFood - foodObtained) / settings.FoodConsumptionRate);
            }
            else
            {
                double timeWithoutFood = currentTime - crewMemberInfo.lastFood;
                if (timeWithoutFood > (settings.MaxTimeWithoutFood + crewMemberInfo.respite))
                {
                    KillCrewMember(crewMember, "starvation", vessel);
                }
            }
        }
Ejemplo n.º 14
0
        protected override void DrawWindowContents(int windowID)
        {
            scrollPosition = GUILayout.BeginScrollView(scrollPosition);
            GUILayout.BeginVertical();
            GUILayout.Space(4);

            double currentTime = Planetarium.GetUniversalTime();

            Dictionary <string, CrewMemberInfo> .Enumerator crewenumerator = gameSettings.knownCrew.GetDictEnumerator();
            while (crewenumerator.MoveNext())
            {
                CrewMemberInfo crewInfo = crewenumerator.Current.Value;
                GUILayout.Label(crewInfo.name + " (" + crewInfo.vesselName + ")", headerStyle);
                if (crewInfo.DFfrozen)
                {
                    if (crewInfo.vesselIsPreLaunch)
                    {
                        GUILayout.Label(cacheautoLOC_TACLS_00027, frozenStyle); // cacheautoLOC_TACLS_00027 = \u0020\u0020Prelaunch - Frozen
                    }
                    else
                    {
                        GUILayout.Label(cacheautoLOC_TACLS_00028, frozenStyle); // cacheautoLOC_TACLS_00028 = \u0020\u0020Frozen
                    }
                }
                else if (crewInfo.vesselIsPreLaunch)
                {
                    GUILayout.Label(cacheautoLOC_TACLS_00029, labelStyle); // cacheautoLOC_TACLS_00029 = \u0020\u0020Prelaunch
                }
                else if (crewInfo.recoverykerbal)
                {
                    GUILayout.Label(cacheautoLOC_TACLS_00030, labelStyle); // cacheautoLOC_TACLS_00030 = \u0020\u0020Rescue Me!
                }
                else
                {
                    GUILayout.BeginHorizontal();
                    GUILayout.Label(cacheautoLOC_TACLS_00031, labelStyle, GUILayout.Width(150)); // cacheautoLOC_TACLS_00031 = \u0020\u0020Last updated:\u0020
                    GUILayout.Label(Utilities.FormatTime(currentTime - crewInfo.lastUpdate), labelStyle);
                    GUILayout.EndHorizontal();
                    GUILayout.BeginHorizontal();
                    GUILayout.Label(cacheautoLOC_TACLS_00032, labelStyle, GUILayout.Width(150)); // cacheautoLOC_TACLS_00032 = \u0020\u0020Last food:\u0020
                    GUILayout.Label(Utilities.FormatTime(currentTime - crewInfo.lastFood),
                                    getStyle(crewInfo.lastUpdate, crewInfo.lastFood, HighLogic.CurrentGame.Parameters.CustomParams <TAC_SettingsParms_Sec3>().MaxTimeWithoutFood));
                    GUILayout.EndHorizontal();
                    GUILayout.BeginHorizontal();
                    GUILayout.Label(cacheautoLOC_TACLS_00033, labelStyle, GUILayout.Width(150)); // cacheautoLOC_TACLS_00033 = \u0020\u0020Last water:\u0020
                    GUILayout.Label(Utilities.FormatTime(currentTime - crewInfo.lastWater),
                                    getStyle(crewInfo.lastUpdate, crewInfo.lastWater, HighLogic.CurrentGame.Parameters.CustomParams <TAC_SettingsParms_Sec3>().MaxTimeWithoutWater));
                    GUILayout.EndHorizontal();
                    if (HighLogic.CurrentGame.Parameters.CustomParams <TAC_SettingsParms>().hibernate != "Die" ||
                        crewInfo.hibernating)
                    {
                        GUILayout.BeginHorizontal();
                        GUILayout.Label(cacheautoLOC_TACLS_00034, labelStyle, GUILayout.Width(150));  // cacheautoLOC_TACLS_00034 = \u0020\u0020Hibernating:\u0020
                        GUILayout.Label(crewInfo.hibernating.ToString(), labelStyle);
                        GUILayout.EndHorizontal();
                    }
                }
                GUILayout.Space(10);
            }
            if (gameSettings.knownCrew.Count == 0)
            {
                GUILayout.Label(cacheautoLOC_TACLS_00035, headerStyle); // cacheautoLOC_TACLS_00035 = No Crew.
            }

            GUILayout.EndVertical();
            GUILayout.EndScrollView();

            GUILayout.Space(8);
        }
        private void ConsumeWater(double currentTime, Vessel vessel, VesselInfo vesselInfo, ProtoCrewMember crewMember, CrewMemberInfo crewMemberInfo, Part part)
        {
            if (vesselInfo.remainingWater >= settings.WaterConsumptionRate)
            {
                double desiredWater = settings.WaterConsumptionRate * (currentTime - crewMemberInfo.lastUpdate);
                double waterObtained = RequestResource(settings.Water, Min(desiredWater, vesselInfo.remainingWater / vesselInfo.numCrew, vesselInfo.remainingWater * 0.95), part);

                double wasteWaterProduced = waterObtained * settings.WasteWaterProductionRate / settings.WaterConsumptionRate;
                RequestResource(settings.WasteWater, -wasteWaterProduced, part);

                crewMemberInfo.lastWater = currentTime - ((desiredWater - waterObtained) / settings.WaterConsumptionRate);
            }
            else
            {
                double timeWithoutWater = currentTime - crewMemberInfo.lastWater;
                if (timeWithoutWater > (settings.MaxTimeWithoutWater + crewMemberInfo.respite))
                {
                    KillCrewMember(crewMember, "dehydration", vessel);
                }
            }
        }
        private void ConsumeOxygen(double currentTime, Vessel vessel, VesselInfo vesselInfo, ProtoCrewMember crewMember, CrewMemberInfo crewMemberInfo, Part part)
        {
            if (!vessel.orbit.referenceBody.atmosphereContainsOxygen || FlightGlobals.getStaticPressure() < 0.2)
            {
                if (vesselInfo.remainingOxygen >= settings.OxygenConsumptionRate)
                {
                    double desiredOxygen = settings.OxygenConsumptionRate * (currentTime - crewMemberInfo.lastUpdate);
                    double oxygenObtained = RequestResource(settings.Oxygen, Min(desiredOxygen, vesselInfo.remainingOxygen / vesselInfo.numCrew, vesselInfo.remainingOxygen * 0.95), part);

                    double co2Production = oxygenObtained * settings.CO2ProductionRate / settings.OxygenConsumptionRate;
                    RequestResource(settings.CO2, -co2Production, part);

                    crewMemberInfo.lastOxygen = currentTime - ((desiredOxygen - oxygenObtained) / settings.OxygenConsumptionRate);
                }
                else
                {
                    double timeWithoutOxygen = currentTime - crewMemberInfo.lastOxygen;
                    if (timeWithoutOxygen > (settings.MaxTimeWithoutOxygen + crewMemberInfo.respite))
                    {
                        KillCrewMember(crewMember, "oxygen deprivation", vessel);
                    }
                }
            }
            else
            {
                crewMemberInfo.lastOxygen = currentTime;
            }
        }
        private void ConsumeWater(double currentTime, Vessel vessel, VesselInfo vesselInfo, ProtoCrewMember crewMember, CrewMemberInfo crewMemberInfo, Part part)
        {
            if (vesselInfo.remainingWater >= settings.WaterConsumptionRate)
            {
                double desiredWater  = settings.WaterConsumptionRate * (currentTime - crewMemberInfo.lastUpdate);
                double waterObtained = RequestResource(settings.Water, Min(desiredWater, vesselInfo.remainingWater / vesselInfo.numCrew, vesselInfo.remainingWater * 0.95), part);

                double wasteWaterProduced = waterObtained * settings.WasteWaterProductionRate / settings.WaterConsumptionRate;
                RequestResource(settings.WasteWater, -wasteWaterProduced, part);

                crewMemberInfo.lastWater = currentTime - ((desiredWater - waterObtained) / settings.WaterConsumptionRate);
            }
            else
            {
                double timeWithoutWater = currentTime - crewMemberInfo.lastWater;
                if (timeWithoutWater > (settings.MaxTimeWithoutWater + crewMemberInfo.respite))
                {
                    KillCrewMember(crewMember, "dehydration", vessel);
                }
            }
        }
        private void ConsumeOxygen(double currentTime, Vessel vessel, VesselInfo vesselInfo, ProtoCrewMember crewMember, CrewMemberInfo crewMemberInfo, Part part)
        {
            if (!vessel.orbit.referenceBody.atmosphereContainsOxygen || FlightGlobals.getStaticPressure() < 0.2)
            {
                if (vesselInfo.remainingOxygen >= settings.OxygenConsumptionRate)
                {
                    double desiredOxygen  = settings.OxygenConsumptionRate * (currentTime - crewMemberInfo.lastUpdate);
                    double oxygenObtained = RequestResource(settings.Oxygen, Min(desiredOxygen, vesselInfo.remainingOxygen / vesselInfo.numCrew, vesselInfo.remainingOxygen * 0.95), part);

                    double co2Production = oxygenObtained * settings.CO2ProductionRate / settings.OxygenConsumptionRate;
                    RequestResource(settings.CO2, -co2Production, part);

                    crewMemberInfo.lastOxygen = currentTime - ((desiredOxygen - oxygenObtained) / settings.OxygenConsumptionRate);
                }
                else
                {
                    double timeWithoutOxygen = currentTime - crewMemberInfo.lastOxygen;
                    if (timeWithoutOxygen > (settings.MaxTimeWithoutOxygen + crewMemberInfo.respite))
                    {
                        KillCrewMember(crewMember, "oxygen deprivation", vessel);
                    }
                }
            }
            else
            {
                crewMemberInfo.lastOxygen = currentTime;
            }
        }
 private void EmptyEvaSuit(CrewMemberInfo crewMemberInfo, Part part)
 {
     VesselInfo lastVesselInfo = knownVessels[crewMemberInfo.vesselId];
     RequestResource(settings.Food, -lastVesselInfo.remainingFood, part);
     RequestResource(settings.Water, -lastVesselInfo.remainingWater, part);
     RequestResource(settings.Oxygen, -lastVesselInfo.remainingOxygen, part);
     RequestResource(settings.Electricity, -lastVesselInfo.remainingElectricity, part);
     RequestResource(settings.CO2, -lastVesselInfo.remainingCO2, part);
     RequestResource(settings.Waste, -lastVesselInfo.remainingWaste, part);
     RequestResource(settings.WasteWater, -lastVesselInfo.remainingWasteWater, part);
 }
        private void ConsumeFood(double currentTime, Vessel vessel, VesselInfo vesselInfo, ProtoCrewMember crewMember, CrewMemberInfo crewMemberInfo, Part part)
        {
            if (vesselInfo.remainingFood >= settings.FoodConsumptionRate)
            {
                double desiredFood  = settings.FoodConsumptionRate * (currentTime - crewMemberInfo.lastUpdate);
                double foodObtained = RequestResource(settings.Food, Min(desiredFood, vesselInfo.remainingFood / vesselInfo.numCrew, vesselInfo.remainingFood * 0.95), part);

                double wasteProduced = foodObtained * settings.WasteProductionRate / settings.FoodConsumptionRate;
                RequestResource(settings.Waste, -wasteProduced, part);

                crewMemberInfo.lastFood = currentTime - ((desiredFood - foodObtained) / settings.FoodConsumptionRate);
            }
            else
            {
                double timeWithoutFood = currentTime - crewMemberInfo.lastFood;
                if (timeWithoutFood > (settings.MaxTimeWithoutFood + crewMemberInfo.respite))
                {
                    KillCrewMember(crewMember, "starvation", vessel);
                }
            }
        }
Ejemplo n.º 21
0
        private void ConsumeFood(double currentTime, Vessel vessel, VesselInfo vesselInfo, ProtoCrewMember crewMember, CrewMemberInfo crewMemberInfo, Part part)
        {
            if (vesselInfo.remainingFood >= globalSettings.FoodConsumptionRate)
            {
                double deltaTime = Math.Min(currentTime - crewMemberInfo.lastFood, globalSettings.MaxDeltaTime);
                double desiredFood = globalSettings.FoodConsumptionRate * deltaTime;
                double foodObtained = part.TakeResource(globalSettings.FoodId, Math.Min(desiredFood, vesselInfo.remainingFood / vesselInfo.numCrew));

                double wasteProduced = foodObtained * globalSettings.WasteProductionRate / globalSettings.FoodConsumptionRate;
                part.TakeResource(globalSettings.WasteId, -wasteProduced);

                crewMemberInfo.lastFood += deltaTime - ((desiredFood - foodObtained) / globalSettings.FoodConsumptionRate);
                crewMemberInfo.hibernating = false;
            }
            else
            {
                double timeWithoutFood = currentTime - crewMemberInfo.lastFood;
                if (timeWithoutFood > (globalSettings.MaxTimeWithoutFood + crewMemberInfo.respite))
                {
                    if (!gameSettings.HibernateInsteadOfKill)
                    {
                        KillCrewMember(crewMember, "starvation", vessel);
                    }
                    else
                    {
                        crewMemberInfo.hibernating = true;
                    }
                }
            }
        }
Ejemplo n.º 22
0
        private void ConsumeWater(double currentTime, Vessel vessel, VesselInfo vesselInfo, ProtoCrewMember crewMember, CrewMemberInfo crewMemberInfo, Part part)
        {
            if (vesselInfo.remainingWater >= globalSettings.WaterConsumptionRate)
            {
                double deltaTime = Math.Min(currentTime - crewMemberInfo.lastWater, globalSettings.MaxDeltaTime);
                double desiredWater = globalSettings.WaterConsumptionRate * deltaTime;
                double waterObtained = part.TakeResource(globalSettings.WaterId, Math.Min(desiredWater, vesselInfo.remainingWater / vesselInfo.numCrew));

                double wasteWaterProduced = waterObtained * globalSettings.WasteWaterProductionRate / globalSettings.WaterConsumptionRate;
                part.TakeResource(globalSettings.WasteWaterId, -wasteWaterProduced);

                crewMemberInfo.lastWater += deltaTime - ((desiredWater - waterObtained) / globalSettings.WaterConsumptionRate);
                crewMemberInfo.hibernating = false;
            }
            else
            {
                double timeWithoutWater = currentTime - crewMemberInfo.lastWater;
                if (timeWithoutWater > (globalSettings.MaxTimeWithoutWater + crewMemberInfo.respite))
                {
                    if (!gameSettings.HibernateInsteadOfKill)
                    {
                        KillCrewMember(crewMember, "dehydration", vessel);
                    }
                    else
                    {
                        crewMemberInfo.hibernating = true;
                    }
                }
            }
        }
        void FixedUpdate()
        {
            if (Time.timeSinceLevelLoad < 1.0f || !FlightGlobals.ready || loadingNewScene)
            {
                return;
            }

            double currentTime  = Planetarium.GetUniversalTime();
            var    allVessels   = FlightGlobals.Vessels;
            var    knownVessels = gameSettings.knownVessels;

            var vesselsToDelete = new List <Guid>();

            foreach (var entry in knownVessels)
            {
                Guid       vesselId   = entry.Key;
                VesselInfo vesselInfo = entry.Value;
                Vessel     vessel     = allVessels.Find(v => v.id == vesselId);

                if (vessel == null)
                {
                    this.Log("Deleting vessel " + vesselInfo.vesselName + " - vessel does not exist anymore");
                    vesselsToDelete.Add(vesselId);
                    var crewToDelete = gameSettings.knownCrew.Where(e => e.Value.vesselId == vesselId).Select(e => e.Key).ToList();
                    foreach (String name in crewToDelete)
                    {
                        this.Log("Deleting crew member: " + name);
                        gameSettings.knownCrew.Remove(name);
                    }
                    continue;
                }

                if (vessel.loaded)
                {
                    int crewCapacity = UpdateVesselInfo(vesselInfo, vessel);

                    if (crewCapacity == 0)
                    {
                        this.Log("Deleting vessel " + vesselInfo.vesselName + " - no crew parts anymore");
                        vesselsToDelete.Add(vesselId);
                        continue;
                    }
                }

                if (vesselInfo.numCrew > 0)
                {
                    double foodRate = globalSettings.FoodConsumptionRate * vesselInfo.numCrew;
                    vesselInfo.estimatedTimeFoodDepleted = vesselInfo.lastFood + (vesselInfo.remainingFood / foodRate);
                    double estimatedFood = vesselInfo.remainingFood - ((currentTime - vesselInfo.lastFood) * foodRate);
                    ShowWarnings(vessel, estimatedFood, vesselInfo.maxFood, foodRate, globalSettings.Food, ref vesselInfo.foodStatus);

                    double waterRate = globalSettings.WaterConsumptionRate * vesselInfo.numCrew;
                    vesselInfo.estimatedTimeWaterDepleted = vesselInfo.lastWater + (vesselInfo.remainingWater / waterRate);
                    double estimatedWater = vesselInfo.remainingWater - ((currentTime - vesselInfo.lastWater) * waterRate);
                    ShowWarnings(vessel, estimatedWater, vesselInfo.maxWater, waterRate, globalSettings.Water, ref vesselInfo.waterStatus);

                    double oxygenRate = globalSettings.OxygenConsumptionRate * vesselInfo.numCrew;
                    vesselInfo.estimatedTimeOxygenDepleted = vesselInfo.lastOxygen + (vesselInfo.remainingOxygen / oxygenRate);
                    double estimatedOxygen = vesselInfo.remainingOxygen - ((currentTime - vesselInfo.lastOxygen) * oxygenRate);
                    ShowWarnings(vessel, estimatedOxygen, vesselInfo.maxOxygen, oxygenRate, globalSettings.Oxygen, ref vesselInfo.oxygenStatus);

                    vesselInfo.estimatedTimeElectricityDepleted = vesselInfo.lastElectricity + (vesselInfo.remainingElectricity / vesselInfo.estimatedElectricityConsumptionRate);
                    if (vessel.loaded)
                    {
                        ShowWarnings(vessel, vesselInfo.remainingElectricity, vesselInfo.maxElectricity, vesselInfo.estimatedElectricityConsumptionRate, globalSettings.Electricity, ref vesselInfo.electricityStatus);
                    }
                }

                if (vessel.loaded)
                {
                    ConsumeResources(currentTime, vessel, vesselInfo);
                }
            }

            vesselsToDelete.ForEach(id => knownVessels.Remove(id));

            foreach (Vessel vessel in allVessels.Where(v => v.loaded))
            {
                if (!knownVessels.ContainsKey(vessel.id) && vessel.parts.Any(p => p.protoModuleCrew.Any()) && IsLaunched(vessel))
                {
                    this.Log("New vessel: " + vessel.vesselName + " (" + vessel.id + ")");
                    VesselInfo vesselInfo = new VesselInfo(vessel.vesselName, currentTime);
                    knownVessels[vessel.id] = vesselInfo;
                    UpdateVesselInfo(vesselInfo, vessel);

                    var knownCrew = gameSettings.knownCrew;
                    foreach (ProtoCrewMember crewMember in vessel.GetVesselCrew())
                    {
                        if (knownCrew.ContainsKey(crewMember.name))
                        {
                            CrewMemberInfo crewMemberInfo = knownCrew[crewMember.name];
                            crewMemberInfo.vesselId   = vessel.id;
                            crewMemberInfo.vesselName = vessel.vesselName;
                        }
                        else
                        {
                            this.Log("New crew member: " + crewMember.name);
                            knownCrew[crewMember.name] = new CrewMemberInfo(crewMember.name, vessel.vesselName, vessel.id, currentTime);
                        }
                    }
                }
            }
        }
        private void ConsumeWater(double currentTime, Vessel vessel, VesselInfo vesselInfo, ProtoCrewMember crewMember, CrewMemberInfo crewMemberInfo, Part part)
        {
            if (vesselInfo.remainingWater >= globalSettings.WaterConsumptionRate)
            {
                double deltaTime     = Math.Min(currentTime - crewMemberInfo.lastWater, globalSettings.MaxDeltaTime);
                double desiredWater  = globalSettings.WaterConsumptionRate * deltaTime;
                double waterObtained = part.TakeResource(globalSettings.WaterId, Math.Min(desiredWater, vesselInfo.remainingWater / vesselInfo.numCrew));

                double wasteWaterProduced = waterObtained * globalSettings.WasteWaterProductionRate / globalSettings.WaterConsumptionRate;
                part.TakeResource(globalSettings.WasteWaterId, -wasteWaterProduced);

                crewMemberInfo.lastWater  += deltaTime - ((desiredWater - waterObtained) / globalSettings.WaterConsumptionRate);
                crewMemberInfo.hibernating = false;
            }
            else
            {
                double timeWithoutWater = currentTime - crewMemberInfo.lastWater;
                if (timeWithoutWater > (globalSettings.MaxTimeWithoutWater + crewMemberInfo.respite))
                {
                    if (!gameSettings.HibernateInsteadOfKill)
                    {
                        KillCrewMember(crewMember, "dehydration", vessel);
                    }
                    else
                    {
                        crewMemberInfo.hibernating = true;
                    }
                }
            }
        }
Ejemplo n.º 25
0
        void FixedUpdate()
        {
            if (Time.timeSinceLevelLoad < 1.0f || loadingNewScene)
            {
                return;
            }

            // If DeepFreeze is installed do DeepFreeze processing to remove frozen kerbals from our list.
            if (IsDFInstalled)
            {
                if (!DFWrapper.InstanceExists)  // Check if DFWrapper has been initialized or not. If not try to initialize.
                {
                    DFWrapper.InitDFWrapper();
                }
                if (DFWrapper.APIReady)
                {
                    Dictionary <string, DFWrapper.KerbalInfo> DFFrozenKerbals = new Dictionary <string, DFWrapper.KerbalInfo>();
                    //Get the DeepFreeze Dictionary of all Frozen Kerbals in the current Game.
                    DFFrozenKerbals = DFWrapper.DeepFreezeAPI.FrozenKerbals;
                    //Remove any Frozen Kerbals from TAC LS tracking.
                    RemoveFrozenKerbals(DFFrozenKerbals);
                }
            }

            double currentTime  = Planetarium.GetUniversalTime();
            var    allVessels   = FlightGlobals.Vessels;
            var    knownVessels = gameSettings.knownVessels;

            var vesselsToDelete = new List <Guid>();

            foreach (var entry in knownVessels)
            {
                Guid       vesselId   = entry.Key;
                VesselInfo vesselInfo = entry.Value;
                Vessel     vessel     = allVessels.Find(v => v.id == vesselId);

                if (vessel == null)
                {
                    this.Log("Deleting vessel " + vesselInfo.vesselName + " - vessel does not exist anymore");
                    vesselsToDelete.Add(vesselId);
                    var crewToDelete = gameSettings.knownCrew.Where(e => e.Value.vesselId == vesselId).Select(e => e.Key).ToList();
                    foreach (String name in crewToDelete)
                    {
                        this.Log("Deleting crew member: " + name);
                        gameSettings.knownCrew.Remove(name);
                    }
                    continue;
                }

                if (vessel.loaded)
                {
                    int crewCapacity = UpdateVesselInfo(vesselInfo, vessel);

                    if (crewCapacity == 0)
                    {
                        this.Log("Deleting vessel " + vesselInfo.vesselName + " - no crew parts anymore");
                        vesselsToDelete.Add(vesselId);
                        continue;
                    }

                    ConsumeResources(currentTime, vessel, vesselInfo);

                    if (vesselInfo.numCrew > 0)
                    {
                        ShowWarnings(vessel.vesselName, vesselInfo.remainingElectricity, vesselInfo.maxElectricity, vesselInfo.estimatedElectricityConsumptionRate, globalSettings.Electricity, ref vesselInfo.electricityStatus);
                    }
                }

                if (vesselInfo.numCrew > 0)
                {
                    double foodRate = globalSettings.FoodConsumptionRate * vesselInfo.numCrew;
                    vesselInfo.estimatedTimeFoodDepleted = vesselInfo.lastFood + (vesselInfo.remainingFood / foodRate);
                    double estimatedFood = vesselInfo.remainingFood - ((currentTime - vesselInfo.lastFood) * foodRate);
                    ShowWarnings(vesselInfo.vesselName, estimatedFood, vesselInfo.maxFood, foodRate, globalSettings.Food, ref vesselInfo.foodStatus);

                    double waterRate = globalSettings.WaterConsumptionRate * vesselInfo.numCrew;
                    vesselInfo.estimatedTimeWaterDepleted = vesselInfo.lastWater + (vesselInfo.remainingWater / waterRate);
                    double estimatedWater = vesselInfo.remainingWater - ((currentTime - vesselInfo.lastWater) * waterRate);
                    ShowWarnings(vesselInfo.vesselName, estimatedWater, vesselInfo.maxWater, waterRate, globalSettings.Water, ref vesselInfo.waterStatus);

                    double oxygenRate = globalSettings.OxygenConsumptionRate * vesselInfo.numCrew;
                    vesselInfo.estimatedTimeOxygenDepleted = vesselInfo.lastOxygen + (vesselInfo.remainingOxygen / oxygenRate);
                    double estimatedOxygen = vesselInfo.remainingOxygen - ((currentTime - vesselInfo.lastOxygen) * oxygenRate);
                    ShowWarnings(vesselInfo.vesselName, estimatedOxygen, vesselInfo.maxOxygen, oxygenRate, globalSettings.Oxygen, ref vesselInfo.oxygenStatus);

                    vesselInfo.estimatedTimeElectricityDepleted = vesselInfo.lastElectricity + (vesselInfo.remainingElectricity / vesselInfo.estimatedElectricityConsumptionRate);
                }
            }

            vesselsToDelete.ForEach(id => knownVessels.Remove(id));

            foreach (Vessel vessel in allVessels.Where(v => v.loaded))
            {
                if (!knownVessels.ContainsKey(vessel.id) && vessel.parts.Any(p => p.protoModuleCrew.Count > 0) && IsLaunched(vessel))
                {
                    this.Log("New vessel: " + vessel.vesselName + " (" + vessel.id + ")");
                    var knownCrew = gameSettings.knownCrew;

                    if (vessel.isEVA)
                    {
                        ProtoCrewMember crewMember = vessel.GetVesselCrew().FirstOrDefault();
                        if (crewMember != null && !knownCrew.ContainsKey(crewMember.name))
                        {
                            FillRescueEvaSuit(vessel);
                        }
                    }

                    VesselInfo vesselInfo = new VesselInfo(vessel.vesselName, currentTime);
                    knownVessels[vessel.id] = vesselInfo;
                    UpdateVesselInfo(vesselInfo, vessel);

                    foreach (ProtoCrewMember crewMember in vessel.GetVesselCrew())
                    {
                        if (knownCrew.ContainsKey(crewMember.name))
                        {
                            CrewMemberInfo crewMemberInfo = knownCrew[crewMember.name];
                            crewMemberInfo.vesselId   = vessel.id;
                            crewMemberInfo.vesselName = vessel.vesselName;
                        }
                        else
                        {
                            this.Log("New crew member: " + crewMember.name);
                            knownCrew[crewMember.name] = new CrewMemberInfo(crewMember.name, vessel.vesselName, vessel.id, currentTime);
                        }
                    }
                }
            }
        }
Ejemplo n.º 26
0
        public static CrewMemberInfo Load(ConfigNode node)
        {
            string name = Utilities.GetValue(node, "name", "Unknown");
            double lastUpdate = Utilities.GetValue(node, "lastUpdate", 0.0);
            string vesselName = Utilities.GetValue(node, "vesselName", "Unknown");
            Guid vesselId;
            if (node.HasValue("vesselId"))
            {
                vesselId = new Guid(node.GetValue("vesselId"));
            }
            else
            {
                vesselId = Guid.Empty;
            }

            CrewMemberInfo info = new CrewMemberInfo(name, vesselName, vesselId, lastUpdate);
            info.lastFood = Utilities.GetValue(node, "lastFood", lastUpdate);
            info.lastWater = Utilities.GetValue(node, "lastWater", lastUpdate);
            info.hibernating = Utilities.GetValue(node, "hibernating", false);

            return info;
        }
Ejemplo n.º 27
0
        public static CrewMemberInfo Load(ConfigNode node)
        {
            string name = Utilities.GetValue(node, "name", "Unknown");
            double lastUpdate = Utilities.GetValue(node, "lastUpdate", 0.0);
            string vesselName = Utilities.GetValue(node, "vesselName", "Unknown");
            Guid vesselId;
            if (node.HasValue("vesselId"))
            {
                vesselId = new Guid(node.GetValue("vesselId"));
            }
            else
            {
                vesselId = Guid.Empty;
            }

            CrewMemberInfo info = new CrewMemberInfo(name, vesselName, vesselId, lastUpdate);
            info.vesselIsPreLaunch = Utilities.GetValue(node, "vesselIsPreLaunch", true);
            info.lastFood = Utilities.GetValue(node, "lastFood", lastUpdate);
            info.lastWater = Utilities.GetValue(node, "lastWater", lastUpdate);
            info.hibernating = Utilities.GetValue(node, "hibernating", false);
            info.DFfrozen = Utilities.GetValue(node, "DFFrozen", false);
            info.recoverykerbal = Utilities.GetValue(node, "recoverykerbal", false);
            info.crewType = Utilities.GetValue(node, "crewType", info.crewType);
            return info;
        }
        private void ConsumeFood(double currentTime, Vessel vessel, VesselInfo vesselInfo, ProtoCrewMember crewMember, CrewMemberInfo crewMemberInfo, Part part)
        {
            if (vesselInfo.remainingFood >= globalSettings.FoodConsumptionRate)
            {
                double deltaTime    = Math.Min(currentTime - crewMemberInfo.lastFood, globalSettings.MaxDeltaTime);
                double desiredFood  = globalSettings.FoodConsumptionRate * deltaTime;
                double foodObtained = part.TakeResource(globalSettings.FoodId, Math.Min(desiredFood, vesselInfo.remainingFood / vesselInfo.numCrew));

                double wasteProduced = foodObtained * globalSettings.WasteProductionRate / globalSettings.FoodConsumptionRate;
                part.TakeResource(globalSettings.WasteId, -wasteProduced);

                crewMemberInfo.lastFood   += deltaTime - ((desiredFood - foodObtained) / globalSettings.FoodConsumptionRate);
                crewMemberInfo.hibernating = false;
            }
            else
            {
                double timeWithoutFood = currentTime - crewMemberInfo.lastFood;
                if (timeWithoutFood > (globalSettings.MaxTimeWithoutFood + crewMemberInfo.respite))
                {
                    if (!gameSettings.HibernateInsteadOfKill)
                    {
                        KillCrewMember(crewMember, "starvation", vessel);
                    }
                    else
                    {
                        crewMemberInfo.hibernating = true;
                    }
                }
            }
        }
        protected override void DrawWindowContents(int windowId)
        {
            scrollPosition = GUILayout.BeginScrollView(scrollPosition);
            GUILayout.BeginVertical();
            GUILayout.Space(4);

            if (FlightGlobals.ready)
            {
                double currentTime = Planetarium.GetUniversalTime();

                foreach (var entry in controller.knownVessels)
                {
                    Vessel     vessel     = FlightGlobals.Vessels.Find(v => v.id.Equals(entry.Key));
                    VesselInfo vesselInfo = entry.Value;

                    GUILayout.Label("Vessel: " + vessel.vesselName + " (" + vessel.vesselType + ")", headerStyle);
                    GUILayout.Label("Crew: " + vesselInfo.numCrew, headerStyle);

                    var crew = vessel.GetVesselCrew().Select(crewMember => controller.knownCrew[crewMember.name]);
                    foreach (CrewMemberInfo crewMemberInfo in crew)
                    {
                        GUIStyle      style = labelStyle;
                        StringBuilder text  = new StringBuilder(crewMemberInfo.name);
                        if ((currentTime - crewMemberInfo.lastFood) > 1)
                        {
                            text.Append("  Food=").Append(Utilities.FormatTime(currentTime - crewMemberInfo.lastFood));
                            style = criticalStyle;
                        }
                        if ((currentTime - crewMemberInfo.lastWater) > 1)
                        {
                            text.Append("  Water=").Append(Utilities.FormatTime(currentTime - crewMemberInfo.lastWater));
                            style = criticalStyle;
                        }
                        if ((currentTime - crewMemberInfo.lastOxygen) > 1)
                        {
                            text.Append("  Oxygen=").Append(Utilities.FormatTime(currentTime - crewMemberInfo.lastOxygen));
                            style = criticalStyle;
                        }

                        GUILayout.Label(text.ToString(), style);
                    }

                    GUILayout.Space(5);

                    // Electricity
                    if (vesselInfo.electricityStatus == VesselInfo.Status.CRITICAL)
                    {
                        GUILayout.Label("Electric Charge depleted!  " + Utilities.FormatTime(vesselInfo.lastElectricity - currentTime), criticalStyle);
                    }
                    else
                    {
                        GUIStyle style = labelStyle;
                        if (vesselInfo.electricityStatus == VesselInfo.Status.LOW)
                        {
                            style = warningStyle;
                        }

                        double electricityConsumptionRate = controller.CalculateElectricityConsumptionRate(vessel, vesselInfo);
                        GUILayout.Label("Remaining Electricity: " + Utilities.FormatTime(vesselInfo.remainingElectricity / electricityConsumptionRate) /* + " (" + vesselInfo.remainingElectricity.ToString("0.000000") + ")"*/, style);
                    }

                    // Food
                    if (vesselInfo.foodStatus == VesselInfo.Status.CRITICAL)
                    {
                        CrewMemberInfo crewMemberInfo = crew.OrderBy(cmi => cmi.lastFood).First();
                        GUILayout.Label("Food depleted! " + Utilities.FormatTime(crewMemberInfo.lastFood - currentTime), criticalStyle);
                    }
                    else
                    {
                        GUIStyle style = labelStyle;
                        if (vesselInfo.foodStatus == VesselInfo.Status.LOW)
                        {
                            style = warningStyle;
                        }

                        GUILayout.Label("Remaining Food: " + Utilities.FormatTime(vesselInfo.remainingFood / settings.FoodConsumptionRate / vesselInfo.numCrew) /* + " (" + vesselInfo.remainingFood.ToString("0.000000") + ")"*/, style);
                    }

                    // Water
                    if (vesselInfo.waterStatus == VesselInfo.Status.CRITICAL)
                    {
                        CrewMemberInfo crewMemberInfo = crew.OrderBy(cmi => cmi.lastWater).First();
                        GUILayout.Label("Water depleted! " + Utilities.FormatTime(crewMemberInfo.lastWater - currentTime), criticalStyle);
                    }
                    else
                    {
                        GUIStyle style = labelStyle;
                        if (vesselInfo.waterStatus == VesselInfo.Status.LOW)
                        {
                            style = warningStyle;
                        }

                        GUILayout.Label("Remaining Water: " + Utilities.FormatTime(vesselInfo.remainingWater / settings.WaterConsumptionRate / vesselInfo.numCrew) /* + " (" + vesselInfo.remainingWater.ToString("0.000000") + ")"*/, style);
                    }

                    // Oxygen
                    if (vesselInfo.oxygenStatus == VesselInfo.Status.CRITICAL)
                    {
                        CrewMemberInfo crewMemberInfo = crew.OrderBy(cmi => cmi.lastOxygen).First();
                        GUILayout.Label("Oxygen depleted! " + Utilities.FormatTime(crewMemberInfo.lastOxygen - currentTime), criticalStyle);
                    }
                    else
                    {
                        GUIStyle style = labelStyle;
                        if (vesselInfo.oxygenStatus == VesselInfo.Status.LOW)
                        {
                            style = warningStyle;
                        }

                        GUILayout.Label("Remaining Oxygen: " + Utilities.FormatTime(vesselInfo.remainingOxygen / settings.OxygenConsumptionRate / vesselInfo.numCrew) /* + " (" + vesselInfo.remainingOxygen.ToString("0.000000") + ")"*/, style);
                    }

                    GUILayout.Space(20);
                }
            }

            GUILayout.EndVertical();
            GUILayout.EndScrollView();

            GUILayout.Space(8);

            if (GUI.Button(new Rect(windowPos.width - 68, 4, 20, 20), "R", closeButtonStyle))
            {
                rosterWindow.SetVisible(true);
            }
            if (GUI.Button(new Rect(windowPos.width - 46, 4, 20, 20), "S", closeButtonStyle))
            {
                settingsWindow.SetVisible(true);
            }
        }