using System; using System.Collections.Generic; using Logic.Action; using Logic.Multilingual; using RuntimeData; using UnityEngine; // 市政卡类型枚举,支持扩展 public enum CultureType { None, HeroCard, // 英雄卡 MonumentCard, // 纪念碑卡 AdvancedCard, // 进阶卡 Max // 用于标记最大值,方便后续扩展 } // 市政卡唯一标识符枚举,Data Asset用到,不能随意修改顺序! public enum CultureCardType { None, // ===== HeroCard 类型 ===== // 可根据需要添加具体的英雄卡 SecondHero, ThirdHero, // ===== MonumentCard 类型 ===== // 可根据需要添加具体的纪念碑卡 MonumentForest, // 纪念碑卡-森林,消耗15文化值 MonumentShallow, // 纪念碑卡-浅海,消耗30文化值 MonumentMountain, // 纪念碑卡-山脉,消耗30文化值 MonumentDeepSea, // 纪念碑卡-深海,消耗60文化值 MonumentPlain, // 纪念碑卡-平地,消耗60文化值 // ===== AdvancedCard 类型 ===== AdvancedHeroEnhance, // 通用卡1-英雄强化:英雄相关所有消耗打1折 AdvancedMilitaryEnhance, // 通用卡2-军事强化:文化值可以购买巨人 AdvancedEconomyEnhance, // 通用卡3-经济强化:1回合文化值=1回合金币 AdvancedScarletMansion, // 特色卡1-红魔馆 AdvancedEientei, // 特色卡2-永远亭 AdvancedMoriya, // 特色卡3-守矢 AdvancedPalaceOfEarth, // 特色卡4-地灵殿 Max } [Serializable] public class CultureCardInfo { [Tooltip("市政卡唯一标识")] public CultureCardType CardType; [Tooltip("市政卡类型分类")] public CultureType CultureType; [Tooltip("是否启用该卡片")] public bool IsActive = true; [MultilingualField] [Tooltip("卡片名称(支持多语言)")] public string Name; [MultilingualField] [Tooltip("卡片描述(支持多语言)")] public string Description; [Tooltip("卡片消耗成本")] public int Cost; [Tooltip("卡片图标")] public Sprite Icon; [Tooltip("图标显示尺寸类型")] public IconViewSizeType IconViewSizeType; [Tooltip("是否使用阵营变体图标")] public bool VarientIcon; [Tooltip("阵营变体图标列表")] public List IconList; public Sprite GetIcon(CivEnum civEnum, ForceEnum forceEnum) { return GetIcon(Table.Instance.TransCivEnumToCivId(civEnum), Table.Instance.TransForceEnumToForceId(forceEnum)); } public Sprite GetIcon(uint civId, uint forceId) { if (!VarientIcon) return Icon; foreach (var t in IconList) { if ((t.IgnoreCivId || t.CivId == civId) && (t.IgnoreForceId || t.ForceId == forceId)) return t.Sprite; } return Icon; } [Tooltip("是否解锁/可购买该卡片的前提科技要求(可为空)")] public List RequiredTechs = new List(); [Tooltip("是否仅限特定文明使用(可为空,表示全文明可用)")] public List LimitedEmpires = new List(); [Tooltip("是否存在前置卡片")] public List PrerequisiteCards = new List(); [Tooltip("卡片最大可拥有数量(-1表示无限)")] public int MaxCount = -1; [Tooltip("卡片优先级(用于排序显示)")] public int Priority = 0; [Tooltip("是否激活关联的Action")] public bool EnableAction; [Tooltip("激活的ActionId列表")] public List EnableActions = new List(); // 检查指定文明是否可以使用 public bool CheckEmpireCanUseCard(Empire empire) { return LimitedEmpires.Count == 0 || LimitedEmpires.Contains(empire); } // 检查前置市政卡是否满足 public bool CheckPrerequisiteCardsOwned(PlayerData player) { foreach (var prereq in PrerequisiteCards) { if (!player.PlayerCultureInfo.CultureCardList.Contains(prereq)) return false; } return true; } } [CreateAssetMenu(fileName = "CultureCardDataAssets", menuName = "TH1 Game Data/CultureCard Data Asset")] public class CultureCardDataAssets : ScriptableObject { [Header("市政卡数据列表")] [Tooltip("所有市政卡的基础配置数据")] public List CultureCardDataList = new List(); // 运行时缓存字典 [NonSerialized] private Dictionary _cardInfoDict; [NonSerialized] private bool _initialized = false; /// /// 延迟初始化,将列表转换为字典以提高查询效率 /// public void Init() { if (_initialized && _cardInfoDict != null) return; _cardInfoDict = new Dictionary(); foreach (var cardInfo in CultureCardDataList) { if (cardInfo.CardType == CultureCardType.None) continue; if (_cardInfoDict.ContainsKey(cardInfo.CardType)) { Debug.LogWarning($"[CultureCardDataAssets] 重复的卡片类型: {cardInfo.CardType}"); continue; } _cardInfoDict[cardInfo.CardType] = cardInfo; } _initialized = true; } /// /// 获取指定市政卡的详细信息 /// /// 市政卡类型 /// 输出卡片信息 /// 是否成功找到该卡片 public bool GetCultureCardInfo(CultureCardType cardType, out CultureCardInfo cardInfo) { Init(); return _cardInfoDict.TryGetValue(cardType, out cardInfo) && cardInfo.IsActive; } }