private void refreshLoadedVesselRosterPartOnly(Dictionary <string, KeepFitCrewMember> roster,
                                                       KeepFitVesselRecord vesselRecord,
                                                       Vessel vessel)
        {
            ActivityLevel vesselDefaultActivityLevel = getDefaultActivityLevel(vessel);

            foreach (Part part in vessel.Parts)
            {
                if (part.CrewCapacity == 0)
                {
                    continue;
                }

                ActivityLevel bestPartActivityLevel = vesselDefaultActivityLevel;

                // check all modules on the part in case we have multiple KeepFit modules for some reason
                foreach (KeepFitPartModule kfModule in part.FindModulesImplementing <KeepFitPartModule>())
                {
                    ActivityLevel partActivityLevel = kfModule.activityLevel;
                    if (partActivityLevel > bestPartActivityLevel)
                    {
                        bestPartActivityLevel = partActivityLevel;
                    }
                }

                foreach (ProtoCrewMember partCrewMember in part.protoModuleCrew)
                {
                    updateRosters(roster, vesselRecord, partCrewMember.name, bestPartActivityLevel, true);
                }
            }
        }
        private void refreshLoadedVesselRosterCLS(Dictionary <string, KeepFitCrewMember> roster,
                                                  KeepFitVesselRecord vesselRecord,
                                                  Vessel vessel)
        {
            ActivityLevel vesselDefaultActivityLevel = getDefaultActivityLevel(vessel);

            ConnectedLivingSpace.ICLSAddon cls = module.GetCLS();
            foreach (ConnectedLivingSpace.ICLSSpace space in cls.Vessel.Spaces)
            {
                ActivityLevel spaceBestActivityLevel = vesselDefaultActivityLevel;

                foreach (ConnectedLivingSpace.ICLSPart part in space.Parts)
                {
                    if (part.Part.CrewCapacity == 0)
                    {
                        continue;
                    }

                    // check all modules on the part in case we have multiple KeepFit modules for some reason
                    foreach (KeepFitPartModule kfModule in part.Part.FindModulesImplementing <KeepFitPartModule>())
                    {
                        ActivityLevel partActivityLevel = kfModule.activityLevel;
                        if (partActivityLevel > spaceBestActivityLevel)
                        {
                            spaceBestActivityLevel = partActivityLevel;
                        }
                    }

                    foreach (ConnectedLivingSpace.ICLSKerbal partCrewMember in space.Crew)
                    {
                        updateRosters(roster, vesselRecord, partCrewMember.Kerbal.name, spaceBestActivityLevel, true);
                    }
                }
            }
        }
        private void refreshNonLoadedVesselRoster(Dictionary <string, KeepFitCrewMember> roster,
                                                  KeepFitVesselRecord vesselRecord,
                                                  Vessel vessel)
        {
            ActivityLevel defaultActivityLevel = getDefaultActivityLevel(vessel);

            foreach (ProtoPartSnapshot part in vessel.protoVessel.protoPartSnapshots)
            {
                foreach (ProtoCrewMember crewMember in part.protoModuleCrew)
                {
                    updateRosters(roster, vesselRecord, crewMember.name, defaultActivityLevel, false);
                }
            }
        }
 private void refreshLoadedVesselRoster(Dictionary <string, KeepFitCrewMember> roster,
                                        KeepFitVesselRecord vesselRecord,
                                        Vessel vessel)
 {
     ConnectedLivingSpace.ICLSAddon cls = module.GetCLS();
     if (cls != null && gameConfig.applyCLSLimitsIfAvailable && vessel == FlightGlobals.ActiveVessel && cls.Vessel != null)
     {
         refreshLoadedVesselRosterCLS(roster, vesselRecord, vessel);
     }
     else if (gameConfig.useBestPartOnVessel)
     {
         refreshLoadedVesselRosterWholeVessel(roster, vesselRecord, vessel);
     }
     else
     {
         refreshLoadedVesselRosterPartOnly(roster, vesselRecord, vessel);
     }
 }
        private void refreshLoadedVesselRoster(Dictionary <string, KeepFitCrewMember> roster,
                                               KeepFitVesselRecord vesselRecord,
                                               Vessel vessel)
        {
            foreach (Part part in vessel.Parts)
            {
                if (part.CrewCapacity == 0)
                {
                    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)
                    {
                        KeepFitPartModule keepFitPartModule = (KeepFitPartModule)module;

                        if (keepFitPartModule.activityLevel > partActivityLevel)
                        {
                            partActivityLevel = keepFitPartModule.activityLevel;
                        }
                    }
                }

                foreach (ProtoCrewMember partCrewMember in part.protoModuleCrew)
                {
                    updateRosters(roster, vesselRecord, partCrewMember.name, partActivityLevel, true);
                }
            }
        }
        private KeepFitCrewMember updateRosters(Dictionary <string, KeepFitCrewMember> roster,
                                                KeepFitVesselRecord vessel,
                                                string name,
                                                ActivityLevel activityLevel,
                                                bool activityLevelReliable)
        {
            this.Log_DebugOnly("updateRosters", "updating crewMember[{0}] activityLevel[{1}]]", name, activityLevel);

            KeepFitCrewMember keepFitCrewMember = null;

            roster.TryGetValue(name, out keepFitCrewMember);
            if (keepFitCrewMember != null)
            {
                this.Log_DebugOnly("updateRosters", "crewMember[{0}] was in the old roster", name);
            }
            else
            {
                this.Log_DebugOnly("updateRosters", "crewMember[{0}] wasn't in the old roster", name);

                // not in the old roster - add him to the new one ...
                keepFitCrewMember = new KeepFitCrewMember(name, false);
                keepFitCrewMember.fitnessLevel  = gameConfig.initialFitnessLevel;
                keepFitCrewMember.activityLevel = activityLevel;
                roster[name] = keepFitCrewMember;
            }

            if (activityLevelReliable)
            {
                keepFitCrewMember.activityLevel = activityLevel;
            }

            vessel.crew[name] = keepFitCrewMember;

            this.Log_DebugOnly("updateRosters", "crewMan[{0}] activityLevel[{1}]", name, activityLevel);

            return(keepFitCrewMember);
        }
