Skip to content

Commit ea716b2

Browse files
Complete the vessel's freq-list dialog
1 parent cf28374 commit ea716b2

File tree

4 files changed

+42
-43
lines changed

4 files changed

+42
-43
lines changed

src/CommNetConstellation/CommNetLayer/CNCCommNetVessel.cs

Lines changed: 29 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ public class CNCAntennaPartInfo
5656
public double antennaCombinableExponent;
5757
public bool antennaCombinable;
5858
public AntennaType antennaType;
59-
public uint GUID;
59+
public Part partReference;
60+
public ProtoPartSnapshot partSnapshotReference = null;
6061
public bool inUse; // selected by user to be used
6162
public bool canComm; //fixed and deployable antennas
6263
}
@@ -70,7 +71,7 @@ public enum FrequencyListOperation
7071
{
7172
AutoBuild,
7273
LockList,
73-
UpdateOnly
74+
//UpdateOnly //cannot find any use
7475
};
7576

7677
//http://forum.kerbalspaceprogram.com/index.php?/topic/141574-kspfield-questions/&do=findComment&comment=2625815
@@ -177,7 +178,8 @@ protected List<CNCAntennaPartInfo> readAntennaData()
177178
newAntennaPartInfo.antennaCombinable = thisAntenna.CommCombinable;
178179
newAntennaPartInfo.antennaCombinableExponent = thisAntenna.CommCombinableExponent;
179180
newAntennaPartInfo.antennaType = thisAntenna.CommType;
180-
newAntennaPartInfo.GUID = thisPart.craftID; // good enough
181+
newAntennaPartInfo.partReference = thisPart; //unique ID for part is not available
182+
newAntennaPartInfo.partSnapshotReference = partSnapshot;
181183
newAntennaPartInfo.canComm = (!this.vessel.loaded) ? thisAntenna.CanCommUnloaded(partModuleSnapshot) : thisAntenna.CanComm();
182184

183185
populatedAntennaInfo = true;
@@ -264,19 +266,20 @@ public short getStrongestFrequency()
264266
/// </summary>
265267
private short computeStrongestFrequency(Dictionary<short, double> dict)
266268
{
267-
short freq = -1;
268-
double power = 0;
269-
foreach(short key in dict.Keys)
270-
{
271-
if (power < dict[key])
272-
{
273-
power = dict[key];
274-
freq = key;
275-
}
276-
}
269+
if (dict.Count < 1)
270+
return -1;
271+
else if (dict.Count == 1)
272+
return dict.Keys.First();
277273

278-
//TODO: two freqs of equal comm power? - choose over public; pick lowest freq
274+
List<KeyValuePair<short, double>> decreasingFreqs= dict.OrderByDescending(x => x.Value).ToList();
275+
short freq = decreasingFreqs[0].Key;
279276

277+
if(freq == CNCSettings.Instance.PublicRadioFrequency)
278+
{
279+
if (decreasingFreqs[0].Value == decreasingFreqs[1].Value)
280+
freq = decreasingFreqs[1].Key; // pick next freq of same comm power
281+
}
282+
280283
return freq;
281284
}
282285

@@ -296,7 +299,7 @@ public bool isFreqListEditable()
296299
/// <summary>
297300
/// Notify CommNet vessel on antenna change (like changing frequency and deploy/retract antenna)
298301
/// </summary>
299-
public void OnAntennaChange()//TODO: bad design. replace it with something better
302+
public void OnAntennaChange()
300303
{
301304
this.vesselAntennas = readAntennaData();
302305

@@ -308,9 +311,6 @@ public void OnAntennaChange()//TODO: bad design. replace it with something bette
308311
case FrequencyListOperation.LockList: // dont change current freq dict
309312
this.strongestFreq = computeStrongestFrequency(this.FrequencyDict);
310313
break;
311-
case FrequencyListOperation.UpdateOnly:
312-
//TODO: complete updateonly function
313-
break;
314314
}
315315
}
316316

