protected override void PostProcess(ConverterResults result, double deltaTime)
 {
     base.PostProcess(result, deltaTime);
     if (result.TimeFactor >= ResourceUtilities.FLOAT_TOLERANCE
         && !status.EndsWith("load"))
     {
         statusPercent = 0d; //Force a reset of the load display.
     }
 }
Пример #2
0
 protected override void PostProcess(ConverterResults result, double deltaTime)
 {
     for (int i = 0; i < resource_amounts.Length; i++) {
         double amount = resource_amounts[i] * result.TimeFactor;
         resource_providers[i].ExtractResource (ResourceName, location, amount);
     }
     if (result.TimeFactor < 1E-09) {
         status = "stalled";
     }
 }
Пример #3
0
        protected override void PostProcess(ConverterResults result, double deltaTime)
        {
            var v = LifeSupportManager.Instance.FetchVessel(part.vessel.id.ToString());
            v.LastUpdate = Planetarium.GetUniversalTime();
            v.VesselName = part.vessel.vesselName;
            v.NumCrew = part.vessel.GetCrewCount();

            //How close before we assume we're done?
            var tolerance = deltaTime/2f;

            foreach (var c in part.protoModuleCrew)
            {
                //Fetch them from the queue
                var k = LifeSupportManager.Instance.FetchKerbal(c);
                //Update our stuff
                var onKerbin = (part.vessel.mainBody.name == "Kerbin" && part.vessel.altitude < 50000);

                if (!onKerbin && (deltaTime - result.TimeFactor > tolerance))
                {
                    //Sadness
                    CheckSideEffects(k, c);
                }
                else
                {
                    //All is well
                    k.LastMeal = lastUpdateTime;
                    v.LastFeeding = lastUpdateTime;
                    if (c.type == ProtoCrewMember.KerbalType.Tourist && k.IsGrouchy)
                    {
                        string msg = string.Format("{0} has returned to duty", c.name);
                        ScreenMessages.PostScreenMessage(msg, 5f, ScreenMessageStyle.UPPER_CENTER);
                        c.type = ProtoCrewMember.KerbalType.Crew;
                        KerbalRoster.SetExperienceTrait(c, "");
                        k.IsGrouchy = false;
                    }
                }
                k.LastUpdate = Planetarium.GetUniversalTime();
                LifeSupportManager.Instance.TrackKerbal(k);

                var supAmpunt = _resBroker.AmountAvailable(part, "Supplies", deltaTime, "ALL_VESSEL");
                v.SuppliesLeft = supAmpunt/0.00005f/part.vessel.GetCrewCount();
                LifeSupportManager.Instance.TrackVessel(v);
            }
        }
        protected override void PostProcess(ConverterResults result, double deltaTime)
        {
            var baseTime = TimeMultiplier*result.TimeFactor;
            var kerbals =
                vessel.GetVesselCrew()
                    .Where(c => string.IsNullOrEmpty(restrictedClass) || c.experienceTrait.Title == restrictedClass);
            if(PartOnly)
                kerbals =
                    part.protoModuleCrew
                        .Where(c => string.IsNullOrEmpty(restrictedClass) || c.experienceTrait.Title == restrictedClass);

            var timePerKerbal = baseTime/kerbals.Count();

            foreach (var k in kerbals)
            {
                var lsKerbal = LifeSupportManager.Instance.FetchKerbal(k);
                if(homeTimer)
                    lsKerbal.MaxOffKerbinTime += timePerKerbal;
                if(habTimer)
                    lsKerbal.TimeEnteredVessel += timePerKerbal;

                LifeSupportManager.Instance.TrackKerbal(lsKerbal);
            }
        }