Example #7
0
        internal void DrawVesselInfo(int windowHandle, KeepFitVesselRecord vessel, bool showExpandToggle, ref bool expanded, bool showAllCrewExpanded)
        {
            GUILayout.BeginHorizontal();
            GUILayout.Label(vessel.name, uiResources.styleBarText);
            GUILayout.Label("Crew - (" + vessel.crew.Count() + ")");
            GUILayout.FlexibleSpace();
            if (showExpandToggle && DrawChevron(expanded))
            {
                expanded = !expanded;
            }
            GUILayout.EndHorizontal();

            if (expanded)
            {
                GUILayout.BeginHorizontal();
                GUILayout.Space(4);
                GUILayout.BeginVertical();

                DrawCrew(windowHandle, vessel.crew.Values, true, showAllCrewExpanded);

                GUILayout.EndVertical();
                GUILayout.EndHorizontal();
            }
        }
        private void refreshNonLoadedVesselRoster(Dictionary<string, KeepFitCrewMember> roster, 
                                                  KeepFitVesselRecord vesselRecord,
                                                  Vessel vessel)
        {
            ActivityLevel defaultActivityLevel = getDefaultActivityLevel(vessel);

            foreach (ProtoPartSnapshot part in vessel.protoVessel.protoPartSnapshots)
            {
                foreach (ProtoCrewMember crewMember in part.protoModuleCrew)
                {
                    updateRosters(roster, vesselRecord, crewMember.name, defaultActivityLevel, false);
                }
            }
        }
        private KeepFitCrewMember updateRosters(Dictionary<string, KeepFitCrewMember> roster,
                                                KeepFitVesselRecord vessel,
                                                string name,
                                                ActivityLevel activityLevel,
                                                bool activityLevelReliable)
        {
            this.Log_DebugOnly("updateRosters", "updating crewMember[{0}] activityLevel[{1}]]", name, activityLevel);

            KeepFitCrewMember keepFitCrewMember = null;
            roster.TryGetValue(name, out keepFitCrewMember);
            if (keepFitCrewMember != null)
            {
                this.Log_DebugOnly("updateRosters", "crewMember[{0}] was in the old roster", name);
            }
            else
            {
                this.Log_DebugOnly("updateRosters", "crewMember[{0}] wasn't in the old roster", name);

                // not in the old roster - add him to the new one ... 
                keepFitCrewMember = new KeepFitCrewMember(name, false);
                keepFitCrewMember.fitnessLevel = gameConfig.initialFitnessLevel;
                keepFitCrewMember.activityLevel = activityLevel;
                roster[name] = keepFitCrewMember;
            }

            if (activityLevelReliable)
            {
                keepFitCrewMember.activityLevel = activityLevel;
            }            

            vessel.crew[name] = keepFitCrewMember;

            this.Log_DebugOnly("updateRosters", "crewMan[{0}] activityLevel[{1}]", name, activityLevel);

            return keepFitCrewMember;
        }
        internal void RefreshRoster()
        {
            this.Log_DebugOnly("RefreshRoster", ".");

            if (gameConfig == null)
            {
                //this.Log_DebugOnly("RefreshRoster", "No gameConfig - bailing");
                return;
            }
            

            Dictionary<string, KeepFitCrewMember> roster = gameConfig.roster.crew;
            gameConfig.roster.available.crew.Clear();
            gameConfig.roster.assigned.crew.Clear();
            gameConfig.roster.vessels.Clear();

            // first go through all the crew in the system roster - find all the ones not doing anything,
            // and get them working for a living
            {
                KerbalRoster crewRoster = HighLogic.CurrentGame.CrewRoster;
                foreach (ProtoCrewMember crewMember in crewRoster.Crew)
                {
                    switch (crewMember.rosterStatus)
                    {
                        case ProtoCrewMember.RosterStatus.Available:
                            // you're sat on your arse in the crew building, so you can get down to the gym
                            updateRosters(roster, gameConfig.roster.available, crewMember.name, ActivityLevel.EXERCISING, true);
                            break;
                        case ProtoCrewMember.RosterStatus.Assigned:
                            // in flight - do this so we don't lose track of kerbals in the non-flight windows
                            // (until i sort out how to get all current vessels outside of flight
                            updateRosters(roster, gameConfig.roster.assigned, crewMember.name, ActivityLevel.UNKNOWN, false);
                            break;
                        case ProtoCrewMember.RosterStatus.Dead:
                        case ProtoCrewMember.RosterStatus.Missing:
                        default:
                            //roster.Remove(crewMember.name);
                            break;
                    }
                }
            }

            // then go through the vessels in the system - find out what activitylevel each crewmember gets
            // and update their stored activityLevel
            foreach (Vessel vessel in (FlightGlobals.fetch == null ? FlightGlobals.Vessels : FlightGlobals.fetch.vessels))
            {
                if (IsUnmanned(vessel))
                {
                    continue;
                }

                KeepFitVesselRecord vesselRecord = new KeepFitVesselRecord(vessel.vesselName, vessel.id.ToString());
                gameConfig.roster.vessels[vessel.id.ToString()] = vesselRecord;

                if (!vessel.loaded)
                {
                    refreshNonLoadedVesselRoster(roster, vesselRecord, vessel);
                }
                else
                {
                    refreshLoadedVesselRoster(roster, vesselRecord, vessel);
                }
            }
        }
        private void refreshLoadedVesselRosterPartOnly(Dictionary<string, KeepFitCrewMember> roster,
                                                       KeepFitVesselRecord vesselRecord,
                                                       Vessel vessel)
        {
            ActivityLevel vesselDefaultActivityLevel = getDefaultActivityLevel(vessel);

            foreach (Part part in vessel.Parts)
            {
                if (part.CrewCapacity == 0)
                {
                    continue;
                }

                ActivityLevel bestPartActivityLevel = vesselDefaultActivityLevel;

                // check all modules on the part in case we have multiple KeepFit modules for some reason
                foreach (KeepFitPartModule kfModule in part.FindModulesImplementing<KeepFitPartModule>())
                {
                    ActivityLevel partActivityLevel = kfModule.activityLevel;
                    if (partActivityLevel > bestPartActivityLevel)
                    {
                        bestPartActivityLevel = partActivityLevel;
                    }
                }

                foreach (ProtoCrewMember partCrewMember in part.protoModuleCrew)
                {
                    updateRosters(roster, vesselRecord, partCrewMember.name, bestPartActivityLevel, true);
                }
            }
        }
        private void refreshLoadedVesselRosterCLS(Dictionary<string, KeepFitCrewMember> roster,
                                                  KeepFitVesselRecord vesselRecord,
                                                  Vessel vessel)
        {
            ActivityLevel vesselDefaultActivityLevel = getDefaultActivityLevel(vessel);

            ConnectedLivingSpace.ICLSAddon cls = module.GetCLS();
            foreach (ConnectedLivingSpace.ICLSSpace space in cls.Vessel.Spaces)
            {
                ActivityLevel spaceBestActivityLevel = vesselDefaultActivityLevel;

                foreach (ConnectedLivingSpace.ICLSPart part in space.Parts)
                {
                    if (part.Part.CrewCapacity == 0)
                    {
                        continue;
                    }

                    // check all modules on the part in case we have multiple KeepFit modules for some reason
                    foreach (KeepFitPartModule kfModule in part.Part.FindModulesImplementing<KeepFitPartModule>())
                    {
                        ActivityLevel partActivityLevel = kfModule.activityLevel;
                        if (partActivityLevel > spaceBestActivityLevel)
                        {
                            spaceBestActivityLevel = partActivityLevel;
                        }
                    }

                    foreach (ConnectedLivingSpace.ICLSKerbal partCrewMember in space.Crew)
                    {
                        updateRosters(roster, vesselRecord, partCrewMember.Kerbal.name, spaceBestActivityLevel, true);
                    }
                }


            }
        }
 private void refreshLoadedVesselRoster(Dictionary<string, KeepFitCrewMember> roster,
                                        KeepFitVesselRecord vesselRecord,
                                        Vessel vessel)
 {
     ConnectedLivingSpace.ICLSAddon cls = module.GetCLS();
     if (cls != null && gameConfig.applyCLSLimitsIfAvailable && vessel == FlightGlobals.ActiveVessel && cls.Vessel != null)
     {
         refreshLoadedVesselRosterCLS(roster, vesselRecord, vessel);
     }
     else if (gameConfig.useBestPartOnVessel)
     {
         refreshLoadedVesselRosterWholeVessel(roster, vesselRecord, vessel);
     }
     else 
     {
         refreshLoadedVesselRosterPartOnly(roster, vesselRecord, vessel);
     }
 }
