private const double secondsBeforeKerbalStarves = DaysBeforeKerbalStarves * 6 * 60 * 60; // 7 kerban days public void KerbalsMissedAMeal(Vessel vessel, bool hasActiveProducers) { if (vessel.isEVA) { return; } this.CheckForNewLoadedVesselSet(); List <ProtoCrewMember> crewThatBecameHungry = new List <ProtoCrewMember>(); List <ProtoCrewMember> crewThatBecameIncapacitated = new List <ProtoCrewMember>(); double now = Planetarium.GetUniversalTime(); foreach (var crew in vessel.GetVesselCrew()) { if (!this.knownKerbals.TryGetValue(crew.name, out LifeSupportStatus crewStatus)) { crewStatus = new LifeSupportStatus { IsGrouchy = false, KerbalName = crew.name, LastMeal = now, OldTrait = null }; this.knownKerbals.Add(crew.name, crewStatus); } if (!crewStatus.IsGrouchy && now > crewStatus.LastMeal + secondsBeforeKerbalStarves) { crewStatus.IsGrouchy = true; crewStatus.OldTrait = crew.experienceTrait.Title; crew.type = ProtoCrewMember.KerbalType.Tourist; KerbalRoster.SetExperienceTrait(crew, "Tourist"); } if (crewStatus.IsGrouchy && !this.incapacitatedKerbals.Contains(crew)) { crewThatBecameIncapacitated.Add(crew); this.incapacitatedKerbals.Add(crew); } else if (!crewStatus.IsGrouchy && (hasActiveProducers || now > crewStatus.LastMeal + .5 * secondsBeforeKerbalStarves) && !this.hungryKerbals.Contains(crew)) { crewThatBecameHungry.Add(crew); this.hungryKerbals.Add(crew); } } if (crewThatBecameIncapacitated.Any()) { ScreenMessages.PostScreenMessage( message: CrewBlurbs.CreateMessage("#LOC_KPBS_KERBAL_INCAPACITATED", crewThatBecameIncapacitated, new string[] { }, TechTier.Tier0), duration: 15f, style: ScreenMessageStyle.UPPER_CENTER); } else if (crewThatBecameHungry.Any()) { ScreenMessages.PostScreenMessage( message: CrewBlurbs.CreateMessage( (hasActiveProducers ? "#LOC_KPBS_KERBAL_HUNGRY_NO_PRODUCTION" : "#LOC_KPBS_KERBAL_HUNGRY"), crewThatBecameHungry, new string[] { }, TechTier.Tier0), duration: 15f, style: ScreenMessageStyle.UPPER_CENTER); } }