Пример #5
0
        public void FixedUpdate()
        {
            if (!HighLogic.LoadedSceneIsFlight)
            {
                return;
            }

            try
            {
                bool isLongLoop = false;
                var  offKerbin  = !LifeSupportManager.IsOnKerbin(part.vessel);
                UnlockTins();
                CheckVesselId();

                //Check our time
                double deltaTime = GetDeltaTime();

                if (deltaTime < ResourceUtilities.FLOAT_TOLERANCE * 10)
                {
                    return;
                }

                if (Planetarium.GetUniversalTime() >= _lastProcessingTime + _checkInterval)
                {
                    isLongLoop          = true;
                    _lastProcessingTime = Planetarium.GetUniversalTime();
                }



                var v = LifeSupportManager.Instance.FetchVessel(part.vessel.id.ToString());
                v.LastUpdate = Planetarium.GetUniversalTime();
                v.VesselName = part.vessel.vesselName;
                v.NumCrew    = part.vessel.GetCrewCount();
                v.CrewCap    = part.vessel.GetCrewCapacity();
                if (isLongLoop)
                {
                    v.RecyclerMultiplier = (float)LifeSupportManager.GetRecyclerMultiplier(part.vessel);
                    CheckForDeadKerbals();
                }

                if (part.protoModuleCrew.Count > 0)
                {
                    #region Long loop - Vessel
                    //Only check effects periodically, this is for performance reasons.
                    if (isLongLoop)
                    {
                        //Update Hab info

                        var habMulti = CalculateVesselHabMultiplier(part.vessel, v.NumCrew);
                        var habTime  = CalculateVesselHabExtraTime(part.vessel);
                        var totParts = 0d;
                        var maxParts = 0d;


                        v.ExtraHabSpace       = habTime;
                        v.VesselHabMultiplier = habMulti;
                        //We also have to temper this with whether or not these parts are worn out.
                        if (part.Resources.Contains("ReplacementParts"))
                        {
                            var res = part.Resources["ReplacementParts"];
                            totParts = res.amount;
                            maxParts = res.maxAmount;
                        }

                        //Worn out parts have a corresponding negative effect.
                        if (maxParts > 0)
                        {
                            v.VesselHabMultiplier *= (totParts / maxParts);
                            v.ExtraHabSpace       *= (totParts / maxParts);
                            if (totParts < 1)
                            {
                                wearPercent = "Broken!";
                            }
                            else
                            {
                                wearPercent = String.Format("{0:0.00}%", (1d - (totParts / maxParts)) * 100);
                            }
                        }
                        else
                        {
                            wearPercent = "Like New";
                        }
                    }
                    #endregion
                    //we will add a bit of a fudge factor for supplies
                    var tolerance = deltaTime / 2f;
                    //nom nom nom!
                    ConverterResults resultSupply = ResConverter.ProcessRecipe(deltaTime, SupplyRecipe, part, this, 1f);
                    ConverterResults resultEC     = ResConverter.ProcessRecipe(deltaTime, ECRecipe, part, this, 1f);

                    foreach (var c in part.protoModuleCrew)
                    {
                        bool isGrouchyHab      = false;
                        bool isGrouchySupplies = false;
                        bool isGrouchyEC       = false;
                        //Fetch them from the queue
                        var k = LifeSupportManager.Instance.FetchKerbal(c);
                        //Update our stuff

                        #region Long Loop - Crew
                        if (isLongLoop)
                        {
                            //First - Hab effects.
                            if (LifeSupportManager.IsOnKerbin(part.vessel))
                            {
                                k.LastAtHome        = Planetarium.GetUniversalTime();
                                k.MaxOffKerbinTime  = 648000;
                                k.TimeEnteredVessel = Planetarium.GetUniversalTime();
                            }
                            else
                            {
                                if (part.vessel.id.ToString() != k.CurrentVesselId)
                                {
                                    if (part.vessel.id.ToString() != k.PreviousVesselId)
                                    {
                                        k.TimeEnteredVessel = Planetarium.GetUniversalTime();
                                    }

                                    k.PreviousVesselId = k.CurrentVesselId;
                                    k.CurrentVesselId  = part.vessel.id.ToString();
                                }
                            }
                            isGrouchyHab = CheckHabSideEffects(k, v);

                            //Second - Supply
                            if (offKerbin && (deltaTime - resultSupply.TimeFactor > tolerance))
                            {
                                isGrouchySupplies = CheckSupplySideEffects(k);
                            }
                            else if (deltaTime >= ResourceUtilities.FLOAT_TOLERANCE)
                            {
                                //All is well
                                k.LastMeal    = lastUpdateTime;
                                v.LastFeeding = lastUpdateTime;
                            }

                            //Third - EC
                            //Second - Supply
                            if (offKerbin && (deltaTime - resultEC.TimeFactor > tolerance))
                            {
                                isGrouchyEC = CheckECSideEffects(k);
                            }
                            else if (deltaTime >= ResourceUtilities.FLOAT_TOLERANCE)
                            {
                                //All is well
                                k.LastEC      = lastUpdateTime;
                                v.LastECCheck = lastUpdateTime;
                            }


                            k.LastUpdate = Planetarium.GetUniversalTime();

                            if (isGrouchyEC)
                            {
                                ApplyEffect(k, c,
                                            LifeSupportManager.isVet(k.KerbalName)
                                        ? LifeSupportScenario.Instance.settings.GetSettings().NoSupplyEffectVets
                                        : LifeSupportScenario.Instance.settings.GetSettings().NoSupplyEffect);
                            }
                            else if (isGrouchySupplies)
                            {
                                ApplyEffect(k, c,
                                            LifeSupportManager.isVet(k.KerbalName)
                                        ? LifeSupportScenario.Instance.settings.GetSettings().NoSupplyEffectVets
                                        : LifeSupportScenario.Instance.settings.GetSettings().NoSupplyEffect);
                            }
                            else if (isGrouchyHab)
                            {
                                ApplyEffect(k, c,
                                            LifeSupportManager.isVet(k.KerbalName)
                                        ? LifeSupportScenario.Instance.settings.GetSettings().NoHomeEffectVets
                                        : LifeSupportScenario.Instance.settings.GetSettings().NoHomeEffect);
                            }
                            else if (c.experienceTrait.Title != k.OldTrait)
                            {
                                RemoveGrouchiness(c, k);
                            }
                            LifeSupportManager.Instance.TrackKerbal(k);
                        }
                        #endregion - Crew
                        var supAmount = _resBroker.AmountAvailable(part, "Supplies", deltaTime, ResourceFlowMode.ALL_VESSEL);
                        var ecAmount  = _resBroker.AmountAvailable(part, "ElectricCharge", deltaTime, ResourceFlowMode.ALL_VESSEL);
                        v.SuppliesLeft = supAmount / LifeSupportScenario.Instance.settings.GetSettings().SupplyAmount /
                                         part.vessel.GetCrewCount() /
                                         v.RecyclerMultiplier;
                        v.ECLeft = ecAmount / LifeSupportScenario.Instance.settings.GetSettings().ECAmount /
                                   part.vessel.GetCrewCount();
                    }
                }
                LifeSupportManager.Instance.TrackVessel(v);
            }
            catch (Exception ex)
            {
                print(String.Format("ERROR {0} IN ModuleLifeSupport", ex.Message));
            }
        }
