public static environment_data analyze_environment(CelestialBody body, double altitude_mult) { // shortcuts CelestialBody sun = Sim.Sun(); // calculate data environment_data env = new environment_data(); env.body = body; env.altitude = body.Radius * altitude_mult; env.landed = env.altitude <= double.Epsilon; env.breathable = env.landed && body.atmosphereContainsOxygen; env.sun_dist = Sim.Apoapsis(Lib.PlanetarySystem(body)) - sun.Radius - body.Radius; Vector3d sun_dir = (sun.position - body.position).normalized; env.sun_flux = Sim.SolarFlux(env.sun_dist); env.body_flux = Sim.BodyFlux(body, body.position + sun_dir * (body.Radius + env.altitude)); env.body_back_flux = Sim.BodyFlux(body, body.position - sun_dir * (body.Radius + env.altitude)); env.background_temp = Sim.BackgroundTemperature(); env.sun_temp = Sim.BlackBody(env.sun_flux); env.body_temp = Sim.BlackBody(env.body_flux); env.body_back_temp = Sim.BlackBody(env.body_back_flux); env.light_temp = env.background_temp + env.sun_temp + env.body_temp; env.shadow_temp = env.background_temp + env.body_back_temp; env.atmo_temp = body.GetTemperature(0.0); env.orbital_period = Sim.OrbitalPeriod(body, env.altitude); env.shadow_period = Sim.ShadowPeriod(body, env.altitude); env.shadow_time = env.shadow_period / env.orbital_period; env.temp_diff = env.landed && body.atmosphere ? Math.Abs(Settings.SurvivalTemperature - env.atmo_temp) : Lib.Mix(Math.Abs(Settings.SurvivalTemperature - env.light_temp), Math.Abs(Settings.SurvivalTemperature - env.shadow_temp), env.shadow_time); env.atmo_factor = env.landed ? Sim.AtmosphereFactor(body, 0.7071) : 1.0; // return data return env; }