示例#1
0
        public LifeSupportStatus FetchKerbal(ProtoCrewMember crew)
        {
            if (!IsKerbalTracked(crew.name))
            {
                var k = new LifeSupportStatus();
                k.KerbalName = crew.name;
                k.HomeBodyId = FlightGlobals.GetHomeBodyIndex();
                k.LastPlanet = FlightGlobals.GetHomeBodyIndex();
                k.LastMeal = Planetarium.GetUniversalTime();
                k.LastEC = Planetarium.GetUniversalTime();
                k.LastAtHome = Planetarium.GetUniversalTime();
                k.LastSOIChange = Planetarium.GetUniversalTime();
                k.MaxOffKerbinTime = 648000;    //TODO - make this configurable
                k.TimeEnteredVessel = Planetarium.GetUniversalTime();
                k.CurrentVesselId = "?UNKNOWN?";
                k.PreviousVesselId = "??UNKNOWN??";
                k.LastUpdate = Planetarium.GetUniversalTime();
                k.IsGrouchy = false;
                k.OldTrait = crew.experienceTrait.Title;
                TrackKerbal(k);
            }

            var kerbal = LifeSupportInfo.FirstOrDefault(k => k.KerbalName == crew.name);
            return kerbal;
        }
示例#2
0
 public void TrackKerbal(LifeSupportStatus status)
 {
     if (LifeSupportInfo.All(n => n.KerbalName != status.KerbalName))
     {
         LifeSupportInfo.Add(status);
     }
     LifeSupportScenario.Instance.settings.SaveStatusNode(status);
 }
示例#3
0
        public void DeleteStatusNode(LifeSupportStatus kerbal)
        {
            if (_StatusInfo.All(n => n.KerbalName != kerbal.KerbalName))
            {
                return;
            }
            var k = _StatusInfo.First(n => n.KerbalName == kerbal.KerbalName);

            _StatusInfo.Remove(k);
        }
        private bool CheckECSideEffects(LifeSupportStatus kStat)
        {
            var curTime = Planetarium.GetUniversalTime();
            var ecMax   = LifeSupportScenario.Instance.settings.GetSettings().ECTime;
            var ecTime  = Math.Max(curTime - kStat.LastEC, ResourceUtilities.FLOAT_TOLERANCE);

            if (ecTime > ecMax)
            {
                return(true);
            }
            return(false);
        }
 private void RemoveGrouchiness(ProtoCrewMember c, LifeSupportStatus k)
 {
     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.OldTrait);
         k.IsGrouchy = false;
         LifeSupportManager.Instance.TrackKerbal(k);
     }
 }
示例#6
0
        private void CheckSideEffects(LifeSupportStatus kStat, ProtoCrewMember crew)
        {
            var curTime  = Planetarium.GetUniversalTime();
            var SnackMax = LifeSupportSetup.Instance.LSConfig.SupplyTime;

            var SnackTime = Math.Max(curTime - kStat.LastMeal, ResourceUtilities.FLOAT_TOLERANCE);

            if (SnackTime > SnackMax)
            {
                //If we are past the final threshold, we will start by trying to unlock any biscuit tins left on the ship.

                foreach (var rp in vessel.parts.Where(p => p.Resources.Contains("Supplies")))
                {
                    var resAmt = rp.Resources["Supplies"].amount;
                    if (resAmt > 0)
                    {
                        rp.Resources["Supplies"].amount = 0;
                        string msg = string.Format("{0} raids the ship for snacks...  some accidentally fell out of the airlock.", crew.name);
                        kStat.LastMeal = lastUpdateTime;
                        ScreenMessages.PostScreenMessage(msg, 5f, ScreenMessageStyle.UPPER_CENTER);
                        LifeSupportManager.Instance.TrackKerbal(kStat);
                        //At this point, the Kerbal is saved!
                        return;
                    }
                }

                if (LifeSupportSetup.Instance.LSConfig.CausesDeath)
                {
                    string msg = string.Format("{0} has died of starvation", crew.name);
                    LifeSupportManager.Instance.UntrackKerbal(crew.name);
                    ScreenMessages.PostScreenMessage(msg, 5f, ScreenMessageStyle.UPPER_CENTER);
                    part.RemoveCrewmember(crew);
                    crew.rosterStatus = ProtoCrewMember.RosterStatus.Dead;
                    return;
                }

                //Vacation time!  The lone exception are our badasses.
                if (crew.isBadass || vetNames.Contains(crew.name))
                {
                    return;
                }

                if (crew.type != ProtoCrewMember.KerbalType.Tourist)
                {
                    string msg = string.Format("{0} refuses to work.", crew.name);
                    ScreenMessages.PostScreenMessage(msg, 5f, ScreenMessageStyle.UPPER_CENTER);
                    crew.type = ProtoCrewMember.KerbalType.Tourist;
                    KerbalRoster.SetExperienceTrait(crew, "Tourist");
                    kStat.IsGrouchy = true;
                    LifeSupportManager.Instance.TrackKerbal(kStat);
                }
            }
        }
        private bool CheckSupplySideEffects(LifeSupportStatus trackedKerbal)
        {
            var now       = Planetarium.GetUniversalTime();
            var snackMax  = LifeSupportScenario.Instance.settings.GetSettings().SupplyTime;
            var snackTime = Math.Max(now - trackedKerbal.LastMeal, ResourceUtilities.FLOAT_TOLERANCE);

            if (snackTime > ResourceUtilities.FLOAT_TOLERANCE)
            {
                UnlockTins();
            }

            return(snackTime > snackMax);
        }
