Files
ft/Client/Assets/Scripts/UI/PartnerStatue/EventPartnerStatueBuildBtn.cs
2026-06-29 21:18:33 +08:00

172 lines
5.8 KiB
C#

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<EventPartnerStatueArc>();
(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<EventPartnerStatueArc>();
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<EventPartnerStatueArc>();
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<EventPartnerStatueArc>();
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,
}
}