发现已经看不懂自己以前写的逻辑了。。。😂
仔细看了一遍,这里做一下备忘📝。
「效果原型」注册在 timing
上,
timing.trigger()
的时候,把「效果原型」和对应的事件添加到 game.triggeringEffects
和 game.triggeringEvents
。
帧结束时,才触发这些「效果原型」(effect.trigger()
)。
为什么?
考虑 A, B, C 为三个只 SIGNI 的「这只 SIGNI 被驱逐时,你的场上没有 SIGNI 的场合,xxx」效果,三只同时被驱逐时:
- 帧开始
- A 被驱逐,触发时点
- B 被驱逐,触发时点
- C 被驱逐,触发时点
- 帧结束
将效果的触发延迟到帧结束,保证了「触发条件」(triggerCondition
)调用时,参考的是同时处理结束后的状态。
触发时(如果「效果原型」为一回合一次,且该「效果原型」存在于「已触发效果队列」,跳过触发),
以「效果原型」为原型,创建「效果」,在「效果」上增加 proto
, event
, triggerZone
属性。
将「效果」推入「待处理效果队列」(playerTriggeredEffects
, opponentTriggeredEffects
)。
块结束时,再处理这些「效果」。
为什么?
- 块的处理中不能插入其他处理。
- 区分「效果」和「效果原型」: 1个「效果原型」可以多次触发,生成的不同「效果」要绑定不同的事件。
回合玩家优先,各玩家选择已触发的效果并处理。
处理前,判断处理条件(condition
)和一回合一次限制(「效果原型」是否存在于「已触发效果队列」)。
处理时,如果「效果」的「效果原型」为一回合一次,把「效果原型」推入「已触发效果队列」。
注意:
- 「一回合一次」记录的是「效果原型」;「待处理效果队列」记录的是「效果」。
- 「一回合一次」是在处理时记录,而不是触发时。因为对于选发效果,选择发动才记为发动。(这点存疑,有待调研)