示例#8
0
        private bool CheckSupplySideEffects(LifeSupportStatus kStat)
        {
            var curTime  = Planetarium.GetUniversalTime();
            var SnackMax = LifeSupportSetup.Instance.LSConfig.SupplyTime;

            var SnackTime = Math.Max(curTime - kStat.LastMeal, ResourceUtilities.FLOAT_TOLERANCE);

            if (SnackTime > SnackMax)
            {
                return(true);
            }
            return(false);
        }
示例#9
0
        public void AddStatusNode(LifeSupportStatus kerbal)
        {
            var count = _StatusInfo.Count;

            for (int i = 0; i < count; ++i)
            {
                if (_StatusInfo[i].KerbalName == kerbal.KerbalName)
                {
                    return;
                }
            }
            _StatusInfo.Add(kerbal);
        }
        private void RemoveGrouchiness(ProtoCrewMember crewMember, LifeSupportStatus trackedKerbal)
        {
            if (trackedKerbal.IsGrouchy)
            {
                crewMember.type = ProtoCrewMember.KerbalType.Crew;
                KerbalRoster.SetExperienceTrait(crewMember, trackedKerbal.OldTrait);

                trackedKerbal.IsGrouchy = false;
                LifeSupportManager.Instance.TrackKerbal(trackedKerbal);

                string msg = string.Format("{0} has returned to duty", crewMember.name);
                ScreenMessages.PostScreenMessage(msg, 5f, ScreenMessageStyle.UPPER_CENTER);
            }
        }
示例#11
0
        public void SaveStatusNode(LifeSupportStatus status)
        {
            LifeSupportStatus kerbInfo =
                _StatusInfo.FirstOrDefault(n => n.KerbalName == status.KerbalName);

            if (kerbInfo == null)
            {
                kerbInfo            = new LifeSupportStatus();
                kerbInfo.KerbalName = status.KerbalName;
                _StatusInfo.Add(kerbInfo);
            }
            kerbInfo.LastMeal   = status.LastMeal;
            kerbInfo.IsGrouchy  = status.IsGrouchy;
            kerbInfo.LastUpdate = status.LastUpdate;
        }
示例#12
0
        public LifeSupportStatus FetchKerbal(ProtoCrewMember crew)
        {
            if (!IsKerbalTracked(crew.name))
            {
                var k = new LifeSupportStatus();
                k.KerbalName = crew.name;
                k.LastMeal = Planetarium.GetUniversalTime();
                k.LastUpdate = Planetarium.GetUniversalTime();
                k.IsGrouchy = false;
                TrackKerbal(k);
            }

            var kerbal = LifeSupportInfo.FirstOrDefault(k => k.KerbalName == crew.name);
            return kerbal;
        }