Пример #6
0
 protected override void PostProcess(ConverterResults result, double deltaTime)
 {
     base.PostProcess(result, deltaTime);
     EfficiencyMultiplier = result.TimeFactor / deltaTime;
 }
Пример #7
0
        protected override void PostProcess(ConverterResults result, double deltaTime)
        {
            if (!HighLogic.LoadedSceneIsFlight)
            {
                return;
            }

            base.PostProcess(result, deltaTime);
            var baseTime = TimeMultiplier * result.TimeFactor;
            var kerbals  = new List <ProtoCrewMember>();
            var crew     = vessel.GetVesselCrew();

            if (PartOnly)
            {
                crew = part.protoModuleCrew;
            }

            var hasMale   = false;
            var hasFemale = false;

            var count = crew.Count;

            for (int i = 0; i < count; ++i)
            {
                var c = crew[i];
                if (c.gender == ProtoCrewMember.Gender.Male)
                {
                    hasMale = true;
                }
                if (c.gender == ProtoCrewMember.Gender.Female)
                {
                    hasFemale = true;
                }

                if (string.IsNullOrEmpty(restrictedClass) || c.experienceTrait.Title == restrictedClass)
                {
                    kerbals.Add(c);
                }
            }

            var timePerKerbal = baseTime / kerbals.Count;

            count = kerbals.Count;
            for (int i = 0; i < count; ++i)
            {
                var k        = kerbals[i];
                var lsKerbal = LifeSupportManager.Instance.FetchKerbal(k);
                if (homeTimer)
                {
                    lsKerbal.MaxOffKerbinTime += timePerKerbal;
                }
                if (habTimer)
                {
                    lsKerbal.TimeEnteredVessel += timePerKerbal;
                }

                LifeSupportManager.Instance.TrackKerbal(lsKerbal);
            }

            //Kolony Growth
            if (KolonyGrowthEnabled && part.CrewCapacity > part.protoModuleCrew.Count)
            {
                GrowthTime += result.TimeFactor;
                if (GrowthTime >= GestationTime)
                {
                    GrowthTime = 0d;
                    SpawnKerbal();
                }
            }
        }
Пример #8
0
 protected override float GetHeatMultiplier(ConverterResults result, double deltaTime)
 {
     return(1 / (float)rate * HeatThrottle);
 }
 protected override void PostProcess(ConverterResults result, double deltaTime)
 {
     var diff = Math.Abs(deltaTime - result.TimeFactor);
     RecyclerIsActive = diff < 0.00001f;
 }
Пример #10
0
        protected override void PostProcess(ConverterResults result, double deltaTime)
        {
            base.PostProcess(result, deltaTime);
            if (HighLogic.LoadedSceneIsFlight == false)
            {
                return;
            }

            //Check activation
            if (IsActivated == false)
            {
                lodeStatus = Localizer.Format(statusNAName);
                return;
            }

            //Check broken
            if (isBroken)
            {
                StopResourceConverter();
                return;
            }

            //Check situation
            if (this.part.vessel.situation != Vessel.Situations.PRELAUNCH && this.part.vessel.situation != Vessel.Situations.LANDED)
            {
                lodeStatus = Localizer.Format(statusNAName);

                //Record the time delta for catch-up purposes.
                if (deltaTime >= TimeWarp.fixedDeltaTime)
                {
                    totalDelta += deltaTime;
                }
                return;
            }

            //Check nearest lode
            if (nearestLode == null)
            {
                UpdateLode();
                if (nearestLode == null)
                {
                    lodeStatus = Localizer.Format(statusNoNearbyName);
                    totalDelta = 0;
                    return;
                }
            }

            //Check amount remaining
            if (nearestLode.amountRemaining == 0)
            {
                lodeStatus = Localizer.Format(statusDepletedName);
                return;
            }

            //Check storage space
            double currentAmount;
            double maxAmount;

            this.part.vessel.resourcePartSet.GetConnectedResourceTotals(outputDef.id, out currentAmount, out maxAmount, true);

            if (maxAmount < 0.0001)
            {
                lodeStatus = Localizer.Format(statusFullName);
                return;
            }
            if (currentAmount / maxAmount > 0.999999)
            {
                lodeStatus = Localizer.Format(statusFullName);
                return;
            }

            //Ok, we have some room. Calculate how much to request from the lode.
            //Base is 1 unit of resource per second, modified by efficiency and deltaTime.
            //Make sure we go through the processing loop at least once.
            totalDelta += deltaTime;
            double requestAmount = Efficiency * EfficiencyBonus * totalDelta;

            if (requestAmount < 0.0001f)
            {
                Debug.Log("No units of resource to request!");
                return;
            }

            //Make sure we don't pull more than we need.
            double maxRequestAmount = maxAmount - currentAmount;

            if (requestAmount > maxRequestAmount)
            {
                requestAmount = maxRequestAmount;
            }

            //Make sure the lode has enough
            if (nearestLode.amountRemaining < requestAmount)
            {
                requestAmount = nearestLode.amountRemaining;
            }

            //Now we can do our business. Add the resource to the vessel.
            double amountObtained = Math.Abs(this.part.RequestResource(outputDef.id, -requestAmount));

            totalDelta -= amountObtained;
            if (totalDelta < 0)
            {
                totalDelta = 0;
            }

            //Update the lode.
            nearestLode.amountRemaining -= amountObtained;
            if (nearestLode.amountRemaining < 0.0001)
            {
                nearestLode.amountRemaining = 0f;
            }

            //Status update
            lodeStatus = Localizer.Format(statusOKName);
        }
