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(); } } }