Skip to content

Commit eea6d9b

Browse files
committed
Holy shit, stuff works.
1 parent a2af008 commit eea6d9b

File tree

6 files changed

+126
-96
lines changed

6 files changed

+126
-96
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
@PART[Large_Crewed_Lab]:FOR[CrewQ]
2+
{
3+
%MODULE[ModuleCrewQ]
4+
{
5+
crewComposition = Scientist
6+
}
7+
}
8+
9+
@PART[Mark1Cockpit]:FOR[CrewQ]
10+
{
11+
%MODULE[ModuleCrewQ]
12+
{
13+
crewComposition = Pilot
14+
}
15+
}
16+
17+
@PART[Mark2Cockpit]:FOR[CrewQ]
18+
{
19+
%MODULE[ModuleCrewQ]
20+
{
21+
crewComposition = Pilot
22+
}
23+
}

Source/CrewQ.cs

Lines changed: 65 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ void OnVesselRecoveryRequested(Vessel vessel)
7878

7979
foreach (ProtoCrewMember kerbal in vessel.GetVesselCrew())
8080
{
81-
kerbal.SetVacationTimerInternal(adjustedTime);
81+
kerbal.SetVacationTimer(adjustedTime);
8282
}
8383

8484
GamePersistence.SaveGame("persistent", HighLogic.SaveFolder, SaveMode.OVERWRITE);
@@ -93,14 +93,23 @@ internal IEnumerable<ProtoCrewMember> AvailableCrew
9393

9494
if (CrewQData.Instance.settingVacationHardlock)
9595
{
96-
_AvailableCrew = HighLogic.CurrentGame.CrewRoster.Crew.Where(x => x.OnVacationInternal() == false);
96+
_AvailableCrew = HighLogic.CurrentGame.CrewRoster.Crew.Where(x => x.OnVacation() == false);
9797
}
9898
else
9999
{
100100
_AvailableCrew = HighLogic.CurrentGame.CrewRoster.Crew;
101101
}
102102

103-
return _AvailableCrew.OrderBy(x => x.GetVacationTimerInternal());
103+
try
104+
{
105+
_AvailableCrew.Except(CMAssignmentDialog.Instance.GetManifest().GetAllCrew(false));
106+
}
107+
catch (Exception)
108+
{
109+
//nothing to see here, move along
110+
}
111+
112+
return _AvailableCrew.OrderBy(x => x.GetVacationTimer());
104113
}
105114
}
106115

@@ -112,19 +121,19 @@ internal IEnumerable<ProtoCrewMember> UnavailableCrew
112121
}
113122
}
114123

115-
internal IEnumerable<ProtoCrewMember> NewbieCrew
124+
internal IOrderedEnumerable<ProtoCrewMember> NewbieCrew
116125
{
117126
get
118127
{
119-
return AvailableCrew.OrderBy(x => x.experienceLevel).ThenBy(x => x.GetVacationTimerInternal());
128+
return AvailableCrew.OrderBy(x => x.experienceLevel).ThenBy(x => x.GetVacationTimer());
120129
}
121130
}
122131

123-
internal IEnumerable<ProtoCrewMember> VeteranCrew
132+
internal IOrderedEnumerable<ProtoCrewMember> VeteranCrew
124133
{
125134
get
126135
{
127-
return AvailableCrew.OrderByDescending(x => x.experienceLevel).ThenBy(x => x.GetVacationTimerInternal());
136+
return AvailableCrew.OrderByDescending(x => x.experienceLevel).ThenBy(x => x.GetVacationTimer());
128137
}
129138
}
130139

