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> /// Moves an entity while it's in a non newtonion translation state. /// TODO: doing this in meters will likely cause problems for ships that have a large position value. /// (position in meters could consevably go out of max value) /// </summary> /// <param name="entity">Entity.</param> /// <param name="deltaSeconds">Unused</param> public void ProcessEntity(Entity entity, int deltaSeconds) { var manager = entity.Manager; var moveDB = entity.GetDataBlob <TranslateMoveDB>(); var propulsionDB = entity.GetDataBlob <PropulsionAbilityDB>(); var currentVelocityMS = moveDB.CurrentNonNewtonionVectorMS; DateTime dateTimeFrom = moveDB.LastProcessDateTime; DateTime dateTimeNow = manager.ManagerSubpulses.StarSysDateTime; DateTime dateTimeFuture = dateTimeNow + TimeSpan.FromSeconds(deltaSeconds); double deltaT = (dateTimeFuture - dateTimeFrom).TotalSeconds; var positionDB = entity.GetDataBlob <PositionDB>(); var currentPositionAU = positionDB.AbsolutePosition_AU; Vector3 currentPositionMt = Distance.AuToMt(positionDB.AbsolutePosition_AU); Vector3 targetPosMt; targetPosMt = Distance.AuToMt(moveDB.TranslateExitPoint_AU); var deltaVecToTargetMt = currentPositionMt - targetPosMt; var newPositionMt = currentPositionMt + currentVelocityMS * deltaT; //var distanceToTargetAU = deltaVecToTargetAU.Length(); //in au var distanceToTargetMt = deltaVecToTargetMt.Length(); //var deltaVecToTimeAU = currentPositionAU - TimePosAU; var positionDelta = currentPositionMt - newPositionMt; double distanceToMove = positionDelta.Length(); if (distanceToTargetMt <= distanceToMove) // moving would overtake target, just go directly to target { newPositionMt = targetPosMt; positionDB.SetParent(moveDB.TargetEntity); //positionDB.AbsolutePosition_AU = Distance.MToAU(newPositionMt);//this needs to be set before creating the orbitDB positionDB.RelativePosition_AU = moveDB.TranslateRalitiveExit_AU; SetOrbitHere(entity, propulsionDB, positionDB, moveDB, dateTimeFuture); } else { positionDB.AbsolutePosition_AU = Distance.MToAU(newPositionMt); } moveDB.LastProcessDateTime = dateTimeFuture; }
/// <summary> /// Calculates a cartisian position for an intercept for a ship and an target's orbit. /// </summary> /// <returns>The intercept position and DateTime</returns> /// <param name="mover">The entity that is trying to intercept a target.</param> /// <param name="targetOrbit">Target orbit.</param> /// <param name="atDateTime">Datetime of transit start</param> public static (Vector3 position, DateTime etiDateTime) GetInterceptPosition(Entity mover, OrbitDB targetOrbit, DateTime atDateTime, Vector3 offsetPosition = new Vector3()) { Vector3 moverPos; if (mover.HasDataBlob <OrbitDB>()) { //moverPos = Distance.AuToMt(OrbitProcessor.GetAbsolutePosition_AU(mover.GetDataBlob<OrbitDB>(), atDateTime)); moverPos = OrbitProcessor.GetAbsolutePosition_AU(mover.GetDataBlob <OrbitDB>(), atDateTime); } else { moverPos = mover.GetDataBlob <PositionDB>().AbsolutePosition_AU; } double spd = mover.GetDataBlob <PropulsionAbilityDB>().MaximumSpeed_MS; var spd1 = Distance.MToAU(spd); return(GetInterceptPosition2(moverPos, spd1, targetOrbit, atDateTime, offsetPosition)); }
public void AddMeters(Vector3 addVector) { _positionInMeters += Distance.MToAU(addVector); }