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 CultureCardCostType { Culture, Coin } 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-地灵殿 // ===== HeroCard Lv2/Lv3 类型 (NotShow) ===== Lv2Hero, Lv3Hero, Max } [Serializable] public class CultureCardInfo { [Tooltip("市政卡唯一标识")] public CultureCardType CardType; [Tooltip("市政卡类型分类")] public CultureType CultureType; [Tooltip("是否启用该卡片")] public bool IsActive = true; [Tooltip("是否在UI中显示(false=显示,true=隐藏)")] public bool NotShow; [MultilingualField] [Tooltip("卡片名称(支持多语言)")] public string Name; [MultilingualField] [Tooltip("卡片描述(支持多语言)")] public string Description; [Tooltip("卡片消耗成本")] public int Cost; [Tooltip("购买该法典消耗的资源类型")] public CultureCardCostType BuyCostType = CultureCardCostType.Culture; [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; } public int GetPlayerCostResource(PlayerData player) { if (player == null) return 0; return BuyCostType == CultureCardCostType.Coin ? player.PlayerCoin : player.PlayerCultureInfo.PlayerCulture; } public bool CheckPlayerCanAfford(PlayerData player) { return GetPlayerCostResource(player) >= Cost; } public void SpendCost(PlayerData player) { if (player == null) return; if (BuyCostType == CultureCardCostType.Coin) player.SpendCoin(Cost); else player.AddCulturePoint(-Cost); } [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; } } [Serializable] public class CultureTaskInfo { [Tooltip("文化任务标识,对应 MomentItemBase.GetMomentSubType()")] public MomentSubType TaskType; [Tooltip("是否启用该文化任务文案")] public bool IsActive = true; [MultilingualField] [Tooltip("文化任务名称")] public string Name; [MultilingualField] [Tooltip("文化任务描述")] public string Description; [Tooltip("文化任务对应的奇观类型")] public WonderTypeEnum WonderType; [Tooltip("文化任务奖励文化值,仅用于展示,实际奖励仍由 MomentItemBase 控制")] public int CultureValue = 5; [Tooltip("文化任务是否由科技解锁")] public bool LockByTech; [MultilingualField] [Tooltip("文化任务锁定时的描述")] public string LockText; [Tooltip("排序优先级,数值越小越靠前")] public int Priority = 0; } [CreateAssetMenu(fileName = "CultureCardDataAssets", menuName = "TH1 Game Data/CultureCard Data Asset")] public class CultureCardDataAssets : ScriptableObject { [Header("市政卡数据列表")] [Tooltip("所有市政卡的基础配置数据")] public List CultureCardDataList = new List(); [Header("文化任务数据列表")] [Tooltip("文化任务的多语言文案与展示数据")] public List CultureTaskDataList = new List(); // 运行时缓存字典 [NonSerialized] private Dictionary _cardInfoDict; [NonSerialized] private Dictionary _cultureTaskInfoDict; [NonSerialized] private bool _initialized = false; /// /// 延迟初始化,将列表转换为字典以提高查询效率 /// public void Init() { if (_initialized && _cardInfoDict != null && _cultureTaskInfoDict != 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; } _cultureTaskInfoDict = new Dictionary(); foreach (var taskInfo in CultureTaskDataList) { if (taskInfo.TaskType == MomentSubType.None) continue; if (_cultureTaskInfoDict.ContainsKey(taskInfo.TaskType)) { Debug.LogWarning($"[CultureCardDataAssets] 重复的文化任务类型: {taskInfo.TaskType}"); continue; } _cultureTaskInfoDict[taskInfo.TaskType] = taskInfo; } _initialized = true; } /// /// 获取指定市政卡的详细信息 /// /// 市政卡类型 /// 输出卡片信息 /// 是否成功找到该卡片 public bool GetCultureCardInfo(CultureCardType cardType, out CultureCardInfo cardInfo) { Init(); return _cardInfoDict.TryGetValue(cardType, out cardInfo) && cardInfo.IsActive; } public bool GetCultureTaskInfo(MomentSubType taskType, out CultureTaskInfo taskInfo) { Init(); return _cultureTaskInfoDict.TryGetValue(taskType, out taskInfo) && taskInfo.IsActive; } }