161 lines
4.9 KiB
C#
161 lines
4.9 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
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 List<TechType> RequiredTechs = new List<TechType>();
|
||
|
||
[Tooltip("是否仅限特定文明使用(可为空,表示全文明可用)")]
|
||
public List<Empire> LimitedEmpires = new List<Empire>();
|
||
|
||
[Tooltip("是否存在前置卡片")]
|
||
public List<CultureCardType> PrerequisiteCards = new List<CultureCardType>();
|
||
|
||
[Tooltip("卡片最大可拥有数量(-1表示无限)")]
|
||
public int MaxCount = -1;
|
||
|
||
[Tooltip("卡片优先级(用于排序显示)")]
|
||
public int Priority = 0;
|
||
|
||
|
||
// 检查指定文明是否可以使用
|
||
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<CultureCardInfo> CultureCardDataList = new List<CultureCardInfo>();
|
||
|
||
|
||
// 运行时缓存字典
|
||
private Dictionary<CultureCardType, CultureCardInfo> _cardInfoDict;
|
||
private bool _initialized = false;
|
||
|
||
|
||
/// <summary>
|
||
/// 延迟初始化,将列表转换为字典以提高查询效率
|
||
/// </summary>
|
||
public void Init()
|
||
{
|
||
if (_initialized) return;
|
||
|
||
_cardInfoDict = new Dictionary<CultureCardType, CultureCardInfo>();
|
||
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;
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 获取指定市政卡的详细信息
|
||
/// </summary>
|
||
/// <param name="cardType">市政卡类型</param>
|
||
/// <param name="cardInfo">输出卡片信息</param>
|
||
/// <returns>是否成功找到该卡片</returns>
|
||
public bool GetCultureCardInfo(CultureCardType cardType, out CultureCardInfo cardInfo)
|
||
{
|
||
Init();
|
||
return _cardInfoDict.TryGetValue(cardType, out cardInfo) && cardInfo.IsActive;
|
||
}
|
||
}
|