示例#13
0
        public void TrackKerbal(LifeSupportStatus status)
        {
            LifeSupportStatus kerbInfo =
                LifeSupportInfo.FirstOrDefault(n => n.KerbalName == status.KerbalName);

            if (kerbInfo == null)
            {
                kerbInfo            = new LifeSupportStatus();
                kerbInfo.KerbalName = status.KerbalName;
                LifeSupportInfo.Add(kerbInfo);
            }
            kerbInfo.LastMeal   = status.LastMeal;
            kerbInfo.LastUpdate = status.LastUpdate;
            kerbInfo.IsGrouchy  = status.IsGrouchy;
            LifeSupportScenario.Instance.settings.SaveStatusNode(status);
        }
示例#14
0
        public LifeSupportStatus FetchKerbal(ProtoCrewMember crew)
        {
            if (!IsKerbalTracked(crew.name))
            {
                var k = new LifeSupportStatus();
                k.KerbalName = crew.name;
                k.LastMeal   = Planetarium.GetUniversalTime();
                k.LastUpdate = Planetarium.GetUniversalTime();
                k.IsGrouchy  = false;
                TrackKerbal(k);
            }

            var kerbal = LifeSupportInfo.FirstOrDefault(k => k.KerbalName == crew.name);

            return(kerbal);
        }
        private bool CheckHabSideEffects(LifeSupportStatus trackedKerbal)
        {
            var now     = Planetarium.GetUniversalTime();
            var habTime = LifeSupportManager.GetTotalHabTime(VesselStatus, vessel);

            if (trackedKerbal.LastAtHome < 1)
            {
                trackedKerbal.LastAtHome = now;
            }
            if (habTime + trackedKerbal.LastAtHome > trackedKerbal.MaxOffKerbinTime)
            {
                trackedKerbal.MaxOffKerbinTime = habTime + trackedKerbal.LastAtHome;
            }

            LifeSupportManager.Instance.TrackKerbal(trackedKerbal);

            return(now > trackedKerbal.MaxOffKerbinTime || (now - trackedKerbal.TimeEnteredVessel) > habTime);
        }
示例#16
0
        public void TrackKerbal(LifeSupportStatus status)
        {
            var count = LifeSupportInfo.Count;
            var isNew = true;

            for (int i = 0; i < count; ++i)
            {
                if (LifeSupportInfo[i].KerbalName == status.KerbalName)
                {
                    isNew = false;
                    break;
                }
            }
            if (isNew)
            {
                LifeSupportInfo.Add(status);
            }
            LifeSupportScenario.Instance.settings.SaveStatusNode(status);
        }
示例#17
0
        public void SaveStatusNode(LifeSupportStatus status)
        {
            LifeSupportStatus kerbInfo =
                _StatusInfo.FirstOrDefault(n => n.KerbalName == status.KerbalName);

            if (kerbInfo == null)
            {
                kerbInfo            = new LifeSupportStatus();
                kerbInfo.KerbalName = status.KerbalName;
                _StatusInfo.Add(kerbInfo);
            }
            kerbInfo.LastMeal          = status.LastMeal;
            kerbInfo.LastOnKerbin      = status.LastOnKerbin;
            kerbInfo.MaxOffKerbinTime  = status.MaxOffKerbinTime;
            kerbInfo.TimeEnteredVessel = status.TimeEnteredVessel;
            kerbInfo.LastVesselId      = status.LastVesselId;
            kerbInfo.IsGrouchy         = status.IsGrouchy;
            kerbInfo.OldTrait          = status.OldTrait;
            kerbInfo.LastUpdate        = status.LastUpdate;
        }
        public LifeSupportStatus FetchKerbal(ProtoCrewMember crew)
        {
            if (!IsKerbalTracked(crew.name))
            {
                var k = new LifeSupportStatus();
                k.KerbalName        = crew.name;
                k.LastMeal          = Planetarium.GetUniversalTime();
                k.LastOnKerbin      = Planetarium.GetUniversalTime();
                k.MaxOffKerbinTime  = Planetarium.GetUniversalTime() + 972000000;
                k.TimeEnteredVessel = Planetarium.GetUniversalTime();
                k.LastVesselId      = "??UNKNOWN??";
                k.LastUpdate        = Planetarium.GetUniversalTime();
                k.IsGrouchy         = false;
                k.OldTrait          = crew.experienceTrait.Title;
                TrackKerbal(k);
            }

            var kerbal = LifeSupportInfo.FirstOrDefault(k => k.KerbalName == crew.name);

            return(kerbal);
        }
