/
Activator.cs
211 lines (199 loc) · 7.76 KB
/
Activator.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
using DMagic;
using DMagic.Part_Modules;
using System;
using System.Collections.Generic;
using System.Text;
namespace KerboKatz.ASS.DMOS
{
public class Activator : IScienceActivator
{
private AutomatedScienceSampler _AutomatedScienceSamplerInstance;
AutomatedScienceSampler IScienceActivator.AutomatedScienceSampler
{
get { return _AutomatedScienceSamplerInstance; }
set { _AutomatedScienceSamplerInstance = value; }
}
public bool CanRunExperiment(ModuleScienceExperiment baseExperiment, float currentScienceValue)
{
var currentExperiment = baseExperiment as DMModuleScienceAnimate;
if (currentScienceValue < _AutomatedScienceSamplerInstance.craftSettings.threshold)
{
Log(currentExperiment.experimentID, ": Science value is less than cutoff threshold: ", currentScienceValue, "<", _AutomatedScienceSamplerInstance.craftSettings.threshold);
return false;
}
if (!currentExperiment.rerunnable && !_AutomatedScienceSamplerInstance.craftSettings.oneTimeOnly)
{
Log(currentExperiment.experimentID, ": Runing rerunable experiments is disabled");
return false;
}
if (currentExperiment.Inoperable)
{
Log(currentExperiment.experimentID, ": Experiment is inoperable");
return false;
}
if (currentExperiment.Deployed)
{
Log(currentExperiment.experimentID, ": Experiment is deployed");
return false;
}
if (!currentExperiment.experiment.IsUnlocked())
{
Log(currentExperiment.experimentID, ": Experiment is locked");
return false;
}
if (!string.IsNullOrEmpty(currentExperiment.animationName))
{
var anim = currentExperiment.part.FindModelAnimators(currentExperiment.animationName)[0];
if (anim.isPlaying)
{
Log(currentExperiment.experimentID, ": Animation is playing");
return false;
}
}
return DMAPI.experimentCanConduct(currentExperiment);
}
public void DeployExperiment(ModuleScienceExperiment baseExperiment)
{
var currentExperiment = baseExperiment as DMModuleScienceAnimate;
DMAPI.deployDMExperiment(currentExperiment, _AutomatedScienceSamplerInstance.craftSettings.hideScienceDialog);
}
public ScienceSubject GetScienceSubject(ModuleScienceExperiment baseExperiment)
{
var currentExperiment = baseExperiment as DMModuleScienceAnimate;
if (DMAPI.isAsteroidGrappled(baseExperiment))
{
return DMAPI.getAsteroidSubject(currentExperiment);
}
else
{
ExperimentSituations situation = ScienceUtil.GetExperimentSituation(FlightGlobals.ActiveVessel);
var biome = DMAPI.getBiome(baseExperiment, situation);
if (biome == null)
{
Log("Biome is null.");
return null;
}
var scienceSubject = ResearchAndDevelopment.GetExperimentSubject(ResearchAndDevelopment.GetExperiment(currentExperiment.experimentID), situation, FlightGlobals.currentMainBody, biome, ScienceUtil.GetBiomedisplayName(FlightGlobals.currentMainBody, biome));
Log(biome, "_", situation, "_", scienceSubject == null);
return scienceSubject;
}
}
public float GetScienceValue(ModuleScienceExperiment baseExperiment, Dictionary<string, int> shipCotainsExperiments, ScienceSubject currentScienceSubject)
{
var currentExperiment = baseExperiment as DMModuleScienceAnimate;
var scienceExperiment = ResearchAndDevelopment.GetExperiment(baseExperiment.experimentID);
return Utilities.Science.GetScienceValue(shipCotainsExperiments, scienceExperiment, currentScienceSubject) * currentExperiment.totalScienceLevel;
/*if (DMAPI.isAsteroidGrappled(currentExperiment))
{
return Utilities.Science.GetScienceValue(shipCotainsExperiments, scienceExperiment, currentScienceSubject, null, GetNextScienceValue);
}
else
{
return Utilities.Science.GetScienceValue(shipCotainsExperiments, scienceExperiment, currentScienceSubject);
}*/
}
public bool CanReset(ModuleScienceExperiment baseExperiment)
{
var currentExperiment = baseExperiment as DMModuleScienceAnimate;
if (!currentExperiment.Inoperable)
{
Log(currentExperiment.experimentID, ": Experiment isn't inoperable");
return false;
}
if (!currentExperiment.Deployed)
{
Log(currentExperiment.experimentID, ": Experiment isn't deployed!");
return false;
}
if ((currentExperiment as IScienceDataContainer).GetScienceCount() > 0)
{
Log(currentExperiment.experimentID, ": Experiment has data!");
return false;
}
if (!currentExperiment.resettable)
{
Log(currentExperiment.experimentID, ": Experiment isn't resetable");
return false;
}
bool hasScientist = false;
foreach (var crew in FlightGlobals.ActiveVessel.GetVesselCrew())
{
if (crew.trait == "Scientist")
{
hasScientist = true;
break;
}
}
if (!hasScientist)
{
Log(currentExperiment.experimentID, ": Vessel has no scientist");
return false;
}
return true;
}
public void Reset(ModuleScienceExperiment baseExperiment)
{
var currentExperiment = baseExperiment as DMModuleScienceAnimate;
Log(currentExperiment.experimentID, ": Reseting experiment");
currentExperiment.ResetExperiment();
}
public bool CanTransfer(ModuleScienceExperiment baseExperiment, IScienceDataContainer moduleScienceContainer)
{
var currentExperiment = baseExperiment as DMModuleScienceAnimate;
if ((currentExperiment as IScienceDataContainer).GetScienceCount() == 0)
{
Log(currentExperiment.experimentID, ": Experiment has no data skiping transfer. Data found: ", (currentExperiment as IScienceDataContainer).GetScienceCount(), "_", currentExperiment.experimentNumber);
return false;
}
if (!currentExperiment.IsRerunnable())
{
if (!_AutomatedScienceSamplerInstance.craftSettings.transferAllData)
{
Log(currentExperiment.experimentID, ": Experiment isn't rerunnable and transferAllData is turned off.");
return false;
}
}
if (!_AutomatedScienceSamplerInstance.craftSettings.dumpDuplicates)
{
foreach (var data in (currentExperiment as IScienceDataContainer).GetData())
{
if (moduleScienceContainer.HasData(data))
{
Log(currentExperiment.experimentID, ": Target already has experiment and dumping is disabled.");
return false;
}
}
}
Log(currentExperiment.experimentID, ": We can transfer the science!");
return true;
}
public void Transfer(ModuleScienceExperiment baseExperiment, IScienceDataContainer moduleScienceContainer)
{
var currentExperiment = baseExperiment as DMModuleScienceAnimate;
Log(currentExperiment.experimentID, ": transfering");
moduleScienceContainer.StoreData(currentExperiment, _AutomatedScienceSamplerInstance.craftSettings.dumpDuplicates);
}
public List<Type> GetValidTypes()
{
var types = new List<Type>();
types.Add(typeof(DMModuleScienceAnimate));
Utilities.LoopTroughAssemblies((type) =>
{
if (type.IsClass && !type.IsAbstract && type.IsSubclassOf(typeof(DMModuleScienceAnimate)))
{
types.Add(type);
}
});
return types;
}
private void Log(params object[] msg)
{
var debugStringBuilder = new StringBuilder();
foreach (var debugString in msg)
{
debugStringBuilder.Append(debugString.ToString());
}
_AutomatedScienceSamplerInstance.Log("[DMagicOrbitalScience]", debugStringBuilder);
}
}
}