예제 #1
0
 /// <summary>
 ///    Если корабль в состоянии гиперпрыжка, то подписан на WorldCtl.TurnStarted.
 ///    Если текущая дата совпадает с датой прибытия, перемещает корабль в целевую систему.
 /// </summary>
 /// <remarks>
 ///    Продолжение банкета - HyperjumpFlightTask.OnTargetStarSystemReached.
 /// </remarks>
 private void OnTurnStarted(WorldCtl sender)
 {
     if (WorldContext.WorldCtl.Date < CurrentHyperjumpInfo.ArrivalDate)
     {
         return;                                                                            //Если еще рано, ждем дальше
     }
     Spacecraft.Location  = CurrentHyperjumpInfo.TargetSystem;
     CurrentHyperjumpInfo = null;
 }
예제 #2
0
        /// <summary>
        ///    Выполняет прыжок в указанную систему. Перемещает корабль игрока в StarSystem.Void и сохраняет информацию о прыжке.
        /// </summary>
        /// <exception cref="InvalidOperationException">Будет выброшено, если прыжок совершить невозможно. Расценивать как баг.</exception>
        public void Jump(StarSystem targetStarSystem)
        {
            Assert.IsFalse(Spacecraft.Location == WorldContext.StarSystems.Void);
            Assert.IsTrue(CurrentHyperjumpInfo == null);

            if (!IsJumpPossible(targetStarSystem))
            {
                throw new InvalidOperationException("Jump failed: can't jump from current star system.");
            }

            var currentPos = Spacecraft.Location.UniverseMapPosition;
            var targetPos  = targetStarSystem.UniverseMapPosition;

            var jumpDuration =
                new TimeSpan(Mathf.RoundToInt(Vector2.Distance(currentPos, targetPos) * HyperjumpDurationFactor) + 1, 0, 0, 0, 0);

            CurrentHyperjumpInfo = new HyperjumpInfo(WorldContext.WorldCtl.Date + jumpDuration, Spacecraft.Location, targetStarSystem);

            Spacecraft.Location = WorldContext.StarSystems.Void;
        }