using System; using System.Collections.Generic; using Core; using UnityEngine; namespace AppleHills.Data.CardSystem { /// /// ScriptableObject containing visual configuration for card display /// Maps card rarities to frames/overlays and zones to backgrounds/shapes /// [CreateAssetMenu(fileName = "CardVisualConfig", menuName = "AppleHills/Card System/Visual Config")] public class CardVisualConfig : ScriptableObject { [Serializable] public class RarityVisualMapping { public CardRarity rarity; [Tooltip("Frame image for this rarity")] public Sprite frame; [Tooltip("Overlay image for this rarity (can be null)")] public Sprite overlay; } [Serializable] public class ZoneVisualMapping { public CardZone zone; [Tooltip("Background image for this zone")] public Sprite background; [Tooltip("Shape sprite for Normal rarity cards in this zone")] public Sprite shapeNormal; [Tooltip("Shape sprite for Rare rarity cards in this zone")] public Sprite shapeRare; } [Header("Rarity Configuration")] [Tooltip("Visual mappings for different card rarities (frames and overlays)")] [SerializeField] private List rarityVisuals = new List(); [Header("Zone Configuration")] [Tooltip("Visual mappings for different card zones (backgrounds and shapes)")] [SerializeField] private List zoneVisuals = new List(); [Header("Legendary Override")] [Tooltip("Background used for all Legendary cards, regardless of zone")] [SerializeField] private Sprite legendaryBackground; private Dictionary _rarityLookup; private Dictionary _zoneLookup; /// /// Initialize the lookup dictionaries when the asset is loaded /// private void OnEnable() { InitializeLookups(); } /// /// Builds the lookup dictionaries from the serialized lists /// private void InitializeLookups() { // Build rarity visual lookup _rarityLookup = new Dictionary(); foreach (var mapping in rarityVisuals) { _rarityLookup[mapping.rarity] = mapping; } // Build zone visual lookup _zoneLookup = new Dictionary(); foreach (var mapping in zoneVisuals) { _zoneLookup[mapping.zone] = mapping; } } /// /// Get the frame sprite for a specific card rarity /// public Sprite GetRarityFrame(CardRarity rarity) { if (_rarityLookup == null) InitializeLookups(); if (_rarityLookup.TryGetValue(rarity, out RarityVisualMapping mapping)) { return mapping.frame; } Logging.Warning($"[CardVisualConfig] No frame mapping found for rarity {rarity}"); return null; } /// /// Get the overlay sprite for a specific card rarity (can be null) /// public Sprite GetRarityOverlay(CardRarity rarity) { if (_rarityLookup == null) InitializeLookups(); if (_rarityLookup.TryGetValue(rarity, out RarityVisualMapping mapping)) { return mapping.overlay; } return null; } /// /// Get the background sprite for a card based on zone and rarity /// Legendary cards always use the legendary background override /// public Sprite GetBackground(CardZone zone, CardRarity rarity) { if (_zoneLookup == null) InitializeLookups(); // Legendary cards use special background if (rarity == CardRarity.Legendary) { return legendaryBackground; } // Normal and Rare cards use zone background if (_zoneLookup.TryGetValue(zone, out ZoneVisualMapping mapping)) { return mapping.background; } Logging.Warning($"[CardVisualConfig] No background mapping found for zone {zone}"); return null; } /// /// Get the shape sprite for a card based on zone and rarity /// Legendary cards don't display shapes (returns null) /// public Sprite GetZoneShape(CardZone zone, CardRarity rarity) { if (_zoneLookup == null) InitializeLookups(); // Legendary cards don't have shapes if (rarity == CardRarity.Legendary) { return null; } if (_zoneLookup.TryGetValue(zone, out ZoneVisualMapping mapping)) { // Return shape based on rarity return rarity == CardRarity.Rare ? mapping.shapeRare : mapping.shapeNormal; } Logging.Warning($"[CardVisualConfig] No shape mapping found for zone {zone}"); return null; } #if UNITY_EDITOR /// /// Editor-only utility to initialize the config with default structure /// public void InitializeDefaults() { // Clear existing mappings rarityVisuals.Clear(); zoneVisuals.Clear(); // Add entries for all rarities foreach (CardRarity rarity in Enum.GetValues(typeof(CardRarity))) { rarityVisuals.Add(new RarityVisualMapping { rarity = rarity }); } // Add entries for all zones foreach (CardZone zone in Enum.GetValues(typeof(CardZone))) { zoneVisuals.Add(new ZoneVisualMapping { zone = zone }); } // Initialize the lookups InitializeLookups(); } #endif } #if UNITY_EDITOR [UnityEditor.CustomEditor(typeof(CardVisualConfig))] public class CardVisualConfigEditor : UnityEditor.Editor { public override void OnInspectorGUI() { DrawDefaultInspector(); CardVisualConfig config = (CardVisualConfig)target; UnityEditor.EditorGUILayout.Space(); if (GUILayout.Button("Initialize Default Structure")) { config.InitializeDefaults(); UnityEditor.EditorUtility.SetDirty(config); } } } #endif }