Пример #11
0
 public virtual void PostProcess(ConverterResults result, double deltaTime)
 {
 }
Пример #12
0
 protected override void PostProcess(ConverterResults result, double deltaTime)
 {
     base.PostProcess(result, deltaTime);
     RecyclerIsActive       = result.TimeFactor > ResourceUtilities.FLOAT_TOLERANCE;
     AdjustedRecyclePercent = (float)(RecyclePercent * (result.TimeFactor / deltaTime));
 }
Пример #13
0
        protected override void PostProcess(ConverterResults result, double deltaTime)
        {
            base.PostProcess(result, deltaTime);

            //Below is a lengthy operation, make sure that sufficient time has passed.
            elapsedDistributionTime += deltaTime;
            if (elapsedDistributionTime < DISTRIBUTION_TIMER)
            {
                return;
            }

            List <SExperimentResource> requiredResources = null;
            Dictionary <string, List <WBIModuleScienceExperiment> > requiredResourceMap = new Dictionary <string, List <WBIModuleScienceExperiment> >();
            int totalSlots = experimentSlots.Length;
            int totalResources;
            WBIModuleScienceExperiment experimentSlot;
            SExperimentResource        experimentResource;
            PartResource resource;
            double       shareAmount;
            double       remainder;
            List <WBIModuleScienceExperiment> experiments;

            //Reset distribution timer
            elapsedDistributionTime = 0f;

            //Make sure we have experiment slots
            GetExperimentSlots();

            //Check for completion and compile the list of resources that the experiments need.
            for (int index = 0; index < totalSlots; index++)
            {
                //Get the experiment slot
                experimentSlot = experimentSlots[index];
                if (experimentSlot.experimentID == experimentSlot.defaultExperiment)
                {
                    continue;
                }

                //First, check for completion
                if (experimentSlot.CheckCompletion())
                {
                    continue;
                }

                //Now get all the resources that the experiment needs
                requiredResources = experimentSlot.GetRequiredResources();

                //Update the map
                totalResources = requiredResources.Count;
                if (totalResources > 0)
                {
                    for (int curResourceIndex = 0; curResourceIndex < totalResources; curResourceIndex++)
                    {
                        experimentResource = requiredResources[curResourceIndex];

                        //Create list if needed
                        if (requiredResourceMap.ContainsKey(experimentResource.name) == false)
                        {
                            requiredResourceMap.Add(experimentResource.name, new List <WBIModuleScienceExperiment>());
                        }

                        //Now update the list
                        requiredResourceMap[experimentResource.name].Add(experimentSlot);
                    }
                }
            }

            //Now that we know who needs what, divy up the resources.
            totalResources = this.part.Resources.Count;
            if (totalResources > 0)
            {
                for (int curResourceIndex = 0; curResourceIndex < totalResources; curResourceIndex++)
                {
                    resource = this.part.Resources[curResourceIndex];
                    if (requiredResourceMap.ContainsKey(resource.resourceName))
                    {
                        //Calculate share amount
                        shareAmount = resource.amount / requiredResourceMap[resource.resourceName].Count;
                        if (shareAmount < 0.0001f)
                        {
                            continue;
                        }

                        //Debugging: track the share amount
                        if (debugMode)
                        {
                            if (shareAmounts.ContainsKey(resource.resourceName) == false)
                            {
                                shareAmounts.Add(resource.resourceName, 0);
                            }
                            if (currentAmounts.ContainsKey(resource.resourceName) == false)
                            {
                                currentAmounts.Add(resource.resourceName, 0);
                            }
                            currentAmounts[resource.resourceName] = resource.amount;
                            shareAmounts[resource.resourceName]   = shareAmount;
                        }

                        //Get the experiments
                        experiments = requiredResourceMap[resource.resourceName];

                        //Now go through all the experiments and tell them to take their share
                        totalSlots = experiments.Count;
                        remainder  = 0;
                        for (int index = 0; index < totalSlots; index++)
                        {
                            remainder += experiments[index].TakeShare(resource.resourceName, shareAmount);
                        }

                        //Resource has been divied up.
                        resource.amount = remainder;
                        if (resource.amount < 0.0001f)
                        {
                            resource.amount = 0f;
                        }
                    }
                }
            }
        }
Пример #14
0
        protected override void PostProcess(ConverterResults result, double deltaTime)
        {
            var diff = Math.Abs(deltaTime - result.TimeFactor);

            converterEnabled = diff < 0.00001f;
        }
Пример #15
0
 protected override void PostProcess(ConverterResults result, double deltaTime)
 {
     base.PostProcess(result,deltaTime);
     EfficiencyMultiplier = result.TimeFactor/deltaTime;
 }
