TH1/Unity/Assets/Scripts/TH1_DataAssetsScript/CultureCardDataAssets.cs
2026-06-05 22:50:45 +08:00

289 lines
8.8 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.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<EmpireGridSpInfoPack> 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<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;
[Tooltip("是否激活关联的Action")]
public bool EnableAction;
[Tooltip("激活的ActionId列表")]
public List<CommonActionId> EnableActions = new List<CommonActionId>();
// 检查指定文明是否可以使用
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<CultureCardInfo> CultureCardDataList = new List<CultureCardInfo>();
[Header("文化任务数据列表")]
[Tooltip("文化任务的多语言文案与展示数据")]
public List<CultureTaskInfo> CultureTaskDataList = new List<CultureTaskInfo>();
// 运行时缓存字典
[NonSerialized] private Dictionary<CultureCardType, CultureCardInfo> _cardInfoDict;
[NonSerialized] private Dictionary<MomentSubType, CultureTaskInfo> _cultureTaskInfoDict;
[NonSerialized] private bool _initialized = false;
/// <summary>
/// 延迟初始化,将列表转换为字典以提高查询效率
/// </summary>
public void Init()
{
if (_initialized && _cardInfoDict != null && _cultureTaskInfoDict != null) 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;
}
_cultureTaskInfoDict = new Dictionary<MomentSubType, CultureTaskInfo>();
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;
}
/// <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;
}
public bool GetCultureTaskInfo(MomentSubType taskType, out CultureTaskInfo taskInfo)
{
Init();
return _cultureTaskInfoDict.TryGetValue(taskType, out taskInfo) && taskInfo.IsActive;
}
}