using TMPro;
using UnityEngine.UI;
using UnityEngine;
using asap.core;
using UniRx;
public class GeneralMultiplierButton : MonoBehaviour
{
[SerializeField] private Button btn;
[SerializeField] private TMP_Text text;
[SerializeField] private GameObject max = null;
[SerializeField] private PinballUncountableMultiplierPopupView popupMultiplier;
private IHasMultiplier _data;
///
/// 获取当前倍率, 如果没有数据返回-1
///
public int Multiplier => _data.GetMultiplier();
private void Start()
{
btn.onClick.AddListener(OnClick);
var manager = GContext.container.Resolve();
manager.EventAggregator.GetEvent()
.Subscribe(_ => DetermineMax())
.AddTo(this);
}
private void OnDestroy()
{
btn.onClick.RemoveListener(OnClick);
}
///
/// 初始化
///
/// 满足条件的数据结构
public void Init(IHasMultiplier data)
{
_data = data;
var multipliers = data.GetMultiplierArray();
var num = _data.GetMultiplier();
if (multipliers.Length <= 0)
{
Debug.LogError("[General Multiplier Button] No multiplier data found.", this);
text.text = "x1";
DetermineMax();
return;
}
if (num == -1)
_data.SetMultiplier(multipliers[0]);
text.text = GetText();
DetermineMax();
}
public void SetToCurrentMax()
{
_data.SetMultiplier(GetCurrentMaxMultiplier());
text.text = GetText();
}
private string GetText()
{
return $"x{_data.GetMultiplier()}";
}
private void OnClick()
{
if (_data == null)
return;
if (_data.GetTicketCount() < _data.GetMultiplier())
{
SetToCurrentMax();
ShowMax();
popupMultiplier.Show(_data.GetMultiplier(), true);
return;
}
var (isMax, multiplier) = GetNextMultiplier();
_data.SetMultiplier(multiplier);
popupMultiplier.Show(_data.GetMultiplier(), isMax);
if (isMax)
ShowMax();
else
HideMax();
text.text = GetText();
}
private int GetCurrentMaxMultiplier()
{
var multipliers = _data.GetMultiplierArray();
if (multipliers.Length <= 0)
{
Debug.LogError("[General Multiplier Button] No multiplier data found.", this);
return 1;
}
for (int i = multipliers.Length - 1; i >= 0; i--)
{
if (multipliers[i] > _data.GetTicketCount())
continue;
return multipliers[i];
}
return multipliers[0];
}
private (bool isMax, int multiplier) GetNextMultiplier()
{
var multipliers = _data.GetMultiplierArray();
if (multipliers.Length <= 0)
{
Debug.LogError("[General Multiplier Button] No multiplier data found.", this);
return (false, 0);
}
var idx = 0;
var cur = _data.GetMultiplier();
while (idx < multipliers.Length)
{
if (multipliers[idx] == cur)
break;
idx++;
}
if (idx >= multipliers.Length)
{
Debug.LogError($"[General Multiplier Button] Multiplier {cur} not found in array.", this);
Debug.LogError($"[General Multiplier Button] Array: {string.Join(",", multipliers)}", this);
return (false, multipliers[0]);
}
idx++;
idx %= multipliers.Length;
if (multipliers[idx] > _data.GetTicketCount())
idx = 0;
// UGLY HACK: 判断是否显示最大倍率
var nextIdx = (idx + 1) % multipliers.Length;
bool isMax;
if (multipliers[nextIdx] > _data.GetTicketCount() || nextIdx == 0)
{
isMax = true;
}
else
{
isMax = false;
}
return (isMax, multipliers[idx]);
}
private void DetermineMax()
{
var idx = 0;
var cur = _data.GetMultiplier();
var multipliers = _data.GetMultiplierArray();
while (idx < multipliers.Length)
{
if (multipliers[idx] == cur)
break;
idx++;
}
var nextIdx = (idx + 1) % multipliers.Length;
if (multipliers[nextIdx] > _data.GetTicketCount() || nextIdx == 0)
ShowMax();
else
HideMax();
}
public void ShowMax()
{
if (max != null)
max.SetActive(true);
}
private void HideMax()
{
if (max != null)
max.SetActive(false);
}
}
public interface IHasMultiplier
{
///
/// 当前有多少代币
///
/// 代币数量
public int GetTicketCount();
///
/// 获取此活动的倍率列表
///
/// 倍率列表
public int[] GetMultiplierArray();
///
/// 获取当前倍率,如果没有数据返回-1
///
/// 当前倍率,没有存过则返回-1
public int GetMultiplier();
///
/// 设置当前倍率,并存储(如果需要的话)
///
/// 倍率
public void SetMultiplier(int multiplier);
}