示例#19
0
        private bool CheckHabSideEffects(LifeSupportStatus kStat)
        {
            var habTime = LifeSupportManager.GetTotalHabTime(VesselStatus, vessel);

            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);
        }
示例#20
0
        internal void ComputeHome(ProtoCrewMember c, LifeSupportStatus cls)
        {
            var crewHomeString  = "indefinite";
            var lblHome         = "6FFF00";
            var useHabPenalties = LifeSupportManager.GetNoHomeEffect(c.name) > 0;

            if (useHabPenalties)
            {
                var homeTimeLeft = cls.MaxOffKerbinTime - Planetarium.GetUniversalTime();
                UpdateEarliestExpiration(homeTimeLeft);

                var isScout    = c.HasEffect("ExplorerSkill") && homeTimeLeft >= LifeSupportScenario.Instance.settings.GetSettings().ScoutHabTime;
                var isPermaHab = homeTimeLeft >= LifeSupportScenario.Instance.settings.GetSettings().PermaHabTime;

                if (isScout || isPermaHab)
                {
                    crewHomeString = "indefinite";
                }
                else if (homeTimeLeft < 0)
                {
                    lblHome        = "FF5E5E";
                    crewHomeString = "expired";
                }
                else
                {
                    crewHomeString = LifeSupportUtilities.SmartDurationDisplay(homeTimeLeft);
                    var secondsPerDay = LifeSupportUtilities.SecondsPerDay();
                    if (homeTimeLeft < secondsPerDay * 30) //15 days
                    {
                        lblHome = "FFE100";
                    }
                    if (homeTimeLeft < secondsPerDay * 15)
                    {
                        lblHome = "FFAE00";
                    }
                }
            }
            HomeLabel = String.Format("<color=#{0}>{1}</color>", lblHome, crewHomeString);
        }
        private void ApplyEffect(LifeSupportStatus trackedKerbal, ProtoCrewMember crewMember, int effectId, string reason)
        {
            //Tourists are immune to effects
            if (crewMember.type == ProtoCrewMember.KerbalType.Tourist || crewMember.experienceTrait.Config.Name == "Tourist")
            {
                return;
            }

            /* SIDE EFFECTS:
             *   0 = No Effect (The feature is effectively turned off)
             *   1 = Grouchy (they become a Tourist until rescued)
             *   2 = Mutinous (Also a tourist, but a random part of the ship is decoupled as they search for snacks)
             *   3 = Instantly 'wander' back to the KSC - don't ask us how!
             *   4 = M.I.A. (will eventually respawn)
             *   5 = K.I.A.
             */

            var msg = "";

            switch (effectId)
            {
            case 0:     // No effect
                return; // No need to print

            case 1:     //Grouchy
                msg = string.Format("{0} refuses to work {1}", crewMember.name, reason);
                trackedKerbal.OldTrait = crewMember.experienceTrait.Config.Name;
                crewMember.type        = ProtoCrewMember.KerbalType.Tourist;
                KerbalRoster.SetExperienceTrait(crewMember, "Tourist");
                trackedKerbal.IsGrouchy = true;
                LifeSupportManager.Instance.TrackKerbal(trackedKerbal);
                break;

            case 2:      //Mutinous
                msg = string.Format("{0} has become mutinous due to {1}", crewMember.name, reason);
                trackedKerbal.OldTrait = crewMember.experienceTrait.Config.Name;
                crewMember.type        = ProtoCrewMember.KerbalType.Tourist;
                KerbalRoster.SetExperienceTrait(crewMember, "Tourist");
                trackedKerbal.IsGrouchy = true;
                LifeSupportManager.Instance.TrackKerbal(trackedKerbal);
                ClipRandomPart();
                SpawnExtraSupplies(100f);
                break;

            case 3:     //Return to KSC
                msg = string.Format("{0} gets fed up and wanders back to the KSC due to {1}", crewMember.name, reason);
                LifeSupportManager.Instance.UntrackKerbal(crewMember.name);
                crewMember.rosterStatus = ProtoCrewMember.RosterStatus.Available;
                vessel.CrewListSetDirty();
                LifeSupportUtilities.RemoveCrewFromPart(crewMember, vessel);
                break;

            case 4:     //Despawn
                msg = string.Format("{0} has gone missing due to {1}", crewMember.name, reason);
                LifeSupportManager.Instance.UntrackKerbal(crewMember.name);
                vessel.CrewListSetDirty();
                LifeSupportUtilities.RemoveCrewFromPart(crewMember, vessel);
                crewMember.rosterStatus = ProtoCrewMember.RosterStatus.Missing;
                break;

            case 5:     //Kill
                msg = string.Format("{0} has died due to {1}", crewMember.name, reason);
                LifeSupportManager.Instance.UntrackKerbal(crewMember.name);
                vessel.CrewListSetDirty();
                LifeSupportUtilities.RemoveCrewFromPart(crewMember, vessel);
                crewMember.rosterStatus = ProtoCrewMember.RosterStatus.Dead;
                break;
            }

            ScreenMessages.PostScreenMessage(msg, 5f, ScreenMessageStyle.UPPER_CENTER);
        }