Пример #16
0
        public void FixedUpdate()
        {
            if (!HighLogic.LoadedSceneIsFlight || vessel == null || !vessel.loaded)
            {
                return;
            }

            if (vessel.isEVA)
            {
                CheckEVA(vessel);
                return;
            }

            if (_partCount != vessel.parts.Count)
            {
                if (_partCount > 0)
                {
                    _isStatusRefreshRequired = true;
                }
                _partCount = vessel.parts.Count;
            }

            if (_isDirty)
            {
                _isDirty = false;
                UpdateVesselInfo();
                UpdateStatus();
            }

            var now = Planetarium.GetUniversalTime();

            if (_currentCrewCount == 0)
            {
                VesselStatus.VesselName  = vessel.vesselName;
                VesselStatus.NumCrew     = vessel.GetCrewCount();
                VesselStatus.CrewCap     = vessel.GetCrewCapacity();
                VesselStatus.LastECCheck = now;
                VesselStatus.LastFeeding = now;
                VesselStatus.LastUpdate  = now;

                LifeSupportManager.Instance.TrackVessel(VesselStatus);
                LastUpdateTime = now;

                return;
            }

            try
            {
                bool isLongLoop = false;
                var  offKerbin  = !LifeSupportManager.IsOnKerbin(vessel);
                CheckVesselId();

                // Check our time
                double deltaTime = GetDeltaTime();
                bool   isCatchup = deltaTime / 2 > TimeWarp.fixedDeltaTime;

                if (deltaTime < ResourceUtilities.FLOAT_TOLERANCE * 10)
                {
                    return;
                }

                if (now >= _lastProcessingTime + _checkInterval)
                {
                    isLongLoop          = true;
                    _lastProcessingTime = now;
                }

                VesselStatus.LastUpdate = now;
                VesselStatus.VesselName = vessel.vesselName;
                VesselStatus.NumCrew    = vessel.GetCrewCount();
                VesselStatus.CrewCap    = vessel.GetCrewCapacity();

                if (isLongLoop)
                {
                    CheckForDeadKerbals();
                }

                if (_currentCrewCount > 0)
                {
                    //Guard clause
                    if (_crewPart == null)
                    {
                        UpdateVesselInfo();
                    }

                    //we will add a bit of a fudge factor for supplies
                    var tolerance = deltaTime / 2f;

                    //nom nom nom!
                    ConverterResults resultSupply = Converter.ProcessRecipe(deltaTime, SupplyRecipe, _crewPart, null, 1f);
                    ConverterResults resultEC     = Converter.ProcessRecipe(deltaTime, ECRecipe, _crewPart, null, 1f);

                    #region Long Loop - Crew
                    if (isLongLoop)
                    {
                        //Ensure status is current
                        UpdateStatus();

                        var habTime = LifeSupportManager.GetTotalHabTime(VesselStatus, vessel);

                        if (_oldHabChecksum < ResourceUtilities.FLOAT_TOLERANCE)
                        {
                            _oldHabChecksum = LifeSupportManager.GetHabChecksum(VesselStatus, vessel);
                        }

                        var newHabChecksum = LifeSupportManager.GetHabChecksum(VesselStatus, vessel);
                        if (Math.Abs(_oldHabChecksum - newHabChecksum) > ResourceUtilities.FLOAT_TOLERANCE)
                        {
                            Debug.Log("[USI-LS] Vessel situation changed, refreshing life support");
                            _isStatusRefreshRequired = true;
                            _oldHabChecksum          = newHabChecksum;
                        }

                        var crewRoster = vessel.GetVesselCrew();
                        var count      = crewRoster.Count;
                        for (int i = 0; i < count; ++i)
                        {
                            var  crewMember        = crewRoster[i];
                            bool isGrouchyHab      = false;
                            bool isGrouchySupplies = false;
                            bool isGrouchyEC       = false;
                            bool isScout           = crewMember.HasEffect("ExplorerSkill") && habTime >= LifeSupportScenario.Instance.settings.GetSettings().ScoutHabTime;
                            bool isPermaHab        = habTime >= LifeSupportScenario.Instance.settings.GetSettings().PermaHabTime;
                            bool isHomeWorld       = CheckIfHomeWorld() && habTime >= LifeSupportScenario.Instance.settings.GetSettings().ScoutHabTime&& vessel.LandedOrSplashed;

                            // Get the crew member's life support stats
                            var trackedKerbal = LifeSupportManager.Instance.FetchKerbal(crewMember);

                            // Update life support stats
                            if (_isStatusRefreshRequired)
                            {
                                trackedKerbal.TimeEnteredVessel = now;
                                _isStatusRefreshRequired        = false;
                                LifeSupportManager.Instance.TrackKerbal(trackedKerbal);
                            }

                            // Update Hab effects
                            if (!offKerbin || isScout || isHomeWorld || isPermaHab)
                            {
                                trackedKerbal.TimeEnteredVessel = now;
                                trackedKerbal.LastAtHome        = now;
                                trackedKerbal.MaxOffKerbinTime  = habTime + trackedKerbal.LastAtHome;
                            }
                            else
                            {
                                if (vessel.id.ToString() != trackedKerbal.CurrentVesselId)
                                {
                                    if (vessel.id.ToString() != trackedKerbal.PreviousVesselId)
                                    {
                                        trackedKerbal.TimeEnteredVessel = now;
                                    }

                                    trackedKerbal.PreviousVesselId = trackedKerbal.CurrentVesselId;
                                    trackedKerbal.CurrentVesselId  = vessel.id.ToString();
                                    LifeSupportManager.Instance.TrackKerbal(trackedKerbal);
                                }

                                isGrouchyHab = CheckHabSideEffects(trackedKerbal);
                            }

                            // Update Supplies effects
                            if (offKerbin && (deltaTime - resultSupply.TimeFactor > tolerance))
                            {
                                isGrouchySupplies = CheckSupplySideEffects(trackedKerbal);
                            }
                            else if (deltaTime >= ResourceUtilities.FLOAT_TOLERANCE)
                            {
                                //All is well
                                trackedKerbal.LastMeal   = LastUpdateTime;
                                VesselStatus.LastFeeding = LastUpdateTime;
                            }

                            // Update ElectricCharge effects
                            if (offKerbin && (deltaTime - resultEC.TimeFactor > tolerance))
                            {
                                isGrouchyEC = CheckECSideEffects(trackedKerbal);
                            }
                            else if (deltaTime >= ResourceUtilities.FLOAT_TOLERANCE)
                            {
                                //All is well
                                trackedKerbal.LastEC     = LastUpdateTime;
                                VesselStatus.LastECCheck = LastUpdateTime;
                            }

                            trackedKerbal.LastUpdate = now;

                            var isAnyGrouch = isGrouchyEC || isGrouchyHab || isGrouchySupplies;
                            if (isGrouchyEC && !isCatchup)
                            {
                                ApplyEffect(
                                    trackedKerbal,
                                    crewMember,
                                    LifeSupportManager.GetNoECEffect(trackedKerbal.KerbalName),
                                    "power loss");
                            }
                            else if (isGrouchySupplies && !isCatchup)
                            {
                                ApplyEffect(
                                    trackedKerbal,
                                    crewMember,
                                    LifeSupportManager.GetNoSupplyEffect(trackedKerbal.KerbalName),
                                    "lack of supplies");
                            }
                            else if (isGrouchyHab && !isCatchup)
                            {
                                ApplyEffect(
                                    trackedKerbal,
                                    crewMember,
                                    LifeSupportManager.GetNoHomeEffect(trackedKerbal.KerbalName),
                                    "homesickness");
                            }
                            else if (crewMember.experienceTrait.Title != trackedKerbal.OldTrait && !isAnyGrouch)
                            {
                                RemoveGrouchiness(crewMember, trackedKerbal);
                            }

                            LifeSupportManager.Instance.TrackKerbal(trackedKerbal);
                        }
                    }
                    #endregion - Crew

                    var remainingSupplies = ResourceBroker.AmountAvailable(
                        _crewPart,
                        "Supplies",
                        deltaTime,
                        ResourceFlowMode.ALL_VESSEL);
                    var remainingBattery = ResourceBroker.AmountAvailable(
                        _crewPart,
                        "ElectricCharge",
                        deltaTime,
                        ResourceFlowMode.ALL_VESSEL);
                    var suppliesConsumption    = LifeSupportScenario.Instance.settings.GetSettings().SupplyAmount;
                    var electricityConsumption = LifeSupportScenario.Instance.settings.GetSettings().ECAmount;

                    VesselStatus.SuppliesLeft = remainingSupplies / suppliesConsumption / _currentCrewCount / VesselStatus.RecyclerMultiplier;
                    VesselStatus.ECLeft       = remainingBattery / electricityConsumption / _currentCrewCount;
                }
                else
                {
                    VesselStatus.LastECCheck = now;
                    VesselStatus.LastFeeding = now;
                    VesselStatus.LastUpdate  = now;
                }

                LifeSupportManager.Instance.TrackVessel(VesselStatus);
            }
            catch (Exception ex)
            {
                print(string.Format("ERROR {0} IN ModuleLifeSupport", ex.Message));
            }
        }
