/// <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; }
/// <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; }