using System; using System.Collections.Generic; using UniRx; using UnityEngine; namespace TON { public class RoulettePresenter { private PlayerDataManager playerDataManager; private List roulettePieceModels = new(); public ReactiveCollection RoulettePieces { get; } = new(); public ReactiveProperty IsSpinning { get; } = new(false); public ReactiveProperty 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 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}"); } } } }