2026-06-05 00:49:32 +08:00

266 lines
8.5 KiB
C#

/*
* @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<CultureCardType, Type> _cardDict;
public static CultureCardBase GetCultureCardBase(CultureCardType cardType)
{
if (_cardDict == null)
{
_cardDict = new Dictionary<CultureCardType, Type>();
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;
}
}