using System.Collections.Generic; using System.Linq; using DataTable; using Definition.DataStruct; using Definition.Enum; using Entity; using Procedure; using UnityEngine; using UnityGameFramework.Runtime; using CustomUtility; using GameFramework.DataTable; namespace UI { internal class LevelUpFormUseCase : IUIUseCase { private const int BaseRefreshPrice = 2; private readonly GameStateLevelUp _gameStateLevelUp; private readonly DRLevelUpReward[] _allRewards; private readonly IDataTable _levelRarityTable; private readonly Dictionary> _rewardsByRarity = new(); private readonly List _validRewards = new(); private int _refreshCount; private LevelUpFormRawData _currentModel; private readonly Player _player; public LevelUpFormUseCase(Player player, GameStateLevelUp gameStateLevelUp) { _player = player; _gameStateLevelUp = gameStateLevelUp; _allRewards = GameEntry.DataTable.GetDataTable().ToArray(); _levelRarityTable = GameEntry.DataTable.GetDataTable(); BuildRewardRarityPools(); } public LevelUpFormRawData CreateInitialModel(int count = 4) { _refreshCount = 0; if (_gameStateLevelUp == null || _player.PendingLevelPoints <= 0) { _currentModel = null; return null; } _currentModel = BuildModel(BaseRefreshPrice, count); return _currentModel; } public LevelUpFormRawData TryRefresh(int refreshCost, int count = 4) { if (_currentModel == null) { return null; } if (_player == null || _player.Coin < refreshCost) { return null; } _player.Coin -= refreshCost; _refreshCount++; _currentModel = BuildModel((_refreshCount + 1) * BaseRefreshPrice, count); return _currentModel; } public LevelUpFormRawData SelectReward(int selectedIndex, int count = 4) { if (_currentModel?.Rewards == null) { return null; } if (selectedIndex < 0 || selectedIndex >= _currentModel.Rewards.Count) { Log.Warning("LevelUpFormUseCase::SelectReward: Invalid index"); return null; } ApplyReward(_currentModel.Rewards[selectedIndex]); if (--_player.PendingLevelPoints > 0) { _refreshCount = 0; _currentModel = BuildModel(BaseRefreshPrice, count); return _currentModel; } _gameStateLevelUp.IsCompleted = true; _currentModel = null; return null; } private LevelUpFormRawData BuildModel(int refreshPrice, int count) { if (_allRewards == null || _allRewards.Length == 0) { Log.Error("LevelUpFormUseCase::BuildModel(): _allRewards is empty"); return null; } int finalCount = count > 0 ? System.Math.Min(count, _allRewards.Length) : _allRewards.Length; List selections = new List(finalCount); int currentLevel = _player != null ? _player.CurrentLevel : 1; for (int i = 0; i < finalCount; i++) { ItemRarity rarity = RarityUtility.SelectRarityForLevel(_levelRarityTable, currentLevel); DRLevelUpReward reward = PickRewardByRarity(rarity); if (reward == null) { Log.Warning("LevelUpFormUseCase::BuildModel(): No available reward for selection."); break; } selections.Add(reward); } return new LevelUpFormRawData { Rewards = selections, RefreshPrice = refreshPrice }; } private void ApplyReward(DRLevelUpReward reward) { if (reward == null) { return; } if (_player == null) { Log.Warning("LevelUpFormUseCase::ApplyReward: Player is null"); return; } if (reward.Modifiers == null || reward.Modifiers.Length == 0) { Log.Warning("LevelUpFormUseCase::ApplyReward: Reward modifiers are empty"); return; } _player.AddProp(new PropItem(reward.Modifiers, reward.Rarity, reward.Title, reward.IconAssetName)); } private void BuildRewardRarityPools() { _rewardsByRarity.Clear(); _validRewards.Clear(); if (_allRewards == null) return; foreach (DRLevelUpReward reward in _allRewards) { if (reward == null) { continue; } ItemRarity rarity = reward.Rarity; _validRewards.Add(reward); if (!_rewardsByRarity.TryGetValue(rarity, out List list)) { list = new List(); _rewardsByRarity.Add(rarity, list); } list.Add(reward); } } private DRLevelUpReward PickRewardByRarity(ItemRarity rarity) { if (_rewardsByRarity.TryGetValue(rarity, out List list) && list.Count > 0) { return list[Random.Range(0, list.Count)]; } if (_validRewards.Count > 0) { return _validRewards[Random.Range(0, _validRewards.Count)]; } return null; } } }