Пример #17
0
        public void FixedUpdate()
        {
            if (!HighLogic.LoadedSceneIsFlight || vessel == null)
            {
                return;
            }
            if (!vessel.loaded)
            {
                return;
            }

            if (_partCount != vessel.parts.Count)
            {
                if (_partCount > 0)
                {
                    refreshVesselTime = true;
                }
                _partCount = vessel.parts.Count;
            }


            if (isDirty)
            {
                isDirty = false;
                UpdateVesselInfo();
                UpdateStatus();
            }

            if (_currentCrew == 0)
            {
                return;
            }

            try
            {
                bool isLongLoop = false;
                var  offKerbin  = !LifeSupportManager.IsOnKerbin(vessel);
                UnlockTins();
                CheckVesselId();

                //Check our time
                double deltaTime = GetDeltaTime();
                bool   isCatchup = deltaTime - 1 > TimeWarp.fixedDeltaTime;

                if (deltaTime < ResourceUtilities.FLOAT_TOLERANCE * 10)
                {
                    return;
                }

                if (Planetarium.GetUniversalTime() >= _lastProcessingTime + _checkInterval)
                {
                    isLongLoop          = true;
                    _lastProcessingTime = Planetarium.GetUniversalTime();
                }

                VesselStatus.LastUpdate = Planetarium.GetUniversalTime();
                VesselStatus.VesselName = vessel.vesselName;
                VesselStatus.NumCrew    = vessel.GetCrewCount();
                VesselStatus.CrewCap    = vessel.GetCrewCapacity();
                if (isLongLoop)
                {
                    CheckForDeadKerbals();
                }

                if (_currentCrew > 0)
                {
                    //Guard clause
                    if (_crewPart == null)
                    {
                        UpdateVesselInfo();
                    }

                    //we will add a bit of a fudge factor for supplies
                    var tolerance = deltaTime / 2f;
                    //nom nom nom!
                    ConverterResults resultSupply = ResConverter.ProcessRecipe(deltaTime, SupplyRecipe, _crewPart, null,
                                                                               1f);
                    ConverterResults resultEC = ResConverter.ProcessRecipe(deltaTime, ECRecipe, _crewPart, null, 1f);

                    #region Long Loop - Crew
                    if (isLongLoop)
                    {
                        //Ensure status is current
                        UpdateStatus();
                        foreach (var c in vessel.GetVesselCrew())
                        {
                            bool isGrouchyHab      = false;
                            bool isGrouchySupplies = false;
                            bool isGrouchyEC       = false;
                            //Fetch them from the queue
                            var k = LifeSupportManager.Instance.FetchKerbal(c);
                            //Update our stuff
                            if (refreshVesselTime)
                            {
                                k.TimeEnteredVessel = Planetarium.GetUniversalTime();
                                refreshVesselTime   = false;
                                LifeSupportManager.Instance.TrackKerbal(k);
                            }
                            //First - Hab effects.
                            if (!offKerbin)
                            {
                                var habTime = LifeSupportManager.GetTotalHabTime(VesselStatus, vessel);
                                k.LastAtHome        = Planetarium.GetUniversalTime();
                                k.MaxOffKerbinTime  = habTime + k.LastAtHome;
                                k.TimeEnteredVessel = Planetarium.GetUniversalTime();
                            }
                            else
                            {
                                if (vessel.id.ToString() != k.CurrentVesselId)
                                {
                                    if (vessel.id.ToString() != k.PreviousVesselId)
                                    {
                                        k.TimeEnteredVessel = Planetarium.GetUniversalTime();
                                    }

                                    k.PreviousVesselId = k.CurrentVesselId;
                                    k.CurrentVesselId  = vessel.id.ToString();
                                    LifeSupportManager.Instance.TrackKerbal(k);
                                }
                                isGrouchyHab = CheckHabSideEffects(k);
                            }


                            //Second - Supply
                            if (offKerbin && (deltaTime - resultSupply.TimeFactor > tolerance))
                            {
                                isGrouchySupplies = CheckSupplySideEffects(k);
                            }
                            else if (deltaTime >= ResourceUtilities.FLOAT_TOLERANCE)
                            {
                                //All is well
                                k.LastMeal = LastUpdateTime;
                                VesselStatus.LastFeeding = LastUpdateTime;
                            }

                            //Third - EC
                            //Second - Supply
                            if (offKerbin && (deltaTime - resultEC.TimeFactor > tolerance))
                            {
                                isGrouchyEC = CheckECSideEffects(k);
                            }
                            else if (deltaTime >= ResourceUtilities.FLOAT_TOLERANCE)
                            {
                                //All is well
                                k.LastEC = LastUpdateTime;
                                VesselStatus.LastECCheck = LastUpdateTime;
                            }


                            k.LastUpdate = Planetarium.GetUniversalTime();

                            if (isGrouchyEC & !isCatchup)
                            {
                                ApplyEffect(k, c,
                                            LifeSupportManager.isVet(k.KerbalName)
                                        ? LifeSupportScenario.Instance.settings.GetSettings().NoSupplyEffectVets
                                        : LifeSupportScenario.Instance.settings.GetSettings().NoSupplyEffect,
                                            "power loss");
                            }
                            else if (isGrouchySupplies & !isCatchup)
                            {
                                ApplyEffect(k, c,
                                            LifeSupportManager.isVet(k.KerbalName)
                                        ? LifeSupportScenario.Instance.settings.GetSettings().NoSupplyEffectVets
                                        : LifeSupportScenario.Instance.settings.GetSettings().NoSupplyEffect,
                                            "lack of supplies");
                            }
                            else if (isGrouchyHab & !isCatchup)
                            {
                                ApplyEffect(k, c,
                                            LifeSupportManager.isVet(k.KerbalName)
                                        ? LifeSupportScenario.Instance.settings.GetSettings().NoHomeEffectVets
                                        : LifeSupportScenario.Instance.settings.GetSettings().NoHomeEffect,
                                            "homesickness");
                            }
                            else if (c.experienceTrait.Title != k.OldTrait)
                            {
                                RemoveGrouchiness(c, k);
                            }
                            LifeSupportManager.Instance.TrackKerbal(k);
                        }
                    }
                    #endregion - Crew

                    var supAmount = _resBroker.AmountAvailable(_crewPart, "Supplies", deltaTime,
                                                               ResourceFlowMode.ALL_VESSEL);
                    var ecAmount = _resBroker.AmountAvailable(_crewPart, "ElectricCharge", deltaTime,
                                                              ResourceFlowMode.ALL_VESSEL);
                    VesselStatus.SuppliesLeft = supAmount /
                                                LifeSupportScenario.Instance.settings.GetSettings().SupplyAmount /
                                                _currentCrew /
                                                VesselStatus.RecyclerMultiplier;
                    VesselStatus.ECLeft = ecAmount / LifeSupportScenario.Instance.settings.GetSettings().ECAmount /
                                          _currentCrew;
                }
                else
                {
                    VesselStatus.LastECCheck = Planetarium.GetUniversalTime();
                    VesselStatus.LastFeeding = Planetarium.GetUniversalTime();
                    VesselStatus.LastUpdate  = Planetarium.GetUniversalTime();
                }
                LifeSupportManager.Instance.TrackVessel(VesselStatus);
            }
            catch (Exception ex)
            {
                print(String.Format("ERROR {0} IN ModuleLifeSupport", ex.Message));
            }
        }
