120 - API文档汉化 - 卡牌

Updated 6 days ago

卡牌

卡牌管理

卡牌管理通过InscryptionAPI.Card.CardManager实现。您只需调用CardManager.Add并传入CardInfo对象,该卡牌将立即加入卡牌池:

CardInfo myCard = ...;
CardManager.Add(myCard); // 完成添加

CardInfo对象可自由创建,但系统提供了一些辅助方法简化流程。其中最重要的是CardManager.New(name, displayName, attack, health, optional description),该方法会自动创建并添加新卡牌:

CardInfo myCard = CardManager.New("example_card", "示例卡牌", 2, 2, "这只是一张示例卡牌");

创建后您可自由修改卡牌属性,所有变更将与游戏实时同步:

CardInfo myCard = CardManager.New("example_card", "示例卡牌", 2, 2, "这只是一张示例卡牌");
myCard.cost = 2;

此外还提供了一系列链式扩展方法,用于执行卡牌创建时的常见操作。以下是使用示例及完整列表:

CardInfo myCard = CardManager.New("example_card", "示例卡牌", 2, 2, "这只是一张示例卡牌")
    .SetDefaultPart1Card()
    .SetCost(bloodCost: 1, bonesCost: 2)
    .SetPortrait("/art/sample_portrait.png", "/art/sample_emissive_portrait.png")
    .AddAbilities(Ability.BuffEnemies, Ability.TailOnHit)
    .SetTail("Geck", "/art/sample_lost_tail.png")
    .SetRare();

卡牌扩展方法

当前可用扩展方法如下(可能未完全更新):

  • SetPortrait: 设置卡牌肖像图及可选的发光肖像图。可直接传入Texture2D对象或图片路径。
  • SetEmissivePortrait: 仅修改卡牌的发光肖像图。若卡牌未设置基础肖像图将抛出异常。
  • SetAltPortrait: 设置卡牌替代肖像图。
  • SetPixelPortrait: 设置GBC模式下(即第二章)的像素风格肖像图。
  • SetCost: 设置卡牌费用。另有单独设置血祭、骨头、能量和宝石费用的扩展方法。
  • SetDefaultPart1Card: 设置使卡牌可在第一章(莱西的小屋)使用的必要元数据。
  • SetGBCPlayable: 设置使卡牌可在第二章使用的必要元数据。
  • SetDefaultPart3Card: 设置使卡牌可在第三章(P03工厂)使用的必要元数据。
  • SetRare: 设置使卡牌呈现为稀有卡的必要元数据。
  • SetTerrain: 设置使卡牌作为地形卡生效的必要元数据。
  • SetPelt: 设置使卡牌作为毛皮卡生效的必要元数据。可选是否触发虱子的特殊效果。
  • SetTail: 创建断尾参数。注意需同时添加TailOnHit能力才有效果。
  • SetIceCube: 创建冰封参数。注意需同时添加IceCube能力才有效果。
  • SetEvolve: 创建进化参数。注意需同时添加Evolve能力才有效果。
  • SetOnePerDeck: 设置卡牌是否为唯一卡(每局游戏牌组仅允许一张)。
  • SetHideAttackAndHealth: 设置是否隐藏卡牌的力量与生命值。
  • SetGemify: 设置卡牌是否默认宝石化。
  • SetAffectedByTidalLock: 设置卡牌是否受潮汐锁定印记效果影响。
  • AddAbilities: 添加任意数量能力至卡牌。允许重复添加。
  • AddAppearances: 添加任意数量外观行为至卡牌。禁止重复添加。
  • AddMetaCategories: 添加任意数量元类别至卡牌。禁止重复添加。
  • AddTraits: 添加任意数量特质至卡牌。禁止重复添加。
  • AddTribes: 添加任意数量族群至卡牌。禁止重复添加。
  • AddSpecialAbilities: 添加任意数量特殊能力至卡牌。禁止重复添加。

进化、断尾、冰封与延迟加载

当您构建卡牌时,目标进化卡牌可能尚未创建。您可通过事件处理器延迟构建进化/冰封/断尾参数,或直接使用上述扩展方法(系统将自动处理)。

注意:若通过扩展方法构建参数时目标卡牌不存在,参数将返回null。只有当进化卡牌加入卡牌列表通过CardLoader获取卡牌新实例时(如游戏内自然发生),进化参数才会显现。

CardManager.New("Example", "Base", "基础卡牌", 2, 2).SetEvolve("进化卡牌", 1); // "进化卡牌"尚未创建
Plugin.Log.LogInfo(CardLoader.GetCardByName("Example_Base").evolveParams == null); // 输出TRUE!

CardInfo myEvolveCard = CardManager.New("Example", "Evolve", "进化卡牌", 2, 5);

Plugin.Log.LogInfo(CardLoader.GetCardByName("Example_Base").evolveParams == null); // 输出FALSE!

重要提示:对于卡牌蓝图(参见遭遇战),若使用延迟加载,进化、断尾和冰封参数将无法正常工作。解决方案是优先创建进化/断尾/冰封卡牌:

CardInfo myEvolveCard = CardManager.New("Example", "Evolve", "进化卡牌", 2, 5); // 先创建"进化卡牌"

CardManager.New("Example", "Base", "基础卡牌", 2, 2).SetEvolve(myEvolveCard, 1); // 再创建基础卡牌

编辑现有卡牌

若要修改基础游戏卡牌,可直接在CardManager.BaseGameCards列表中定位并编辑:

CardInfo card = CardManager.BaseGameCards.CardByName("Porcupine");
card.AddTraits(Trait.KillsSurvivors);

另提供高级编辑模式,可同时修改其他模组添加的卡牌。需向CardManager.ModifyCardList事件添加处理器,该处理器需接收并返回CardInfo对象列表。以下示例为所有具有死神之触或尖刺铠甲能力的卡牌添加"击杀生还者"特质:

CardManager.ModifyCardList += delegate(List<CardInfo> cards)
{
    foreach (CardInfo card in cards.Where(c => c.HasAbility(Ability.Sharp) || c.HasAbility(Ability.Deathtouch)))
        card.AddTraits(Trait.KillsSurvivors);

    return cards;
};

此方法可确保同时修改基础游戏卡牌和其他模组添加的卡牌。

卡牌外观行为

卡牌外观行为CardAppearanceBehaviour是特殊类,用于修改卡牌在游戏中的视觉表现。可内置至CardInfo对象,或在游戏运行时动态添加。

外观行为的实现方式与特殊能力类似(详见能力管理):

public readonly static CardAppearanceBehaviour.Appearance MyAppearanceID = CardAppearanceBehaviourManager.Add(MyPlugin.guid, "特殊外观", typeof(MyAppearanceBehaviour)).Id;

外观行为需继承CardAppearanceBehaviour类。必须实现抽象方法ApplyAppearance(用于覆盖卡牌默认外观),另有三个可选虚方法:ResetAppearanceOnCardAddedToDeckOnPreRenderCard。以下是基础游戏示例:

public class RedEmission : CardAppearanceBehaviour
{
    public override void ApplyAppearance()
    {
        base.Card.RenderInfo.forceEmissivePortrait = true;
        base.Card.StatsLayer.SetEmissionColor(GameColors.Instance.glowRed);
    }

    public override void ResetAppearance()
    {
        base.Card.RenderInfo.forceEmissivePortrait = false;
        base.Card.StatsLayer.SetEmissionColor(GameColors.Instance.glowSeafoam);
    }
}