using System; using System.Collections; using UnityEngine; using UnityEngine.UI; public class WinWindow : ParameterlessWindow { [SerializeField] private Text _coinsCountText; [SerializeField] private LevelRewardSection _levelReward; [SerializeField] private TimerRewardButtonsSection _rewardButtons; private bool _haveReward; protected override void OnInit() { _rewardButtons.SetCallback(OnRewardSectionResult); } protected override void OnShowed() { Ads.ShowInterstitial("win"); UI.GetOrCreateWindow().SyncCoinsCounter(); SyncCoinsCountText(); _levelReward.Init("@level_rewards/level_reward"); if (Settings.LEVEL_REWARD_ENABLE && _levelReward.HasReward) { _levelReward.Show(); _levelReward.ChangeProgress(true); _rewardButtons.Hide(); StartCoroutine(ActionAfterCondition(() => _levelReward.IsWorking)); } else { _levelReward.Hide(); _rewardButtons.Show(); _rewardButtons.Begin(); } } private IEnumerator ActionAfterCondition(Func predicate) { while (predicate.Invoke()) yield return null; _rewardButtons.Show(); _rewardButtons.Begin(); } private void OnRewardSectionResult(EnumRewardResult result) { switch (result) { case EnumRewardResult.SKIP: OnPlayerSkipReward(); break; case EnumRewardResult.FAIL: OnPlayerFailReward(); break; case EnumRewardResult.NEED_REWARD: OnPlayerNeedReward(); break; default: throw new ArgumentOutOfRangeException(nameof(result), result, null); } } private void OnPlayerSkipReward() { StartClosing(); } private void OnPlayerFailReward() { _rewardButtons.Begin(); } private void OnPlayerNeedReward() { G.Instance.Session.MultiplyEarnedCoins(_rewardButtons.Power); _haveReward = true; SyncCoinsCountText(); StartClosing(); } private void StartClosing() { G.Instance.Session.SaveEarnedCoins(); StartCoroutine(ClosingRoutine()); } private void SyncCoinsCountText() { SetCoinsCountText(G.Instance.Session.EarnedCoins); } private void SetCoinsCountText(int coinsValue) { _coinsCountText.text = $"+{coinsValue}"; } private IEnumerator ClosingRoutine() { _rewardButtons.Hide(); var coinsCounter = UI.GetOrCreateWindow(); coinsCounter.Show(); coinsCounter.SyncCoinsCounter(); if(_haveReward) yield return coinsCounter.ShowScreenCoins(); G.Instance.Session.BuildLevel(); } }