Пример #18
0
 public override void PostProcess(ConverterResults result, double deltaTime)
 {
     base.PostProcess(result, deltaTime);
     IsOperational = result.TimeFactor > ResourceUtilities.FLOAT_TOLERANCE;
 }
Пример #19
0
 protected override float GetHeatMultiplier(ConverterResults result, double deltaTime)
 {
     return(0f);
 }
Пример #20
0
 protected override float GetHeatMultiplier(ConverterResults result, double deltaTime)
 {
     return 1 / (float)rate * HeatThrottle;
 }
Пример #21
0
 protected override void PostProcess(ConverterResults result, double deltaTime)
 {
     PartIsActive      = Math.Abs(deltaTime - result.TimeFactor) < ResourceUtilities.FLOAT_TOLERANCE;
     CurrentEfficiency = result.TimeFactor / deltaTime * eMultiplier;
 }
 protected override float GetHeatMultiplier(ConverterResults result, double deltaTime)
 {
     return 0f;
 }
        protected override void PostProcess(ConverterResults result, double deltaTime)
        {
            bool missingResources = false;

            Events["StartResourceConverter"].guiActive = false;
            Events["StopResourceConverter"].guiActive  = false;

            if (FlightGlobals.ready == false)
            {
                return;
            }
            if (HighLogic.LoadedSceneIsFlight == false)
            {
                return;
            }
            if (ModuleIsActive() == false)
            {
                return;
            }
            if (this.part.vessel.IsControllable == false)
            {
                StopResourceConverter();
                return;
            }
            if (hoursPerCycle == 0f)
            {
                return;
            }

            //If w're missing required resources, then we're done
            string missingRequiredResource = GetMissingRequiredResource();

            if (!string.IsNullOrEmpty(missingRequiredResource))
            {
                status = requiredResource + missingRequiredResource;
                StopResourceConverter();
                return;
            }

            //Make sure we have the minimum crew
            if (hasMinimumCrew() == false)
            {
                return;
            }

            //Now run the base converter stuff
            base.PostProcess(result, deltaTime);

            if (cycleStartTime == 0f)
            {
                cycleStartTime = Planetarium.GetUniversalTime();
                lastUpdateTime = cycleStartTime;
                elapsedTime    = 0.0f;
                return;
            }

            //Calculate the crew skill and seconds of research per cycle.
            //Thes values can change if the player swaps out crew.
            totalCrewSkill  = GetTotalCrewSkill();
            secondsPerCycle = GetSecondsPerCycle();

            //If we're missing resources then we're done.
            if (!string.IsNullOrEmpty(result.Status))
            {
                if (result.Status.ToLower().Contains("missing"))
                {
                    status           = result.Status;
                    missingResources = true;
                    return;
                }
            }

            //Calculate elapsed time
            elapsedTime = Planetarium.GetUniversalTime() - cycleStartTime;

            //Calculate progress
            CalculateProgress();

            //If we've elapsed time cycle then perform the analyis.
            float completionRatio = (float)(elapsedTime / secondsPerCycle);

            if (completionRatio > 1.0f && !missingResources)
            {
                int cyclesSinceLastUpdate = Mathf.RoundToInt(completionRatio);
                int currentCycle;
                for (currentCycle = 0; currentCycle < cyclesSinceLastUpdate; currentCycle++)
                {
                    PerformAnalysis();

                    //Reset start time
                    cycleStartTime = Planetarium.GetUniversalTime();
                }
            }
        }
