221 lines
6.4 KiB
C#
221 lines
6.4 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using Logic.Multilingual;
|
||
using UnityEngine;
|
||
|
||
|
||
// 市政卡类型枚举,支持扩展
|
||
public enum CultureType
|
||
{
|
||
None,
|
||
HeroCard, // 英雄卡
|
||
MonumentCard, // 纪念碑卡
|
||
AdvancedCard, // 进阶卡
|
||
Max // 用于标记最大值,方便后续扩展
|
||
}
|
||
|
||
|
||
// 市政卡唯一标识符枚举,Data Asset用到,不能随意修改顺序!
|
||
public enum CultureCardType
|
||
{
|
||
None,
|
||
|
||
// ===== HeroCard 类型 =====
|
||
// 可根据需要添加具体的英雄卡
|
||
|
||
// ===== MonumentCard 类型 =====
|
||
// 可根据需要添加具体的纪念碑卡
|
||
|
||
// ===== AdvancedCard 类型 =====
|
||
// 可根据需要添加具体的进阶卡
|
||
|
||
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<CivEnum> LimitedCivs = new List<CivEnum>();
|
||
|
||
[Tooltip("卡片最大可拥有数量(-1表示无限)")]
|
||
public int MaxCount = -1;
|
||
|
||
[Tooltip("卡片优先级(用于排序显示)")]
|
||
public int Priority = 0;
|
||
}
|
||
|
||
|
||
[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;
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 获取指定市政卡的名称
|
||
/// </summary>
|
||
public string GetCultureCardName(CultureCardType cardType)
|
||
{
|
||
if (GetCultureCardInfo(cardType, out var info))
|
||
return info.Name;
|
||
return string.Empty;
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 获取指定市政卡的描述
|
||
/// </summary>
|
||
public string GetCultureCardDesc(CultureCardType cardType)
|
||
{
|
||
if (GetCultureCardInfo(cardType, out var info))
|
||
return info.Description;
|
||
return string.Empty;
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 获取指定市政卡的成本
|
||
/// </summary>
|
||
public int GetCultureCardCost(CultureCardType cardType)
|
||
{
|
||
if (GetCultureCardInfo(cardType, out var info))
|
||
return info.Cost;
|
||
return 0;
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 获取指定类型的所有市政卡
|
||
/// </summary>
|
||
/// <param name="cultureType">市政卡类型</param>
|
||
/// <returns>该类型的所有卡片列表</returns>
|
||
public List<CultureCardInfo> GetCardsByCultureType(CultureType cultureType)
|
||
{
|
||
var result = new List<CultureCardInfo>();
|
||
foreach (var cardInfo in CultureCardDataList)
|
||
{
|
||
if (cardInfo.CultureType == cultureType && cardInfo.IsActive)
|
||
result.Add(cardInfo);
|
||
}
|
||
result.Sort((a, b) => a.Priority.CompareTo(b.Priority));
|
||
return result;
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 获取指定文明可用的所有市政卡
|
||
/// </summary>
|
||
/// <param name="civ">文明类型</param>
|
||
/// <returns>该文明可用的所有卡片列表</returns>
|
||
public List<CultureCardInfo> GetCardsByCiv(CivEnum civ)
|
||
{
|
||
var result = new List<CultureCardInfo>();
|
||
foreach (var cardInfo in CultureCardDataList)
|
||
{
|
||
if (!cardInfo.IsActive) continue;
|
||
// 如果LimitedCivs为空或包含指定文明,则该文明可用
|
||
if (cardInfo.LimitedCivs.Count == 0 || cardInfo.LimitedCivs.Contains(civ))
|
||
result.Add(cardInfo);
|
||
}
|
||
result.Sort((a, b) => a.Priority.CompareTo(b.Priority));
|
||
return result;
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 检查指定文明是否可以使用某张卡
|
||
/// </summary>
|
||
public bool CheckCivCanUseCard(CivEnum civ, CultureCardType cardType)
|
||
{
|
||
if (!GetCultureCardInfo(cardType, out var info)) return false;
|
||
return info.LimitedCivs.Count == 0 || info.LimitedCivs.Contains(civ);
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 获取所有激活的市政卡
|
||
/// </summary>
|
||
public List<CultureCardInfo> GetAllActiveCards()
|
||
{
|
||
var result = new List<CultureCardInfo>();
|
||
foreach (var cardInfo in CultureCardDataList)
|
||
{
|
||
if (cardInfo.IsActive)
|
||
result.Add(cardInfo);
|
||
}
|
||
result.Sort((a, b) => a.Priority.CompareTo(b.Priority));
|
||
return result;
|
||
}
|
||
}
|