示例#22
0
 public void TrackKerbal(LifeSupportStatus status)
 {
     LifeSupportStatus kerbInfo =
         LifeSupportInfo.FirstOrDefault(n => n.KerbalName == status.KerbalName);
     if (kerbInfo == null)
     {
         kerbInfo = new LifeSupportStatus();
         kerbInfo.KerbalName = status.KerbalName;
         LifeSupportInfo.Add(kerbInfo);
     }
     kerbInfo.LastMeal = status.LastMeal;
     kerbInfo.LastUpdate = status.LastUpdate;
     kerbInfo.IsGrouchy = status.IsGrouchy;
     kerbInfo.OldTrait = status.OldTrait;
     LifeSupportScenario.Instance.settings.SaveStatusNode(status);
 }
示例#23
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;
        }
        private void ApplyEVAEffect(LifeSupportStatus trackedKerbal, ProtoCrewMember crewMember, Vessel vessel, int effectId)
        {
            if (crewMember.type == ProtoCrewMember.KerbalType.Tourist || crewMember.experienceTrait.Config.Name == "Tourist")
            {
                return;
            }

            /* SIDE EFFECTS:
             *   0 = No Effect (The feature is effectively turned off)
             *   1 = Grouchy (they become a Tourist until rescued)
             *   2 = Mutinous (A tourist, but also destroys a part of a nearby vessel...)
             *   3 = Instantly 'wander' back to the KSC - don't ask us how!
             *   4 = M.I.A. (will eventually respawn)
             *   5 = K.I.A.
             */

            var screenMessage = "";

            switch (effectId)
            {
            case 0:     // No effect
                return; // No need to print

            case 1:     //Grouchy
                if (crewMember.type != ProtoCrewMember.KerbalType.Tourist)
                {
                    screenMessage          = string.Format("{0} refuses to work", crewMember.name);
                    trackedKerbal.OldTrait = crewMember.experienceTrait.Config.Name;
                    crewMember.type        = ProtoCrewMember.KerbalType.Tourist;
                    KerbalRoster.SetExperienceTrait(crewMember, "Tourist");
                    trackedKerbal.IsGrouchy = true;
                    LifeSupportManager.Instance.TrackKerbal(trackedKerbal);
                }
                break;

            case 2:      //Mutinous
            {
                screenMessage          = string.Format("{0} has become mutinous", crewMember.name);
                trackedKerbal.OldTrait = crewMember.experienceTrait.Config.Name;
                crewMember.type        = ProtoCrewMember.KerbalType.Tourist;
                KerbalRoster.SetExperienceTrait(crewMember, "Tourist");
                trackedKerbal.IsGrouchy = true;
                LifeSupportManager.Instance.TrackKerbal(trackedKerbal);
                DestroyRandomPart(vessel);
            }
            break;

            case 3:     //Return to KSC
                screenMessage = string.Format("{0} gets fed up and wanders back to the KSC", crewMember.name);
                LifeSupportManager.Instance.UntrackKerbal(crewMember.name);
                crewMember.rosterStatus = ProtoCrewMember.RosterStatus.Available;
                DestroyVessel(vessel);
                break;

            case 4:     //Despawn
                screenMessage = string.Format("{0} has gone missing", crewMember.name);
                LifeSupportManager.Instance.UntrackKerbal(crewMember.name);
                crewMember.rosterStatus = ProtoCrewMember.RosterStatus.Missing;
                DestroyVessel(vessel);
                break;

            case 5:     //Kill
                screenMessage = string.Format("{0} has died", crewMember.name);
                LifeSupportManager.Instance.UntrackKerbal(crewMember.name);
                crewMember.rosterStatus = ProtoCrewMember.RosterStatus.Dead;
                DestroyVessel(vessel);
                break;
            }

            ScreenMessages.PostScreenMessage(screenMessage, 5f, ScreenMessageStyle.UPPER_CENTER);
        }
