using System.Collections.Generic; using BriarQueen.Framework.Managers.Player.Data; using UnityEngine; namespace BriarQueen.Framework.Registries { [CreateAssetMenu(menuName = "Briar Queen/Registries/Item Registry", fileName = "New Item Registry")] public class ItemRegistry : ScriptableObject { [Header("Items")] [SerializeField] private List _puzzleSlots = new(); [SerializeField] private List _pickupItems = new(); [SerializeField] private List _environmentInteractables = new(); private Dictionary _entryLookup; public IReadOnlyList PuzzleSlots => _puzzleSlots; public IReadOnlyList PickupItems => _pickupItems; public IReadOnlyList EnvironmentInteractables => _environmentInteractables; public void EnsureInitialized() { if (_entryLookup != null) return; RebuildLookup(); } public void RebuildLookup() { _entryLookup = new Dictionary(); AddEntries(_puzzleSlots, "Puzzle Slots"); AddEntries(_pickupItems, "Pickup Items"); AddEntries(_environmentInteractables, "Environment Interactables"); } private void AddEntries(List entries, string category) { if (entries == null) return; foreach (var entry in entries) { if (entry == null) continue; if (string.IsNullOrWhiteSpace(entry.UniqueID)) { Debug.LogWarning( $"[ItemRegistry] Skipping {category} entry '{entry.name}' because UniqueID is empty.", this); continue; } if (_entryLookup.ContainsKey(entry.UniqueID)) { Debug.LogError( $"[ItemRegistry] Duplicate UniqueID detected: '{entry.UniqueID}' from entry '{entry.name}'.", this); continue; } _entryLookup.Add(entry.UniqueID, entry); } } public bool TryGetEntry(string itemID, out ItemDataSo entry) { EnsureInitialized(); if (string.IsNullOrWhiteSpace(itemID)) { entry = null; return false; } return _entryLookup.TryGetValue(itemID, out entry); } public ItemDataSo FindItemTemplateByID(string itemID) { EnsureInitialized(); return string.IsNullOrWhiteSpace(itemID) ? null : _entryLookup.GetValueOrDefault(itemID); } public IEnumerable GetAllItems() { EnsureInitialized(); return _entryLookup.Values; } public IEnumerable GetAllKeys() { EnsureInitialized(); return _entryLookup.Keys; } public IEnumerable GetPuzzleSlots() { return _puzzleSlots; } public IEnumerable GetPickupItems() { return _pickupItems; } public IEnumerable GetEnvironmentInteractables() { return _environmentInteractables; } #if UNITY_EDITOR public void SetDiscoveredEntries( List puzzleSlots, List pickupItems, List environmentInteractables) { _puzzleSlots = puzzleSlots ?? new List(); _pickupItems = pickupItems ?? new List(); _environmentInteractables = environmentInteractables ?? new List(); RebuildLookup(); } #endif } }