@@ -148,26 +157,72 @@ internal void ShowVacationingCrew()
148157
kerbal.rosterStatus = ProtoCrewMember.RosterStatus.Available;
149158
}
150159
}
160+
161+
internal IEnumerable<ProtoCrewMember> GetCrewForPart(Part partPrefab, bool preferVeterans = false)
162+
{
163+
IList<ProtoCrewMember> partCrew = new List<ProtoCrewMember>();
164+
IEnumerable<ProtoCrewMember> availableCrew = (preferVeterans ? VeteranCrew : NewbieCrew);
165+
string[] crewComposition;
166+
int numToSelect = partPrefab.CrewCapacity;
167+
ProtoCrewMember candidate;
168+
169+
//Get Crew Composition
170+
if (partPrefab.Modules.OfType<ModuleCrewQ>().Any())
171+
{
172+
crewComposition = partPrefab.Modules["ModuleCrewQ"].Fields.GetValue<string>("crewComposition").Split(',').Select(x => x.Trim()).ToArray();
173+
}
174+
else
175+
{
176+
crewComposition = new string[] { "Pilot", "Engineer", "Scientist" };
177+
}
178+
179+
for (int i = 0; i < numToSelect; i++)
180+
{
181+
if (i < crewComposition.Length)
182+
{
183+
candidate = availableCrew.Where(x => x.experienceTrait.Title == crewComposition[i]).FirstOrDefault();
184+
}
185+
else
186+
{
187+
candidate = availableCrew.Where(x => x.experienceTrait.Title == crewComposition[new System.Random().Next(crewComposition.Length)]).FirstOrDefault();
188+
}
189+
190+
if (candidate != null)
191+
{
192+
partCrew.Add(candidate);
193+
}
194+
195+
availableCrew = availableCrew.Except(partCrew);
196+
}
197+
198+
return partCrew;
199+
}
151200
}
152201

153202
// The idea here is that we always want to be dealing with ProtoCrewMember outside of this class.
154203
// By making our data available as extension methods, that makes life easier.
155204
public static class CrewQExtensions
156205
{
157-
internal static double GetVacationTimerInternal(this ProtoCrewMember kerbal)
206+
internal static double GetVacationTimer(this ProtoCrewMember kerbal)
158207
{
159208
return CrewQData.Instance.GetVacationTimer(kerbal);
160209
}
161210

162-
internal static bool OnVacationInternal(this ProtoCrewMember kerbal)
211+
internal static bool OnVacation(this ProtoCrewMember kerbal)
163212
{
164213
return CrewQData.Instance.OnVacation(kerbal);
165214
}
166215

167-
internal static void SetVacationTimerInternal(this ProtoCrewMember kerbal, double timeout)
216+
internal static void SetVacationTimer(this ProtoCrewMember kerbal, double timeout)
168217
{
169218
Logging.Debug("Attempting to set vacation timer: " + timeout);
170219
CrewQData.Instance.SetVacationTimer(kerbal, timeout);
171220
}
172221
}
222+
223+
public class ModuleCrewQ : PartModule
224+
{
225+
[KSPField]
226+
public string crewComposition;
227+
}
173228
}

Source/CrewQData.cs

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -167,16 +167,7 @@ public double GetVacationTimer(ProtoCrewMember kerbal)
167167

168168
public bool OnVacation(ProtoCrewMember kerbal)
169169
{
170-
double vacationTimer = kerbal.GetVacationTimerInternal();
171-
172-
if (vacationTimer == -1)
173-
{
174-
return false;
175-
}
176-
else
177-
{
178-
return (vacationTimer - Planetarium.GetUniversalTime() > 0);
179-
}
170+
return ((GetVacationTimer(kerbal) - Planetarium.GetUniversalTime()) > 0);
180171
}
181172

182173
public void SetVacationTimer(ProtoCrewMember kerbal, double timeout)

Source/Interface/EditorModule.cs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,25 +57,35 @@ protected void OnEditorScreenChanged(EditorScreen screen)
5757
if (screen == EditorScreen.Crew)
5858
{
5959
RemapFillButton();
60-
RemapCrew = true;
60+
CrewQ.Instance.HideVacationingCrew();
6161
}
6262
else
6363
{
64-
RemapCrew = false;
64+
CrewQ.Instance.ShowVacationingCrew();
6565
}
66+
67+
CMAssignmentDialog.Instance.RefreshCrewLists(CMAssignmentDialog.Instance.GetManifest(), true, true);
6668
}
6769