示例#25
0
        private bool CheckSupplySideEffects(LifeSupportStatus kStat)
        {
            var curTime = Planetarium.GetUniversalTime();
            var SnackMax = LifeSupportScenario.Instance.settings.GetSettings().SupplyTime;

            var SnackTime = Math.Max(curTime - kStat.LastMeal, ResourceUtilities.FLOAT_TOLERANCE);

            if (SnackTime > SnackMax)
            {
                return true;
            }
            return false;
        }
示例#26
0
 private void RemoveGrouchiness(ProtoCrewMember c, LifeSupportStatus k)
 {
     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.OldTrait);
         k.IsGrouchy = false;
         LifeSupportManager.Instance.TrackKerbal(k);
     }
 }
示例#27
0
        private void ApplyEffect(LifeSupportStatus kStat, ProtoCrewMember crew, int effectId)
        {
            /*
             *  SIDE EFFECTS:
             *
             *  0 = No Effect (The feature is effectively turned off
             *  1 = Grouchy (they become a Tourist until rescued)
             *  2 = Mutinous (A tourist, but a random part of the ship is decoupled as they search for snacks
             *  3 = Instantly 'wander' back to the KSC - don't ask us how!
             *  4 = M.I.A. (will eventually respawn)
             *  5 = K.I.A.
             *
             */

            var msg = "";
            switch (effectId)
            {
                case 1: //Grouchy
                    if (crew.type != ProtoCrewMember.KerbalType.Tourist)
                    {
                        msg = string.Format("{0} refuses to work", crew.name);
                        kStat.OldTrait = crew.experienceTrait.Title;
                        crew.type = ProtoCrewMember.KerbalType.Tourist;
                        KerbalRoster.SetExperienceTrait(crew, "Tourist");
                        kStat.IsGrouchy = true;
                        LifeSupportManager.Instance.TrackKerbal(kStat);
                    }
                    break;
                case 2:  //Mutinous
                    {
                        msg = string.Format("{0} has become mutinous", crew.name);
                        kStat.OldTrait = crew.experienceTrait.Title;
                        crew.type = ProtoCrewMember.KerbalType.Tourist;
                        KerbalRoster.SetExperienceTrait(crew, "Tourist");
                        kStat.IsGrouchy = true;
                        LifeSupportManager.Instance.TrackKerbal(kStat);
                        ClipRandomPart();
                    }
                    break;
                case 3: //Return to KSC
                    msg = string.Format("{0} gets fed up and wanders back to the KSC", crew.name);
                    LifeSupportManager.Instance.UntrackKerbal(crew.name);
                    part.RemoveCrewmember(crew);
                    crew.rosterStatus = ProtoCrewMember.RosterStatus.Available;
                    break;
                case 4: //Despawn
                    msg = string.Format("{0} has gone missing", crew.name);
                    LifeSupportManager.Instance.UntrackKerbal(crew.name);
                    part.RemoveCrewmember(crew);
                    crew.rosterStatus = ProtoCrewMember.RosterStatus.Missing;
                    break;
                case 5: //Kill
                    msg = string.Format("{0} has died", crew.name);
                    LifeSupportManager.Instance.UntrackKerbal(crew.name);
                    part.RemoveCrewmember(crew);
                    crew.rosterStatus = ProtoCrewMember.RosterStatus.Dead;
                    break;
            }

            ScreenMessages.PostScreenMessage(msg, 5f, ScreenMessageStyle.UPPER_CENTER);
        }
