Example #1
0
        internal static double GetOrbitalPeriod(this Body body, CelestialBody referenceBody)
        {
            if (body?.GeneratedBody?.orbitDriver?.orbit?.semiMajorAxis != null && referenceBody != null)
            {
                body.GeneratedBody.celestialBody.Set("customOrbitalPeriod", 2 * Math.PI * Math.Sqrt(Math.Pow(body.GeneratedBody.orbitDriver.orbit.semiMajorAxis, 3) / 6.67408E-11 / referenceBody.GetMass()));
            }

            return(body.GetOrbitalPeriod());
        }
Example #2
0
        void ProcessBinaries(Loader ldr, ConfigNode cfgn)
        {
            if (ListOfBinaries?.Count > 0)
            {
                Debug.Log("SigmaBinary.ProcessBinaries", "Starting the set up of " + ListOfBinaries?.Count + " binary systems");
            }

            while (ListOfBinaries?.Count > 0)
            {
                /// Loading the Bodies

                Body sbSecondary = ListOfBinaries.First().Value;
                Debug.Log("SigmaBinary.ProcessBinaries", "sbSecondary = " + sbSecondary?.Name);
                Body sbPrimary = OrbitPatcher(sbSecondary);
                Debug.Log("SigmaBinary.ProcessBinaries", "sbPrimary = " + sbPrimary?.Name);
                Body sbBarycenter = ListOfBodies.Find(b0 => b0.GeneratedBody.name == sigmabinarySBName[sbSecondary]);
                Debug.Log("SigmaBinary.ProcessBinaries", "sbBarycenter = " + sbBarycenter?.Name);
                Body sbReference = OrbitPatcher(sbPrimary);
                Debug.Log("SigmaBinary.ProcessBinaries", "sbReference = " + sbReference?.Name);
                Body sbOrbit = ListOfBodies.Find(ob => ob.GeneratedBody.name == sigmabinarySBName[sbSecondary] + "Orbit" && sigmabinaryRedrawOrbit.Contains(sbSecondary));
                Debug.Log("SigmaBinary.ProcessBinaries", "sbOrbit = " + sbOrbit?.Name);

                Debug.Log("SigmaBinary.ProcessBinaries", "Loaded Bodies\nReferenceBody: " + sbReference?.GeneratedBody?.name + "\n   Barycenter: " + sbBarycenter?.GeneratedBody?.name + "\n      Primary: " + sbPrimary?.GeneratedBody?.name + "\n    Secondary: " + sbSecondary?.GeneratedBody?.name + "\n        Orbit: " + sbOrbit?.GeneratedBody?.name);
                Debug.Log("SigmaBinary.ProcessBinaries", "Loaded PSystemBodies\nReferenceBody: " + sbReference?.GeneratedBody?.name + "\n   Barycenter: " + sbBarycenter?.GeneratedBody?.name + "\n      Primary: " + sbPrimary?.GeneratedBody?.name + "\n    Secondary: " + sbSecondary?.GeneratedBody?.name + "\n        Orbit: " + sbOrbit?.GeneratedBody?.name);
                // Check that the bodies exist

                if (sbPrimary == null || sbBarycenter == null || sbReference == null)
                {
                    break;
                }
                if (sbOrbit == null && sigmabinaryRedrawOrbit.Contains(sbSecondary))
                {
                    break;
                }


                // Load the CelestialBodies

                CelestialBody cbSecondary  = sbSecondary?.GeneratedBody?.celestialBody;
                CelestialBody cbPrimary    = sbPrimary?.GeneratedBody?.celestialBody;
                CelestialBody cbBarycenter = sbBarycenter?.GeneratedBody?.celestialBody;
                CelestialBody cbReference  = sbReference?.GeneratedBody?.celestialBody;

                Debug.Log("SigmaBinary.ProcessBinaries", "Loaded CelestialBodies\nReferenceBody: " + cbReference + "\n   Barycenter: " + cbBarycenter + "\n      Primary: " + cbPrimary + "\n    Secondary: " + cbSecondary + "\n        Orbit: " + sbOrbit?.GeneratedBody?.celestialBody);



                /// Generating Binary System

                // Fix sphereOfInfluence where needed
                if (cbPrimary.Has("SBfixSOI"))
                {
                    cbPrimary.sphereOfInfluence = sbPrimary.GeneratedBody.orbitDriver.orbit.semiMajorAxis * Math.Pow(cbPrimary.GetMass() / cbReference.GetMass(), 0.4);
                    cbPrimary.Remove("SBfixSOI");
                    Debug.Log("SigmaBinary.ProcessBinaries", "Fixed 'sphereOfInfluence' of primary " + sbPrimary.GeneratedBody.name + ". sphereOfInfluence = " + cbPrimary.sphereOfInfluence);
                }
                if (cbSecondary.Has("SBfixSOI"))
                {
                    cbSecondary.sphereOfInfluence = sbSecondary.GeneratedBody.orbitDriver.orbit.semiMajorAxis * Math.Pow(cbSecondary.GetMass() / cbPrimary.GetMass(), 0.4);
                    cbSecondary.Remove("SBfixSOI");
                    Debug.Log("SigmaBinary.ProcessBinaries", "Fixed 'sphereOfInfluence' of secondary " + sbSecondary.GeneratedBody.name + ". sphereOfInfluence = " + cbSecondary.sphereOfInfluence);
                }


                // Remove Finalize Orbit

                if (cbSecondary.Has("finalizeBody") && cbSecondary.Get <bool>("finalizeBody"))
                {
                    cbSecondary.Set("finalizeBody", false);
                    Debug.Log("SigmaBinary.ProcessBinaries", "'finalizeBody' turned off for secondary body " + sbSecondary.GeneratedBody.name);
                    // Fix sphereOfInfluence
                    if (!cbSecondary.Has("sphereOfInfluence"))
                    {
                        cbSecondary.Set("sphereOfInfluence", Math.Max(sbSecondary.GeneratedBody.orbitDriver.orbit.semiMajorAxis * Math.Pow(cbSecondary.GetMass() / cbPrimary.GetMass(), 0.4), Math.Max(cbSecondary.Radius * Templates.SOI_MIN_RADIUS_MULTIPLIER, cbSecondary.Radius + Templates.SOI_MIN_ALTITUDE)));
                        Debug.Log("SigmaBinary.ProcessBinaries", "recalculated 'sphereOfInfluence' for secondary body " + sbSecondary.GeneratedBody.name);
                    }
                }
                if (cbPrimary.Has("finalizeBody") && cbPrimary.Get <bool>("finalizeBody"))
                {
                    cbPrimary.Set("finalizeBody", false);
                    Debug.Log("SigmaBinary.ProcessBinaries", "'finalizeBody' turned off for primary body " + sbPrimary.GeneratedBody.name);
                    // Fix sphereOfInfluence
                    if (!cbPrimary.Has("sphereOfInfluence"))
                    {
                        cbPrimary.Set("sphereOfInfluence", Math.Max(sbPrimary.GeneratedBody.orbitDriver.orbit.semiMajorAxis * Math.Pow(cbPrimary.GetMass() / cbReference.GetMass(), 0.4), Math.Max(cbPrimary.Radius * Templates.SOI_MIN_RADIUS_MULTIPLIER, cbPrimary.Radius + Templates.SOI_MIN_ALTITUDE)));
                        Debug.Log("SigmaBinary.ProcessBinaries", "recalculated 'sphereOfInfluence' for primary body " + sbPrimary.GeneratedBody.name);
                    }
                }



                /// Set Barycenter

                sbBarycenter.GeneratedBody.orbitDriver.orbit = new Orbit(sbPrimary.GeneratedBody.orbitDriver.orbit);
                sbBarycenter.Orbit.ReferenceBody             = sbPrimary.Orbit.ReferenceBody;
                cbBarycenter.GeeASL         = (cbPrimary.GetMass() + cbSecondary.GetMass()) / 1e5 * 6.674e-11d / Math.Pow(cbBarycenter.Radius, 2) / 9.80665d;
                cbBarycenter.rotationPeriod = 0;
                Debug.Log("SigmaBinary.SetBarycenter", "Printing orbital parameters of primary " + sbPrimary.GeneratedBody.name + " for reference.");
                Debug.Log("SigmaBinary.SetBarycenter", "referenceBody = " + sbPrimary.Orbit.ReferenceBody + ", semiMajorAxis = " + sbPrimary.GeneratedBody.orbitDriver.orbit.semiMajorAxis + ", period = " + sbPrimary.GetOrbitalPeriod(cbReference));
                Debug.Log("SigmaBinary.SetBarycenter", "Calculated new orbital parameters for barycenter " + sbBarycenter.GeneratedBody.name);
                Debug.Log("SigmaBinary.SetBarycenter", "referenceBody = " + sbBarycenter.Orbit.ReferenceBody + ", semiMajorAxis = " + sbBarycenter.GeneratedBody.orbitDriver.orbit.semiMajorAxis);

                sbBarycenter.GeneratedBody.celestialBody.Set("customOrbitalPeriod", sbPrimary.GetOrbitalPeriod(cbReference));
                Debug.Log("SigmaBinary.SetBarycenter", "Changed orbital period of barycenter " + sbBarycenter?.GeneratedBody?.name + ", new orbital period = " + sbBarycenter.GetOrbitalPeriod());

                // Orbit Color
                if (sigmabinaryOrbitColor.ContainsKey(sbSecondary))
                {
                    sbBarycenter.GeneratedBody.orbitRenderer.SetColor(sigmabinaryOrbitColor[sbSecondary]);
                    Debug.Log("SigmaBinary.SetBarycenter", "Barycenter " + sbBarycenter.GeneratedBody.name + " orbit line color set from list. color = " + sigmabinaryOrbitColor[sbSecondary]);
                }
                else
                {
                    sbBarycenter.GeneratedBody.orbitRenderer.orbitColor = sbPrimary.GeneratedBody.orbitRenderer.orbitColor;
                    Debug.Log("SigmaBinary.SetBarycenter", "Barycenter " + sbBarycenter.GeneratedBody.name + " orbit line color copied from primary " + sbPrimary.GeneratedBody.name + ". color = " + sbPrimary.GeneratedBody.orbitRenderer.orbitColor);
                }

                // Icon Color
                if (sigmabinaryIconColor.ContainsKey(sbSecondary))
                {
                    sbBarycenter.GeneratedBody.orbitRenderer.nodeColor = sigmabinaryIconColor[sbSecondary];
                    Debug.Log("SigmaBinary.SetBarycenter", "Barycenter " + sbBarycenter.GeneratedBody.name + " orbit icon color set from list. color = " + sigmabinaryIconColor[sbSecondary]);
                }
                else if (!sigmabinaryOrbitColor.ContainsKey(sbSecondary))
                {
                    sbBarycenter.GeneratedBody.orbitRenderer.nodeColor = sbPrimary.GeneratedBody.orbitRenderer.nodeColor;
                    Debug.Log("SigmaBinary.SetBarycenter", "Barycenter " + sbBarycenter.GeneratedBody.name + " orbit icon color copied from primary " + sbPrimary.GeneratedBody.name + ". color = " + sbPrimary.GeneratedBody.orbitRenderer.nodeColor);
                }

                // Description
                if (sigmabinaryDescription.ContainsKey(sbSecondary))
                {
                    cbBarycenter.bodyDescription = sigmabinaryDescription[sbSecondary].Replace("<name>", nameof(sbBarycenter)).Replace("<primary>", nameof(sbPrimary)).Replace("<secondary>", nameof(sbSecondary));
                    Debug.Log("SigmaBinary.SetBarycenter", "Barycenter " + sbBarycenter.GeneratedBody.name + " description loaded.");
                }
                Debug.Log("SigmaBinary.SetBarycenter", "description = " + cbBarycenter.bodyDescription);

                // DrawMode and DrawIcons
                if (sigmabinaryMode.ContainsKey(sbSecondary))
                {
                    cbBarycenter.Set("drawMode", sigmabinaryMode[sbSecondary]);
                    Debug.Log("SigmaBinary.SetBarycenter", "Barycenter " + sbBarycenter.GeneratedBody.name + " custom orbit 'drawMode' loaded. drawMode = " + sigmabinaryMode[sbSecondary].Value);
                }
                else if (cbPrimary.Has("drawMode"))
                {
                    cbBarycenter.Set("drawMode", cbPrimary.Get <DrawMode>("drawMode"));
                    Debug.Log("SigmaBinary.SetBarycenter", "Barycenter " + sbBarycenter.GeneratedBody.name + " orbit 'drawMode' copied from primary " + sbPrimary.GeneratedBody.name + ". drawMode = " + cbPrimary.Get <DrawMode>("drawMode"));
                    cbPrimary.Set("drawMode", DrawMode.REDRAW_AND_RECALCULATE);
                    Debug.Log("SigmaBinary.SetBarycenter", "Primary " + sbPrimary.GeneratedBody.name + " orbit 'drawMode' automatically set. drawMode = " + DrawMode.REDRAW_AND_RECALCULATE);
                }
                if (sigmabinaryIcon.ContainsKey(sbSecondary))
                {
                    cbPrimary.Set("drawIcons", sigmabinaryIcon[sbSecondary]);
                    Debug.Log("SigmaBinary.SetBarycenter", "Primary " + sbPrimary.GeneratedBody.name + " custom orbit 'drawIcons' loaded. drawIcons = " + sigmabinaryIcon[sbSecondary].Value);
                }
                else if (cbPrimary.Has("drawIcons"))
                {
                    cbBarycenter.Set("drawIcons", cbPrimary.Get <DrawIcons>("drawIcons"));
                    Debug.Log("SigmaBinary.SetBarycenter", "Barycenter " + sbBarycenter.GeneratedBody.name + " orbit 'drawIcons' copied from primary " + sbPrimary.GeneratedBody.name + ". drawIcons = " + cbPrimary.Get <DrawIcons>("drawIcons"));
                    cbPrimary.Set("drawIcons", DrawIcons.ALL);
                    Debug.Log("SigmaBinary.SetBarycenter", "Primary " + sbPrimary.GeneratedBody.name + " orbit 'drawIcons' automatically set. drawIcons = " + DrawIcons.ALL);
                }



                /// Set Primary

                if (sbPrimary.Template.OriginalBody.celestialBody.name == "Kerbin")
                {
                    Debug.Log("SigmaBinary.SetPrimary", "Primary " + sbPrimary.GeneratedBody.name + " uses Kerbin as Template.");
                    if (!kerbinFixer.ContainsKey(sbPrimary.GeneratedBody.name))
                    {
                        kerbinFixer.Add(sbPrimary.GeneratedBody.name, sbReference.GeneratedBody.name);
                        Debug.Log("SigmaBinary.SetPrimary", "Stored patched 'referenceBody' " + cbReference + " of Primary " + sbPrimary.GeneratedBody.name + " in 'kerbinFixer'.");
                    }
                    if (!archivesFixerList.ContainsKey(sbPrimary.GeneratedBody))
                    {
                        archivesFixerList.Add(sbPrimary.GeneratedBody, sbBarycenter.GeneratedBody);
                        Debug.Log("SigmaBinary.SetPrimary", "Stored primary " + sbPrimary.GeneratedBody.name + " and barycenter " + sbBarycenter.GeneratedBody.name + " in 'archivesFixerList'.");
                    }
                }
                sbPrimary.GeneratedBody.orbitDriver.orbit =
                    new Orbit
                    (
                        sbSecondary.GeneratedBody.orbitDriver.orbit.inclination,
                        sbSecondary.GeneratedBody.orbitDriver.orbit.eccentricity,
                        sbSecondary.GeneratedBody.orbitDriver.orbit.semiMajorAxis * cbSecondary.GetMass() / (cbSecondary.GetMass() + cbPrimary.GetMass()),
                        sbSecondary.GeneratedBody.orbitDriver.orbit.LAN,
                        sbSecondary.GeneratedBody.orbitDriver.orbit.argumentOfPeriapsis + 180d,
                        sbSecondary.GeneratedBody.orbitDriver.orbit.meanAnomalyAtEpoch,
                        sbSecondary.GeneratedBody.orbitDriver.orbit.epoch,
                        cbBarycenter
                    );
                sbPrimary.Orbit.ReferenceBody = sbBarycenter.GeneratedBody.name;
                Debug.Log("SigmaBinary.SetPrimary", "Printing masses of bodies for reference. primary = " + cbPrimary.GetMass() + ", secondary = " + cbSecondary.GetMass() + ", ratio = " + (cbPrimary.GetMass() / cbSecondary.GetMass()));
                Debug.Log("SigmaBinary.SetPrimary", "Printing orbital parameters of secondary " + sbSecondary.GeneratedBody.name + " for reference.");
                Debug.Log("SigmaBinary.SetPrimary", "referenceBody = " + sbSecondary.Orbit.ReferenceBody + ", semiMajorAxis = " + sbSecondary.GeneratedBody.orbitDriver.orbit.semiMajorAxis);
                Debug.Log("SigmaBinary.SetPrimary", "Calculated new orbital parameters for primary " + sbPrimary.GeneratedBody.name);
                Debug.Log("SigmaBinary.SetPrimary", "referenceBody = " + sbPrimary.Orbit.ReferenceBody + ", semiMajorAxis = " + sbPrimary.GeneratedBody.orbitDriver.orbit.semiMajorAxis + ", ratio = " + (sbSecondary.GeneratedBody.orbitDriver.orbit.semiMajorAxis / sbPrimary.GeneratedBody.orbitDriver.orbit.semiMajorAxis));

                sbPrimary.GeneratedBody.celestialBody.Set("customOrbitalPeriod", sbSecondary.GetOrbitalPeriod(cbPrimary));
                Debug.Log("SigmaBinary.SetPrimary", "New Orbital Period for Primary " + sbPrimary.GeneratedBody.name + " = " + sbPrimary.GetOrbitalPeriod());

                // Primary Locked
                if (cbPrimary.solarRotationPeriod)
                {
                    cbPrimary.solarRotationPeriod = false;
                    cbPrimary.rotationPeriod      = (sbBarycenter.GetOrbitalPeriod() * cbPrimary.rotationPeriod) / (sbBarycenter.GetOrbitalPeriod() + cbPrimary.rotationPeriod);
                    Debug.Log("SigmaBinary.SetPrimary", "Primary " + sbPrimary.GeneratedBody.name + " 'solarRotationPeriod' set to 'false'. recalculated rotation period = " + cbPrimary.rotationPeriod);
                }
                if (sigmabinaryPrimaryLocked.Contains(sbSecondary))
                {
                    cbPrimary.solarRotationPeriod = false;
                    cbPrimary.rotationPeriod      = sbPrimary.GetOrbitalPeriod();
                    Debug.Log("SigmaBinary.SetPrimary", "Primary " + sbPrimary.GeneratedBody.name + " is locked to reference " + sbReference.GeneratedBody.name + ".");
                    Debug.Log("SigmaBinary.SetPrimary", "Primary " + sbPrimary.GeneratedBody.name + " 'solarRotationPeriod' set to 'false'. recalculated rotation period = " + cbPrimary.rotationPeriod);
                }



                /// Set Secondary Orbit

                if (sigmabinaryRedrawOrbit.Contains(sbSecondary))
                {
                    if (sbOrbit?.GeneratedBody?.celestialBody != null && !trackingStationFixer.Contains(sbOrbit.GeneratedBody.celestialBody))
                    {
                        trackingStationFixer.Add(sbOrbit.GeneratedBody.celestialBody);
                    }

                    mapViewFixerList.Add(sbOrbit.GeneratedBody.celestialBody, cbSecondary);

                    sbOrbit.GeneratedBody.orbitDriver.orbit =
                        new Orbit
                        (
                            sbSecondary.GeneratedBody.orbitDriver.orbit.inclination,
                            sbSecondary.GeneratedBody.orbitDriver.orbit.eccentricity,
                            sbSecondary.GeneratedBody.orbitDriver.orbit.semiMajorAxis - sbPrimary.GeneratedBody.orbitDriver.orbit.semiMajorAxis,
                            sbSecondary.GeneratedBody.orbitDriver.orbit.LAN,
                            sbSecondary.GeneratedBody.orbitDriver.orbit.argumentOfPeriapsis,
                            sbSecondary.GeneratedBody.orbitDriver.orbit.meanAnomalyAtEpoch,
                            sbSecondary.GeneratedBody.orbitDriver.orbit.epoch,
                            cbBarycenter
                        );
                    sbOrbit.Orbit.ReferenceBody = sbBarycenter.GeneratedBody.name;
                    Debug.Log("SigmaBinary.SetMarker", "Printing orbital parameters of primary " + sbPrimary.GeneratedBody.name + " for reference.");
                    Debug.Log("SigmaBinary.SetMarker", "referenceBody = " + sbPrimary.Orbit.ReferenceBody + ", semiMajorAxis = " + sbPrimary.GeneratedBody.orbitDriver.orbit.semiMajorAxis);
                    Debug.Log("SigmaBinary.SetMarker", "Printing orbital parameters of secondary " + sbSecondary.GeneratedBody.name + " for reference.");
                    Debug.Log("SigmaBinary.SetMarker", "referenceBody = " + sbSecondary.Orbit.ReferenceBody + ", semiMajorAxis = " + sbSecondary.GeneratedBody.orbitDriver.orbit.semiMajorAxis);
                    Debug.Log("SigmaBinary.SetMarker", "Calculated new orbital parameters for orbit marker " + sbOrbit.GeneratedBody.name);
                    Debug.Log("SigmaBinary.SetMarker", "referenceBody = " + sbOrbit.Orbit.ReferenceBody + ", semiMajorAxis = " + sbOrbit.GeneratedBody.orbitDriver.orbit.semiMajorAxis);

                    sbOrbit.GeneratedBody.orbitRenderer.orbitColor = sbSecondary.GeneratedBody.orbitRenderer.orbitColor;
                    Debug.Log("SigmaBinary.SetMarker", "Orbit marker " + sbOrbit.GeneratedBody.name + " orbit line color set from secondary " + sbSecondary.GeneratedBody.name + ". color = " + sbOrbit.GeneratedBody.orbitRenderer.orbitColor);

                    sbOrbit.GeneratedBody.celestialBody.Set("customOrbitalPeriod", sbSecondary.GetOrbitalPeriod(cbPrimary));
                    Debug.Log("SigmaBinary.SetMarker", "Orbit marker " + sbOrbit.GeneratedBody.name + " orbital period = " + sbOrbit.GetOrbitalPeriod());

                    cbSecondary.Set("drawMode", DrawMode.OFF);
                    Debug.Log("SigmaBinary.SetMarker", "Secondary " + sbSecondary.GeneratedBody.name + " orbit 'drawMode' automatically set. drawMode = " + DrawMode.OFF);
                }



                /// Set SphereOfInfluence for Barycenter and Primary

                if (!cbPrimary.Has("sphereOfInfluence"))
                {
                    cbPrimary.Set("sphereOfInfluence", sbBarycenter.GeneratedBody.orbitDriver.orbit.semiMajorAxis * Math.Pow(cbPrimary.GetMass() / cbReference.GetMass(), 0.4));
                    Debug.Log("SigmaBinary.SetSoI", "Calculated 'sphereOfInfluence' for primary " + sbPrimary.GeneratedBody.name + ". sphereOfInfluence = " + cbPrimary.Get <double>("sphereOfInfluence"));
                }
                cbBarycenter.Set("sphereOfInfluence", cbPrimary.Get <double>("sphereOfInfluence"));
                Debug.Log("SigmaBinary.SetSoI", "Set barycenter " + sbBarycenter.GeneratedBody.name + " 'sphereOfInfluence' from primary " + sbPrimary.GeneratedBody.name + ". sphereOfInfluence = " + cbPrimary.Get <double>("sphereOfInfluence"));
                cbPrimary.Set("sphereOfInfluence", sbPrimary.GeneratedBody.orbitDriver.orbit.semiMajorAxis * (sbBarycenter.GeneratedBody.orbitDriver.orbit.eccentricity + 1) + cbBarycenter.Get <double>("sphereOfInfluence"));
                Debug.Log("SigmaBinary.SetSoI", "Recalculated 'sphereOfInfluence' for primary " + sbPrimary.GeneratedBody.name + ". sphereOfInfluence = " + cbPrimary.Get <double>("sphereOfInfluence"));



                /// Final Fixes for Bodies with a Kerbin Template

                // If the primary has a Kerbin Template, bypass PostSpawnOrbit
                if (kerbinFixer.ContainsKey(sbPrimary.GeneratedBody.name))
                {
                    Debug.Log("SigmaBinary.FixKerbinTemplate", "Primary " + sbPrimary.GeneratedBody.name + " uses Kerbin as Template.");

                    // Revert the referenceBody to the original one
                    sbPrimary.Orbit.ReferenceBody = kerbinFixer[sbPrimary.GeneratedBody.name];
                    Debug.Log("SigmaBinary.FixKerbinTemplate", "Primary " + sbPrimary.GeneratedBody.name + " 'referenceBody' reverted to the original. referenceBody = " + sbPrimary.Orbit.ReferenceBody);

                    // Save the PostSpawn referenceBody for later
                    kerbinFixer[sbPrimary.GeneratedBody.name] = sbBarycenter.GeneratedBody.name;
                    Debug.Log("SigmaBinary.FixKerbinTemplate", "kerbinFixer[cbPrimary] set to barycenter " + sbBarycenter.GeneratedBody.name);

                    // Clear PostSpawnOrbit
                    if (sbPrimary.GeneratedBody.Has("orbitPatches"))
                    {
                        sbPrimary.GeneratedBody.Remove("orbitPatches");
                        Debug.Log("SigmaBinary.FixKerbinTemplate", "Primary " + sbPrimary.GeneratedBody.name + " 'PostSpawnOrbit' node removed, 'kerbinFixer' will handle this.");
                    }
                }

                // If the secondary has a Kerbin Template, restore PostSpawnOrbit referenceBody
                if (kerbinFixer.ContainsKey(sbSecondary.GeneratedBody.name))
                {
                    Debug.Log("SigmaBinary.FixKerbinTemplate", "Secondary " + sbSecondary.GeneratedBody.name + " uses Kerbin as Template.");
                    sbSecondary.Orbit.ReferenceBody = kerbinFixer[sbSecondary.GeneratedBody.name];
                    Debug.Log("SigmaBinary.FixKerbinTemplate", "Secondary " + sbSecondary.GeneratedBody.name + " 'referenceBody' reverted to the original. referenceBody = " + sbSecondary.Orbit.ReferenceBody);
                    kerbinFixer.Remove(sbSecondary.GeneratedBody.name);
                    Debug.Log("SigmaBinary.FixKerbinTemplate", "Secondary " + sbSecondary.GeneratedBody.name + " removed from 'kerbinFixer', 'PostSpawnOrbit' will handle this.");
                }



                /// Binary System Completed

                ListOfBinaries.Remove(ListOfBinaries.First().Key);
                Debug.Log("SigmaBinary.PostApply", "Binary system with secondary " + sbSecondary.GeneratedBody.name + " removed from 'ListOfBinaries'.");

                // Easter Eggs
                LateFixes.TextureFixer(sbPrimary, sbSecondary, ListOfBodies);

                // Log
                UnityEngine.Debug.Log("[SigmaLog]: Binary System Completed\nReferenceBody: " + sbReference.GeneratedBody.name + "\n   Barycenter: " + sbBarycenter.GeneratedBody.name + "\n      Primary: " + sbPrimary.GeneratedBody.name + "\n    Secondary: " + sbSecondary.GeneratedBody.name + (Debug.debug ? "\n        Orbit: " + sbOrbit?.GeneratedBody?.name : ""));
            }
            Debug.Log("SigmaBinary.ProcessBinaries", "Completed the set up of all binary systems.");
        }