/* * @Author: 白哉 * @Description: * @Date: 2026年03月16日 星期一 17:03:45 * @Modify: */ using System; using System.Collections.Generic; using System.Reflection; using MemoryPack; namespace RuntimeData { public class CultureCardFactory { private static Dictionary _cardDict; public static CultureCardBase GetCultureCardBase(CultureCardType cardType) { if (_cardDict == null) { _cardDict = new Dictionary(); Assembly assembly = typeof(CultureCardBase).Assembly; // 获取基类所在程序集 foreach (Type classType in assembly.GetTypes()) { if (classType.IsSubclassOf(typeof(CultureCardBase)) && !classType.IsAbstract) { var obj = Activator.CreateInstance(classType); var cardBase = obj as CultureCardBase; if (cardBase == null) continue; _cardDict[cardBase.GetCardType()] = classType; } } } if (_cardDict.TryGetValue(cardType, out var cardBaseClass)) { return Activator.CreateInstance(cardBaseClass) as CultureCardBase; } return null; } } [MemoryPackable] [MemoryPackUnion(1, typeof(SecondHeroCultureCard))] [MemoryPackUnion(2, typeof(ThirdHeroCultureCard))] [MemoryPackUnion(3, typeof(MonumentForestCultureCard))] [MemoryPackUnion(4, typeof(MonumentShallowCultureCard))] [MemoryPackUnion(5, typeof(MonumentMountainCultureCard))] [MemoryPackUnion(6, typeof(MonumentDeepSeaCultureCard))] [MemoryPackUnion(7, typeof(MonumentPlainCultureCard))] [MemoryPackUnion(8, typeof(AdvancedHeroEnhanceCultureCard))] [MemoryPackUnion(9, typeof(AdvancedMilitaryEnhanceCultureCard))] [MemoryPackUnion(10, typeof(AdvancedEconomyEnhanceCultureCard))] [MemoryPackUnion(11, typeof(AdvancedScarletMansionCultureCard))] [MemoryPackUnion(12, typeof(AdvancedEienteiCultureCard))] [MemoryPackUnion(13, typeof(AdvancedMoriyaCultureCard))] [MemoryPackUnion(14, typeof(AdvancedPalaceOfEarthCultureCard))] [MemoryPackUnion(15, typeof(Lv2HeroCultureCard))] [MemoryPackUnion(16, typeof(Lv3HeroCultureCard))] public abstract partial class CultureCardBase { [MemoryPackConstructor] public CultureCardBase() { } public abstract CultureCardType GetCardType(); public virtual void OnGetCultureCard(MapData mapData, PlayerData playerData) { } //英雄相关所有消耗是否打折 public virtual float GetHeroCostDiscount(MapData mapData, PlayerData playerData) { return 1f; } // 是否可以用文化值让普通单位立刻升级为 Officer public virtual bool CanCultureUpgradeUnit(MapData mapData, PlayerData playerData) { return false; } // 是否可以用文化值购买巨人 public virtual bool CanBuyBigGuyWithCulture(MapData mapData, PlayerData playerData) { return false; } // 文化值是否能转换成金币 public virtual bool CanConvertCultureToGold(MapData mapData, PlayerData playerData) { return false; } // 检查是否开启了对应 Resource public virtual bool CheckResourceOpen(MapData mapData, PlayerData playerData, ResourceType resourceType) { return false; } } [MemoryPackable] public partial class SecondHeroCultureCard : CultureCardBase { public override CultureCardType GetCardType() => CultureCardType.SecondHero; public override void OnGetCultureCard(MapData mapData, PlayerData playerData) { if (playerData.PlayerHeroData.MaxHeroCount == 1) playerData.PlayerHeroData.MaxHeroCount++; } } [MemoryPackable] public partial class ThirdHeroCultureCard : CultureCardBase { public override CultureCardType GetCardType() => CultureCardType.ThirdHero; public override void OnGetCultureCard(MapData mapData, PlayerData playerData) { if (playerData.PlayerHeroData.MaxHeroCount == 2) playerData.PlayerHeroData.MaxHeroCount++; } } [MemoryPackable] public partial class Lv2HeroCultureCard : CultureCardBase { public override CultureCardType GetCardType() => CultureCardType.Lv2Hero; } [MemoryPackable] public partial class Lv3HeroCultureCard : CultureCardBase { public override CultureCardType GetCardType() => CultureCardType.Lv3Hero; } [MemoryPackable] public partial class MonumentForestCultureCard : CultureCardBase { public override CultureCardType GetCardType() => CultureCardType.MonumentForest; public override bool CheckResourceOpen(MapData mapData, PlayerData playerData, ResourceType resourceType) { return resourceType == ResourceType.ForestTemple; } } [MemoryPackable] public partial class MonumentShallowCultureCard : CultureCardBase { public override CultureCardType GetCardType() => CultureCardType.MonumentShallow; public override bool CheckResourceOpen(MapData mapData, PlayerData playerData, ResourceType resourceType) { return resourceType == ResourceType.WaterTemple; } } [MemoryPackable] public partial class MonumentMountainCultureCard : CultureCardBase { public override CultureCardType GetCardType() => CultureCardType.MonumentMountain; public override bool CheckResourceOpen(MapData mapData, PlayerData playerData, ResourceType resourceType) { return resourceType == ResourceType.MountainTemple; } } [MemoryPackable] public partial class MonumentDeepSeaCultureCard : CultureCardBase { public override CultureCardType GetCardType() => CultureCardType.MonumentDeepSea; public override bool CheckResourceOpen(MapData mapData, PlayerData playerData, ResourceType resourceType) { return resourceType == ResourceType.KingTemple; } } [MemoryPackable] public partial class MonumentPlainCultureCard : CultureCardBase { public override CultureCardType GetCardType() => CultureCardType.MonumentPlain; public override bool CheckResourceOpen(MapData mapData, PlayerData playerData, ResourceType resourceType) { return resourceType == ResourceType.Temple; } } [MemoryPackable] public partial class AdvancedHeroEnhanceCultureCard : CultureCardBase { public override CultureCardType GetCardType() => CultureCardType.AdvancedHeroEnhance; public override bool CanCultureUpgradeUnit(MapData mapData, PlayerData playerData) { return true; } } [MemoryPackable] public partial class AdvancedMilitaryEnhanceCultureCard : CultureCardBase { public override CultureCardType GetCardType() => CultureCardType.AdvancedMilitaryEnhance; public override bool CanBuyBigGuyWithCulture(MapData mapData, PlayerData playerData) => true; } [MemoryPackable] public partial class AdvancedEconomyEnhanceCultureCard : CultureCardBase { public override CultureCardType GetCardType() => CultureCardType.AdvancedEconomyEnhance; public override bool CanConvertCultureToGold(MapData mapData, PlayerData playerData) => true; } [MemoryPackable] public partial class AdvancedScarletMansionCultureCard : CultureCardBase { public override CultureCardType GetCardType() => CultureCardType.AdvancedScarletMansion; } [MemoryPackable] public partial class AdvancedEienteiCultureCard : CultureCardBase { public override CultureCardType GetCardType() => CultureCardType.AdvancedEientei; } [MemoryPackable] public partial class AdvancedMoriyaCultureCard : CultureCardBase { public override CultureCardType GetCardType() => CultureCardType.AdvancedMoriya; } [MemoryPackable] public partial class AdvancedPalaceOfEarthCultureCard : CultureCardBase { public override CultureCardType GetCardType() => CultureCardType.AdvancedPalaceOfEarth; } }