Пример #24
0
 protected override float GetHeatMultiplier(ConverterResults result, double deltaTime)
 {
     //No need for heat generation
     return 0f;
 }
Пример #25
0
 protected override void PostProcess(ConverterResults result, double deltaTime)
 {
     var diff = Math.Abs(deltaTime - result.TimeFactor);
     converterEnabled = diff < 0.00001f;
 }
Пример #26
0
 protected override void PostProcess(ConverterResults result, double deltaTime)
 {
     base.PostProcess(result, deltaTime);
     RecyclerIsActive = result.TimeFactor > ResourceUtilities.FLOAT_TOLERANCE;
 }
Пример #27
0
        protected override void PostProcess(ConverterResults result, double deltaTime)
        {
            base.PostProcess(result, deltaTime);
            Events["StartResourceConverter"].guiActive = false;
            Events["StopResourceConverter"].guiActive = false;

            if (FlightGlobals.ready == false)
                return;
            if (HighLogic.LoadedSceneIsFlight == false)
                return;
            if (ModuleIsActive() == false)
                return;
            if (this.part.vessel.IsControllable == false)
            {
                StopConverter();
                return;
            }
            if (hoursPerCycle == 0f)
                return;

            //Calculate the crew skill and seconds of research per cycle.
            //Thes values can change if the player swaps out crew.
            totalCrewSkill = GetTotalCrewSkill();
            secondsPerCycle = GetSecondsPerCycle();

            //Calculate elapsed time
            elapsedTime = Planetarium.GetUniversalTime() - cycleStartTime;

            //Calculate progress
            CalculateProgress();

            //If we've completed our research cycle then perform the analyis.
            int cyclesSinceLastUpdate = Mathf.RoundToInt((float)(elapsedTime / secondsPerCycle));
            int currentCycle;
            for (currentCycle = 0; currentCycle < cyclesSinceLastUpdate; currentCycle++)
            {
                PerformAnalysis();

                //Reset start time
                cycleStartTime = Planetarium.GetUniversalTime();
            }

            //If we're missing resources then stop the converter
            if (result.Status.ToLower().Contains("missing"))
            {
                StopConverter();
                status = result.Status;
            }
        }
Пример #28
0
 protected override void PostProcess(ConverterResults result, double deltaTime)
 {
     base.PostProcess(result, deltaTime);
     HabIsActive   = result.TimeFactor > ResourceUtilities.FLOAT_TOLERANCE;
     HabAdjustment = result.TimeFactor / deltaTime;
 }
Пример #29
0
 protected override void PostProcess(ConverterResults result, double deltaTime)
 {
     RecyclerIsActive = result.TimeFactor > ResourceUtilities.FLOAT_TOLERANCE;
 }
Пример #30
0
 protected override void PostProcess(ConverterResults result, double deltaTime)
 {
     RecyclerIsActive = Math.Abs(result.TimeFactor - deltaTime) < ResourceUtilities.FLOAT_TOLERANCE;
 }