Пример #1
0
        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);
            }
        }
Пример #2
0
        /// <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;
        }
Пример #3
0
        /// <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));
        }
Пример #4
0
 public void AddMeters(Vector3 addVector)
 {
     _positionInMeters += Distance.MToAU(addVector);
 }