/// <summary> /// Creates an test system with planets of varying longitude of periapsis. /// Adds to game.StarSystem. /// </summary> public StarSystem CreateLongitudeTest(Game game) { StarSystem system = new StarSystem(game, "Longitude test", -1); Entity sun = _starFactory.CreateStar(system, GameConstants.Units.SolarMassInKG, GameConstants.Units.SolarRadiusInAu, 4.6E9, "G", 5778, 1, SpectralType.G, "_lop"); MassVolumeDB sunMVDB = sun.GetDataBlob <MassVolumeDB>(); double planetSemiMajAxis = 0.387098; double planetEccentricity = 0.9;// 0.205630; double planetInclination = 0; double planetLoAN = 48.33167; double planetLoP = 77.45645; double planetMeanLongd = 252.25084; for (int i = 0; i < 13; i++) { NameDB planetNameDB = new NameDB("planet" + i); SystemBodyInfoDB planetBodyDB = new SystemBodyInfoDB { BodyType = BodyType.Terrestrial, SupportsPopulations = true }; MassVolumeDB planetMVDB = MassVolumeDB.NewFromMassAndRadius(3.3022E23, Distance.KmToAU(2439.7)); PositionDB planetPositionDB = new PositionDB(system.Guid); planetLoP = i * 15; OrbitDB planetOrbitDB = OrbitDB.FromMajorPlanetFormat(sun, sunMVDB.Mass, planetMVDB.Mass, planetSemiMajAxis, planetEccentricity, planetInclination, planetLoAN, planetLoP, planetMeanLongd, GalaxyGen.Settings.J2000); planetPositionDB.AbsolutePosition_AU = OrbitProcessor.GetPosition_AU(planetOrbitDB, StaticRefLib.CurrentDateTime); Entity planet = new Entity(system, new List <BaseDataBlob> { planetPositionDB, planetBodyDB, planetMVDB, planetNameDB, planetOrbitDB }); } game.GameMasterFaction.GetDataBlob <FactionInfoDB>().KnownSystems.Add(system.Guid); return(system); }
/// <summary> /// Calculates distance/s on an orbit by calculating positions now and second in the future. /// Fairly slow and inefficent. /// </summary> /// <returns>the distance traveled in a second</returns> /// <param name="orbit">Orbit.</param> /// <param name="atDatetime">At datetime.</param> public static double Hackspeed(OrbitDB orbit, DateTime atDatetime) { var pos1 = OrbitProcessor.GetPosition_AU(orbit, atDatetime); var pos2 = OrbitProcessor.GetPosition_AU(orbit, atDatetime + TimeSpan.FromSeconds(1)); return(Distance.DistanceBetween(pos1, pos2)); }
public static Vector3 HackVelocityVector(OrbitDB orbit, DateTime atDatetime) { var pos1 = OrbitProcessor.GetPosition_AU(orbit, atDatetime); var pos2 = OrbitProcessor.GetPosition_AU(orbit, atDatetime + TimeSpan.FromSeconds(1)); //double speed = Distance.DistanceBetween(pos1, pos2); return(pos2 - pos1); }
public static double HackVelocityHeading(OrbitDB orbit, DateTime atDatetime) { var pos1 = OrbitProcessor.GetPosition_AU(orbit, atDatetime); var pos2 = OrbitProcessor.GetPosition_AU(orbit, atDatetime + TimeSpan.FromSeconds(1)); Vector3 vector = pos2 - pos1; double heading = Math.Atan2(vector.Y, vector.X); return(heading); }
/// <summary> /// Creates on Orbit at current location from a given velocity /// </summary> /// <returns>The Orbit Does not attach the OrbitDB to the entity!</returns> /// <param name="parent">Parent.</param> /// <param name="entity">Entity.</param> /// <param name="velocityAU">Velocity.</param> public static OrbitDB FromVector(Entity parent, Entity entity, Vector3 velocityAU, DateTime atDateTime) { var parentMass = parent.GetDataBlob <MassVolumeDB>().Mass; var myMass = entity.GetDataBlob <MassVolumeDB>().Mass; var epoch1 = parent.Manager.ManagerSubpulses.StarSysDateTime; //getting epoch from here is incorrect as the local datetime doesn't change till after the subpulse. var parentPos = OrbitProcessor.GetAbsolutePosition_AU(parent.GetDataBlob <OrbitDB>(), atDateTime); //need to use the parent position at the epoch var posdb = entity.GetDataBlob <PositionDB>(); posdb.SetParent(parent); var ralitivePos = posdb.RelativePosition_AU;//entity.GetDataBlob<PositionDB>().AbsolutePosition_AU - parentPos; if (ralitivePos.Length() > OrbitProcessor.GetSOI(parent)) { throw new Exception("Entity not in target SOI"); } var sgp = GameConstants.Science.GravitationalConstant * (myMass + parentMass) / 3.347928976e33; var ke = OrbitMath.KeplerFromPositionAndVelocity(sgp, ralitivePos, velocityAU, atDateTime); var epoch = atDateTime;// - TimeSpan.FromSeconds(ke.Epoch); //ke.Epoch is seconds from periapsis. OrbitDB orbit = new OrbitDB(parent, parentMass, myMass, Math.Abs(ke.SemiMajorAxis), ke.Eccentricity, Angle.ToDegrees(ke.Inclination), Angle.ToDegrees(ke.LoAN), Angle.ToDegrees(ke.AoP), Angle.ToDegrees(ke.MeanAnomalyAtEpoch), epoch); var pos = OrbitProcessor.GetPosition_AU(orbit, atDateTime); var d = Distance.AuToKm(pos - ralitivePos).Length(); if (d > 1) { var e = new Event(atDateTime, "Positional difference of " + d + "Km when creating orbit from velocity"); e.Entity = entity; e.SystemGuid = entity.Manager.ManagerGuid; e.EventType = EventType.Opps; //e.Faction = entity.FactionOwner; StaticRefLib.EventLog.AddEvent(e); //other info: var keta = Angle.ToDegrees(ke.TrueAnomalyAtEpoch); var obta = Angle.ToDegrees(OrbitProcessor.GetTrueAnomaly(orbit, atDateTime)); var tadif = Angle.ToDegrees(Angle.DifferenceBetweenRadians(keta, obta)); var pos1 = OrbitProcessor.GetPosition_AU(orbit, atDateTime); var pos2 = OrbitProcessor.GetPosition_AU(orbit, ke.TrueAnomalyAtEpoch); var d2 = Distance.AuToKm(pos1 - pos2).Length(); } return(orbit); }
internal override void ActionCommand(Game game) { if (!IsRunning) { (Vector3 pos, DateTime eti)targetIntercept = InterceptCalcs.GetInterceptPosition(_entityCommanding, _targetEntity.GetDataBlob <OrbitDB>(), TransitStartDateTime, TargetOffsetPosition_AU); OrbitDB orbitDB = _entityCommanding.GetDataBlob <OrbitDB>(); Vector3 currentPos = OrbitProcessor.GetAbsolutePosition_AU(orbitDB, TransitStartDateTime); var ralPos = OrbitProcessor.GetPosition_AU(orbitDB, TransitStartDateTime); var masses = _entityCommanding.GetDataBlob <MassVolumeDB>().Mass + orbitDB.Parent.GetDataBlob <MassVolumeDB>().Mass; var sgp = GameConstants.Science.GravitationalConstant * masses / 3.347928976e33; //Vector4 currentVec = OrbitProcessor.PreciseOrbitalVector(sgp, ralPos, orbitDB.SemiMajorAxis); Vector2 currentVec = OrbitProcessor.GetOrbitalVector(orbitDB, TransitStartDateTime); _db = new TranslateMoveDB(targetIntercept.pos); _db.TranslateRalitiveExit_AU = TargetOffsetPosition_AU; _db.EntryDateTime = TransitStartDateTime; _db.PredictedExitTime = targetIntercept.eti; _db.TranslateEntryPoint_AU = currentPos; _db.SavedNewtonionVector_AU = currentVec; _db.ExpendDeltaV_AU = ExpendDeltaV; if (_targetEntity.HasDataBlob <SensorInfoDB>()) { _db.TargetEntity = _targetEntity.GetDataBlob <SensorInfoDB>().DetectedEntity; } else { _db.TargetEntity = _targetEntity; } if (EntityCommanding.HasDataBlob <OrbitDB>()) { EntityCommanding.RemoveDataBlob <OrbitDB>(); } EntityCommanding.SetDataBlob(_db); TranslateMoveProcessor.StartNonNewtTranslation(EntityCommanding); IsRunning = true; var distance = (currentPos - targetIntercept.Item1).Length(); var distancekm = Distance.AuToKm(distance); var time = targetIntercept.Item2 - TransitStartDateTime; double spd = _entityCommanding.GetDataBlob <PropulsionAbilityDB>().MaximumSpeed_MS; spd = Distance.MToAU(spd); var distb = spd * time.TotalSeconds; var distbKM = Distance.AuToKm(distb); var dif = distancekm - distbKM; //Assert.AreEqual(distancekm, distbKM); } }
/// <summary> /// Creates orbit here using the current distance between the two entites as aphelion(furthest distance) and a given semiMajorAxis /// *NOTE BUG* this only returns a correct orbit DB if the position is y=0 and is +x (ie the position is in the reference direction) /// </summary> /// <returns>An OrbitDB. Does Not set DB to Entity.</returns> /// <param name="shipEntity">Ship entity.</param> /// <param name="parentEntity">The Entity to orbit</param> /// <param name="semiMajorAxsis">Largest Radius</param> public static OrbitDB CreateOrbitHereWithSemiMajAxis(Entity shipEntity, Entity parentEntity, double semiMajAxsisKM, DateTime time) { PositionDB parentPosition = parentEntity.GetDataBlob <PositionDB>(); PositionDB myPosition = shipEntity.GetDataBlob <PositionDB>(); double parentMass = parentEntity.GetDataBlob <MassVolumeDB>().Mass; double myMass = shipEntity.GetDataBlob <MassVolumeDB>().Mass; double aphelionAU = PositionDB.GetDistanceBetween(parentPosition, myPosition); double semiMajAxisAU = semiMajAxsisKM / GameConstants.Units.KmPerAu; double linierEcentricity = aphelionAU - semiMajAxisAU; double semiMinorAxsis = Math.Sqrt(Math.Pow(semiMajAxisAU, 2) - Math.Pow(linierEcentricity, 2)); double ecentricity = linierEcentricity / semiMajAxisAU; Vector3 ralitivePos = myPosition.RelativePosition_AU; double angle = Math.Atan2(ralitivePos.Y, ralitivePos.X); var theta = Angle.ToDegrees(angle); OrbitDB newOrbit = OrbitDB.FromAsteroidFormat(parentEntity, parentMass, myMass, semiMajAxisAU, ecentricity, 0, 0, angle, angle, time); var pos = OrbitProcessor.GetPosition_AU(newOrbit, time); var pos2 = Distance.AuToKm(pos); return(newOrbit); }
public StarSystem CreateTestSystem(Game game, int x = 0, int y = 0) { StarSystem sol = new StarSystem(game, "something", -1); Entity sun = _starFactory.CreateStar(sol, GameConstants.Units.SolarMassInKG, GameConstants.Units.SolarRadiusInAu, 4.6E9, "G", 5778, 1, SpectralType.G, "something"); sun.GetDataBlob <PositionDB>().X_AU += x; sun.GetDataBlob <PositionDB>().Y_AU += x; MassVolumeDB sunMVDB = sun.GetDataBlob <MassVolumeDB>(); SystemBodyInfoDB mercuryBodyDB = new SystemBodyInfoDB { BodyType = BodyType.Terrestrial, SupportsPopulations = true, Albedo = 0.068f }; //Albedo = 0.068f MassVolumeDB mercuryMVDB = MassVolumeDB.NewFromMassAndRadius_AU(3.3022E23, Distance.KmToAU(2439.7)); NameDB mercuryNameDB = new NameDB("LOLXDWTF"); double mercurySemiMajAxis = 0.387098; double mercuryEccentricity = 0.205630; double mercuryInclination = 0; double mercuryLoAN = 48.33167; double mercuryLoP = 77.45645; double mercuryMeanLongd = 252.25084; OrbitDB mercuryOrbitDB = OrbitDB.FromMajorPlanetFormat(sun, sunMVDB.MassDry, mercuryMVDB.MassDry, mercurySemiMajAxis, mercuryEccentricity, mercuryInclination, mercuryLoAN, mercuryLoP, mercuryMeanLongd, GalaxyGen.Settings.J2000); PositionDB mercuryPositionDB = new PositionDB(OrbitProcessor.GetPosition_AU(mercuryOrbitDB, StaticRefLib.CurrentDateTime), sol.Guid, sun); //AtmosphereDB mercuryAtmo = new AtmosphereDB(); SensorProfileDB sensorProfile = new SensorProfileDB(); mercuryPositionDB.X_AU += x; mercuryPositionDB.Y_AU += x; Entity mercury = new Entity(sol, new List <BaseDataBlob> { sensorProfile, mercuryPositionDB, mercuryBodyDB, mercuryMVDB, mercuryNameDB, mercuryOrbitDB }); _systemBodyFactory.MineralGeneration(game.StaticData, sol, mercury); SensorProcessorTools.PlanetEmmisionSig(sensorProfile, mercuryBodyDB, mercuryMVDB); SystemBodyInfoDB venusBodyDB = new SystemBodyInfoDB { BodyType = BodyType.Terrestrial, SupportsPopulations = true, Albedo = 0.77f }; MassVolumeDB venusMVDB = MassVolumeDB.NewFromMassAndRadius_AU(4.8676E24, Distance.KmToAU(6051.8)); NameDB venusNameDB = new NameDB("AYLMAOROFL"); double venusSemiMajAxis = 0.72333199; double venusEccentricity = 0.00677323; double venusInclination = 0; double venusLoAN = 76.68069; double venusLoP = 131.53298; double venusMeanLongd = 181.97973; OrbitDB venusOrbitDB = OrbitDB.FromMajorPlanetFormat(sun, sunMVDB.MassDry, venusMVDB.MassDry, venusSemiMajAxis, venusEccentricity, venusInclination, venusLoAN, venusLoP, venusMeanLongd, GalaxyGen.Settings.J2000); PositionDB venusPositionDB = new PositionDB(OrbitProcessor.GetPosition_AU(venusOrbitDB, StaticRefLib.CurrentDateTime), sol.Guid, sun); sensorProfile = new SensorProfileDB(); Entity venus = new Entity(sol, new List <BaseDataBlob> { sensorProfile, venusPositionDB, venusBodyDB, venusMVDB, venusNameDB, venusOrbitDB }); _systemBodyFactory.MineralGeneration(game.StaticData, sol, venus); SensorProcessorTools.PlanetEmmisionSig(sensorProfile, venusBodyDB, venusMVDB); SystemBodyInfoDB earthBodyDB = new SystemBodyInfoDB { BodyType = BodyType.Terrestrial, SupportsPopulations = true, Albedo = 0.306f }; MassVolumeDB earthMVDB = MassVolumeDB.NewFromMassAndRadius_AU(5.9726E24, Distance.KmToAU(6378.1)); NameDB earthNameDB = new NameDB("OMG"); double earthSemiMajAxis = 1.00000011; double earthEccentricity = 0.01671022; double earthInclination = 0; double earthLoAN = -11.26064; double earthLoP = 102.94719; double earthMeanLongd = 100.46435; OrbitDB earthOrbitDB = OrbitDB.FromMajorPlanetFormat(sun, sunMVDB.MassDry, earthMVDB.MassDry, earthSemiMajAxis, earthEccentricity, earthInclination, earthLoAN, earthLoP, earthMeanLongd, GalaxyGen.Settings.J2000); earthBodyDB.Tectonics = TectonicActivity.EarthLike; PositionDB earthPositionDB = new PositionDB(OrbitProcessor.GetPosition_AU(earthOrbitDB, StaticRefLib.CurrentDateTime), sol.Guid, sun); Dictionary <AtmosphericGasSD, float> atmoGasses = new Dictionary <AtmosphericGasSD, float>(); atmoGasses.Add(game.StaticData.AtmosphericGases.SelectAt(6), 0.78f); atmoGasses.Add(game.StaticData.AtmosphericGases.SelectAt(9), 0.12f); atmoGasses.Add(game.StaticData.AtmosphericGases.SelectAt(11), 0.01f); AtmosphereDB earthAtmosphereDB = new AtmosphereDB(1f, true, 71, 1f, 1f, 57.2f, atmoGasses); //TODO what's our greenhouse factor an pressure? sensorProfile = new SensorProfileDB(); Entity earth = new Entity(sol, new List <BaseDataBlob> { sensorProfile, earthPositionDB, earthBodyDB, earthMVDB, earthNameDB, earthOrbitDB, earthAtmosphereDB }); _systemBodyFactory.HomeworldMineralGeneration(game.StaticData, sol, earth); SensorProcessorTools.PlanetEmmisionSig(sensorProfile, earthBodyDB, earthMVDB); SystemBodyInfoDB lunaBodyDB = new SystemBodyInfoDB { BodyType = BodyType.Moon, SupportsPopulations = true }; MassVolumeDB lunaMVDB = MassVolumeDB.NewFromMassAndRadius_AU(0.073E24, Distance.KmToAU(1738.14)); NameDB lunaNameDB = new NameDB("NOWAY"); double lunaSemiMajAxis = Distance.KmToAU(0.3844E6); double lunaEccentricity = 0.0549; double lunaInclination = 0;//5.1; // Next three values are unimportant. Luna's LoAN and AoP regress/progress by one revolution every 18.6/8.85 years respectively. // Our orbit code it not advanced enough to deal with LoAN/AoP regression/progression. double lunaLoAN = 125.08; double lunaAoP = 318.0634; double lunaMeanAnomaly = 115.3654; OrbitDB lunaOrbitDB = OrbitDB.FromAsteroidFormat(earth, earthMVDB.MassDry, lunaMVDB.MassDry, lunaSemiMajAxis, lunaEccentricity, lunaInclination, lunaLoAN, lunaAoP, lunaMeanAnomaly, GalaxyGen.Settings.J2000); PositionDB lunaPositionDB = new PositionDB(OrbitProcessor.GetPosition_AU(lunaOrbitDB, StaticRefLib.CurrentDateTime) + earthPositionDB.AbsolutePosition_AU, sol.Guid, earth); sensorProfile = new SensorProfileDB(); Entity luna = new Entity(sol, new List <BaseDataBlob> { sensorProfile, lunaPositionDB, lunaBodyDB, lunaMVDB, lunaNameDB, lunaOrbitDB }); _systemBodyFactory.MineralGeneration(game.StaticData, sol, luna); SensorProcessorTools.PlanetEmmisionSig(sensorProfile, lunaBodyDB, lunaMVDB); SystemBodyInfoDB halleysBodyDB = new SystemBodyInfoDB { BodyType = BodyType.Comet, SupportsPopulations = false, Albedo = 0.04f }; //Albedo = 0.04f MassVolumeDB halleysMVDB = MassVolumeDB.NewFromMassAndRadius_AU(2.2e14, Distance.KmToAU(11)); NameDB halleysNameDB = new NameDB("ASSHOLE"); double halleysSemiMajAxis = 17.834; //AU double halleysEccentricity = 0.96714; double halleysInclination = 180; //162.26° note retrograde orbit. double halleysLoAN = 58.42; //° double halleysAoP = 111.33; //° double halleysMeanAnomaly = 38.38; //° OrbitDB halleysOrbitDB = OrbitDB.FromAsteroidFormat(sun, sunMVDB.MassDry, halleysMVDB.MassDry, halleysSemiMajAxis, halleysEccentricity, halleysInclination, halleysLoAN, halleysAoP, halleysMeanAnomaly, new System.DateTime(1994, 2, 17)); PositionDB halleysPositionDB = new PositionDB(OrbitProcessor.GetPosition_AU(halleysOrbitDB, StaticRefLib.CurrentDateTime), sol.Guid, sun); // + earthPositionDB.AbsolutePosition_AU, sol.ID); sensorProfile = new SensorProfileDB(); Entity halleysComet = new Entity(sol, new List <BaseDataBlob> { sensorProfile, halleysPositionDB, halleysBodyDB, halleysMVDB, halleysNameDB, halleysOrbitDB }); _systemBodyFactory.MineralGeneration(game.StaticData, sol, halleysComet); SensorProcessorTools.PlanetEmmisionSig(sensorProfile, halleysBodyDB, halleysMVDB); JPSurveyFactory.GenerateJPSurveyPoints(sol); game.GameMasterFaction.GetDataBlob <FactionInfoDB>().KnownSystems.Add(sol.Guid); return(sol); }
/// <summary> /// Creates our own solar system. /// This probibly needs to be Json! (since we're getting atmo stuff) /// Adds sol to game.StarSystems. /// </summary> public StarSystem CreateSol(Game game) { // WIP Function. Not complete. StarSystem sol = new StarSystem(game, "Sol", -1); Entity sun = _starFactory.CreateStar(sol, GameConstants.Units.SolarMassInKG, GameConstants.Units.SolarRadiusInAu, 4.6E9, "G", 5778, 1, SpectralType.G, "Sol"); MassVolumeDB sunMVDB = sun.GetDataBlob <MassVolumeDB>(); SystemBodyInfoDB mercuryBodyDB = new SystemBodyInfoDB { BodyType = BodyType.Terrestrial, SupportsPopulations = true, Albedo = 0.068f }; //Albedo = 0.068f MassVolumeDB mercuryMVDB = MassVolumeDB.NewFromMassAndRadius_AU(3.3022E23, Distance.KmToAU(2439.7)); NameDB mercuryNameDB = new NameDB("Mercury"); double mercurySemiMajAxis = 0.387098; double mercuryEccentricity = 0.205630; double mercuryInclination = 0; double mercuryLoAN = 48.33167; double mercuryLoP = 77.45645; double mercuryMeanLongd = 252.25084; OrbitDB mercuryOrbitDB = OrbitDB.FromMajorPlanetFormat(sun, sunMVDB.MassDry, mercuryMVDB.MassDry, mercurySemiMajAxis, mercuryEccentricity, mercuryInclination, mercuryLoAN, mercuryLoP, mercuryMeanLongd, GalaxyGen.Settings.J2000); mercuryBodyDB.BaseTemperature = (float)SystemBodyFactory.CalculateBaseTemperatureOfBody(sun, mercuryOrbitDB); PositionDB mercuryPositionDB = new PositionDB(OrbitProcessor.GetPosition_AU(mercuryOrbitDB, StaticRefLib.CurrentDateTime), sol.Guid, sun); //AtmosphereDB mercuryAtmo = new AtmosphereDB(); SensorProfileDB sensorProfile = new SensorProfileDB(); Entity mercury = new Entity(sol, new List <BaseDataBlob> { sensorProfile, mercuryPositionDB, mercuryBodyDB, mercuryMVDB, mercuryNameDB, mercuryOrbitDB }); _systemBodyFactory.MineralGeneration(game.StaticData, sol, mercury); SensorProcessorTools.PlanetEmmisionSig(sensorProfile, mercuryBodyDB, mercuryMVDB); SystemBodyInfoDB venusBodyDB = new SystemBodyInfoDB { BodyType = BodyType.Terrestrial, SupportsPopulations = true, Albedo = 0.77f }; MassVolumeDB venusMVDB = MassVolumeDB.NewFromMassAndRadius_AU(4.8676E24, Distance.KmToAU(6051.8)); NameDB venusNameDB = new NameDB("Venus"); double venusSemiMajAxis = 0.72333199; double venusEccentricity = 0.00677323; double venusInclination = 0; double venusLoAN = 76.68069; double venusLoP = 131.53298; double venusMeanLongd = 181.97973; OrbitDB venusOrbitDB = OrbitDB.FromMajorPlanetFormat(sun, sunMVDB.MassDry, venusMVDB.MassDry, venusSemiMajAxis, venusEccentricity, venusInclination, venusLoAN, venusLoP, venusMeanLongd, GalaxyGen.Settings.J2000); venusBodyDB.BaseTemperature = (float)SystemBodyFactory.CalculateBaseTemperatureOfBody(sun, venusOrbitDB); PositionDB venusPositionDB = new PositionDB(OrbitProcessor.GetPosition_AU(venusOrbitDB, StaticRefLib.CurrentDateTime), sol.Guid, sun); sensorProfile = new SensorProfileDB(); Entity venus = new Entity(sol, new List <BaseDataBlob> { sensorProfile, venusPositionDB, venusBodyDB, venusMVDB, venusNameDB, venusOrbitDB }); _systemBodyFactory.MineralGeneration(game.StaticData, sol, venus); SensorProcessorTools.PlanetEmmisionSig(sensorProfile, venusBodyDB, venusMVDB); SystemBodyInfoDB earthBodyDB = new SystemBodyInfoDB { BodyType = BodyType.Terrestrial, SupportsPopulations = true, Albedo = 0.306f }; MassVolumeDB earthMVDB = MassVolumeDB.NewFromMassAndRadius_AU(5.9726E24, Distance.KmToAU(6378.1)); NameDB earthNameDB = new NameDB("Earth"); double earthSemiMajAxis = 1.00000011; double earthEccentricity = 0.01671022; double earthInclination = 0; double earthLoAN = -11.26064; double earthLoP = 102.94719; double earthMeanLongd = 100.46435; OrbitDB earthOrbitDB = OrbitDB.FromMajorPlanetFormat(sun, sunMVDB.MassDry, earthMVDB.MassDry, earthSemiMajAxis, earthEccentricity, earthInclination, earthLoAN, earthLoP, earthMeanLongd, GalaxyGen.Settings.J2000); earthBodyDB.BaseTemperature = (float)SystemBodyFactory.CalculateBaseTemperatureOfBody(sun, earthOrbitDB); earthBodyDB.Tectonics = TectonicActivity.EarthLike; PositionDB earthPositionDB = new PositionDB(OrbitProcessor.GetPosition_AU(earthOrbitDB, StaticRefLib.CurrentDateTime), sol.Guid, sun); Dictionary <AtmosphericGasSD, float> atmoGasses = new Dictionary <AtmosphericGasSD, float>(); atmoGasses.Add(game.StaticData.AtmosphericGases.SelectAt(6), 0.78f); atmoGasses.Add(game.StaticData.AtmosphericGases.SelectAt(9), 0.12f); atmoGasses.Add(game.StaticData.AtmosphericGases.SelectAt(11), 0.01f); AtmosphereDB earthAtmosphereDB = new AtmosphereDB(1f, true, 71, 1f, 1f, 57.2f, atmoGasses); //TODO what's our greenhouse factor an pressure? sensorProfile = new SensorProfileDB(); Entity earth = new Entity(sol, new List <BaseDataBlob> { sensorProfile, earthPositionDB, earthBodyDB, earthMVDB, earthNameDB, earthOrbitDB, earthAtmosphereDB }); _systemBodyFactory.HomeworldMineralGeneration(game.StaticData, sol, earth); SensorProcessorTools.PlanetEmmisionSig(sensorProfile, earthBodyDB, earthMVDB); SystemBodyInfoDB lunaBodyDB = new SystemBodyInfoDB { BodyType = BodyType.Moon, SupportsPopulations = true }; MassVolumeDB lunaMVDB = MassVolumeDB.NewFromMassAndRadius_AU(0.073E24, Distance.KmToAU(1738.14)); NameDB lunaNameDB = new NameDB("Luna"); double lunaSemiMajAxis = Distance.KmToAU(0.3844E6); double lunaEccentricity = 0.0549; double lunaInclination = 0;//5.1; // Next three values are unimportant. Luna's LoAN and AoP regress/progress by one revolution every 18.6/8.85 years respectively. // Our orbit code it not advanced enough to deal with LoAN/AoP regression/progression. double lunaLoAN = 125.08; double lunaAoP = 318.0634; double lunaMeanAnomaly = 115.3654; OrbitDB lunaOrbitDB = OrbitDB.FromAsteroidFormat(earth, earthMVDB.MassDry, lunaMVDB.MassDry, lunaSemiMajAxis, lunaEccentricity, lunaInclination, lunaLoAN, lunaAoP, lunaMeanAnomaly, GalaxyGen.Settings.J2000); lunaBodyDB.BaseTemperature = (float)SystemBodyFactory.CalculateBaseTemperatureOfBody(sun, earthOrbitDB); //yes, using earth orbit here, since this is the DB it calculates the average distance from. PositionDB lunaPositionDB = new PositionDB(OrbitProcessor.GetPosition_AU(lunaOrbitDB, StaticRefLib.CurrentDateTime) + earthPositionDB.AbsolutePosition_AU, sol.Guid, earth); sensorProfile = new SensorProfileDB(); Entity luna = new Entity(sol, new List <BaseDataBlob> { sensorProfile, lunaPositionDB, lunaBodyDB, lunaMVDB, lunaNameDB, lunaOrbitDB }); _systemBodyFactory.MineralGeneration(game.StaticData, sol, luna); SensorProcessorTools.PlanetEmmisionSig(sensorProfile, lunaBodyDB, lunaMVDB); SystemBodyInfoDB marsBodyDB = new SystemBodyInfoDB { BodyType = BodyType.Terrestrial, SupportsPopulations = true, Albedo = 0.25f }; MassVolumeDB marsMVDB = MassVolumeDB.NewFromMassAndRadius_AU(0.64174E24, Distance.KmToAU(3396.2)); NameDB marsNameDB = new NameDB("Mars"); double marsSemiMajAxis = Distance.KmToAU(227.92E6); double marsEccentricity = 0.0934; //wiki says .0934 double marsInclination = 0; //1.85; double marsLoAN = 49.57854; double marsAoP = 336.04084; double marsMeanLong = 355.45332; OrbitDB marsOrbitDB = OrbitDB.FromMajorPlanetFormat(sun, sunMVDB.MassDry, marsMVDB.MassDry, marsSemiMajAxis, marsEccentricity, marsInclination, marsLoAN, marsAoP, marsMeanLong, GalaxyGen.Settings.J2000); marsBodyDB.BaseTemperature = (float)SystemBodyFactory.CalculateBaseTemperatureOfBody(sun, marsOrbitDB); Dictionary <AtmosphericGasSD, float> marsAtmoGasses = new Dictionary <AtmosphericGasSD, float>(); marsAtmoGasses.Add(game.StaticData.AtmosphericGases.SelectAt(12), 0.95f * 0.01f); // C02% * Mars Atms marsAtmoGasses.Add(game.StaticData.AtmosphericGases.SelectAt(6), 0.027f * 0.01f); // N% * Mars Atms marsAtmoGasses.Add(game.StaticData.AtmosphericGases.SelectAt(9), 0.007f * 0.01f); // O% * Mars Atms marsAtmoGasses.Add(game.StaticData.AtmosphericGases.SelectAt(11), 0.016f * 0.01f); // Ar% * Mars Atms AtmosphereDB marsAtmo = new AtmosphereDB(0.087f, false, 0, 0, 0, -55, marsAtmoGasses); PositionDB marsPositionDB = new PositionDB(OrbitProcessor.GetPosition_AU(marsOrbitDB, StaticRefLib.CurrentDateTime), sol.Guid, sun); sensorProfile = new SensorProfileDB(); Entity mars = new Entity(sol, new List <BaseDataBlob> { sensorProfile, marsPositionDB, marsBodyDB, marsMVDB, marsNameDB, marsOrbitDB, marsAtmo }); _systemBodyFactory.MineralGeneration(game.StaticData, sol, mars); SensorProcessorTools.PlanetEmmisionSig(sensorProfile, marsBodyDB, marsMVDB); SystemBodyInfoDB halleysBodyDB = new SystemBodyInfoDB { BodyType = BodyType.Comet, SupportsPopulations = false, Albedo = 0.04f }; //Albedo = 0.04f MassVolumeDB halleysMVDB = MassVolumeDB.NewFromMassAndRadius_AU(2.2e14, Distance.KmToAU(11)); NameDB halleysNameDB = new NameDB("Halleys Comet"); double halleysSemiMajAxis = 17.834; //AU double halleysEccentricity = 0.96714; double halleysInclination = 180; //162.26° note retrograde orbit. double halleysLoAN = 58.42; //° double halleysAoP = 111.33; //° double halleysMeanAnomaly = 38.38; //° OrbitDB halleysOrbitDB = OrbitDB.FromAsteroidFormat(sun, sunMVDB.MassDry, halleysMVDB.MassDry, halleysSemiMajAxis, halleysEccentricity, halleysInclination, halleysLoAN, halleysAoP, halleysMeanAnomaly, new System.DateTime(1994, 2, 17)); halleysBodyDB.BaseTemperature = (float)SystemBodyFactory.CalculateBaseTemperatureOfBody(sun, halleysOrbitDB); PositionDB halleysPositionDB = new PositionDB(OrbitProcessor.GetPosition_AU(halleysOrbitDB, StaticRefLib.CurrentDateTime), sol.Guid, sun); // + earthPositionDB.AbsolutePosition_AU, sol.ID); sensorProfile = new SensorProfileDB(); Entity halleysComet = new Entity(sol, new List <BaseDataBlob> { sensorProfile, halleysPositionDB, halleysBodyDB, halleysMVDB, halleysNameDB, halleysOrbitDB }); _systemBodyFactory.MineralGeneration(game.StaticData, sol, halleysComet); SensorProcessorTools.PlanetEmmisionSig(sensorProfile, halleysBodyDB, halleysMVDB); /* * * SystemBody Jupiter = new SystemBody(sun, SystemBody.PlanetType.GasGiant); * Jupiter.Name = "Jupiter"; * Jupiter.Orbit = Orbit.FromMajorPlanetFormat(1898.3E24, sun.Orbit.Mass, 5.20336301, 0.04839266, 1.30530, 100.55615, 14.75385, 34.40438, GalaxyGen.J2000); * Jupiter.Radius = Distance.ToAU(71492); * Jupiter.Orbit.GetPosition(GameState.Instance.CurrentDate, out x, out y); * Jupiter.Position.System = Sol; * Jupiter.Position.X = x; * Jupiter.Position.Y = y; * sun.Planets.Add(Jupiter); * * SystemBody Saturn = new SystemBody(sun, SystemBody.PlanetType.GasGiant); * Saturn.Name = "Saturn"; * Saturn.Orbit = Orbit.FromMajorPlanetFormat(568.36E24, sun.Orbit.Mass, 9.53707032, 0.05415060, 2.48446, 113.71504, 92.43194, 49.94432, GalaxyGen.J2000); * Saturn.Radius = Distance.ToAU(60268); * Saturn.Orbit.GetPosition(GameState.Instance.CurrentDate, out x, out y); * Saturn.Position.System = Sol; * Saturn.Position.X = x; * Saturn.Position.Y = y; * sun.Planets.Add(Saturn); * * SystemBody Uranus = new SystemBody(sun, SystemBody.PlanetType.IceGiant); * Uranus.Name = "Uranus"; * Uranus.Orbit = Orbit.FromMajorPlanetFormat(86.816E24, sun.Orbit.Mass, 19.19126393, 0.04716771, 0.76986, 74.22988, 170.96424, 313.23218, GalaxyGen.J2000); * Uranus.Radius = Distance.ToAU(25559); * Uranus.Orbit.GetPosition(GameState.Instance.CurrentDate, out x, out y); * Uranus.Position.System = Sol; * Uranus.Position.X = x; * Uranus.Position.Y = y; * sun.Planets.Add(Uranus); * * SystemBody Neptune = new SystemBody(sun, SystemBody.PlanetType.IceGiant); * Neptune.Name = "Neptune"; * Neptune.Orbit = Orbit.FromMajorPlanetFormat(102E24, sun.Orbit.Mass, Distance.ToAU(4495.1E6), 0.011, 1.8, 131.72169, 44.97135, 304.88003, GalaxyGen.J2000); * Neptune.Radius = Distance.ToAU(24764); * Neptune.Orbit.GetPosition(GameState.Instance.CurrentDate, out x, out y); * Neptune.Position.System = Sol; * Neptune.Position.X = x; * Neptune.Position.Y = y; * sun.Planets.Add(Neptune); * * SystemBody Pluto = new SystemBody(sun, SystemBody.PlanetType.DwarfPlanet); * Pluto.Name = "Pluto"; * Pluto.Orbit = Orbit.FromMajorPlanetFormat(0.0131E24, sun.Orbit.Mass, Distance.ToAU(5906.38E6), 0.24880766, 17.14175, 110.30347, 224.06676, 238.92881, GalaxyGen.J2000); * Pluto.Radius = Distance.ToAU(1195); * Pluto.Orbit.GetPosition(GameState.Instance.CurrentDate, out x, out y); * Pluto.Position.System = Sol; * Pluto.Position.X = x; * Pluto.Position.Y = y; * sun.Planets.Add(Pluto); * * GenerateJumpPoints(Sol); * * // Clean up cached RNG: * m_RNG = null; * GameState.Instance.StarSystems.Add(Sol); * GameState.Instance.StarSystemCurrentIndex++; */ /* * double planetSemiMajAxis = 0.387098; * double planetEccentricity = 0.205630; * double planetInclination = 0; * double planetLoAN = 0;//48.33167; * double planetLoP = 0;//77.45645; * double planetMeanLongd = 252.25084; * * EMWaveForm waveform; * * for (int i = 0; i < 8; i++) * { * NameDB planetNameDB = new NameDB("planetE" + i); * * SystemBodyInfoDB planetBodyDB = new SystemBodyInfoDB { BodyType = BodyType.Terrestrial, SupportsPopulations = true }; * MassVolumeDB planetMVDB = MassVolumeDB.NewFromMassAndRadius_AU(3.3022E23, Distance.KmToAU(2439.7)); * PositionDB planetPositionDB = new PositionDB(sol.ID); * planetEccentricity = i * 2 / 16.0; * OrbitDB planetOrbitDB = OrbitDB.FromMajorPlanetFormat(sun, sunMVDB.Mass, planetMVDB.Mass, planetSemiMajAxis, planetEccentricity, planetInclination, planetLoAN, planetLoP, planetMeanLongd, GalaxyGen.Settings.J2000); * planetPositionDB.AbsolutePosition = OrbitProcessor.GetPosition(planetOrbitDB, game.CurrentDateTime); * * waveform = new EMWaveForm() * { * WavelengthAverage_nm = 600, * WavelengthMin_nm = 600 - 400, //4k angstrom, semi arbitrary number pulled outa my ass from 0min of internet research. * WavelengthMax_nm = 600 + 600 * }; * * sensorProfile = new SensorProfileDB(); * sensorProfile.EmittedEMSpectra.Add(waveform, 3.827e23); * Entity planet = new Entity(sol, new List<BaseDataBlob> { sensorProfile, planetPositionDB, planetBodyDB, planetMVDB, planetNameDB, planetOrbitDB }); * } * * planetEccentricity = 0.9; * for (int i = 0; i < 8; i++) * { * NameDB planetNameDB = new NameDB("planetL" + i); * SystemBodyInfoDB planetBodyDB = new SystemBodyInfoDB { BodyType = BodyType.Terrestrial, SupportsPopulations = true }; * MassVolumeDB planetMVDB = MassVolumeDB.NewFromMassAndRadius_AU(3.3022E23, Distance.KmToAU(2439.7)); * PositionDB planetPositionDB = new PositionDB(sol.ID); * planetLoP = i * 15; * OrbitDB planetOrbitDB = OrbitDB.FromMajorPlanetFormat(sun, sunMVDB.Mass, planetMVDB.Mass, planetSemiMajAxis, planetEccentricity, planetInclination, planetLoAN, planetLoP, planetMeanLongd, GalaxyGen.Settings.J2000); * planetPositionDB.AbsolutePosition = OrbitProcessor.GetPosition(planetOrbitDB, game.CurrentDateTime); * * waveform = new EMWaveForm() * { * WavelengthAverage_nm = 600, * WavelengthMin_nm = 600 - 400, //4k angstrom, semi arbitrary number pulled outa my ass from 0min of internet research. * WavelengthMax_nm = 600 + 600 * }; * * sensorProfile = new SensorProfileDB(); * sensorProfile.EmittedEMSpectra.Add(waveform, 3.827e23); * Entity planet = new Entity(sol, new List<BaseDataBlob> {sensorProfile, planetPositionDB, planetBodyDB, planetMVDB, planetNameDB, planetOrbitDB }); * } */ JPSurveyFactory.GenerateJPSurveyPoints(sol); game.GameMasterFaction.GetDataBlob <FactionInfoDB>().KnownSystems.Add(sol.Guid); return(sol); }
/// <summary> /// This was designed so that fast moving objects will get interpolated a lot more than slow moving objects /// so fast moving objects shouldn't loose positional acuracy when close to a planet, /// and slow moving objects won't have processor time wasted on them by calulcating too often. /// However this seems to be unstable and looses energy, unsure why. currently set it to just itterate/interpolate every second. /// so currently will be using more time to get through this than neccisary. /// </summary> /// <param name="entity">Entity.</param> /// <param name="deltaSeconds">Delta seconds.</param> public static void NewtonMove(Entity entity, int deltaSeconds) { NewtonMoveDB newtonMoveDB = entity.GetDataBlob <NewtonMoveDB>(); PositionDB positionDB = entity.GetDataBlob <PositionDB>(); double Mass_Kg = entity.GetDataBlob <MassVolumeDB>().Mass; double ParentMass_kg = newtonMoveDB.ParentMass; var manager = entity.Manager; DateTime dateTimeFrom = newtonMoveDB.LastProcessDateTime; DateTime dateTimeNow = manager.ManagerSubpulses.StarSysDateTime; DateTime dateTimeFuture = dateTimeNow + TimeSpan.FromSeconds(deltaSeconds); double deltaT = (dateTimeFuture - dateTimeFrom).TotalSeconds; double secondsToItterate = deltaT; while (secondsToItterate > 0) { double speed_kms = newtonMoveDB.CurrentVector_kms.Length(); //double timeStep = Math.Max(secondsToItterate / speed_kms, 1); //timeStep = Math.Min(timeStep, secondsToItterate); double timeStep = 1;//because the above seems unstable and looses energy. double distanceToParent_m = Distance.AuToMt(positionDB.GetDistanceTo(newtonMoveDB.SOIParent.GetDataBlob <PositionDB>())); distanceToParent_m = Math.Max(distanceToParent_m, 0.1); //don't let the distance be 0 (once collision is in this will likely never happen anyway) double gravForce = GameConstants.Science.GravitationalConstant * (Mass_Kg * ParentMass_kg / Math.Pow(distanceToParent_m, 2)); Vector3 gravForceVector = gravForce * -Vector3.Normalise(positionDB.RelativePosition_AU); double distance = Distance.AuToKm(positionDB.RelativePosition_AU).Length(); Vector3 totalForce = gravForceVector + newtonMoveDB.ThrustVector; Vector3 acceleration_mps = totalForce / Mass_Kg; Vector3 newVelocity = (acceleration_mps * timeStep * 0.001) + newtonMoveDB.CurrentVector_kms; newtonMoveDB.CurrentVector_kms = newVelocity; Vector3 deltaPos = (newtonMoveDB.CurrentVector_kms + newVelocity) / 2 * timeStep; //Vector4 deltaPos = newtonMoveDB.CurrentVector_kms * timeStep; positionDB.RelativePosition_AU += Distance.KmToAU(deltaPos); double sOIRadius_AU = OrbitProcessor.GetSOI(newtonMoveDB.SOIParent); if (positionDB.RelativePosition_AU.Length() >= sOIRadius_AU) { Entity newParent; Vector3 parentRalitiveVector; //if our parent is a regular kepler object (normaly this is the case) if (newtonMoveDB.SOIParent.HasDataBlob <OrbitDB>()) { var orbitDB = newtonMoveDB.SOIParent.GetDataBlob <OrbitDB>(); newParent = orbitDB.Parent; var parentVelocity = OrbitProcessor.InstantaneousOrbitalVelocityVector(orbitDB, entity.Manager.ManagerSubpulses.StarSysDateTime); parentRalitiveVector = Distance.KmToAU(newtonMoveDB.CurrentVector_kms) + parentVelocity; var pvlen = Distance.AuToKm(parentVelocity.Length()); var vlen = newtonMoveDB.CurrentVector_kms.Length(); var rvlen = Distance.AuToKm(parentRalitiveVector.Length()); } else //if (newtonMoveDB.SOIParent.HasDataBlob<NewtonMoveDB>()) { //this will pretty much never happen. newParent = newtonMoveDB.SOIParent.GetDataBlob <NewtonMoveDB>().SOIParent; var parentVelocity = newtonMoveDB.SOIParent.GetDataBlob <NewtonMoveDB>().CurrentVector_kms; parentRalitiveVector = Distance.KmToAU(newtonMoveDB.CurrentVector_kms + parentVelocity); } double newParentMass = newParent.GetDataBlob <MassVolumeDB>().Mass; double sgp = GameConstants.Science.GravitationalConstant * (newParentMass + Mass_Kg) / 3.347928976e33; Vector3 posRalitiveToNewParent = positionDB.AbsolutePosition_AU - newParent.GetDataBlob <PositionDB>().AbsolutePosition_AU; var dateTime = dateTimeNow + TimeSpan.FromSeconds(deltaSeconds - secondsToItterate); var kE = OrbitMath.KeplerFromPositionAndVelocity(sgp, posRalitiveToNewParent, parentRalitiveVector, dateTime); if (kE.Eccentricity < 1) //if we're going to end up in a regular orbit around our new parent { /* * var newOrbit = OrbitDB.FromKeplerElements( * newParent, * newParentMass, * Mass_Kg, * kE, * dateTime); */ var newOrbit = OrbitDB.FromVector(newParent, entity, parentRalitiveVector, dateTime); entity.RemoveDataBlob <NewtonMoveDB>(); entity.SetDataBlob(newOrbit); positionDB.SetParent(newParent); var currentPos = Distance.AuToKm(positionDB.RelativePosition_AU); var newPos = OrbitProcessor.GetPosition_AU(newOrbit, dateTime); var newPosKM = Distance.AuToKm(newPos); positionDB.RelativePosition_AU = newPos; break; } else //else we're in a hyperbolic trajectory around our new parent, so just coninue the newtonion move. { positionDB.SetParent(newParent); newtonMoveDB.ParentMass = newParentMass; newtonMoveDB.SOIParent = newParent; } } secondsToItterate -= timeStep; } newtonMoveDB.LastProcessDateTime = dateTimeFuture; }