135 - API文档汉化 - 触发器与执行顺序

Updated 6 days ago

触发器与执行顺序

本文面向需要了解不同情境下触发器调用顺序的模组开发者。
所提供的信息技术性较强且较为枯燥,默认读者已理解《邪恶冥刻》的代码运作机制。

触发器按调用顺序列出,首项为最先触发的触发器,末项为最后触发的触发器。

自定义触发器以字母I开头并通过接口实现,其余为原版(Vanilla)触发器。

卡牌伤害

PlayableCard.TakeDamageShieldManager.TriggerBreakShieldShieldManager.BreakShield处理。

带护盾的卡牌仅调用前四个列出的触发器。

触发器 附加说明
IModifyDamageTaken 将伤害值设置为返回值
IPreTakeDamage 在护盾检查前调用
IShieldPreventedDamage 仅当卡牌有护盾时调用
IShieldPreventedDamageInHand 仅当卡牌有护盾时调用

作用于玩家手牌中的卡牌
OnTakeDamage 作用于无护盾卡牌
OtherCardDealtDamage PlayableCard.Die 后调用
IOnOtherCardDealtDamageInHand 作用于玩家手牌中的卡牌

卡牌死亡

PlayableCard.Die处理。

触发器 附加说明
OnPreDeathAnimation
OnOtherCardPreDeath
IOnOtherCardPreDeathInHand 作用于玩家手牌中的卡牌
OnOtherCardDie
IOnOtherCardDieInHand 作用于玩家手牌中的卡牌

抽卡

PlayerHand.AddCardToHand处理。

触发器 附加说明
OnDrawn 在卡牌加入cardsInHand前调用
OnOtherCardDrawn 在卡牌加入cardsInHand前调用
IOnAddedToHand 在卡牌加入cardsInHand后调用
IOtherCardAddedToHand 在卡牌加入cardsInHand后调用

出牌

BoardManager.TransitionAndResolveCreatedCardBoardManager.ResolveCardOnBoardBoardManager.AssignCardToSlot处理。

触发器 附加说明
OnOtherCardAssignedToSlot
IOnCardAssignedToSlotContext 提供新旧卡槽信息
IOnOtherCardAssignedToSlotInHand 作用于玩家手牌中的卡牌
IOnCardAssignedToSlotNoResolve 仅当分配卡牌已结算时调用
OnResolveOnBoard 当卡牌从手牌或队列打出时调用
OnOtherCardResolve 当卡牌从手牌或队列打出时调用
IOnOtherCardResolveInHand 作用于玩家手牌中的卡牌

当卡牌从手牌或队列打出时调用

战斗阶段

CombatPhaseManager.DoCombatPhaseCombatPhaseManager.SlotAttackSequenceCombatPhaseManager.SlotAttackSlot处理。

每张攻击卡牌会调用SlotAttackSequence,随后每次攻击行为调用SlotAttackSlot

触发器 附加说明
IOnBellRun DoCombatPhase前调用
IOnPreSlotAttackSequence SlotAttackSequence前调用
IGetAttackingSlots 将返回值加入当前攻击卡槽列表,可在方法内修改当前列表
ISetupAttackSequence 用返回值替换当前目标卡槽列表

优先级为ReplacesDefaultOpposingSlot
IGetOpposingSlots 将返回值加入当前目标卡槽列表,可在方法内修改当前列表
ISetupAttackSequence 用返回值替换当前目标卡槽列表

优先级为Normal
ISetupAttackSequence 用返回值替换当前目标卡槽列表

优先级为BringsBackOpposingSlot
ISetupAttackSequence 用返回值替换当前目标卡槽列表

优先级为PostAdditionModification
OnSlotTargetedForAttack
IModifyDirectDamage 仅当造成直接伤害时调用

将伤害值设置为返回值
OnDealDamageDirectly
IOnCardDealtDamageDirectly 作用于场上所有卡牌
OnCardGettingAttacked 仅当卡牌被攻击时调用
IPostCardGettingAttacked
IOnPostSingularSlotAttackSlot SlotAttackSlot后调用
OnAttackEnded 在所有卡牌完成攻击后调用
IOnPostSlotAttackSequence SlotAttackSequence后调用

消耗品

ConsumableItemSlot.ConsumeItem和各消耗品的ActivateSequence处理。

触发器 附加说明
IItemCanBeUsed 可阻止物品使用
IOnItemPreventedFromUse IItemCanBeUsed阻止物品使用时调用
IOnPreItemUsed ConsumeItemActivateSequence前调用
IOnPostItemUsed ConsumeItemActivateSequence后调用

被动属性增益

PlayableCard.GetPassiveAttackBuffsPlayableCard.GetPassiveHealthBuffs处理。

这些补丁每帧都会调用。

触发器 附加说明
IOnCardPassiveAttackBuffs 将攻击增益设置为返回值
IPassiveAttackBuffs 将返回值累加到攻击增益
触发器 附加说明
IOnCardPassiveHealthBuffs 将生命增益设置为返回值
IPassiveHealthBuffs 将返回值累加到生命增益

天平伤害

LifeManager.ShowDamageSequence处理。

触发器 附加说明
IOnPreScalesChangedRef 修改即将造成的伤害值与实体天平上的砝码
IOnPreScalesChanged ShowDamageSequence前调用
IOnPostScalesChanged ShowDamageSequence后调用

回合流程

TurnManager.GameSequenceTurnManager.PlayerTurnTurnManager.OpponentTurnTurnManager.DoUpkeepPhase处理。

若对手回合被跳过,则不会调用其对应的触发器。

触发器 附加说明
OnUpkeep
IOnUpkeepInHand 作用于玩家手牌中的卡牌
OnTurnEnd DoCombatPhase后调用
IOnTurnEndInQueue 作用于对手队列中的卡牌
IOnTurnEndInHand 作用于玩家手牌中的卡牌