示例#1
0
        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;
            }
        }
示例#5
0
        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);
        }
示例#6
0
        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);
        }
示例#7
0
 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);
 }
示例#9
0
        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);
        }
示例#10
0
        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);
        }
示例#11
0
        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);
        }
示例#13
0
 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;
     }
 }
示例#14
0
 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;
     }
 }
示例#15
0
        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);
        }
示例#16
0
        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);
        }
示例#17
0
 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;
         }
     }
 }
示例#18
0
 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;
         }
     }
 }
示例#19
0
        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;
        }
示例#20
0
        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;
        }
示例#21
0
        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);
        }
示例#22
0
        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);
        }
示例#23
0
        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));
        }
示例#24
0
        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);
        }
示例#25
0
        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()));
        }
示例#26
0
        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);
        }
示例#27
0
        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;
        }
示例#28
0
 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);
 }
示例#29
0
        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;
        }
示例#30
0
        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));
        }
示例#31
0
 internal static double GetTotalHabTime(VesselSupplyStatus sourceVessel)
 {
     int numSharedVessels = 0;
      return GetTotalHabTime(sourceVessel, out numSharedVessels);
 }
示例#32
0
 public void TrackVessel(VesselSupplyStatus status)
 {
     if(VesselSupplyInfo.All(n => n.VesselId != status.VesselId))
     VesselSupplyInfo.Add(status);
     LifeSupportScenario.Instance.settings.SaveVesselNode(status);
 }
示例#33
0
        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;
        }
示例#34
0
 public void AddVesselNode(VesselSupplyStatus vInfo)
 {
     if (_VesselInfo.Any(n => n.VesselId == vInfo.VesselId))
         return;
     _VesselInfo.Add(vInfo);
 }
示例#35
0
        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);
        }
示例#36
0
        internal static double GetTotalHabTime(VesselSupplyStatus sourceVessel, Vessel vsl)
        {
            int numSharedVessels = 0;

            return(GetTotalHabTime(sourceVessel, vsl, out numSharedVessels));
        }
示例#37
0
 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;
 }
示例#38
0
 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;
 }
示例#39
0
 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);
 }