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; }
public void TrackKerbal(LifeSupportStatus status) { if (LifeSupportInfo.All(n => n.KerbalName != status.KerbalName)) { LifeSupportInfo.Add(status); } LifeSupportScenario.Instance.settings.SaveStatusNode(status); }
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); } }
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); }
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); }
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); } }
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; }
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; }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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; }
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); }
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; }
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; }
public void AddStatusNode(LifeSupportStatus kerbal) { if (_StatusInfo.Any(n => n.KerbalName == kerbal.KerbalName)) return; _StatusInfo.Add(kerbal); }
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); }
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); } } }
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); }