public override ContractParameter Generate(Contract contract) { // Get the OrbitGenerator behaviour OrbitGenerator orbitGenerator = ((ConfiguredContract)contract).Behaviours.OfType <OrbitGenerator>().First <OrbitGenerator>(); if (orbitGenerator == null) { LoggingUtil.LogError(this, "Could not find OrbitGenerator BEHAVIOUR to couple with ReachSpecificOrbit PARAMETER."); return(null); } // Get the parameter for that orbit try { SpecificOrbitWrapper s = orbitGenerator.GetOrbitParameter(index); if (deviationWindow != 0.0) { s.deviationWindow = deviationWindow; } return(new VesselParameterDelegator(s)); } catch (Exception e) { LoggingUtil.LogError(this, "Couldn't find orbit in OrbitGenerator with index " + index + ": " + e.Message); return(null); } }
/* * Copy constructor. */ public OrbitGenerator(OrbitGenerator orig, Contract contract) : base() { foreach (OrbitData old in orig.orbits) { // Copy orbit data orbits.Add(new OrbitData(old, contract)); } System.Random random = new System.Random(contract.MissionSeed); // Find/add the AlwaysTrue parameter AlwaysTrue alwaysTrue = AlwaysTrue.FetchOrAdd(contract); int i = 0; foreach (OrbitData obData in orbits) { // Do type specific handling if (obData.type == "RANDOM_ORBIT") { obData.orbit = CelestialUtilities.GenerateOrbit(obData.orbitType, contract.MissionSeed + i++, obData.orbit.referenceBody, obData.difficulty); } // Create the wrapper to the SpecificOrbit parameter that will do the rendering work SpecificOrbitWrapper s = new SpecificOrbitWrapper(obData.orbitType, obData.orbit.inclination, obData.orbit.eccentricity, obData.orbit.semiMajorAxis, obData.orbit.LAN, obData.orbit.argumentOfPeriapsis, obData.orbit.meanAnomalyAtEpoch, obData.orbit.epoch, obData.orbit.referenceBody, obData.difficulty, 3.0); s.DisableOnStateChange = false; alwaysTrue.AddParameter(s); obData.index = alwaysTrue.ParameterCount - 1; } }