예제 #1
0
    public virtual async void Abort()
    {
        print("Game aborted");

        Music.Stop();
        // Resume DSP
        AudioListener.pause = false;

        // Unload resources
        Context.AudioManager.Unload("Level");

        onGameAborted.Invoke(this);

        Dispose();

        var sceneLoader = new SceneLoader("Navigation");

        sceneLoader.Load();
        var transitioned = false;

        Context.ScreenManager.ChangeScreen(OverlayScreen.Id, ScreenTransition.None, 0.4f, 1,
                                           onFinished: screen => transitioned = true);
        await UniTask.WaitUntil(() => transitioned && sceneLoader.IsLoaded);

        sceneLoader.Activate();
    }
예제 #2
0
    protected virtual async void Start()
    {
        await UniTask.WaitUntil(() => Context.IsInitialized);

        try
        {
            await Initialize();
        }
        catch (Exception e)
        {
            Debug.LogError(e);
            // Not editor
            if (Context.SelectedGameMode != GameMode.Unspecified)
            {
                Context.GameErrorState = new GameErrorState {
                    Message = "DIALOG_LEVEL_LOAD_ERROR".Get(), Exception = e
                };

                await UniTask.Delay(TimeSpan.FromSeconds(3));

                var sceneLoader = new SceneLoader("Navigation");
                sceneLoader.Load();
                var transitioned = false;
                Context.ScreenManager.ChangeScreen(OverlayScreen.Id, ScreenTransition.None, 0.4f, 1,
                                                   onFinished: screen => transitioned = true);
                await UniTask.WaitUntil(() => transitioned && sceneLoader.IsLoaded);

                sceneLoader.Activate();
            }
        }
    }
예제 #3
0
    public async void NextStage()
    {
        if (State == ScreenState.Inactive)
        {
            return;
        }
        State = ScreenState.Inactive;

        ProfileWidget.Instance.FadeOut();
        LoopAudioPlayer.Instance.StopAudio(0.4f);

        Context.AudioManager.Get("LevelStart").Play();

        var sceneLoader = new SceneLoader("Game");

        sceneLoader.Load();
        await UniTask.Delay(TimeSpan.FromSeconds(0.8f));

        NavigationBackdrop.Instance.FadeBrightness(0, 0.8f);
        await UniTask.Delay(TimeSpan.FromSeconds(0.8f));

        if (!sceneLoader.IsLoaded)
        {
            await UniTask.WaitUntil(() => sceneLoader.IsLoaded);
        }

        Context.AssetMemory.DisposeTaggedCacheAssets(AssetTag.GameCover);

        sceneLoader.Activate();
    }
예제 #4
0
    public async void Retry()
    {
        if (State == ScreenState.Inactive)
        {
            return;
        }
        // TODO: Refactor with TierResult?
        State = ScreenState.Inactive;

        ProfileWidget.Instance.FadeOut();
        LoopAudioPlayer.Instance.StopAudio(0.4f);

        Context.AudioManager.Get("LevelStart").Play();
        Context.SelectedGameMode = GameMode.Tier;
        Context.TierState        = new TierState(tierState.Tier);

        var sceneLoader = new SceneLoader("Game");

        sceneLoader.Load();
        await UniTask.Delay(TimeSpan.FromSeconds(0.8f));

        NavigationBackdrop.Instance.FadeBrightness(0, 0.8f);
        await UniTask.Delay(TimeSpan.FromSeconds(0.8f));

        if (!sceneLoader.IsLoaded)
        {
            await UniTask.WaitUntil(() => sceneLoader.IsLoaded);
        }
        sceneLoader.Activate();
    }
예제 #5
0
    public async void OnStartButton()
    {
        if (SelectedTier == null || State == ScreenState.Inactive)
        {
            return;
        }
        Context.Haptic(HapticTypes.SoftImpact, true);
        if (SelectedTier.StagesValid)
        {
            lastScrollPosition = scrollRect.verticalNormalizedPosition;

            State = ScreenState.Inactive;
            Context.SelectedGameMode = GameMode.Tier;
            Context.TierState        = new TierState(SelectedTier);

            LoadedContent = null;

            scrollRect.GetComponentsInChildren <TierCard>().ForEach(it => it.OnTierStart());
            ProfileWidget.Instance.FadeOut();
            LoopAudioPlayer.Instance.StopAudio(0.4f);

            Context.AudioManager.Get("LevelStart").Play();

            Context.SelectedMods = Context.Player.Settings.EnabledMods.ToHashSet(); // This will be filtered

            await UniTask.Delay(TimeSpan.FromSeconds(0.8f));

            OpaqueOverlay.Show();

            await UniTask.Delay(TimeSpan.FromSeconds(0.8f));

            var sceneLoader = new SceneLoader("Game");
            sceneLoader.Load();
            await UniTask.WaitUntil(() => sceneLoader.IsLoaded);

            sceneLoader.Activate();
        }
        else
        {
            DownloadAndUnpackStages();
        }
    }
예제 #6
0
    public virtual async void Retry()
    {
        print("Game retried");

        // Unload resources
        Context.AudioManager.Unload("Level");

        onGameRetried.Invoke(this);

        Dispose();

        var sceneLoader = new SceneLoader("Game");

        sceneLoader.Load();
        var transitioned = false;

        Context.ScreenManager.ChangeScreen(OverlayScreen.Id, ScreenTransition.None, 0.4f, 1,
                                           onFinished: screen => transitioned = true);
        await UniTask.WaitUntil(() => transitioned && sceneLoader.IsLoaded);

        sceneLoader.Activate();
    }
예제 #7
0
    public virtual async void Complete(bool?skipMusic = null)
    {
        if (State.IsCompleted || State.IsFailed)
        {
            return;
        }
        print("Game completed");

        if (skipMusic == null)
        {
            skipMusic = Chart.SkipMusicOnCompletion;
        }

        State.IsCompleted = true;

        State.OnComplete();
        if (State.Mode == GameMode.Tier)
        {
            Context.TierState.OnStageComplete();
        }

        inputController.DisableInput();

        onGameCompleted.Invoke(this);

        if (!EditorImmediatelyComplete)
        {
            var maxVolume = Music.Volume;
            var volume    = Music.Volume * 3f;

            // Wait for audio to finish
            var remainingLength = MusicLength - Music.PlaybackTime;
            var startTime       = DateTime.Now;
            await UniTask.WaitUntil(() =>
            {
                if (skipMusic.Value)
                {
                    volume -= 1 / 60f;
                    if (volume < 1)
                    {
                        Music.Volume = Math.Min(maxVolume, volume);
                    }

                    return(Music.IsFinished() || volume <= 0);
                }
                else
                {
                    return(Music.IsFinished() ||
                           DateTime.Now - startTime > TimeSpan.FromSeconds(remainingLength)); // Just as a fail-safe
                }
            });
        }

        State.IsReadyToExit = true;

        print("Audio ended");
        Context.AudioManager.Unload("Level");

        try
        {
            await UniTask.WhenAll(BeforeExitTasks);
        }
        catch (OperationCanceledException)
        {
        }

        onGameBeforeExit.Invoke(this);

        await Resources.UnloadUnusedAssets();

        Dispose();
        globalCalibrator?.Dispose();

        var sceneLoader = new SceneLoader("Navigation");

        sceneLoader.Load();

        await UniTask.Delay(TimeSpan.FromSeconds(1.5f));

        if (!sceneLoader.IsLoaded)
        {
            await UniTask.WaitUntil(() => sceneLoader.IsLoaded);
        }

        sceneLoader.Activate();
    }