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 colors and zones to colors/shapes /// [CreateAssetMenu(fileName = "CardVisualConfig", menuName = "AppleHills/Card System/Visual Config")] public class CardVisualConfig : ScriptableObject { [Serializable] public class RarityColorMapping { public CardRarity rarity; public Color color = Color.white; } [Serializable] public class ZoneVisualMapping { public CardZone zone; public Color color = Color.white; public Sprite backgroundShape; } [Header("Rarity Configuration")] [Tooltip("Color mappings for different card rarities")] [SerializeField] private List rarityColors = new List(); [Header("Zone Configuration")] [Tooltip("Visual mappings for different card zones")] [SerializeField] private List zoneVisuals = new List(); private Dictionary _rarityColorLookup; private Dictionary _zoneColorLookup; private Dictionary _zoneShapeLookup; /// /// 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 color lookup _rarityColorLookup = new Dictionary(); foreach (var mapping in rarityColors) { _rarityColorLookup[mapping.rarity] = mapping.color; } // Build zone color and shape lookups _zoneColorLookup = new Dictionary(); _zoneShapeLookup = new Dictionary(); foreach (var mapping in zoneVisuals) { _zoneColorLookup[mapping.zone] = mapping.color; _zoneShapeLookup[mapping.zone] = mapping.backgroundShape; } } /// /// Get the color for a specific card rarity /// public Color GetRarityColor(CardRarity rarity) { // Initialize lookups if needed if (_rarityColorLookup == null) { InitializeLookups(); } // Return the color if found, otherwise white if (_rarityColorLookup.TryGetValue(rarity, out Color color)) { return color; } Logging.Warning($"[CardVisualConfig] No color mapping found for rarity {rarity}, using default"); return Color.white; } /// /// Get the color for a specific card zone /// public Color GetZoneColor(CardZone zone) { // Initialize lookups if needed if (_zoneColorLookup == null) { InitializeLookups(); } // Return the color if found, otherwise white if (_zoneColorLookup.TryGetValue(zone, out Color color)) { return color; } Logging.Warning($"[CardVisualConfig] No color mapping found for zone {zone}, using default"); return Color.white; } /// /// Get the background shape sprite for a specific zone /// public Sprite GetZoneShape(CardZone zone) { // Initialize lookups if needed if (_zoneShapeLookup == null) { InitializeLookups(); } // Return the sprite if found, otherwise null if (_zoneShapeLookup.TryGetValue(zone, out Sprite sprite)) { return sprite; } Logging.Warning($"[CardVisualConfig] No shape mapping found for zone {zone}"); return null; } #if UNITY_EDITOR /// /// Editor-only utility to reset the config with default values /// public void ResetWithDefaults() { // Clear existing mappings rarityColors.Clear(); zoneVisuals.Clear(); // Add default rarity colors rarityColors.Add(new RarityColorMapping { rarity = CardRarity.Common, color = Color.gray }); rarityColors.Add(new RarityColorMapping { rarity = CardRarity.Uncommon, color = Color.green }); rarityColors.Add(new RarityColorMapping { rarity = CardRarity.Rare, color = Color.blue }); rarityColors.Add(new RarityColorMapping { rarity = CardRarity.Epic, color = new Color(0.5f, 0, 0.5f) }); rarityColors.Add(new RarityColorMapping { rarity = CardRarity.Legendary, color = Color.yellow }); // Add default zone colors zoneVisuals.Add(new ZoneVisualMapping { zone = CardZone.AppleHills, color = new Color(0.8f, 0.9f, 0.8f) }); zoneVisuals.Add(new ZoneVisualMapping { zone = CardZone.Quarry, color = new Color(0.85f, 0.8f, 0.7f) }); zoneVisuals.Add(new ZoneVisualMapping { zone = CardZone.Forest, color = new Color(0.6f, 0.8f, 0.6f) }); zoneVisuals.Add(new ZoneVisualMapping { zone = CardZone.Mountain, color = new Color(0.7f, 0.7f, 0.9f) }); zoneVisuals.Add(new ZoneVisualMapping { zone = CardZone.Beach, color = new Color(0.9f, 0.85f, 0.7f) }); // 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("Reset with Defaults")) { config.ResetWithDefaults(); UnityEditor.EditorUtility.SetDirty(config); } } } #endif }