From 37164ea62d4be6fc71f8fc1344035331d5ab62aa Mon Sep 17 00:00:00 2001 From: wuwenbo Date: Thu, 2 Jul 2026 14:26:40 +0800 Subject: [PATCH] Validate culture card purchase limits --- Unity/Assets/Scripts/TH1_Data/PlayerData.cs | 30 +++++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/Unity/Assets/Scripts/TH1_Data/PlayerData.cs b/Unity/Assets/Scripts/TH1_Data/PlayerData.cs index 7fe0a2634..d66a417aa 100644 --- a/Unity/Assets/Scripts/TH1_Data/PlayerData.cs +++ b/Unity/Assets/Scripts/TH1_Data/PlayerData.cs @@ -2301,10 +2301,7 @@ namespace RuntimeData // 购买文化卡 public bool TryBuyCultureCard(MapData map, PlayerData player, CultureCardType cardType) { - if (!Table.Instance.CultureCardDataAssets.GetCultureCardInfo(cardType, out var info)) return false; - if (!info.CheckEmpireCanUseCard(player.Empire)) return false; - if (!info.CheckPrerequisiteCardsOwned(player)) return false; - if (!info.CheckPlayerCanAfford(player)) return false; + if (!CheckCanBuyCultureCard(map, player, cardType, out var info)) return false; info.SpendCost(player); CultureCardList.Add(cardType); var card = CultureCardFactory.GetCultureCardBase(cardType); @@ -2316,12 +2313,35 @@ namespace RuntimeData // 能否购买文化卡 public bool CheckCanBuyCultureCard(MapData map, PlayerData player, CultureCardType cardType) { - if (!Table.Instance.CultureCardDataAssets.GetCultureCardInfo(cardType, out var info)) return false; + return CheckCanBuyCultureCard(map, player, cardType, out _); + } + + private bool CheckCanBuyCultureCard(MapData map, PlayerData player, CultureCardType cardType, out CultureCardInfo info) + { + info = null; + var dataAssets = Table.Instance?.CultureCardDataAssets; + if (dataAssets == null || !dataAssets.GetCultureCardInfo(cardType, out info)) return false; + if (player == null) return false; + if (info.NotShow) return false; + var ownedCount = GetCultureCardOwnedCount(cardType); + if (info.MaxCount > 0 && ownedCount >= info.MaxCount) return false; if (!info.CheckEmpireCanUseCard(player.Empire)) return false; if (!info.CheckPrerequisiteCardsOwned(player)) return false; if (!info.CheckPlayerCanAfford(player)) return false; return true; } + + private int GetCultureCardOwnedCount(CultureCardType cardType) + { + var count = 0; + if (CultureCardList == null) return count; + foreach (var ownedCardType in CultureCardList) + { + if (ownedCardType == cardType) count++; + } + + return count; + } public void OnTurnStart(MapData map, PlayerData player) {