Replaced a couple more foreach loops with for
--- a/KerbalEngineer/Editor/BuildAdvanced.cs
+++ b/KerbalEngineer/Editor/BuildAdvanced.cs
@@ -528,6 +528,11 @@
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
+ GUILayout.Label("Verbose Simulation Log:");
+ SimManager.logOutput = GUILayout.Toggle(SimManager.logOutput, "ENABLED", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
+ GUILayout.EndHorizontal();
+
+ GUILayout.BeginHorizontal();
GUILayout.Label("Build Engineer Overlay:", settingStyle);
BuildOverlay.Visible = GUILayout.Toggle(BuildOverlay.Visible, "VISIBLE", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
BuildOverlayPartInfo.NamesOnly = GUILayout.Toggle(BuildOverlayPartInfo.NamesOnly, "NAMES ONLY", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
--- a/KerbalEngineer/VesselSimulator/PartSim.cs
+++ b/KerbalEngineer/VesselSimulator/PartSim.cs
@@ -360,8 +360,9 @@
buffer.AppendFormat(", isSep = {0}", isSepratron);
- foreach (int type in resources.Types)
- {
+ for (int i = 0; i < resources.Types.Count; i++)
+ {
+ int type = resources.Types[i];
buffer.AppendFormat(", {0} = {1:g6}", ResourceContainer.GetResourceName(type), resources[type]);
}
@@ -384,8 +385,9 @@
if (allParts != null)
{
String newPrefix = prefix + " ";
- foreach (PartSim partSim in allParts)
- {
+ for (int i = 0; i < allParts.Count; i++)
+ {
+ PartSim partSim = allParts[i];
if (partSim.parent == this)
{
partSim.DumpPartToBuffer(buffer, newPrefix, allParts);
@@ -398,7 +400,7 @@
{
foreach (int type in types)
{
- if (resources.HasType(type) && resourceFlowStates[type] != 0 && resources[type] > SimManager.RESOURCE_MIN)
+ if (resources.HasType(type) && resourceFlowStates[type] != 0 && resources[type] > SimManager.RESOURCE_PART_EMPTY_THRESH)
{
return false;
}
@@ -444,47 +446,46 @@
if (visited.Contains(this))
{
if (log != null)
- {
log.buf.AppendLine(indent + "Returning empty set, already visited (" + name + ":" + partId + ")");
- }
return;
}
- //if (log != null)
- // log.buf.AppendLine(indent + "Adding this to visited");
+ if (log != null)
+ log.buf.AppendLine(indent + "Adding this to visited");
visited.Add(this);
// Rule 2: Part performs scan on start of every fuel pipe ending in it. This scan is done in order in which pipes were installed.
// Then it makes an union of fuel tank sets each pipe scan returned. If the resulting list is not empty, it is returned as result.
- //MonoBehaviour.print("foreach fuel line");
+ //MonoBehaviour.print("for each fuel line");
int lastCount = allSources.Count;
for (int i = 0; i < this.fuelTargets.Count; i++)
{
PartSim partSim = this.fuelTargets[i];
- if (visited.Contains(partSim))
- {
- //if (log != null)
- // log.buf.AppendLine(indent + "Fuel target already visited, skipping (" + partSim.name + ":" + partSim.partId + ")");
- }
- else
- {
- //if (log != null)
- // log.buf.AppendLine(indent + "Adding fuel target as source (" + partSim.name + ":" + partSim.partId + ")");
-
- partSim.GetSourceSet(type, allParts, visited, allSources, log, indent);
+ if (partSim != null)
+ {
+ if (visited.Contains(partSim))
+ {
+ if (log != null)
+ log.buf.AppendLine(indent + "Fuel target already visited, skipping (" + partSim.name + ":" + partSim.partId + ")");
+ }
+ else
+ {
+ if (log != null)
+ log.buf.AppendLine(indent + "Adding fuel target as source (" + partSim.name + ":" + partSim.partId + ")");
+
+ partSim.GetSourceSet(type, allParts, visited, allSources, log, indent);
+ }
}
}
if (allSources.Count > lastCount)
{
if (log != null)
- {
log.buf.AppendLine(indent + "Returning " + (allSources.Count - lastCount) + " fuel target sources (" + this.name + ":" + this.partId + ")");
- }
return;
}
@@ -500,7 +501,7 @@
if (fuelCrossFeed)
{
lastCount = allSources.Count;
- //MonoBehaviour.print("foreach attach node");
+ //MonoBehaviour.print("for each attach node");
for (int i = 0; i < this.attachNodes.Count; i++)
{
AttachNodeSim attachSim = this.attachNodes[i];
@@ -514,13 +515,13 @@
{
if (visited.Contains(attachSim.attachedPartSim))
{
- //if (log != null)
- // log.buf.AppendLine(indent + "Attached part already visited, skipping (" + attachSim.attachedPartSim.name + ":" + attachSim.attachedPartSim.partId + ")");
+ if (log != null)
+ log.buf.AppendLine(indent + "Attached part already visited, skipping (" + attachSim.attachedPartSim.name + ":" + attachSim.attachedPartSim.partId + ")");
}
else
{
- //if (log != null)
- // log.buf.AppendLine(indent + "Adding attached part as source (" + attachSim.attachedPartSim.name + ":" + attachSim.attachedPartSim.partId + ")");
+ if (log != null)
+ log.buf.AppendLine(indent + "Adding attached part as source (" + attachSim.attachedPartSim.name + ":" + attachSim.attachedPartSim.partId + ")");
attachSim.attachedPartSim.GetSourceSet(type, allParts, visited, allSources, log, indent);
}
@@ -532,9 +533,7 @@
if (allSources.Count > lastCount)
{
if (log != null)
- {
log.buf.AppendLine(indent + "Returning " + (allSources.Count - lastCount) + " attached sources (" + this.name + ":" + this.partId + ")");
- }
return;
}
@@ -551,12 +550,15 @@
allSources.Add(this);
if (log != null)
- {
log.buf.AppendLine(indent + "Returning enabled tank as only source (" + name + ":" + partId + ")");
- }
}
return;
+ }
+ else
+ {
+ if (log != null)
+ log.buf.AppendLine(indent + "Not fuel tank or disabled. HasType = " + resources.HasType(type) + " FlowState = " + resourceFlowStates[type]);
}
// Rule 7: If the part is radially attached to another part and it is child of that part in the ship's tree structure, it scans its
@@ -567,8 +569,8 @@
{
if (visited.Contains(parent))
{
- //if (log != null)
- // log.buf.AppendLine(indent + "Parent part already visited, skipping (" + parent.name + ":" + parent.partId + ")");
+ if (log != null)
+ log.buf.AppendLine(indent + "Parent part already visited, skipping (" + parent.name + ":" + parent.partId + ")");
}
else
{
@@ -577,9 +579,7 @@
if (allSources.Count > lastCount)
{
if (log != null)
- {
log.buf.AppendLine(indent + "Returning " + (allSources.Count - lastCount) + " parent sources (" + this.name + ":" + this.partId + ")");
- }
return;
}
@@ -588,8 +588,8 @@
}
// Rule 8: If all preceding rules failed, part returns empty list.
- //if (log != null)
- // log.buf.AppendLine(indent + "Returning empty set, no sources found (" + name + ":" + partId + ")");
+ if (log != null)
+ log.buf.AppendLine(indent + "Returning empty set, no sources found (" + name + ":" + partId + ")");
return;
}
@@ -609,6 +609,17 @@
if (partSims.Contains(attachSim.attachedPartSim))
{
attachSim.attachedPartSim = null;
+ }
+ }
+
+ // Loop through the fuel targets (fuel line sources)
+ for (int i = 0; i < this.fuelTargets.Count; i++)
+ {
+ PartSim fuelTargetSim = this.fuelTargets[i];
+ // If the part is in the set then "remove" it by clearing the PartSim reference
+ if (fuelTargetSim != null && partSims.Contains(fuelTargetSim))
+ {
+ this.fuelTargets[i] = null;
}
}
}
--- a/KerbalEngineer/VesselSimulator/SimManager.cs
+++ b/KerbalEngineer/VesselSimulator/SimManager.cs
@@ -35,6 +35,7 @@
#region Constants
public const double RESOURCE_MIN = 0.0001;
+ public const double RESOURCE_PART_EMPTY_THRESH = 0.01;
#endregion