@@ -319,7 +319,11 @@ public void OnAntennaChange()//TODO: bad design. replace it with something bette
319319
/// </summary>
320320
public void rebuildFreqList(bool readAntennaData = false)
321321
{
322-
if (!isFreqListEditable()) return;
322+
if (!isFreqListEditable())
323+
{
324+
this.strongestFreq = computeStrongestFrequency(this.FrequencyDict);
325+
return;
326+
}
323327

324328
if(readAntennaData)
325329
this.vesselAntennas = this.readAntennaData();
@@ -364,26 +368,23 @@ public void clearFreqList()
364368
/// <summary>
365369
/// Replace one frequency in the particular antenna
366370
/// </summary>
367-
public void updateFrequency(uint GUID, short newFrequency)
371+
public void updateFrequency(CNCAntennaPartInfo partInfo, short newFrequency)
368372
{
369373
if (!Constellation.isFrequencyValid(newFrequency))
370374
{
371375
CNCLog.Error("New frequency {0} is out of the range [0,{1}]!", newFrequency, short.MaxValue);
372376
return;
373377
}
374378

375-
CNCAntennaPartInfo partInfo = this.vesselAntennas.Find(x => x.GUID == GUID);
376379
partInfo.frequency = newFrequency;
377380

378381
if (this.Vessel.loaded)
379382
{
380-
CNConstellationAntennaModule mod = this.Vessel.FindPartModulesImplementing<CNConstellationAntennaModule>().Find(x => x.part.craftID == GUID);
381-
mod.Frequency = newFrequency;
383+
partInfo.partReference.FindModuleImplementing<CNConstellationAntennaModule>().Frequency = newFrequency;
382384
}
383385
else
384386
{
385-
ProtoPartModuleSnapshot cncAntMod = this.vessel.protoVessel.protoPartSnapshots.Find(x => x.partInfo.partPrefab.craftID == GUID).FindModule("CNConstellationAntennaModule");
386-
cncAntMod.moduleValues.SetValue("Frequency", newFrequency);
387+
partInfo.partSnapshotReference.FindModule("CNConstellationAntennaModule").moduleValues.SetValue("Frequency", newFrequency);
387388
}
388389

389390
CNCLog.Debug("Update the antenna of CommNet vessel '{0}' to {1}", this.Vessel.GetName(), newFrequency);
@@ -423,20 +424,17 @@ public void replaceAllFrequencies(short oldFrequency, short newFrequency)
423424
/// <summary>
424425
/// Turn on or off the specific antenna
425426
/// </summary>
426-
public void toggleAntenna(uint GUID, bool inUse)
427+
public void toggleAntenna(CNCAntennaPartInfo partInfo, bool inUse)
427428
{
428-
CNCAntennaPartInfo partInfo = this.vesselAntennas.Find(x => x.GUID == GUID);
429429
partInfo.inUse = inUse;
430430

431431
if (this.Vessel.loaded)
432432
{
433-
CNConstellationAntennaModule mod = this.Vessel.FindPartModulesImplementing<CNConstellationAntennaModule>().Find(x => x.part.craftID == GUID);
434-
mod.InUse = inUse;
433+
partInfo.partReference.FindModuleImplementing<CNConstellationAntennaModule>().InUse = inUse;
435434
}
436435
else
437436
{
438-
ProtoPartModuleSnapshot cncAntMod = this.vessel.protoVessel.protoPartSnapshots.Find(x => x.partInfo.partPrefab.craftID == GUID).FindModule("CNConstellationAntennaModule");
439-
cncAntMod.moduleValues.SetValue("InUse", inUse);
437+
partInfo.partSnapshotReference.FindModule("CNConstellationAntennaModule").moduleValues.SetValue("InUse", inUse);
440438
}
441439

442440
CNCLog.Debug("Set the antenna '{0}' of CommNet vessel '{1}' to {2}", partInfo.name, this.Vessel.GetName(), inUse);

src/CommNetConstellation/UI/VesselMgtTools/AntennaTool.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public override List<DialogGUIBase> getContentComponents()
3636
{
3737
CNCAntennaPartInfo antennaInfo = antennas[i];
3838

39-
DialogGUIToggle toggleBtn = new DialogGUIToggle(antennaInfo.inUse, "", delegate (bool b) { vesselAntennaSelected(b, antennaInfo.GUID); actionCallbacks[0](); }, 20, 32);
39+
DialogGUIToggle toggleBtn = new DialogGUIToggle(antennaInfo.inUse, "", delegate (bool b) { vesselAntennaSelected(b, antennaInfo); actionCallbacks[0](); }, 20, 32);
4040
DialogGUILabel nameLabel = new DialogGUILabel(antennaInfo.name, style); nameLabel.size = new Vector2(160, 32);
4141
DialogGUILabel comPowerLabel = new DialogGUILabel(string.Format("Com power: {0:0.00}", UIUtils.RoundToNearestMetricFactor(antennaInfo.antennaPower)), style); comPowerLabel.size = new Vector2(120, 32);
4242
DialogGUILabel frequencyLabel = new DialogGUILabel(string.Format("(<color={0}>{1}</color>)", UIUtils.colorToHex(Constellation.getColor(antennaInfo.frequency)), antennaInfo.frequency), style); frequencyLabel.size = new Vector2(60, 32);
@@ -58,9 +58,9 @@ public override List<DialogGUIBase> getContentComponents()
5858
return layout;
5959
}
6060

61-
private void vesselAntennaSelected(bool useState, uint antennaGUID)
61+
private void vesselAntennaSelected(bool useState, CNCAntennaPartInfo antenna)
6262
{
63-
cncVessel.toggleAntenna(antennaGUID, useState);
63+
cncVessel.toggleAntenna(antenna, useState);
6464
cncVessel.OnAntennaChange();
6565
}
6666

@@ -70,7 +70,7 @@ private void toggleAllAntennas(bool state)
7070

7171
for (int i = 0; i < allAntennas.Count; i++)
7272
{
73-
cncVessel.toggleAntenna(allAntennas[i].GUID, state);
73+
cncVessel.toggleAntenna(allAntennas[i], state);
7474
}
7575

7676
cncVessel.OnAntennaChange();

src/CommNetConstellation/UI/VesselMgtTools/UpdateListTool.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,14 @@ public override List<DialogGUIBase> getContentComponents()
4343
nameColumn.AddChild(nameLabel2);
4444
descriptionColumn.AddChild(descriptionLabel2);
4545

46+
/*
4647
DialogGUIToggle toggleBtn3 = new DialogGUIToggle((cncVessel.FreqListOperation == FrequencyListOperation.UpdateOnly) ? true : false, "", delegate (bool b) { ListOperationSelected(b, FrequencyListOperation.UpdateOnly); }, 20, 32);
47-
DialogGUILabel nameLabel3 = new DialogGUILabel("Update Only", style); nameLabel3.size = new Vector2(80, 32);
48+
DialogGUILabel nameLabel3 = new DialogGUILabel("Freq Only", style); nameLabel3.size = new Vector2(80, 32);
4849
DialogGUILabel descriptionLabel3 = new DialogGUILabel("Update the affected frequency in the list only (not yet)", style); descriptionLabel3.size = new Vector2(350, 32);
4950
toggleGrp.AddChild(toggleBtn3);
5051
nameColumn.AddChild(nameLabel3);
5152
descriptionColumn.AddChild(descriptionLabel3);
53+
*/
5254

5355
layout.Add(new DialogGUIHorizontalLayout(true, false, 0, new RectOffset(), TextAnchor.MiddleLeft, new DialogGUIBase[] { new DialogGUIVerticalLayout(false, false, 0, new RectOffset(), TextAnchor.MiddleLeft, toggleGrp), nameColumn, descriptionColumn }));
5456

src/CommNetConstellation/UI/VesselMgtTools/VanillaFreqTool.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -99,22 +99,21 @@ private void updateClick()
9999
}
100100

101101
//ALL OK
102-
if (!this.cncVessel.canUpdateFreqList())
102+
if (!this.cncVessel.isFreqListEditable())
103103
{
104-
this.cncVessel.OnAntennaChange();
105104
return;
106105
}
107106

108-
this.antennas = this.cncVessel.getAllAntennaInfo(true);
109-
this.cncVessel.clearFreqList();
107+
//this.antennas = this.cncVessel.getAllAntennaInfo(true); //unnecessary
108+
//this.cncVessel.clearFreqList();
110109

111110
//update all antennas to new freq
112111
for (int i=0; i< this.antennas.Count; i++)
113112
{
114113
CNCAntennaPartInfo thisAntenna = this.antennas[i];
115-
this.cncVessel.toggleAntenna(thisAntenna.GUID, true);
114+
this.cncVessel.toggleAntenna(thisAntenna, true);
116115
if (thisAntenna.frequency != userFreq) // update each antenna to user freq
117-
this.cncVessel.updateFrequency(thisAntenna.GUID, userFreq);
116+
this.cncVessel.updateFrequency(thisAntenna, userFreq);
118117
}
119118
this.cncVessel.rebuildFreqList();
120119

@@ -125,7 +124,7 @@ private void updateClick()
125124
this.cncVessel.addToFreqList(CNCSettings.Instance.PublicRadioFrequency, commPower);
126125
}
127126

128-
actionCallbacks[0]();
127+
actionCallbacks[0]();//TODO: need better way
129128
}
130129
catch (FormatException e)
131130
{

0 commit comments

Comments
 (0)