示例#28
0
        public LifeSupportStatus FetchKerbal(ProtoCrewMember crew)
        {
            if (!IsKerbalTracked(crew.name))
            {
                var k = new LifeSupportStatus();
                k.KerbalName = crew.name;
                k.LastMeal = Planetarium.GetUniversalTime();
                k.LastEC = Planetarium.GetUniversalTime();
                k.LastOnKerbin = Planetarium.GetUniversalTime();
                k.MaxOffKerbinTime = 648000;
                k.TimeEnteredVessel = Planetarium.GetUniversalTime();
                k.CurrentVesselId = "?UNKNOWN?";
                k.PreviousVesselId = "??UNKNOWN??";
                k.LastUpdate = Planetarium.GetUniversalTime();
                k.IsGrouchy = false;
                k.OldTrait = crew.experienceTrait.Title;
                TrackKerbal(k);
            }

            var kerbal = LifeSupportInfo.FirstOrDefault(k => k.KerbalName == crew.name);
            return kerbal;
        }
示例#29
0
 public void SaveStatusNode(LifeSupportStatus status)
 {
     LifeSupportStatus kerbInfo =
         _StatusInfo.FirstOrDefault(n => n.KerbalName == status.KerbalName);
     if (kerbInfo == null)
     {
         kerbInfo = new LifeSupportStatus();
         kerbInfo.KerbalName = status.KerbalName;
         _StatusInfo.Add(kerbInfo);
     }
     kerbInfo.LastMeal = status.LastMeal;
     kerbInfo.IsGrouchy = status.IsGrouchy;
     kerbInfo.LastUpdate = status.LastUpdate;
 }
示例#30
0
 public void SaveStatusNode(LifeSupportStatus status)
 {
     LifeSupportStatus kerbInfo =
         _StatusInfo.FirstOrDefault(n => n.KerbalName == status.KerbalName);
     if (kerbInfo == null)
     {
         kerbInfo = new LifeSupportStatus();
         kerbInfo.KerbalName = status.KerbalName;
         _StatusInfo.Add(kerbInfo);
     }
     kerbInfo.LastMeal = status.LastMeal;
     kerbInfo.LastEC = status.LastEC;
     kerbInfo.LastOnKerbin = status.LastOnKerbin;
     kerbInfo.MaxOffKerbinTime = status.MaxOffKerbinTime;
     kerbInfo.TimeEnteredVessel = status.TimeEnteredVessel;
     kerbInfo.CurrentVesselId = status.CurrentVesselId;
     kerbInfo.PreviousVesselId = status.PreviousVesselId;
     kerbInfo.IsGrouchy = status.IsGrouchy;
     kerbInfo.OldTrait = status.OldTrait;
     kerbInfo.LastUpdate = status.LastUpdate;
 }
示例#31
0
 public void AddStatusNode(LifeSupportStatus kerbal)
 {
     if (_StatusInfo.Any(n => n.KerbalName == kerbal.KerbalName))
         return;
     _StatusInfo.Add(kerbal);
 }
示例#32
0
 public void TrackKerbal(LifeSupportStatus status)
 {
     if (LifeSupportInfo.All(n => n.KerbalName != status.KerbalName))
     {
         LifeSupportInfo.Add(status);
     }
     LifeSupportScenario.Instance.settings.SaveStatusNode(status);
 }
