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; } } } }
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); }
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(); }
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; } } }
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; } } }
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(); } }
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."); } }
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); } } }
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 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; } } } }
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); } } } } }
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); } } } } }
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; }
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; }
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); } }