Beispiel #1
0
        internal static void SaveSettings()
        {
            //If EnableAging has been turned ON when it was previously OFF, we reset age processing, otherwise they could all die instantly.
            if (RMLifeSpan.Instance.RMGameSettings.EnableAging && PrevEnableAging == false)
            {
                RmUtils.LogMessage("RosterManagerWindowSettings.Display Save settings, aging has been enabled. Reset all birthdays.", "info", RMSettings.VerboseLogging);
                double currentTime = Planetarium.GetUniversalTime();
                foreach (KeyValuePair <string, RMKerbal> rmkerbal in RMLifeSpan.Instance.RMKerbals.AllrmKerbals)
                {
                    rmkerbal.Value.TimelastBirthday = currentTime;
                    rmkerbal.Value.TimeNextBirthday = RMKerbal.BirthdayNextDue(currentTime);
                }
            }
            //If EnableSalaries has been turned OFF when it was previously ON, reset any kerbals from tourist back to active.
            if (!RMLifeSpan.Instance.RMGameSettings.EnableSalaries && PrevEnableSalaries)
            {
                RmUtils.LogMessage("RosterManagerWindowSettings.Display Save settings, salaries have been turned off. Reset all salary related fields for all kerbals.", "info", RMSettings.VerboseLogging);
                foreach (KeyValuePair <string, RMKerbal> rmkerbal in RMLifeSpan.Instance.RMKerbals.AllrmKerbals)
                {
                    if (rmkerbal.Value.Type == ProtoCrewMember.KerbalType.Tourist && rmkerbal.Value.Kerbal.rosterStatus != ProtoCrewMember.RosterStatus.Dead)
                    {
                        rmkerbal.Value.Type         = ProtoCrewMember.KerbalType.Crew;
                        rmkerbal.Value.Kerbal.type  = ProtoCrewMember.KerbalType.Crew;
                        rmkerbal.Value.Trait        = rmkerbal.Value.RealTrait;
                        rmkerbal.Value.Kerbal.trait = rmkerbal.Value.RealTrait;
                        KerbalRoster.SetExperienceTrait(rmkerbal.Value.Kerbal, rmkerbal.Value.Trait);
                        RMKerbal.RegisterExperienceTrait(rmkerbal.Value);
                    }
                    rmkerbal.Value.SalaryContractDispute          = false;
                    rmkerbal.Value.SalaryContractDisputePeriods   = 0;
                    rmkerbal.Value.SalaryContractDisputeProcessed = true;
                }
            }
            //If EnableSalaries has been turned ON when it was previously OFF, reset all kerbals salary time to now.
            if (RMLifeSpan.Instance.RMGameSettings.EnableSalaries && PrevEnableSalaries == false)
            {
                RmUtils.LogMessage("RosterManagerWindowSettings.Display Save settings, salaries have been turned on. Reset all salary related fields for all kerbals.", "info", RMSettings.VerboseLogging);
                double currentTime = Planetarium.GetUniversalTime();
                foreach (KeyValuePair <string, RMKerbal> rmkerbal in RMLifeSpan.Instance.RMKerbals.AllrmKerbals)
                {
                    rmkerbal.Value.Timelastsalary = currentTime;
                    rmkerbal.Value.TimeSalaryDue  = RMKerbal.SalaryNextDue(currentTime);
                }
            }
            if (Settings == null)
            {
                Settings = LoadSettingsFile();
            }

            ConfigNode windowsNode  = Settings.HasNode("RM_Windows") ? Settings.GetNode("RM_Windows") : Settings.AddNode("RM_Windows");
            ConfigNode settingsNode = Settings.HasNode("RM_Settings") ? Settings.GetNode("RM_Settings") : Settings.AddNode("RM_Settings");
            ConfigNode hiddenNode   = Settings.HasNode("RM_Hidden") ? Settings.GetNode("RM_Hidden") : Settings.AddNode("RM_Hidden");

            // Write window positions
            WriteRectangle(windowsNode, "DebuggerPosition", WindowDebugger.Position);
            WriteRectangle(windowsNode, "SettingsPosition", WindowSettings.Position);
            WriteRectangle(windowsNode, "RosterPosition", WindowRoster.Position);
            WriteRectangle(windowsNode, "ContractDisputePosition", WindowContracts.Position);

            //Write settings...
            // Realism Settings
            WriteValue(settingsNode, "LockSettings", LockSettings);

            // ToolTip Settings
            WriteValue(settingsNode, "ShowToolTips", ShowToolTips);
            WriteValue(settingsNode, "SettingsToolTips", WindowSettings.ShowToolTips);
            WriteValue(settingsNode, "RosterToolTips", WindowRoster.ShowToolTips);
            WriteValue(settingsNode, "DebuggerToolTips", WindowDebugger.ShowToolTips);
            WriteValue(settingsNode, "ContractDisputeToolTips", WindowContracts.ShowToolTips);

            // Config Settings
            WriteValue(settingsNode, "ShowDebugger", WindowDebugger.ShowWindow);
            WriteValue(settingsNode, "EnableBlizzyToolbar", EnableBlizzyToolbar);
            WriteValue(settingsNode, "VerboseLogging", VerboseLogging);
            WriteValue(settingsNode, "AutoDebug", AutoDebug);
            WriteValue(settingsNode, "DebugLogPath", DebugLogPath);
            WriteValue(settingsNode, "ErrorLogLength", ErrorLogLength);
            WriteValue(settingsNode, "SaveLogOnExit", SaveLogOnExit);
            WriteValue(settingsNode, "EnableKerbalRename", EnableKerbalRename);

            // Hidden Settings
            WriteValue(hiddenNode, "LifeInfoUpdatePeriod", LifeInfoUpdatePeriod);

            if (!Directory.Exists(SettingsPath))
            {
                Directory.CreateDirectory(SettingsPath);
            }
            Settings.Save(SettingsFile);
        }
        private void CheckAge(ProtoCrewMember crew, KeyValuePair <string, RMKerbal> kerbal, double currentTime)
        {
            //Calculate and update their age.
            //If they are DeepFreeze Frozen - They Don't Age, until they are thawed.
            if (Api.InstalledMods.IsDfInstalled)
            {
                if (crew.rosterStatus == ProtoCrewMember.RosterStatus.Dead && crew.type == ProtoCrewMember.KerbalType.Unowned)
                {
                    //Frozen - check if we are tracking when they were frozen, if not, set it to the time they were frozen
                    if (Math.Abs(kerbal.Value.TimeDfFrozen) < Tolerance)
                    {
                        if (RMAddon.FrozenKerbals.ContainsKey(crew.name))
                        {
                            kerbal.Value.TimeDfFrozen = RMAddon.FrozenKerbals[crew.name].lastUpdate;
                        }
                    }
                    return; //We don't process age any further if they are frozen.
                }
                if (crew.rosterStatus == ProtoCrewMember.RosterStatus.Dead && (crew.type != ProtoCrewMember.KerbalType.Unowned || crew.type != ProtoCrewMember.KerbalType.Tourist))
                {
                    //They are really dead. Should this ever occur? Just in case.
                    return;
                }
                //If we get here, they aren't frozen and they aren't really dead... so were they frozen?
                //IE: we know that if they are now crew, but their KerbalLifeInfo record has their status as dead and time frozen > 0
                if (crew.type == ProtoCrewMember.KerbalType.Crew && kerbal.Value.Status == ProtoCrewMember.RosterStatus.Dead && kerbal.Value.TimeDfFrozen > 0d)
                {
                    //We add the time they were frozen onto their time of last birthday - effectively extending their life.
                    var timeFrozen = currentTime - kerbal.Value.TimeDfFrozen; //The amount of time they were frozen
                    kerbal.Value.TimelastBirthday += timeFrozen;
                    kerbal.Value.TimeDfFrozen      = 0d;
                }
            }

            //Is it their Birthday?

            if (currentTime >= kerbal.Value.TimeNextBirthday)
            {
                //It's their Birthday!!!!
                kerbal.Value.Age += 1;
                kerbal.Value.TimelastBirthday = currentTime;
                kerbal.Value.TimeNextBirthday = RMKerbal.BirthdayNextDue(currentTime);
                if (kerbal.Value.Type != ProtoCrewMember.KerbalType.Applicant)
                {
                    ScreenMessages.PostScreenMessage("It's " + crew.name + " Birthday! They are now " + kerbal.Value.Age.ToString("###0"), 5.0f, ScreenMessageStyle.UPPER_CENTER);
                }
                Utilities.LogMessage("RosterManagerLifeSpanAddon.checkAge " + crew.name + " just had a birthday. They are now " + kerbal.Value.Age.ToString("###0"), "info", RMSettings.VerboseLogging);
            }

            //Check if they Die of Old Age
            if (!(kerbal.Value.Lifespan - 2 <= kerbal.Value.Age))
            {
                return;
            }
            int percentage;

            //Set random range based on:- if age is less than lifespan have 20% chance of death, if age is = or up to 2 years greater than lifespan have 40% chance of death.
            // if age is > than 2 years past lifespan have 60% chance of death. If age is > than 4 years past lifespan have 80% chance of death.
            if (kerbal.Value.Age < kerbal.Value.Lifespan)
            {
                percentage = 20;
            }
            else if (kerbal.Value.Lifespan + 2 < kerbal.Value.Age)
            {
                percentage = 40;
            }
            else if (kerbal.Value.Lifespan + 4 < kerbal.Value.Age)
            {
                percentage = 60;
            }
            else
            {
                percentage = 80;
            }
            if (_gen.Next(100) < percentage)
            {
                //Their Time has Come. As long as they aren't currently DeepFreeze Frozen/comatose
                if (crew.rosterStatus == ProtoCrewMember.RosterStatus.Dead ||
                    (crew.type == ProtoCrewMember.KerbalType.Unowned && crew.type == ProtoCrewMember.KerbalType.Tourist))
                {
                    return;
                }
                TimeWarp.SetRate(0, false);
                if (CameraManager.Instance.currentCameraMode == CameraManager.CameraMode.IVA)
                {
                    CameraManager.Instance.SetCameraFlight();
                }
                Utilities.LogMessage("RosterManagerLifeSpanAddon.CheckAge " + crew.name + " died from old age.", "info", RMSettings.VerboseLogging);
                ScreenMessages.PostScreenMessage(crew.name + " died at the old age of " + kerbal.Value.Age.ToString("###0"), 5.0f, ScreenMessageStyle.UPPER_CENTER);

                if (crew.rosterStatus == ProtoCrewMember.RosterStatus.Assigned) //On active duty, need to find their vessel and remove them.
                {
                    var foundcrew = false;
                    //First try to find their assigned vessel and remove them.
                    if (kerbal.Value.VesselId != Guid.Empty)
                    {
                        var v = FlightGlobals.Vessels.FirstOrDefault(a => a.id == kerbal.Value.VesselId);
                        if (v != null)
                        {
                            if (v.loaded)
                            {
                                var part = v.Parts.Find(p => p.protoModuleCrew.Contains(crew));
                                if (part != null)
                                {
                                    part.RemoveCrewmember(crew);
                                    crew.Die();
                                    foundcrew = true;
                                }
                            }
                            else
                            {
                                var part = v.protoVessel.protoPartSnapshots.Find(p => p.protoModuleCrew.Contains(crew));
                                if (part != null)
                                {
                                    part.RemoveCrew(crew);
                                    crew.Die();
                                    foundcrew = true;
                                }
                            }
                        }
                    }
                    if (!foundcrew) //We didn't find their vessel and remove them so now search all vessels in game.
                    {
                        foreach (var v in FlightGlobals.Vessels)
                        {
                            if (v.isEVA && v.name.Contains(crew.name))
                            {
                                if (v.name.Contains(crew.name))
                                {
                                    v.rootPart.Die();
                                    foundcrew = true;
                                    break;
                                }
                            }
                            if (v.loaded)
                            {
                                var part = v.Parts.Find(p => p.protoModuleCrew.Contains(crew));
                                if (part == null)
                                {
                                    continue;
                                }
                                part.RemoveCrewmember(crew);
                                crew.Die();
                                foundcrew = true;
                                break;
                            }
                            else
                            {
                                var part = v.protoVessel.protoPartSnapshots.Find(p => p.protoModuleCrew.Contains(crew));
                                if (part == null)
                                {
                                    continue;
                                }
                                part.RemoveCrew(crew);
                                crew.Die();
                                foundcrew = true;
                                break;
                            }
                        }
                    }

                    if (!foundcrew) //We still didn't find them, log error and kill them anyway.
                    {
                        Utilities.LogMessage("RosterManagerLifeSpanAddon.CheckAge " + crew.name + " couldn't find them to remove them from vessel.", "Error", RMSettings.VerboseLogging);
                        crew.Die();
                    }
                }
                else //Not on active duty
                {
                    crew.Die();
                }

                //Remove from LifeSpan.Instance.kerbalLifeRecord.KerbalLifeRecords
                RemoveKerbal(crew);

                // set ReSpawn
                if (HighLogic.CurrentGame.Parameters.Difficulty.MissingCrewsRespawn)
                {
                    crew.StartRespawnPeriod();
                }
            }
        }