using TMPro; using UnityEngine; using UnityEngine.UI; using asap.core; using System; using UniRx; public class EventPartnerStatueBuildBtn : MonoBehaviour { [SerializeField] private Button btnNormal, btnFree, btnMore, btnMultiplier; [SerializeField] private GameObject goBuildNormal, goBuildFree, goBuildMore, goMultiplierNormal, goMultiplierMax, goTicketCount; [SerializeField] private TMP_Text textMoreTimer, textMorePercentage0, textMorePercentage1, textMorePercentage2, textCost, textMultiplierNormal, textMultiplierMax; private IDisposable _timer; private DateTime _expiryTime; private EState _state; private int _multiplierIdx, _multiplier; public int Cost => _multiplier; public int Index => _multiplierIdx; public void Init(Action onClickBuild) { var arc = GContext.container.Resolve(); (bool isMax, int idx, int multiplier) = arc.GetInitMultiplier(); SetMultiplier(multiplier, idx, isMax); btnMultiplier.onClick.AddListener(OnClickMultiplier); btnNormal.onClick.AddListener(() => onClickBuild.Invoke()); btnFree.onClick.AddListener(() => onClickBuild.Invoke()); btnMore.onClick.AddListener(() => onClickBuild.Invoke()); RefreshToCurrentMax(); } public void RefreshToCurrentMax() { var arc = GContext.container.Resolve(); var buff = arc.Buff; if (buff.FreeMultiplier != null) { SwitchToFree(buff.FreeMultiplier.Value); } else if (buff.PointBonusExpiryTime != null && ZZTimeHelper.UtcNow() < buff.PointBonusExpiryTime) { SwitchToMore(buff.GetMoreBuff(), buff.PointBonusExpiryTime.Value); var (isMax, idx, multiplier) = arc.GetCurrentMultiplier(_multiplierIdx); SetMultiplier(multiplier, idx, isMax); } else { var (isMax, idx, multiplier) = arc.GetCurrentMultiplier(_multiplierIdx); SwitchToNormal(multiplier); SetMultiplier(multiplier, idx, isMax); } goTicketCount.SetActive(true); btnMultiplier.gameObject.SetActive(true); } public void RefreshAndHold() { var arc = GContext.container.Resolve(); var buff = arc.Buff; if (buff.FreeMultiplier != null) { SwitchToFree(buff.FreeMultiplier.Value); } else if (buff.PointBonusExpiryTime != null && ZZTimeHelper.UtcNow() < buff.PointBonusExpiryTime) { SwitchToMore(buff.GetMoreBuff(), buff.PointBonusExpiryTime.Value); // var (isMax, idx, multiplier) = arc.GetCurrentMultiplier(_multiplierIdx); var isMax = _multiplierIdx >= arc.TableContext.GetMultiplierList().Count - 1 || _multiplier > arc.Model.TicketCount; SetMultiplier(_multiplier, _multiplierIdx, isMax); } else { var isMax = _multiplierIdx >= arc.TableContext.GetMultiplierList().Count - 1 || _multiplier > arc.Model.TicketCount; // var (isMax, idx, multiplier) = arc.GetCurrentMultiplier(_multiplierIdx); SwitchToNormal(_multiplier); SetMultiplier(_multiplier, _multiplierIdx, isMax); } goTicketCount.SetActive(true); btnMultiplier.gameObject.SetActive(true); } public void SwitchToNormal(int cost) { goBuildNormal.SetActive(true); goBuildFree.SetActive(false); goBuildMore.SetActive(false); textCost.text = $"x{cost}"; _state = EState.Normal; } public void SwitchToFree(int cost) { goBuildNormal.SetActive(false); goBuildFree.SetActive(true); goBuildMore.SetActive(false); _state = EState.Free; SetMultiplier(cost, _multiplierIdx, false); } public void SwitchToMore(float percentage, DateTime expiryTime) { goBuildNormal.SetActive(false); goBuildFree.SetActive(false); goBuildMore.SetActive(true); textMorePercentage0.text = $"{percentage * 100}%"; textMorePercentage1.text = $"{percentage * 100}%"; textMorePercentage2.text = $"{percentage * 100}%"; _timer?.Dispose(); _expiryTime = expiryTime; OnTimerUpdate(); _timer = Observable.Interval(TimeSpan.FromSeconds(1)) .Subscribe(_ => OnTimerUpdate()); _state = EState.More; } private void OnTimerUpdate() { var ts = _expiryTime - ZZTimeHelper.UtcNow(); if (ts.TotalSeconds < 0) { RefreshToCurrentMax(); return; } textMoreTimer.text = ConvertTools.ConvertTime4(ts); } private void OnDestroy() { _timer?.Dispose(); } #region Multiplier Button private void SetMultiplier(int multiplier, int idx, bool isMax) { _multiplierIdx = idx; _multiplier = multiplier; textMultiplierNormal.text = "x" + multiplier; textMultiplierMax.text = "x" + multiplier; goMultiplierNormal.SetActive(!isMax); goMultiplierMax.SetActive(isMax); } private void OnClickMultiplier() { if (_state == EState.Free) return; var arc = GContext.container.Resolve(); var (isMax, idx, multiplier) = arc.GetNextMultiplier(_multiplierIdx); SetMultiplier(multiplier, idx, isMax); textCost.text = $"x{multiplier}"; } #endregion public void Hide() { goBuildNormal.SetActive(false); goBuildFree.SetActive(false); goBuildMore.SetActive(false); goMultiplierNormal.SetActive(false); goMultiplierMax.SetActive(false); goTicketCount.SetActive(false); btnMultiplier.gameObject.SetActive(false); } private enum EState { Normal, Free, More, } }