6870
// Our methods
69-
protected override void OnUpdate()
71+
protected override void Update()
7072
{
71-
if (rootExists && !cleanedRoot)
73+
try
7274
{
73-
//CleanManifest();
74-
cleanedRoot = true;
75+
if (rootExists && !cleanedRoot)
76+
{
77+
CleanManifest();
78+
cleanedRoot = true;
79+
}
80+
else if (!rootExists && cleanedRoot)
81+
{
82+
cleanedRoot = false;
83+
}
7584
}
76-
else if (!rootExists && cleanedRoot)
85+
catch (Exception)
7786
{
78-
cleanedRoot = false;
87+
// No worries!
88+
Logging.Debug("If there is a problem with clearing the roster, look here.");
7989
}
8090
}
8191

Source/Interface/SceneModule.cs

Lines changed: 13 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -37,72 +37,28 @@ namespace CrewQ.Interface
3737
{
3838
public abstract class SceneModule : MonoBehaviourExtended
3939
{
40-
private bool remapCrewActive, releaseTrigger;
41-
public bool RemapCrew
42-
{
43-
get
44-
{
45-
return remapCrewActive;
46-
}
47-
48-
set
49-
{
50-
if (value == false)
51-
{
52-
releaseTrigger = true;
53-
}
54-
remapCrewActive = value;
55-
}
56-
}
57-
58-
// Monobehaviour Methods
59-
sealed protected override void Update()
60-
{
61-
if (remapCrewActive)
62-
{
63-
CrewQ.Instance.HideVacationingCrew();
64-
}
65-
else if (releaseTrigger)
66-
{
67-
CrewQ.Instance.ShowVacationingCrew();
68-
releaseTrigger = false;
69-
}
70-
71-
OnUpdate();
72-
}
73-
74-
virtual protected void OnUpdate() { }
75-
7640
public void CleanManifest()
7741
{
78-
if (CMAssignmentDialog.Instance != null && CrewQData.Instance != null)
42+
if (CMAssignmentDialog.Instance != null && (CrewQData.Instance.settingRemoveDefaultCrews || CrewQData.Instance.settingDoCustomAssignment))
7943
{
8044
VesselCrewManifest originalVesselManifest = CMAssignmentDialog.Instance.GetManifest();
8145
IList<PartCrewManifest> partCrewManifests = originalVesselManifest.GetCrewableParts();
8246

8347
if (partCrewManifests != null && partCrewManifests.Count > 0)
8448
{
8549
PartCrewManifest partManifest = partCrewManifests[0];
86-
87-
if (CrewQData.Instance.settingRemoveDefaultCrews || CrewQData.Instance.settingDoCustomAssignment)
50+
foreach (ProtoCrewMember crewMember in partManifest.GetPartCrew())
8851
{
89-
foreach (ProtoCrewMember crewMember in partManifest.GetPartCrew())
52+
if (crewMember != null)
9053
{
91-
if (crewMember != null)
92-
{
93-
// Clean the root part
94-
partManifest.RemoveCrewFromSeat(partManifest.GetCrewSeat(crewMember));
95-
}
96-
}
97-
if (CrewQData.Instance.settingDoCustomAssignment)
98-
{
99-
int numCrew = partManifest.PartInfo.partPrefab.CrewCapacity;
100-
101-
IEnumerable<ProtoCrewMember> newCrew = new List<ProtoCrewMember>();
102-
103-
//partManifest.AddCrewToOpenSeats(CrewQ.Instance.AvailableCrew);
54+
// Clean the root part
55+
partManifest.RemoveCrewFromSeat(partManifest.GetCrewSeat(crewMember));
10456
}
10557
}
58+
if (CrewQData.Instance.settingDoCustomAssignment)
59+
{
60+
partManifest.AddCrewToOpenSeats(CrewQ.Instance.GetCrewForPart(partManifest.PartInfo.partPrefab, true));
61+
}
10662
}
10763

10864
CMAssignmentDialog.Instance.RefreshCrewLists(originalVesselManifest, true, true);
@@ -112,30 +68,24 @@ public void CleanManifest()
11268
public void RemapFillButton()
11369
{
11470
BTButton[] buttons = MiscUtils.GetFields<BTButton>(CMAssignmentDialog.Instance);
71+
buttons[0].RemoveInputDelegate(new EZInputDelegate(CMAssignmentDialog.Instance.ButtonFill));
11572
buttons[0].AddInputDelegate(new EZInputDelegate(OnFillButton));
11673
}
11774

11875
public void OnFillButton(ref POINTER_INFO eventPointer)
11976
{
12077
if (eventPointer.evt == POINTER_INFO.INPUT_EVENT.TAP)
12178
{
122-
Logging.Debug("Fill Button Pressed");
79+
Logging.Debug("Fill Button Pressed");
12380
if (CrewQData.Instance.settingDoCustomAssignment)
12481
{
125-
VesselCrewManifest vesselManifest = CMAssignmentDialog.Instance.GetManifest();
126-
127-
foreach (PartCrewManifest partManifest in vesselManifest)
128-
{
129-
bool firstPart = (partManifest == vesselManifest.GetCrewableParts()[0]);
130-
131-
partManifest.AddCrewToOpenSeats(CrewQ.Instance.GetCrewForPart(partManifest.PartInfo.partPrefab, firstPart));
132-
}
82+
// TODO - make this work.
13383
}
13484
else
13585
{
13686
CMAssignmentDialog.Instance.ButtonFill(ref eventPointer);
13787
}
13888
}
13989
}
140-
}
90+
}
14191
}

Source/Interface/SpaceCenterModule.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ protected override void Awake()
4747
GameEvents.onGUILaunchScreenDespawn.Add(onGUILaunchScreenDespawn);
4848
}
4949

