public void SaveVesselNode(VesselSupplyStatus status) { VesselSupplyStatus vesselInfo = null; var count = _VesselInfo.Count; for (int i = 0; i < count; ++i) { var n = _VesselInfo[i]; if (n.VesselId == status.VesselId) { vesselInfo = n; break; } } if (vesselInfo == null) { vesselInfo = new VesselSupplyStatus(); vesselInfo.VesselId = status.VesselId; _VesselInfo.Add(vesselInfo); } vesselInfo.VesselName = status.VesselName; vesselInfo.LastFeeding = status.LastFeeding; vesselInfo.LastECCheck = status.LastECCheck; vesselInfo.LastUpdate = status.LastUpdate; vesselInfo.NumCrew = status.NumCrew; vesselInfo.RecyclerMultiplier = status.RecyclerMultiplier; vesselInfo.CrewCap = status.CrewCap; vesselInfo.ExtraHabSpace = status.ExtraHabSpace; vesselInfo.VesselHabMultiplier = status.VesselHabMultiplier; vesselInfo.CachedHabTime = status.CachedHabTime; vesselInfo.SuppliesLeft = status.SuppliesLeft; vesselInfo.ECLeft = status.ECLeft; }
internal static double GetTotalHabTime(VesselSupplyStatus sourceVessel) { var vsl = FlightGlobals.Vessels.FirstOrDefault(v => v.id.ToString() == sourceVessel.VesselId); double totHabSpace = (LifeSupportSetup.Instance.LSConfig.BaseHabTime * sourceVessel.CrewCap) + sourceVessel.ExtraHabSpace; double totHabMult = sourceVessel.VesselHabMultiplier; double totCurCrew = sourceVessel.NumCrew; double totMaxCrew = sourceVessel.CrewCap; var vList = LogisticsTools.GetNearbyVessels((float)LifeSupportSetup.Instance.LSConfig.HabRange, false, vsl, false); foreach (var v in vList) { var curVsl = LifeSupportManager.Instance.FetchVessel(v.id.ToString()); //Hab time starts with our baseline of the crew hab plus extra hab. //We then multiply it out based on the crew ratio, our global multiplier, and the vessel's multipler. //First - crew capacity. totHabSpace += (LifeSupportSetup.Instance.LSConfig.BaseHabTime * curVsl.CrewCap) + curVsl.ExtraHabSpace; totCurCrew += curVsl.NumCrew; totMaxCrew += curVsl.CrewCap; totHabMult += curVsl.VesselHabMultiplier; } totHabMult += USI_GlobalBonuses.Instance.GetHabBonus(vsl.mainBody.flightGlobalsIndex); double habTotal = totHabSpace / totCurCrew * (totHabMult + 1) * LifeSupportSetup.Instance.LSConfig.HabMultiplier; //print(String.Format("THS: {0} TC:{1} THM: {2} HM: {3}", totHabSpace, totCurCrew, totHabMult, LifeSupportSetup.Instance.LSConfig.HabMultiplier)); return(habTotal * (60d * 60d * 6d * 30d)); }
private void UpdateStatus(VesselSupplyStatus v) { v.RecyclerMultiplier = (float)LifeSupportManager.GetRecyclerMultiplier(vessel); v.ExtraHabSpace = (float)LifeSupportManager.CalculateVesselHabExtraTime(vessel); v.VesselHabMultiplier = (float)LifeSupportManager.CalculateVesselHabMultiplier(vessel, _currentCrew); LifeSupportManager.Instance.TrackVessel(v); }
private void CheckVesselId() { if (String.IsNullOrEmpty(VesselStatus.VesselId)) { return; } //Something changed... if (VesselStatus.VesselId != vessel.id.ToString()) { var oldV = LifeSupportManager.Instance.FetchVessel(VesselStatus.VesselId); var newV = LifeSupportManager.Instance.FetchVessel(vessel.id.ToString()); newV.LastFeeding = oldV.LastFeeding; newV.LastECCheck = oldV.LastECCheck; newV.LastUpdate = oldV.LastUpdate; newV.NumCrew = oldV.NumCrew; newV.RecyclerMultiplier = oldV.RecyclerMultiplier; newV.CrewCap = oldV.CrewCap; newV.VesselHabMultiplier = oldV.VesselHabMultiplier; newV.CachedHabTime = oldV.CachedHabTime; newV.ExtraHabSpace = oldV.ExtraHabSpace; newV.SuppliesLeft = oldV.SuppliesLeft; newV.ECLeft = oldV.ECLeft; newV.VesselId = vessel.id.ToString(); newV.VesselName = vessel.vesselName; LifeSupportManager.Instance.TrackVessel(newV); VesselStatus = newV; } }
public VesselSupplyStatus FetchVessel(string vesselId) { if (!IsVesselTracked(vesselId)) { var v = new VesselSupplyStatus(); v.LastFeeding = Planetarium.GetUniversalTime(); v.LastECCheck = Planetarium.GetUniversalTime(); v.LastUpdate = Planetarium.GetUniversalTime(); v.NumCrew = 0; v.RecyclerMultiplier = 1; v.CrewCap = 0; v.VesselHabMultiplier = 0; v.CachedHabTime = 0; v.ExtraHabSpace = 0; v.SuppliesLeft = 0f; v.ECLeft = 0f; v.VesselId = vesselId; v.VesselName = "??loading??"; TrackVessel(v); } VesselSupplyStatus vInfo = null; var count = VesselSupplyInfo.Count; for (int i = 0; i < count; ++i) { if (VesselSupplyInfo[i].VesselId == vesselId) { vInfo = VesselSupplyInfo[i]; break; } } return(vInfo); }
public VesselSupplyStatus FetchVessel(string vesselId) { if (!IsVesselTracked(vesselId)) { var v = new VesselSupplyStatus(); v.LastFeeding = Planetarium.GetUniversalTime(); v.LastECCheck = Planetarium.GetUniversalTime(); v.LastUpdate = Planetarium.GetUniversalTime(); v.NumCrew = 0; v.RecyclerMultiplier = 1; v.CrewCap = 0; v.VesselHabMultiplier = 0; v.CachedHabTime = 0; v.ExtraHabSpace = 0; v.SuppliesLeft = 0f; v.ECLeft = 0f; v.VesselId = vesselId; v.VesselName = "??loading??"; TrackVessel(v); } var vInfo = VesselSupplyInfo.FirstOrDefault(k => k.VesselId == vesselId); return(vInfo); }
public void TrackVessel(VesselSupplyStatus status) { if (VesselSupplyInfo.All(n => n.VesselId != status.VesselId)) { VesselSupplyInfo.Add(status); } LifeSupportScenario.Instance.settings.SaveVesselNode(status); }
public void AddVesselNode(VesselSupplyStatus vInfo) { if (_VesselInfo.Any(n => n.VesselId == vInfo.VesselId)) { return; } _VesselInfo.Add(vInfo); }
internal static double GetTotalHabTime(VesselSupplyStatus sourceVessel, Vessel vsl, out int numSharedVessels) { //In the event that a vessel is not loaded, we just return the cached value. if (!vsl.loaded) { numSharedVessels = 0; return(sourceVessel.CachedHabTime); } double totHabSpace = sourceVessel.ExtraHabSpace; double totHabMult = sourceVessel.VesselHabMultiplier; int totCurCrew = sourceVessel.NumCrew; int totMaxCrew = sourceVessel.CrewCap; numSharedVessels = 0; var vList = LogisticsTools.GetNearbyVessels((float)LifeSupportScenario.Instance.settings.GetSettings().HabRange, false, vsl, false); var hList = new List <Vessel>(); var vCount = vList.Count; for (int i = 0; i < vCount; ++i) { var v = vList[i]; //Hab time starts with our baseline of the crew hab plus extra hab. //We then multiply it out based on the crew ratio, our global multiplier, and the vessel's multipler. //First - crew capacity. int crewCap = v.GetCrewCapacity(); totMaxCrew += crewCap; totCurCrew += v.GetCrewCount(); if (crewCap > 0) { numSharedVessels++; hList.Add(v); } } totHabSpace += (LifeSupportScenario.Instance.settings.GetSettings().BaseHabTime *totMaxCrew); var hCount = hList.Count; for (int i = 0; i < hCount; ++i) { var v = hList[i]; // Calculate HabSpace and HabMult after we know totCurCrew and totMaxCrew totHabSpace += CalculateVesselHabExtraTime(v); totHabMult *= Math.Min(1, CalculateVesselHabMultiplier(v, totCurCrew)); } totHabMult += USI_GlobalBonuses.Instance.GetHabBonus(vsl.mainBody.flightGlobalsIndex); double habTotal = totHabSpace / (double)totCurCrew * (totHabMult + 1) * LifeSupportScenario.Instance.settings.GetSettings().HabMultiplier; //print(String.Format("THS: {0} TC:{1} THM: {2} HM: {3}", totHabSpace, totCurCrew, totHabMult, LifeSupportScenario.Instance.settings.GetSettings().HabMultiplier)); sourceVessel.CachedHabTime = Math.Max(0, habTotal * LifeSupportUtilities.SecondsPerMonth()); LifeSupportManager.Instance.TrackVessel(sourceVessel); return(sourceVessel.CachedHabTime); }
public void DeleteVesselNode(VesselSupplyStatus vInfo) { if (_VesselInfo.All(n => n.VesselId != vInfo.VesselId)) { return; } var v = _VesselInfo.First(n => n.VesselId == vInfo.VesselId); _VesselInfo.Remove(v); }
private VesselSupplyStatus SetupVesselStatus() { VesselSupplyStatus v = new VesselSupplyStatus(); v.VesselId = vessel.id.ToString(); UpdateVesselInfo(); LifeSupportManager.Instance.TrackVessel(v); UpdateStatus(v); return(v); }
private void UpdateStatus(VesselSupplyStatus supplyStatus) { var now = Planetarium.GetUniversalTime(); if (_lastUpdate < ResourceUtilities.FLOAT_TOLERANCE) { _lastUpdate = now; } // Give converters time to catch up before we start using calculated values bool fullRefresh = false; if (now > _lastUpdate + 5d) { fullRefresh = true; _lastUpdate = now; } var calcRecyclerMultiplier = (float)LifeSupportManager.GetRecyclerMultiplier(vessel); var calcHabTime = (float)LifeSupportManager.CalculateVesselHabExtraTime(vessel); var calcHabMultiplier = (float)LifeSupportManager.CalculateVesselHabMultiplier(vessel, _currentCrewCount); // If we're the active vessel, and we're past easing, use calculated values. // Otherwise, use the cache. var useCalculated = fullRefresh && vessel.id == FlightGlobals.ActiveVessel.id; //Start with intelligent defaults. if (supplyStatus.RecyclerMultiplier < ResourceUtilities.FLOAT_TOLERANCE) { supplyStatus.RecyclerMultiplier = 1f; } if (calcRecyclerMultiplier < ResourceUtilities.FLOAT_TOLERANCE) { calcRecyclerMultiplier = 1f; } //And take the lowest (non-zero) if (useCalculated || calcRecyclerMultiplier < supplyStatus.RecyclerMultiplier) { supplyStatus.RecyclerMultiplier = calcRecyclerMultiplier; } //Hab we want the best ones. if (useCalculated || calcHabTime > supplyStatus.ExtraHabSpace) { supplyStatus.ExtraHabSpace = calcHabTime; } if (useCalculated || calcHabMultiplier > supplyStatus.VesselHabMultiplier) { supplyStatus.VesselHabMultiplier = calcHabMultiplier; } LifeSupportManager.Instance.TrackVessel(supplyStatus); }
public override void OnStart(StartState state) { base.OnStart(state); if (HighLogic.LoadedSceneIsFlight) { var v = new VesselSupplyStatus(); v.VesselId = part.vessel.id.ToString(); LifeSupportManager.Instance.TrackVessel(v); Fields["status"].guiActive = false; } }
public void AddVesselNode(VesselSupplyStatus vInfo) { var count = _VesselInfo.Count; for (int i = 0; i < count; ++i) { if (_VesselInfo[i].VesselId == vInfo.VesselId) { return; } } _VesselInfo.Add(vInfo); }
private void UpdateStatus(VesselSupplyStatus v) { if (_lastUpdate < ResourceUtilities.FLOAT_TOLERANCE) { _lastUpdate = Planetarium.GetUniversalTime(); } bool fullRefresh = false; if (Planetarium.GetUniversalTime() > _lastUpdate + 5d) //A reasonable time for easing in everything { fullRefresh = true; _lastUpdate = Planetarium.GetUniversalTime(); } var newRecMult = (float)LifeSupportManager.GetRecyclerMultiplier(vessel); var newSpace = (float)LifeSupportManager.CalculateVesselHabExtraTime(vessel); var newHabMult = (float)LifeSupportManager.CalculateVesselHabMultiplier(vessel, _currentCrew); //If we're the active vessel, and we're past easing, we always take calc values. //Otherwise, let's use the cache. var useCur = fullRefresh && vessel.id == FlightGlobals.ActiveVessel.id; //Start with intelligent defaults. if (v.RecyclerMultiplier < ResourceUtilities.FLOAT_TOLERANCE) { v.RecyclerMultiplier = 1f; } if (newRecMult < ResourceUtilities.FLOAT_TOLERANCE) { newRecMult = 1f; } //And take the lowest (non-zero) if (useCur || newRecMult < v.RecyclerMultiplier) { v.RecyclerMultiplier = newRecMult; } //Hab we want the best ones. if (useCur || newSpace > v.ExtraHabSpace) { v.ExtraHabSpace = newSpace; } if (useCur || newHabMult > v.VesselHabMultiplier) { v.VesselHabMultiplier = newHabMult; } LifeSupportManager.Instance.TrackVessel(v); }
public override void OnStart(StartState state) { base.OnStart(state); if (HighLogic.LoadedSceneIsFlight) { var v = new VesselSupplyStatus(); v.VesselId = part.vessel.id.ToString(); LifeSupportManager.Instance.TrackVessel(v); if (LifeSupportScenario.Instance.settings.GetSettings().ReplacementPartAmount < ResourceUtilities.FLOAT_TOLERANCE) { Fields["wearPercent"].guiActive = false; } } }
public override void OnStart(StartState state) { base.OnStart(state); if (HighLogic.LoadedSceneIsFlight) { var v = new VesselSupplyStatus(); v.VesselId = part.vessel.id.ToString(); LifeSupportManager.Instance.TrackVessel(v); if (LifeSupportSetup.Instance.LSConfig.ReplacementPartAmount < ResourceUtilities.FLOAT_TOLERANCE) { Fields["wearPercent"].guiActive = false; } } }
public VesselSupplyStatus FetchVessel(string vesselId) { if (!IsVesselTracked(vesselId)) { var v = new VesselSupplyStatus(); v.LastFeeding = Planetarium.GetUniversalTime(); v.LastUpdate = Planetarium.GetUniversalTime(); v.NumCrew = 0; v.SuppliesLeft = 0f; v.VesselId = vesselId; v.VesselName = "??loading??"; TrackVessel(v); } var vInfo = VesselSupplyInfo.FirstOrDefault(k => k.VesselId == vesselId); return vInfo; }
public void SaveVesselNode(VesselSupplyStatus status) { VesselSupplyStatus vesselInfo = _VesselInfo.FirstOrDefault(n => n.VesselId == status.VesselId); if (vesselInfo == null) { vesselInfo = new VesselSupplyStatus(); vesselInfo.VesselId = status.VesselId; _VesselInfo.Add(vesselInfo); } vesselInfo.VesselName = status.VesselName; vesselInfo.LastFeeding = status.LastFeeding; vesselInfo.LastUpdate = status.LastUpdate; vesselInfo.NumCrew = status.NumCrew; vesselInfo.SuppliesLeft = status.SuppliesLeft; }
public void TrackVessel(VesselSupplyStatus status) { VesselSupplyStatus vesselInfo = VesselSupplyInfo.FirstOrDefault(n => n.VesselId == status.VesselId); if (vesselInfo == null) { vesselInfo = new VesselSupplyStatus(); vesselInfo.VesselId = status.VesselId; VesselSupplyInfo.Add(vesselInfo); } vesselInfo.VesselName = status.VesselName; vesselInfo.LastFeeding = status.LastFeeding; vesselInfo.LastUpdate = status.LastUpdate; vesselInfo.NumCrew = status.NumCrew; vesselInfo.SuppliesLeft = status.SuppliesLeft; LifeSupportScenario.Instance.settings.SaveVesselNode(status); }
public VesselSupplyStatus FetchVessel(string vesselId) { if (!IsVesselTracked(vesselId)) { var v = new VesselSupplyStatus(); v.LastFeeding = Planetarium.GetUniversalTime(); v.LastUpdate = Planetarium.GetUniversalTime(); v.NumCrew = 0; v.SuppliesLeft = 0f; v.VesselId = vesselId; v.VesselName = "??loading??"; TrackVessel(v); } var vInfo = VesselSupplyInfo.FirstOrDefault(k => k.VesselId == vesselId); return(vInfo); }
internal static double GetHabChecksum(VesselSupplyStatus sourceVessel, Vessel vsl) { //This routine just returns the total amount of hab factored by the multiplier. //It is used to determine if there was a situation change and thus reset the vessel time. //The main use case would be undocking/docking, or flying into range of a base. //In the event that a vessel is not loaded, return zero. if (!vsl.loaded) { return(0d); } int totMaxCrew = sourceVessel.CrewCap; var vList = LogisticsTools.GetNearbyVessels((float)LifeSupportScenario.Instance.settings.GetSettings().HabRange, false, vsl, false); var hList = new List <Vessel>(); var vCount = vList.Count; for (int i = 0; i < vCount; ++i) { var v = vList[i]; int crewCap = v.GetCrewCapacity(); totMaxCrew += crewCap; if (crewCap > 0) { hList.Add(v); } } double totHabSpace = sourceVessel.ExtraHabSpace; double totHabMult = CalculateVesselHabMultiplier(vsl, 1); totHabSpace += (LifeSupportScenario.Instance.settings.GetSettings().BaseHabTime *totMaxCrew); var hCount = hList.Count; for (int i = 0; i < hCount; ++i) { var v = hList[i]; totHabSpace += CalculateVesselHabExtraTime(v); totHabMult += CalculateVesselHabMultiplier(v, 1); } return(totHabSpace * (totHabMult + 1)); }
public void TrackVessel(VesselSupplyStatus status) { var count = VesselSupplyInfo.Count; var isNew = true; for (int i = 0; i < count; ++i) { if (VesselSupplyInfo[i].VesselId == status.VesselId) { isNew = false; break; } } if (isNew) { VesselSupplyInfo.Add(status); } LifeSupportScenario.Instance.settings.SaveVesselNode(status); }
internal static double GetTotalHabTime(VesselSupplyStatus sourceVessel, out int numSharedVessels) { var vsl = FlightGlobals.Vessels.FirstOrDefault(v => v.id.ToString() == sourceVessel.VesselId); double totHabSpace = (LifeSupportScenario.Instance.settings.GetSettings().BaseHabTime *sourceVessel.CrewCap) + sourceVessel.ExtraHabSpace; double totHabMult = sourceVessel.VesselHabMultiplier; int totCurCrew = sourceVessel.NumCrew; int totMaxCrew = sourceVessel.CrewCap; numSharedVessels = 0; var vList = LogisticsTools.GetNearbyVessels((float)LifeSupportScenario.Instance.settings.GetSettings().HabRange, false, vsl, false); var hList = new List <Vessel>(); foreach (var v in vList) { //Hab time starts with our baseline of the crew hab plus extra hab. //We then multiply it out based on the crew ratio, our global multiplier, and the vessel's multipler. //First - crew capacity. int crewCap = v.GetCrewCapacity(); totMaxCrew += crewCap; totCurCrew += v.GetCrewCount(); if (crewCap > 0) { numSharedVessels++; hList.Add(v); } } foreach (var v in hList) { // Calculate HabSpace and HabMult after we know totCurCrew and totMaxCrew totHabSpace += (LifeSupportScenario.Instance.settings.GetSettings().BaseHabTime *totMaxCrew) + CalculateVesselHabExtraTime(v); totHabMult += CalculateVesselHabMultiplier(v, totCurCrew); } totHabMult += USI_GlobalBonuses.Instance.GetHabBonus(vsl.mainBody.flightGlobalsIndex); double habTotal = totHabSpace / (double)totCurCrew * (totHabMult + 1) * LifeSupportScenario.Instance.settings.GetSettings().HabMultiplier; //print(String.Format("THS: {0} TC:{1} THM: {2} HM: {3}", totHabSpace, totCurCrew, totHabMult, LifeSupportScenario.Instance.settings.GetSettings().HabMultiplier)); return(Math.Max(0, habTotal * LifeSupportUtilities.SecondsPerMonth())); }
private bool CheckHabSideEffects(LifeSupportStatus kStat, VesselSupplyStatus vsl) { var habTime = LifeSupportManager.GetTotalHabTime(vsl); if (kStat.LastOnKerbin < 1) { kStat.LastOnKerbin = Planetarium.GetUniversalTime(); } if (habTime + kStat.LastOnKerbin > kStat.MaxOffKerbinTime) { kStat.MaxOffKerbinTime = habTime + kStat.LastOnKerbin; } LifeSupportManager.Instance.TrackKerbal(kStat); if (Planetarium.GetUniversalTime() > kStat.MaxOffKerbinTime || (Planetarium.GetUniversalTime() - kStat.TimeEnteredVessel) > habTime) { return(true); } return(false); }
public void SaveVesselNode(VesselSupplyStatus status) { VesselSupplyStatus vesselInfo = _VesselInfo.FirstOrDefault(n => n.VesselId == status.VesselId); if (vesselInfo == null) { vesselInfo = new VesselSupplyStatus(); vesselInfo.VesselId = status.VesselId; _VesselInfo.Add(vesselInfo); } vesselInfo.VesselName = status.VesselName; vesselInfo.LastFeeding = status.LastFeeding; vesselInfo.LastUpdate = status.LastUpdate; vesselInfo.NumCrew = status.NumCrew; vesselInfo.RecyclerMultiplier = status.RecyclerMultiplier; vesselInfo.CrewCap = status.CrewCap; vesselInfo.ExtraHabSpace = status.ExtraHabSpace; vesselInfo.VesselHabMultiplier = status.VesselHabMultiplier; vesselInfo.SuppliesLeft = status.SuppliesLeft; }
public void DeleteVesselNode(VesselSupplyStatus vInfo) { if (_VesselInfo.All(n => n.VesselId != vInfo.VesselId)) return; var v = _VesselInfo.First(n => n.VesselId == vInfo.VesselId); _VesselInfo.Remove(v); }
public VesselSupplyStatus FetchVessel(string vesselId) { if (!IsVesselTracked(vesselId)) { var v = new VesselSupplyStatus(); v.LastFeeding = Planetarium.GetUniversalTime(); v.LastECCheck = Planetarium.GetUniversalTime(); v.LastUpdate = Planetarium.GetUniversalTime(); v.NumCrew = 0; v.RecyclerMultiplier = 1; v.CrewCap = 0; v.VesselHabMultiplier = 0; v.ExtraHabSpace = 0; v.SuppliesLeft = 0f; v.ECLeft = 0f; v.VesselId = vesselId; v.VesselName = "??loading??"; TrackVessel(v); } var vInfo = VesselSupplyInfo.FirstOrDefault(k => k.VesselId == vesselId); return vInfo; }
internal static double GetTotalHabTime(VesselSupplyStatus sourceVessel, out int numSharedVessels) { var vsl = FlightGlobals.Vessels.FirstOrDefault(v => v.id.ToString() == sourceVessel.VesselId); double totHabSpace = (LifeSupportScenario.Instance.settings.GetSettings().BaseHabTime * sourceVessel.CrewCap) + sourceVessel.ExtraHabSpace; double totHabMult = sourceVessel.VesselHabMultiplier; int totCurCrew = sourceVessel.NumCrew; int totMaxCrew = sourceVessel.CrewCap; numSharedVessels = 0; var vList = LogisticsTools.GetNearbyVessels((float)LifeSupportScenario.Instance.settings.GetSettings().HabRange, false, vsl, false); foreach (var v in vList) { //Hab time starts with our baseline of the crew hab plus extra hab. //We then multiply it out based on the crew ratio, our global multiplier, and the vessel's multipler. //First - crew capacity. int crewCap = v.GetCrewCapacity(); totMaxCrew += crewCap; totCurCrew += v.GetCrewCount(); if (crewCap > 0) { numSharedVessels++; } } foreach (var v in vList) { // Calculate HabSpace and HabMult after we know totCurCrew and totMaxCrew totHabSpace += (LifeSupportScenario.Instance.settings.GetSettings().BaseHabTime * totMaxCrew) + ModuleLifeSupport.CalculateVesselHabExtraTime(v); totHabMult += ModuleLifeSupport.CalculateVesselHabMultiplier(v, totCurCrew); } totHabMult += USI_GlobalBonuses.Instance.GetHabBonus(vsl.mainBody.flightGlobalsIndex); double habTotal = totHabSpace / (double)totCurCrew * (totHabMult + 1) * LifeSupportScenario.Instance.settings.GetSettings().HabMultiplier; //print(String.Format("THS: {0} TC:{1} THM: {2} HM: {3}", totHabSpace, totCurCrew, totHabMult, LifeSupportScenario.Instance.settings.GetSettings().HabMultiplier)); return Math.Max(0,habTotal * (60d * 60d * 6d * 30d)); }
internal static double GetTotalHabTime(VesselSupplyStatus sourceVessel) { int numSharedVessels = 0; return GetTotalHabTime(sourceVessel, out numSharedVessels); }
public void TrackVessel(VesselSupplyStatus status) { if(VesselSupplyInfo.All(n => n.VesselId != status.VesselId)) VesselSupplyInfo.Add(status); LifeSupportScenario.Instance.settings.SaveVesselNode(status); }
private bool CheckHabSideEffects(LifeSupportStatus kStat, VesselSupplyStatus vsl) { var habTime = LifeSupportManager.GetTotalHabTime(vsl); if (kStat.LastAtHome < 1) kStat.LastAtHome = Planetarium.GetUniversalTime(); if (habTime + kStat.LastAtHome > kStat.MaxOffKerbinTime) kStat.MaxOffKerbinTime = habTime + kStat.LastAtHome; LifeSupportManager.Instance.TrackKerbal(kStat); if (Planetarium.GetUniversalTime() > kStat.MaxOffKerbinTime || (Planetarium.GetUniversalTime() - kStat.TimeEnteredVessel) > habTime) { return true; } return false; }
public void AddVesselNode(VesselSupplyStatus vInfo) { if (_VesselInfo.Any(n => n.VesselId == vInfo.VesselId)) return; _VesselInfo.Add(vInfo); }
private LifeSupportVesselDisplayStat GetVesselStats(VesselSupplyStatus vsl) { var secondsPerDay = GameSettings.KERBIN_TIME ? (21600) : (86400); var useHabPenalties = (LifeSupportScenario.Instance.settings.GetSettings().NoHomeEffectVets + LifeSupportScenario.Instance.settings.GetSettings().NoHomeEffect > 0); Vessel thisVessel = FlightGlobals.Vessels.Find(v => v.id.ToString() == vsl.VesselId); var vstat = new LifeSupportVesselDisplayStat(); bool isOldData = Planetarium.GetUniversalTime() - vsl.LastUpdate > 2; var lblColor = isOldData ? "C4C4C4" : "ACFF40"; vstat.VesselName = String.Format("<color=#{0}>{1}</color>", lblColor, vsl.VesselName); vstat.VesselId = vsl.VesselId; vstat.LastUpdate = vsl.LastUpdate; var situationString = GetSituationString(thisVessel); double suppliesPerSecond = LifeSupportScenario.Instance.settings.GetSettings().SupplyAmount *Convert.ToDouble(vsl.NumCrew) * vsl.RecyclerMultiplier; var suppliesPerDay = secondsPerDay * suppliesPerSecond; var supAmount = GetResourceInVessel(thisVessel, "Supplies"); var suppliesTimeLeft = (suppliesPerSecond > ResourceUtilities.FLOAT_TOLERANCE) ? (supAmount / suppliesPerSecond) : 0; if (supAmount == 0) { var suppliesConsumedSinceLastCheck = suppliesPerSecond * (Planetarium.GetUniversalTime() - vsl.LastFeeding); supAmount = Math.Max(0, (vsl.SuppliesLeft * suppliesPerSecond) - suppliesConsumedSinceLastCheck); suppliesTimeLeft = (vsl.SuppliesLeft - (Planetarium.GetUniversalTime() - vsl.LastFeeding)); } double ecPerSecond = LifeSupportScenario.Instance.settings.GetSettings().ECAmount *Convert.ToDouble(vsl.NumCrew); var ecAmount = GetResourceInVessel(thisVessel, "ElectricCharge"); var ecTimeLeft = (ecPerSecond > ResourceUtilities.FLOAT_TOLERANCE) ? (ecAmount / ecPerSecond) : 0; if (ecAmount == 0) { var ecConsumedSinceLastCheck = ecPerSecond * (Planetarium.GetUniversalTime() - vsl.LastECCheck); ecAmount = Math.Max(0, (vsl.ECLeft * ecPerSecond) - ecConsumedSinceLastCheck); ecTimeLeft = (vsl.ECLeft - (Planetarium.GetUniversalTime() - vsl.LastECCheck)); } int numSharedHabVessels = 0; var habTime = LifeSupportManager.GetTotalHabTime(vsl, thisVessel, out numSharedHabVessels); var habString = "indefinite"; if (useHabPenalties) { habString = LifeSupportUtilities.DurationDisplay(habTime, LifeSupportUtilities.TimeFormatLength.Short); } vstat.SummaryLabel = String.Format( "<color=#3DB1FF>{0}/{1} - </color><color=#9EE4FF>{2:0}</color><color=#3DB1FF> supplies (</color><color=#9EE4FF>{3:0.0}</color><color=#3DB1FF>/day) hab for </color><color=#9EE4FF>{4}</color>" , thisVessel.mainBody.bodyName , situationString , supAmount , suppliesPerDay , habString); vstat.crew = new List <LifeSupportCrewDisplayStat>(); if (useHabPenalties) { vstat.SummaryLabel += String.Format( "<color=#3DB1FF> (</color><color=#9EE4FF>{0}</color><color=#3DB1FF> {1} shared within </color><color=#9EE4FF>{2}</color><color=#3DB1FF>m)</color>", isOldData ? "?" : numSharedHabVessels.ToString(), numSharedHabVessels == 1 ? "vessel" : "vessels", LifeSupportScenario.Instance.settings.GetSettings().HabRange); } foreach (var c in thisVessel.GetVesselCrew()) { var crewStat = GetCrewStat(c, thisVessel, suppliesTimeLeft, ecTimeLeft, ecAmount, habTime); vstat.crew.Add(crewStat); } vstat.crew = vstat.crew.OrderBy(crewStat => crewStat.EarliestExpiration).ToList(); if (vstat.crew.Any()) { vstat.EarliestExpiration = vstat.crew.First().EarliestExpiration; } return(vstat); }
internal static double GetTotalHabTime(VesselSupplyStatus sourceVessel, Vessel vsl) { int numSharedVessels = 0; return(GetTotalHabTime(sourceVessel, vsl, out numSharedVessels)); }
public void SaveVesselNode(VesselSupplyStatus status) { VesselSupplyStatus vesselInfo = _VesselInfo.FirstOrDefault(n => n.VesselId == status.VesselId); if (vesselInfo == null) { vesselInfo = new VesselSupplyStatus(); vesselInfo.VesselId = status.VesselId; _VesselInfo.Add(vesselInfo); } vesselInfo.VesselName = status.VesselName; vesselInfo.LastFeeding = status.LastFeeding; vesselInfo.LastECCheck = status.LastECCheck; vesselInfo.LastUpdate = status.LastUpdate; vesselInfo.NumCrew = status.NumCrew; vesselInfo.RecyclerMultiplier = status.RecyclerMultiplier; vesselInfo.CrewCap = status.CrewCap; vesselInfo.ExtraHabSpace = status.ExtraHabSpace; vesselInfo.VesselHabMultiplier = status.VesselHabMultiplier; vesselInfo.SuppliesLeft = status.SuppliesLeft; vesselInfo.ECLeft = status.ECLeft; }