204 lines
5.5 KiB
C#
204 lines
5.5 KiB
C#
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;
|
|
|
|
/// <summary>
|
|
/// 获取当前倍率, 如果没有数据返回-1
|
|
/// </summary>
|
|
public int Multiplier => _data.GetMultiplier();
|
|
|
|
private void Start()
|
|
{
|
|
btn.onClick.AddListener(OnClick);
|
|
var manager = GContext.container.Resolve<PinballUncountable.Manager>();
|
|
manager.EventAggregator.GetEvent<PinballUncountable.EventTicketUpdate>()
|
|
.Subscribe(_ => DetermineMax())
|
|
.AddTo(this);
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
btn.onClick.RemoveListener(OnClick);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 初始化
|
|
/// </summary>
|
|
/// <param name="data">满足条件的数据结构</param>
|
|
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
|
|
{
|
|
/// <summary>
|
|
/// 当前有多少代币
|
|
/// </summary>
|
|
/// <returns>代币数量</returns>
|
|
public int GetTicketCount();
|
|
/// <summary>
|
|
/// 获取此活动的倍率列表
|
|
/// </summary>
|
|
/// <returns>倍率列表</returns>
|
|
public int[] GetMultiplierArray();
|
|
/// <summary>
|
|
/// 获取当前倍率,如果没有数据返回-1
|
|
/// </summary>
|
|
/// <returns>当前倍率,没有存过则返回-1</returns>
|
|
public int GetMultiplier();
|
|
/// <summary>
|
|
/// 设置当前倍率,并存储(如果需要的话)
|
|
/// </summary>
|
|
/// <param name="multiplier">倍率</param>
|
|
public void SetMultiplier(int multiplier);
|
|
} |