Example #14
0
        internal void DrawVesselInfo(int windowHandle, KeepFitVesselRecord vessel, bool showExpandToggle, ref bool expanded, bool showAllCrewExpanded)
        {
            GUILayout.BeginHorizontal();
            GUILayout.Label(vessel.name, uiResources.styleBarText);
            GUILayout.Label("Crew - (" + vessel.crew.Count() + ")");
            GUILayout.FlexibleSpace();
            if (showExpandToggle && DrawChevron(expanded))
            {
                expanded = !expanded;
            }
            GUILayout.EndHorizontal();

            if (expanded)
            {
                GUILayout.BeginHorizontal();
                GUILayout.Space(4);
                GUILayout.BeginVertical();

                DrawCrew(windowHandle, vessel.crew.Values, true, showAllCrewExpanded);

                GUILayout.EndVertical();
                GUILayout.EndHorizontal();
            }
        }
        internal void RefreshRoster()
        {
            this.Log_DebugOnly("RefreshRoster", ".");

            if (gameConfig == null)
            {
                //this.Log_DebugOnly("RefreshRoster", "No gameConfig - bailing");
                return;
            }


            Dictionary <string, KeepFitCrewMember> roster = gameConfig.roster.crew;

            gameConfig.roster.available.crew.Clear();
            gameConfig.roster.assigned.crew.Clear();
            gameConfig.roster.vessels.Clear();

            // first go through all the crew in the system roster - find all the ones not doing anything,
            // and get them working for a living
            {
                KerbalRoster crewRoster = HighLogic.CurrentGame.CrewRoster;
                foreach (ProtoCrewMember crewMember in crewRoster.Crew)
                {
                    switch (crewMember.rosterStatus)
                    {
                    case ProtoCrewMember.RosterStatus.Available:
                        // you're sat on your arse in the crew building, so you can get down to the gym
                        updateRosters(roster, gameConfig.roster.available, crewMember.name, ActivityLevel.EXERCISING, true);
                        break;

                    case ProtoCrewMember.RosterStatus.Assigned:
                        // in flight - do this so we don't lose track of kerbals in the non-flight windows
                        // (until i sort out how to get all current vessels outside of flight
                        updateRosters(roster, gameConfig.roster.assigned, crewMember.name, ActivityLevel.UNKNOWN, false);
                        break;

                    case ProtoCrewMember.RosterStatus.Dead:
                    case ProtoCrewMember.RosterStatus.Missing:
                    default:
                        //roster.Remove(crewMember.name);
                        break;
                    }
                }
            }

            // then go through the vessels in the system - find out what activitylevel each crewmember gets
            // and update their stored activityLevel
            foreach (Vessel vessel in (FlightGlobals.fetch == null ? FlightGlobals.Vessels : FlightGlobals.fetch.vessels))
            {
                if (IsUnmanned(vessel))
                {
                    continue;
                }

                KeepFitVesselRecord vesselRecord = new KeepFitVesselRecord(vessel.vesselName, vessel.id.ToString());
                gameConfig.roster.vessels[vessel.id.ToString()] = vesselRecord;

                if (!vessel.loaded)
                {
                    refreshNonLoadedVesselRoster(roster, vesselRecord, vessel);
                }
                else
                {
                    refreshLoadedVesselRoster(roster, vesselRecord, vessel);
                }
            }
        }