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
}