Skip to content

Commit aaa9d7f

Browse files
committed
add ConfigNodeHolder so that internal modules don't have to search for the module config in Start
1 parent 9e14622 commit aaa9d7f

File tree

9 files changed

+268
-305
lines changed

9 files changed

+268
-305
lines changed

RasterPropMonitor/Auxiliary modules/JSIActionGroupSwitch.cs

Lines changed: 98 additions & 102 deletions
Large diffs are not rendered by default.

RasterPropMonitor/Auxiliary modules/JSICallbackAnimator.cs

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ namespace JSI
3232
/// </summary>
3333
public class JSICallbackAnimator : InternalModule
3434
{
35+
[SerializeReference] ConfigNodeHolder moduleConfig;
36+
3537
[KSPField]
3638
public string variableName = string.Empty;
3739
[KSPField]
@@ -42,6 +44,12 @@ public class JSICallbackAnimator : InternalModule
4244
private RasterPropMonitorComputer rpmComp;
4345
private JSIFlashModule fm;
4446

47+
public override void OnLoad(ConfigNode node)
48+
{
49+
moduleConfig = ScriptableObject.CreateInstance<ConfigNodeHolder>();
50+
moduleConfig.Node = node;
51+
}
52+
4553
/// <summary>
4654
/// Start and initialize all the things!
4755
/// </summary>
@@ -56,32 +64,23 @@ public void Start()
5664
{
5765
rpmComp = RasterPropMonitorComputer.FindFromProp(internalProp);
5866

59-
ConfigNode moduleConfig = null;
60-
foreach (ConfigNode node in GameDatabase.Instance.GetConfigNodes("PROP"))
67+
if (string.IsNullOrEmpty(variableName))
6168
{
62-
if (node.GetValue("name") == internalProp.propName)
63-
{
64-
if (string.IsNullOrEmpty(variableName))
65-
{
66-
JUtil.LogErrorMessage(this, "Configuration failed in prop {0} ({1}), no variableName.", internalProp.propID, internalProp.propName);
67-
throw new ArgumentNullException();
68-
}
69+
JUtil.LogErrorMessage(this, "Configuration failed in prop {0} ({1}), no variableName.", internalProp.propID, internalProp.propName);
70+
throw new ArgumentNullException();
71+
}
6972

70-
moduleConfig = node.GetNodes("MODULE")[moduleID];
71-
ConfigNode[] variableNodes = moduleConfig.GetNodes("VARIABLESET");
73+
ConfigNode[] variableNodes = moduleConfig.Node.GetNodes("VARIABLESET");
7274

73-
for (int i = 0; i < variableNodes.Length; i++)
74-
{
75-
try
76-
{
77-
variableSets.Add(new CallbackAnimationSet(variableNodes[i], variableName, internalProp));
78-
}
79-
catch (ArgumentException e)
80-
{
81-
JUtil.LogErrorMessage(this, "Error in building prop number {1} - {0}", e.Message, internalProp.propID);
82-
}
83-
}
84-
break;
75+
for (int i = 0; i < variableNodes.Length; i++)
76+
{
77+
try
78+
{
79+
variableSets.Add(new CallbackAnimationSet(variableNodes[i], variableName, internalProp));
80+
}
81+
catch (ArgumentException e)
82+
{
83+
JUtil.LogErrorMessage(this, "Error in building prop number {1} - {0}", e.Message, internalProp.propID);
8584
}
8685
}
8786

RasterPropMonitor/Auxiliary modules/JSILabel.cs

Lines changed: 39 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,18 @@ namespace JSI
2727
// Note 1: http://docs.unity3d.com/Manual/StyledText.html details the "richText" abilities
2828
public class JSILabel : InternalModule
2929
{
30+
[SerializeReference] ConfigNodeHolder moduleConfig;
31+
3032
[KSPField]
3133
public string labelText = "uninitialized";
3234
[KSPField]
3335
public string transformName;
3436
[KSPField]
3537
public Vector2 transformOffset = Vector2.zero;
3638
[KSPField]
37-
public string emissive = string.Empty;
38-
private EmissiveMode emissiveMode = EmissiveMode.always;
39+
public EmissiveMode emissive;
3940
float lastEmissiveValue = -1;
40-
enum EmissiveMode
41+
public enum EmissiveMode
4142
{
4243
always,
4344
never,
@@ -106,6 +107,12 @@ enum EmissiveMode
106107
RasterPropMonitorComputer rpmComp;
107108
private JSIFlashModule fm;
108109

110+
public override void OnLoad(ConfigNode node)
111+
{
112+
moduleConfig = ScriptableObject.CreateInstance<ConfigNodeHolder>();
113+
moduleConfig.Node = node;
114+
}
115+
109116
/// <summary>
110117
/// Start everything up and get it configured.
111118
/// </summary>
@@ -192,43 +199,34 @@ public void Start()
192199
SmarterButton.CreateButton(internalProp, switchTransform, Click);
193200
audioOutput = JUtil.SetupIVASound(internalProp, switchSound, switchSoundVolume, false);
194201

195-
foreach (ConfigNode node in GameDatabase.Instance.GetConfigNodes("PROP"))
202+
ConfigNode[] variableNodes = moduleConfig.Node.GetNodes("VARIABLESET");
203+
204+
for (int i = 0; i < variableNodes.Length; i++)
196205
{
197-
if (node.GetValue("name") == internalProp.propName)
206+
try
198207
{
199-
ConfigNode moduleConfig = node.GetNodes("MODULE")[moduleID];
200-
ConfigNode[] variableNodes = moduleConfig.GetNodes("VARIABLESET");
201-
202-
for (int i = 0; i < variableNodes.Length; i++)
208+
bool lOneshot = false;
209+
if (variableNodes[i].HasValue("oneshot"))
203210
{
204-
try
205-
{
206-
bool lOneshot = false;
207-
if (variableNodes[i].HasValue("oneshot"))
208-
{
209-
bool.TryParse(variableNodes[i].GetValue("oneshot"), out lOneshot);
210-
}
211-
if (variableNodes[i].HasValue("labelText"))
212-
{
213-
string lText = variableNodes[i].GetValue("labelText");
214-
string sourceString = lText.UnMangleConfigText();
215-
lOneshot |= !lText.Contains("$&$");
216-
labels.Add(new JSILabelSet(sourceString, rpmComp, lOneshot));
217-
if (!lOneshot)
218-
{
219-
rpmComp.UpdateDataRefreshRate(refreshRate);
220-
}
221-
}
222-
}
223-
catch (ArgumentException e)
211+
bool.TryParse(variableNodes[i].GetValue("oneshot"), out lOneshot);
212+
}
213+
if (variableNodes[i].HasValue("labelText"))
214+
{
215+
string lText = variableNodes[i].GetValue("labelText");
216+
string sourceString = lText.UnMangleConfigText();
217+
lOneshot |= !lText.Contains("$&$");
218+
labels.Add(new JSILabelSet(sourceString, rpmComp, lOneshot));
219+
if (!lOneshot)
224220
{
225-
JUtil.LogErrorMessage(this, "Error in building prop number {1} - {0}", e.Message, internalProp.propID);
221+
rpmComp.UpdateDataRefreshRate(refreshRate);
226222
}
227223
}
228-
break;
224+
}
225+
catch (ArgumentException e)
226+
{
227+
JUtil.LogErrorMessage(this, "Error in building prop number {1} - {0}", e.Message, internalProp.propID);
229228
}
230229
}
231-
232230
}
233231

234232
if (!string.IsNullOrEmpty(zeroColor))
@@ -237,51 +235,24 @@ public void Start()
237235
textObj.color = zeroColorValue;
238236
}
239237

240-
bool usesMultiColor = false;
241238
if (!(string.IsNullOrEmpty(variableName) || string.IsNullOrEmpty(positiveColor) || string.IsNullOrEmpty(negativeColor) || string.IsNullOrEmpty(zeroColor)))
242239
{
243-
usesMultiColor = true;
244240
positiveColorValue = JUtil.ParseColor32(positiveColor, rpmComp);
245241
negativeColorValue = JUtil.ParseColor32(negativeColor, rpmComp);
246242
del = (Action<float>)Delegate.CreateDelegate(typeof(Action<float>), this, "OnCallback");
247243
rpmComp.RegisterVariableCallback(variableName, del);
248244
registeredVessel = vessel.id;
249245

246+
emissive = EmissiveMode.active;
247+
250248
// Initialize the text color. Actually, callback registration takes care of that.
251249
}
252250

253-
if (string.IsNullOrEmpty(emissive))
254-
{
255-
if (usesMultiColor)
256-
{
257-
emissiveMode = EmissiveMode.active;
258-
}
259-
else
260-
{
261-
emissiveMode = EmissiveMode.always;
262-
}
263-
}
264-
else if (emissive.ToLower() == EmissiveMode.always.ToString())
265-
{
266-
emissiveMode = EmissiveMode.always;
267-
}
268-
else if (emissive.ToLower() == EmissiveMode.never.ToString())
269-
{
270-
emissiveMode = EmissiveMode.never;
271-
}
272-
else if (emissive.ToLower() == EmissiveMode.active.ToString())
273-
{
274-
emissiveMode = EmissiveMode.active;
275-
}
276-
else if (emissive.ToLower() == EmissiveMode.passive.ToString())
277-
{
278-
emissiveMode = EmissiveMode.passive;
279-
}
280-
else if (emissive.ToLower() == EmissiveMode.flash.ToString())
251+
if (emissive == EmissiveMode.flash)
281252
{
282253
if (flashRate > 0.0f)
283254
{
284-
emissiveMode = EmissiveMode.flash;
255+
emissive = EmissiveMode.flash;
285256
fm = JUtil.InstallFlashModule(part, flashRate);
286257
if (fm != null)
287258
{
@@ -290,14 +261,9 @@ public void Start()
290261
}
291262
else
292263
{
293-
emissiveMode = EmissiveMode.active;
264+
emissive = EmissiveMode.active;
294265
}
295266
}
296-
else
297-
{
298-
JUtil.LogErrorMessage(this, "Unrecognized emissive mode '{0}' in config for {1} ({2})", emissive, internalProp.propID, internalProp.propName);
299-
emissiveMode = EmissiveMode.always;
300-
}
301267

302268
UpdateShader();
303269
}
@@ -359,19 +325,19 @@ public void Click()
359325
private void UpdateShader()
360326
{
361327
float emissiveValue;
362-
if (emissiveMode == EmissiveMode.always)
328+
if (emissive == EmissiveMode.always)
363329
{
364330
emissiveValue = 1.0f;
365331
}
366-
else if (emissiveMode == EmissiveMode.never)
332+
else if (emissive == EmissiveMode.never)
367333
{
368334
emissiveValue = 0.0f;
369335
}
370-
else if (emissiveMode == EmissiveMode.flash)
336+
else if (emissive == EmissiveMode.flash)
371337
{
372338
emissiveValue = (variablePositive && flashOn) ? 1.0f : 0.0f;
373339
}
374-
else if (variablePositive ^ (emissiveMode == EmissiveMode.passive))
340+
else if (variablePositive ^ (emissive == EmissiveMode.passive))
375341
{
376342
emissiveValue = 1.0f;
377343
}

RasterPropMonitor/Auxiliary modules/JSINumericInput.cs

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ namespace JSI
2727
{
2828
class JSINumericInput : InternalModule
2929
{
30+
[SerializeReference] ConfigNodeHolder moduleConfig;
31+
3032
[KSPField]
3133
public string perPodPersistenceName = string.Empty;
3234

@@ -57,6 +59,12 @@ class JSINumericInput : InternalModule
5759

5860
private float remainder = 0.0f;
5961

62+
public override void OnLoad(ConfigNode node)
63+
{
64+
moduleConfig = ScriptableObject.CreateInstance<ConfigNodeHolder>();
65+
moduleConfig.Node = node;
66+
}
67+
6068
public void Start()
6169
{
6270
if (HighLogic.LoadedSceneIsEditor)
@@ -117,28 +125,18 @@ public void Start()
117125
rpmComp.SetPersistentVariable(perPodPersistenceName, value, perPodPersistenceIsGlobal);
118126
}
119127

120-
ConfigNode moduleConfig = null;
121-
foreach (ConfigNode node in GameDatabase.Instance.GetConfigNodes("PROP"))
128+
ConfigNode[] inputNodes = moduleConfig.Node.GetNodes("USERINPUTSET");
129+
130+
for (int i = 0; i < inputNodes.Length; i++)
122131
{
123-
if (node.GetValue("name") == internalProp.propName)
132+
try
124133
{
125-
126-
moduleConfig = node.GetNodes("MODULE")[moduleID];
127-
ConfigNode[] inputNodes = moduleConfig.GetNodes("USERINPUTSET");
128-
129-
for (int i = 0; i < inputNodes.Length; i++)
130-
{
131-
try
132-
{
133-
numericInputs.Add(new NumericInput(inputNodes[i], internalProp));
134-
//JUtil.LogMessage(this, "Added USERINPUTSET {0}", inputNodes[i].GetValue("switchTransform"));
135-
}
136-
catch (ArgumentException e)
137-
{
138-
JUtil.LogErrorMessage(this, "Error in building prop number {1} - {0}", e.Message, internalProp.propID);
139-
}
140-
}
141-
break;
134+
numericInputs.Add(new NumericInput(inputNodes[i], internalProp));
135+
//JUtil.LogMessage(this, "Added USERINPUTSET {0}", inputNodes[i].GetValue("switchTransform"));
136+
}
137+
catch (ArgumentException e)
138+
{
139+
JUtil.LogErrorMessage(this, "Error in building prop number {1} - {0}", e.Message, internalProp.propID);
142140
}
143141
}
144142

RasterPropMonitor/Auxiliary modules/JSISwitchableVariableLabel.cs

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ namespace JSI
2626
{
2727
public class JSISwitchableVariableLabel : InternalModule
2828
{
29+
[SerializeReference] ConfigNodeHolder moduleConfig;
30+
2931
[KSPField]
3032
public string labelTransform = string.Empty;
3133
[KSPField]
@@ -61,6 +63,12 @@ public class JSISwitchableVariableLabel : InternalModule
6163
private FXGroup audioOutput;
6264
private RasterPropMonitorComputer rpmComp;
6365

66+
public override void OnLoad(ConfigNode node)
67+
{
68+
moduleConfig = ScriptableObject.CreateInstance<ConfigNodeHolder>();
69+
moduleConfig.Node = node;
70+
}
71+
6472
public void Start()
6573
{
6674
if (HighLogic.LoadedSceneIsEditor)
@@ -92,36 +100,26 @@ public void Start()
92100
SmarterButton.CreateButton(internalProp, decrementSwitchTransform, DecremenetClick);
93101
}
94102

95-
ConfigNode moduleConfig = null;
96-
foreach (ConfigNode node in GameDatabase.Instance.GetConfigNodes("PROP"))
103+
ConfigNode[] variableNodes = moduleConfig.Node.GetNodes("VARIABLESET");
104+
105+
for (int i = 0; i < variableNodes.Length; i++)
97106
{
98-
if (node.GetValue("name") == internalProp.propName)
107+
try
99108
{
100-
101-
moduleConfig = node.GetNodes("MODULE")[moduleID];
102-
ConfigNode[] variableNodes = moduleConfig.GetNodes("VARIABLESET");
103-
104-
for (int i = 0; i < variableNodes.Length; i++)
105-
{
106-
try
107-
{
108-
labelsEx.Add(new VariableLabelSet(variableNodes[i], internalProp));
109-
}
110-
catch (ArgumentException e)
111-
{
112-
JUtil.LogErrorMessage(this, "Error in building prop number {1} - {0}", e.Message, internalProp.propID);
113-
}
114-
}
115-
break;
109+
labelsEx.Add(new VariableLabelSet(variableNodes[i], internalProp));
110+
}
111+
catch (ArgumentException e)
112+
{
113+
JUtil.LogErrorMessage(this, "Error in building prop number {1} - {0}", e.Message, internalProp.propID);
116114
}
117115
}
118116

119117
// Fallback: If there are no VARIABLESET blocks, we treat the module configuration itself as a variableset block.
120-
if (labelsEx.Count < 1 && moduleConfig != null)
118+
if (labelsEx.Count < 1)
121119
{
122120
try
123121
{
124-
labelsEx.Add(new VariableLabelSet(moduleConfig, internalProp));
122+
labelsEx.Add(new VariableLabelSet(moduleConfig.Node, internalProp));
125123
}
126124
catch (ArgumentException e)
127125
{

0 commit comments

Comments
 (0)