172 lines
5.8 KiB
C#
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,
|
|
}
|
|
}
|