73 lines
2.5 KiB
C#
73 lines
2.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using UniRx;
|
|
using UnityEngine;
|
|
|
|
namespace TON
|
|
{
|
|
public class RoulettePresenter
|
|
{
|
|
private PlayerDataManager playerDataManager;
|
|
private List<RoulettePieceData> roulettePieceModels = new();
|
|
public ReactiveCollection<RoulettePiecePresenter> RoulettePieces { get; } = new();
|
|
public ReactiveProperty<bool> IsSpinning { get; } = new(false);
|
|
public ReactiveProperty<RoulettePiecePresenter> SelectedPiece { get; } = new();
|
|
private int accumulatedWeight;
|
|
|
|
public RoulettePresenter(RoulettePieceData[] pieceDataArray)
|
|
{
|
|
playerDataManager = PlayerDataManager.Singleton;
|
|
if (playerDataManager == null)
|
|
{
|
|
Debug.LogError("PlayerDataManager가 초기화되지 않았습니다.");
|
|
}
|
|
|
|
accumulatedWeight = 0;
|
|
for (int i = 0; i < pieceDataArray.Length; ++i)
|
|
{
|
|
var data = pieceDataArray[i];
|
|
data.index = i;
|
|
if (data.chance <= 0) data.chance = 1;
|
|
accumulatedWeight += data.chance;
|
|
data.weight = accumulatedWeight;
|
|
roulettePieceModels.Add(data);
|
|
RoulettePieces.Add(new RoulettePiecePresenter(data));
|
|
}
|
|
}
|
|
|
|
public int GetRandomIndex()
|
|
{
|
|
int weight = UnityEngine.Random.Range(0, accumulatedWeight);
|
|
for (int i = 0; i < roulettePieceModels.Count; ++i)
|
|
{
|
|
if (roulettePieceModels[i].weight > weight)
|
|
{
|
|
return i;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
public void Spin(Action<RoulettePiecePresenter> onResult = null)
|
|
{
|
|
if (IsSpinning.Value) return;
|
|
IsSpinning.Value = true;
|
|
int selectedIndex = GetRandomIndex();
|
|
var selected = RoulettePieces[selectedIndex];
|
|
SelectedPiece.Value = selected;
|
|
onResult?.Invoke(selected);
|
|
}
|
|
|
|
// 결과 처리(예: 골드 지급 등)
|
|
public void InsertRouletteResult(RoulettePiecePresenter selectedPresenter)
|
|
{
|
|
if (playerDataManager != null && int.TryParse(selectedPresenter.Description.Value, out int gold))
|
|
{
|
|
playerDataManager.AddGold(gold);
|
|
UIManager.Singleton.UpdateCashData();
|
|
Debug.Log($"{selectedPresenter.Index.Value}:{selectedPresenter.Description.Value}");
|
|
}
|
|
}
|
|
}
|
|
}
|