private void SplitNode(List <double> list, bool fix) { if (IsSolverAvailable() && Solver.maneuverNodes.Count > 0) { ManeuverNode originalNode = Solver.maneuverNodes[0]; Maneuver original = new Maneuver(originalNode); double originalPeriod = originalNode.patch.period; double originalMagnitude = original.DeltaV.magnitude; int nodeCount = list.Count; double splitDv = 0; ManeuverNode node = originalNode; for (int index = 0; index < list.Count; index += 1) { LogNode("Before " + index, node); AdjustNode(originalNode, original, originalPeriod, originalMagnitude, node, list[index], splitDv); LogNode("After " + index, node); if (node.nextPatch.patchEndTransition == Orbit.PatchTransitionType.ESCAPE) { ScreenMessages.PostScreenMessage("Input values cause ejection in fewer burns than specified!", 8f, ScreenMessageStyle.UPPER_CENTER); Debug.Log(string.Format("Early ejection at index {0}", index)); break; } else if (node.nextPatch.patchEndTransition == Orbit.PatchTransitionType.ENCOUNTER) { ScreenMessages.PostScreenMessage("Encounter detected! Unable to split the maneuver as specified!", 8f, ScreenMessageStyle.UPPER_CENTER); Debug.Log(string.Format("Encounter at index {0}", index)); break; } splitDv += node.DeltaV.magnitude; node = Solver.AddManeuverNode(node.UT + node.nextPatch.period); } if (supportsRepeat && repeat) { double limit = double.Parse(repeatLimit) * 1000; double value = list[list.Count - 1]; while (node.nextPatch.ApA < limit) { LogNode("Before", node); AdjustNode(originalNode, original, originalPeriod, originalMagnitude, node, value, splitDv); LogNode("After", node); if (node.nextPatch.ApA < limit) { nodeCount += 1; splitDv += node.DeltaV.magnitude; node = Solver.AddManeuverNode(node.UT + node.nextPatch.period); } } } if (fix) { // TBD } else { Vector3d dv = original.DeltaV * ((originalMagnitude - splitDv) / originalMagnitude); RotateDeltaV(originalNode, node, ref dv); node.DeltaV = dv; node.solver.UpdateFlightPlan(); LogNode("Final", node); double timeDifference = node.UT - original.UT; double orbitsToReverse = Math.Ceiling(timeDifference / originalPeriod); DebugLog("UT: {0} time diff: {1} orbits to reverse: {2}", Planetarium.GetUniversalTime(), timeDifference, orbitsToReverse); while (orbitsToReverse > 0 && original.UT - orbitsToReverse * originalPeriod < Planetarium.GetUniversalTime()) { orbitsToReverse -= 1; } DebugLog("Reversing {0} orbits", orbitsToReverse); if (orbitsToReverse > 0) { double timeToReverse = orbitsToReverse * originalPeriod; for (int index = 0; index <= nodeCount; index += 1) { ManeuverNode mn = Solver.maneuverNodes[index]; Debug.Log(string.Format("Moving node {0} ({1}) back {2} from {3}", index, mn.DeltaV.magnitude, timeToReverse, mn.UT)); mn.UT -= timeToReverse; mn.solver.UpdateFlightPlan(); } } double dt = original.UT - node.UT; if (dt < 0) { dt = dt * -1; ScreenMessages.PostScreenMessage( string.Format("Final ejection will happen {0} later than originally planned", DurationToDisplayString(dt)), 8f, ScreenMessageStyle.UPPER_CENTER); } else { ScreenMessages.PostScreenMessage( string.Format("Final ejection will happen {0} earlier than originally planned", DurationToDisplayString(dt)), 8f, ScreenMessageStyle.UPPER_CENTER); } } Debug.Log("Done!"); } }