TH1/Unity/Assets/Scripts/TH1_DataAssetsScript/CultureCardDataAssets.cs
2026-03-17 15:21:38 +08:00

161 lines
4.9 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 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;
}
}