TH1/Unity/Assets/Scripts/TH1_DataAssetsScript/CultureCardDataAssets.cs
2026-03-11 18:56:38 +08:00

221 lines
6.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}