50-
protected override void OnUpdate()
50+
protected override void Update()
5151
{
5252
if (astronautComplexSpawned)
5353
{
@@ -56,10 +56,10 @@ protected override void OnUpdate()
5656

5757
foreach (CrewItemContainer crewContainer in crewItemContainers)
5858
{
59-
if (crewContainer.GetCrewRef().OnVacationInternal())
59+
if (crewContainer.GetCrewRef().type == ProtoCrewMember.KerbalType.Crew && crewContainer.GetCrewRef().OnVacation())
6060
{
6161
Logging.Debug("relabeling: " + crewContainer.GetName());
62-
string label = "Ready In: " + Utilities.GetFormattedTime(crewContainer.GetCrewRef().GetVacationTimerInternal());
62+
string label = "Ready In: " + Utilities.GetFormattedTime(crewContainer.GetCrewRef().GetVacationTimer() - Planetarium.GetUniversalTime());
6363
crewContainer.SetLabel(label);
6464
}
6565
}
@@ -78,12 +78,13 @@ private void onGUIAstronautComplexSpawn()
7878

7979
private void onGUILaunchScreenSpawn(GameEvents.VesselSpawnInfo info)
8080
{
81-
RemapCrew = true;
81+
CrewQ.Instance.HideVacationingCrew();
82+
CMAssignmentDialog.Instance.RefreshCrewLists(CMAssignmentDialog.Instance.GetManifest(), true, true);
8283
}
8384

8485
private void onGUILaunchScreenDespawn()
8586
{
86-
RemapCrew = false;
87+
CrewQ.Instance.ShowVacationingCrew();
8788
}
8889

8990
private void onVesselSelected(ShipTemplate shipTemplate)

0 commit comments

Comments
 (0)