From 42f8bca046c42f43cf970a3dc6bf3ef7b77848e1 Mon Sep 17 00:00:00 2001 From: Adrian Irving-Beer Date: Fri, 6 Feb 2015 00:19:16 -0500 Subject: [PATCH] Reassign seats to lowest-fitness Kerbals. --- Timmers/KeepFit/KeepFitCrewMember.cs | 10 +++ .../KeepFitCrewRosterController.cs | 77 ++++++++++++++++--- 2 files changed, 75 insertions(+), 12 deletions(-) diff --git a/Timmers/KeepFit/KeepFitCrewMember.cs b/Timmers/KeepFit/KeepFitCrewMember.cs index ae8d00e..20970a6 100644 --- a/Timmers/KeepFit/KeepFitCrewMember.cs +++ b/Timmers/KeepFit/KeepFitCrewMember.cs @@ -114,6 +114,16 @@ public KeepFitCrewMember(string name, bool loaded) Name = name; } + public bool WantsBetterSeat() + { + return true; // TODO: configurable globally / per Kerbal? + } + + public bool WillGiveUpSeat() + { + return true; // TODO: configure globally / per Kerbal? + } + internal void AddTime(float elapsed) { float existing = 0; diff --git a/Timmers/KeepFit/controllers/KeepFitCrewRosterController.cs b/Timmers/KeepFit/controllers/KeepFitCrewRosterController.cs index f75f61a..29efb74 100644 --- a/Timmers/KeepFit/controllers/KeepFitCrewRosterController.cs +++ b/Timmers/KeepFit/controllers/KeepFitCrewRosterController.cs @@ -99,10 +99,28 @@ private void refreshNonLoadedVesselRoster(Dictionary } } + private List levelsBestToWorst = new List() + { + ActivityLevel.EXERCISING, + ActivityLevel.NEUTRAL, + ActivityLevel.COMFY, + ActivityLevel.CRAMPED + }; + private void refreshLoadedVesselRoster(Dictionary roster, KeepFitVesselRecord vesselRecord, Vessel vessel) { + Dictionary shipSeats = new Dictionary(); + Dictionary> shipCrew = new Dictionary>(); + HashSet seatUpgradePool = new HashSet(); + + foreach (ActivityLevel level in Enum.GetValues(typeof(ActivityLevel))) + { + shipSeats[level] = 0; + shipCrew[level] = new List(); + } + foreach (Part part in vessel.Parts) { if (part.CrewCapacity == 0) @@ -110,21 +128,11 @@ private void refreshLoadedVesselRoster(Dictionary ros continue; } - bool hasSeat = false; - bool hasCommandModule = false; ActivityLevel partActivityLevel = getDefaultActivityLevel(vessel); foreach (PartModule module in part.Modules) { - if (module is KerbalSeat) - { - hasSeat = true; - } - else if (module is ModuleCommand) - { - hasCommandModule = true; - } - else if (module is KeepFitPartModule) + if (module is KeepFitPartModule) { KeepFitPartModule keepFitPartModule = (KeepFitPartModule)module; @@ -135,9 +143,54 @@ private void refreshLoadedVesselRoster(Dictionary ros } } + shipSeats[partActivityLevel] += part.CrewCapacity; + foreach (ProtoCrewMember partCrewMember in part.protoModuleCrew) { - updateRosters(roster, vesselRecord, partCrewMember.name, partActivityLevel, true); + KeepFitCrewMember crew = updateRosters(roster, vesselRecord, partCrewMember.name, partActivityLevel, true); + shipCrew[partActivityLevel].Add(crew); + if (crew.WantsBetterSeat()) + { + seatUpgradePool.Add(crew); + } + } + } + + foreach (ActivityLevel level in levelsBestToWorst) + { + int freeSeats = shipSeats[level]; + foreach (KeepFitCrewMember crew in shipCrew[level]) + { + if (crew.activityLevel > level) + { + // They were already upgraded, ignore them. + } + else if (crew.WillGiveUpSeat()) + { + // Effectively, vacate the seat immediately and join the pool. + // If unfit or plenty of seats available, will get immediately re-added to the seat. + seatUpgradePool.Add(crew); + } + else + { + freeSeats -= 1; + seatUpgradePool.Remove(crew); // already in the best seat possible + } + } + + this.Log_DebugOnly("KeepFitSeats", "" + vessel.name + " seats [" + level + "]: " + freeSeats + " available, " + shipSeats[level] + " total"); + + foreach (KeepFitCrewMember crew in seatUpgradePool.OrderBy(crew => crew.fitnessLevel).ToList()) + { + if (freeSeats < 1) + { + break; + } + + this.Log_DebugOnly("KeepFitSeatUpgrade", "Upgrading " + crew.Name + " from " + crew.activityLevel + " to " + level); + updateRosters(roster, vesselRecord, crew.Name, level, true); + seatUpgradePool.Remove(crew); + freeSeats -= 1; } } }