using Kryz.CharacterStats.Examples; using System.Collections; using System.Collections.Generic; using UnityEngine; [System.Serializable] public class WeightedDrop { public Item drop; public float weight; public DifficultyLevels lowestPossibleDifficulty; public DifficultyLevels highestPossibleDifficulty; public int LowestDifficultyDrop => (int)lowestPossibleDifficulty; public int HighestDifficultyDrop => (int)highestPossibleDifficulty; public WeightedDrop(Item item, float weight) { this.drop = item; this.weight = weight; lowestPossibleDifficulty = DifficultyLevels.E; highestPossibleDifficulty = DifficultyLevels.SS; } public WeightedDrop(Item item, float weight, DifficultyLevels lowestPossibleDifficulty, DifficultyLevels highestPossibleDifficulty) { this.drop = item; this.weight = weight; this.lowestPossibleDifficulty = lowestPossibleDifficulty; this.highestPossibleDifficulty = highestPossibleDifficulty; } public static bool HaveDropsForDifficulty(List table, int difficulty) { for (int i = 0; i < table.Count; i++) { if (table[i].LowestDifficultyDrop <= difficulty && table[i].HighestDifficultyDrop >= difficulty) return true; } return false; } public static bool HaveDropsForDifficulty(List table, DifficultyLevels difficulty) { for (int i = 0; i < table.Count; i++) { if (table[i].lowestPossibleDifficulty <= difficulty && table[i].highestPossibleDifficulty >= difficulty) return true; } return false; } public static Item GetRandomDrop(List items) { float totalWeight = 0; foreach (var weightedItem in items) { totalWeight += weightedItem.weight; } float randomValue = UnityEngine.Random.Range(0f, totalWeight); float currentWeight = 0; foreach (var weightedItem in items) { currentWeight += weightedItem.weight; if (randomValue <= currentWeight) { return weightedItem.drop; } } // This should never happen if the weights are set up correctly Debug.LogWarning("No item selected in weighted drop system. Returning default value."); return null; } public static Item GetRandomDrop(List items, DifficultyLevels currentDifficulty) { float totalWeight = 0; // First pass: calculate total weight only for items within difficulty range foreach (var weightedItem in items) { if (weightedItem.lowestPossibleDifficulty <= currentDifficulty && weightedItem.highestPossibleDifficulty >= currentDifficulty) { totalWeight += weightedItem.weight; } } if (totalWeight <= 0) { Debug.LogWarning($"No items available for difficulty level {currentDifficulty}. Returning null."); return null; } float randomValue = UnityEngine.Random.Range(0f, totalWeight); float currentWeight = 0; // Second pass: select item only from those within difficulty range foreach (var weightedItem in items) { if (weightedItem.lowestPossibleDifficulty <= currentDifficulty && weightedItem.highestPossibleDifficulty >= currentDifficulty) { currentWeight += weightedItem.weight; if (randomValue <= currentWeight) { return weightedItem.drop; } } } Debug.LogWarning("No item selected in weighted drop system. Returning null."); return null; } public static Item GetRandomDrop(List items, int currentDifficulty) { float totalWeight = 0; // First pass: calculate total weight only for items within difficulty range foreach (var weightedItem in items) { if (weightedItem.LowestDifficultyDrop <= currentDifficulty && weightedItem.HighestDifficultyDrop >= currentDifficulty) { totalWeight += weightedItem.weight; } } if (totalWeight <= 0) { Debug.LogWarning($"No items available for difficulty level {currentDifficulty}. Returning null."); return null; } float randomValue = UnityEngine.Random.Range(0f, totalWeight); float currentWeight = 0; // Second pass: select item only from those within difficulty range foreach (var weightedItem in items) { if (weightedItem.LowestDifficultyDrop <= currentDifficulty && weightedItem.HighestDifficultyDrop >= currentDifficulty) { currentWeight += weightedItem.weight; if (randomValue <= currentWeight) { return weightedItem.drop; } } } Debug.LogWarning("No item selected in weighted drop system. Returning null."); return null; } }