示例#33
0
        private void ApplyEffect(LifeSupportStatus kStat, ProtoCrewMember crew, int effectId)
        {
            /*
             *  SIDE EFFECTS:
             *
             *  0 = No Effect (The feature is effectively turned off
             *  1 = Grouchy (they become a Tourist until rescued)
             *  2 = Mutinous (A tourist, but a random part of the ship is decoupled as they search for snacks
             *  3 = Instantly 'wander' back to the KSC - don't ask us how!
             *  4 = M.I.A. (will eventually respawn)
             *  5 = K.I.A.
             *
             */

            var msg = "";

            switch (effectId)
            {
            case 1:     //Grouchy
                if (crew.type != ProtoCrewMember.KerbalType.Tourist)
                {
                    msg            = string.Format("{0} refuses to work", crew.name);
                    kStat.OldTrait = crew.experienceTrait.Title;
                    crew.type      = ProtoCrewMember.KerbalType.Tourist;
                    KerbalRoster.SetExperienceTrait(crew, "Tourist");
                    kStat.IsGrouchy = true;
                    LifeSupportManager.Instance.TrackKerbal(kStat);
                }
                break;

            case 2:      //Mutinous
            {
                msg            = string.Format("{0} has become mutinous", crew.name);
                kStat.OldTrait = crew.experienceTrait.Title;
                crew.type      = ProtoCrewMember.KerbalType.Tourist;
                KerbalRoster.SetExperienceTrait(crew, "Tourist");
                kStat.IsGrouchy = true;
                LifeSupportManager.Instance.TrackKerbal(kStat);
                ClipRandomPart();
            }
            break;

            case 3:     //Return to KSC
                msg = string.Format("{0} gets fed up and wanders back to the KSC", crew.name);
                LifeSupportManager.Instance.UntrackKerbal(crew.name);
                crew.rosterStatus = ProtoCrewMember.RosterStatus.Available;
                vessel.CrewListSetDirty();
                RemoveCrewFromPart(crew);
                break;

            case 4:     //Despawn
                msg = string.Format("{0} has gone missing", crew.name);
                LifeSupportManager.Instance.UntrackKerbal(crew.name);
                vessel.CrewListSetDirty();
                RemoveCrewFromPart(crew);
                crew.rosterStatus = ProtoCrewMember.RosterStatus.Missing;
                break;

            case 5:     //Kill
                msg = string.Format("{0} has died", crew.name);
                LifeSupportManager.Instance.UntrackKerbal(crew.name);
                vessel.CrewListSetDirty();
                RemoveCrewFromPart(crew);
                crew.rosterStatus = ProtoCrewMember.RosterStatus.Dead;
                break;
            }

            ScreenMessages.PostScreenMessage(msg, 5f, ScreenMessageStyle.UPPER_CENTER);
        }
示例#34
0
        private void CheckSideEffects(LifeSupportStatus kStat, ProtoCrewMember crew)
        {
            var curTime = Planetarium.GetUniversalTime();
            var SnackMax = LifeSupportSetup.Instance.LSConfig.SupplyTime;

            var SnackTime = Math.Max(curTime - kStat.LastMeal, ResourceUtilities.FLOAT_TOLERANCE);

            if (SnackTime > SnackMax)
            {
                //If we are past the final threshold, we will start by trying to unlock any biscuit tins left on the ship.

                foreach (var rp in vessel.parts.Where(p => p.Resources.Contains("Supplies")))
                {
                    var resAmt = rp.Resources["Supplies"].amount;
                    if (resAmt > 0)
                    {
                        rp.Resources["Supplies"].amount = 0;
                        string msg = string.Format("{0} raids the ship for snacks...  some accidentally fell out of the airlock.", crew.name);
                        kStat.LastMeal = lastUpdateTime;
                        ScreenMessages.PostScreenMessage(msg, 5f, ScreenMessageStyle.UPPER_CENTER);
                        LifeSupportManager.Instance.TrackKerbal(kStat);
                        //At this point, the Kerbal is saved!
                        return;
                    }
                }

                if (LifeSupportSetup.Instance.LSConfig.CausesDeath)
                {
                    string msg = string.Format("{0} has died of starvation", crew.name);
                    LifeSupportManager.Instance.UntrackKerbal(crew.name);
                    ScreenMessages.PostScreenMessage(msg, 5f, ScreenMessageStyle.UPPER_CENTER);
                    part.RemoveCrewmember(crew);
                    crew.rosterStatus = ProtoCrewMember.RosterStatus.Dead;
                    return;
                }

                //Vacation time!  The lone exception are our badasses.
                if (crew.isBadass || vetNames.Contains(crew.name))
                    return;

                if (crew.type != ProtoCrewMember.KerbalType.Tourist)
                {
                    string msg = string.Format("{0} refuses to work.", crew.name);
                    ScreenMessages.PostScreenMessage(msg, 5f, ScreenMessageStyle.UPPER_CENTER);
                    crew.type = ProtoCrewMember.KerbalType.Tourist;
                    KerbalRoster.SetExperienceTrait(crew, "Tourist");
                    kStat.IsGrouchy = true;
                    LifeSupportManager.Instance.TrackKerbal(kStat);
                }
            }
        }
示例#35
0
 public void DeleteStatusNode(LifeSupportStatus kerbal)
 {
     if (_StatusInfo.All(n => n.KerbalName != kerbal.KerbalName))
         return;
     var k = _StatusInfo.First(n => n.KerbalName == kerbal.KerbalName);
     _StatusInfo.Remove(k);
 }