专家攻略:调用和递归

来自Noita Wiki
跳到导航 跳到搜索

正常施法

在介绍如何复制法术之前,我们先复习一下正常是怎么施法的。正常施法通过抽取施法——要么是法杖自己抽取一个法术,要么是某一个法术抽取另一个法术。这两者都有着一个完整的抽取逻辑。

当抽取开始时,会从牌库顶端抽取出第一个法术,并“持有”它。它并不会立即置入手牌中,他会检查法杖是否有足够的法力来释放它,或者是否还有剩余施法数。如果因为这两个原因法术无法施放,那么就会直接把他置入弃牌堆,而不是手牌中。然后抽取下一个法术,重复上述过程。

当上述这个过程成功时,法术将会从法杖中扣除所需的蓝量。法术被“调用”,“调用”一个咒语意味着执行该咒语的“函数(function) ”——就是它的效果。 (注:function是一个编程概念,一般翻译成函数,也可译成方法。函数由函数头和函数体组成,这里函数头就是法术的名字,函数体里面就是装着法术的效果。)

法术的动作函数是一个重要的概念,一种理解它的方式是,它是法术本身所做的事情,而不是游戏中其他法术或机制与该法术交互时做的事情。

例如,法术的法力消耗和剩余使用次数都不是法术动作函数的一部分,因为法术本身不会消耗法力和剩余次数——正如上面所说,是由抽取机制来查看法术的这些属性并执行对应的操作,接着才会调用该法术,并执行其函数。

以下是法术效果函数的两个例子:

伤害加成的函数是:“给施法状态+10投射物伤害和+0.08s的施法延迟。”

黑洞的函数是:“给施法状态增加一个黑洞投射物和+1.33s的施法演示”

这些函数都不包含法力消耗或者剩余使用次数,这是因为这些值都是法术的“属性”,它基本上指一个法术除了函数外的所有杂七杂八的信息,包括稀有程度、在哪几层生成、法术的类型、法术是否被标记为“递归”(很快我们就会讲到它),当然,也包括了法力消耗和剩余使用次数。

这些属性的共同之处在于,如果想要属性发挥作用,就必须有游戏中的另一种机制在起作用。正如我们之前在法力消耗上看到的,它们自己不会做任何事情。一个法术的属性必须有另一个法术或法术的函数与它们相关联才能使它们产生作用。

了解了这些,让我们开始讨论本章的核心内容:复制。

复制

最基本的复制法术是简单的调用目标法术。它调用法术的函数,而不考虑属性。例如:伽马的函数是这样的:

“施法状态中的施放延迟+0.25s。查找牌库中的最后一个法术,如果牌库是空的,则查找手牌中的最后一个法术。调用那个法术。(为了简单起见,省略了一行————我们很快就会介绍他。)”

请注意,在伽马的函数中并没有提及目标法术的法力消耗或者剩余使用量————法术的函数是直接调用的,没有抽取过程。这就是为什么可以使用伽马以30的蓝耗施放一个黑洞。不过施放延迟是法术的函数的一部分,因此如果使用伽马调用黑洞,您仍然需要考虑黑洞的施放延迟。

然而,有些法术的函数会把正常抽取过程中应当产生的调整补上。比如一分为N系列法术,在它的函数中,会检查并扣除其目标法术的剩余使用次数。法术复制没有一套标准————它们中的大部分都有略有不同,本指南将着重介绍这里。不过好消息是,它们都会调用目标法术以生成其函数,这是最基本的。

递归

在介绍每个法术的具体复制细节之前,我们需要了解什么是递归限制。因为所有的法术复制都受其影响。

首先要知道的是,有些法术有着“递归”的标签,一个法术是否递归是它的属性之一,这个属性决定了每个法术实例的递归级别如何计算。工作原理如下:

  • 正常抽取和施放法术时,递归等级为0。
  • 如果一个法术调用了一个非递归法术,被调用者的递归等级同调用者。
  • 如果一个法术调用了一个递归法术,被调用者的递归等级等于调用者+1。
  • 如果法术的递归等级大于递归等级限制,则无法施放。
  • 递归等级限制为2。


这是检查递归的流程:获取将要被调用的法术的递归等级,并判断它是否超过限制。我们接下来讨论的所有法术都是用这种逻辑来限制递归。

是时候举例说明了!

例:陶

Wand 0821.png
乱序
法术数/施放
1

陶 Τ 的函数是记住牌库中最上面的两个法术,并检查它们的递归级别,如果没有超过就调用它们。

我们来解析一下:

  • 法杖会抽取陶,由于它是通过正常方式抽取的,所以递归等级为0。
  • Τ(rec = 0)记住牌库中的前两个法术: Τ 和火花弹
  • Τ(rec = 0)调用陶。第二个 Τ 的递归等级为0+1=1,因为 Τ 是一个递归法术。
    • Τ (rec = 1) 记住牌库中前两个法术:仍然是 Τ 和火花弹
    • Τ (rec = 1) 调用 Tau (rec = 2)
      • Τ (rec = 2) 记住牌库中前两个法术:Τ 和火花弹
      • Τ (rec = 2) 尝试调用陶 (rec = 3), 但是失败了,因为超出了递归限制,什么也没有发生。
      • Τ (rec = 2) 调用火花弹 (rec = 2), 成功
    • Τ (rec = 1) 调用火花弹 (rec = 1)
  • Τ (rec = 0) 调用火花弹 (rec = 0)

最后,产生三个火花弹。并添加了来自三个独立 Τ 的施放延迟。当第一个 Τ 抽取结束后,牌库中仍有第二个 τ 和火花弹。

例:欧米伽

Wand 0821.png
乱序
法术数/施放
1

欧米伽的函数是按顺序施放所有的法术,首先是弃牌堆中,然后是手牌中所有的非递归法术,然后是牌库中所有的法术。通常情况下,这种不使用递归函数的限制是为了不让欧米伽施放欧米伽,但是当我们像上面那样配杖时,就会变得不同了。此外,欧米伽有一个特殊情况,那就是它在任何情况下都不会调用魔杖刷新

你已经了解了欧米伽的基本原理了,快试试分析一下上面这个例子吧!

  • 伽马 (rec = 0) 调用牌库中的最后一个法术 (rec = 1)
    • 欧米伽 (rec = 1) 按顺序调用弃牌堆中的所有法术,弃牌堆中没有法术,所以什么也不会发生。
    • 欧米伽 (rec = 1) 调用手牌中的所以法术,手牌中的法术是递归法术伽马,所以什么也没有发生。
    • 欧米伽 (rec = 1) 调用牌库中的所有法术,顺序为:
      • 欧米伽 (rec = 1) 跳过魔杖刷新
      • 欧米伽 (rec = 1) 调用火花弹 (rec = 1)
      • 欧米伽 (rec = 1) 调用第一个欧米伽 (rec = 2)
        • 欧米伽 (rec = 2) 跳过伽马和魔杖刷新
        • 欧米伽 (rec = 2) 调用火花弹 (rec = 2)
        • 欧米伽 (rec = 2) 跳过两个欧米伽,因为它们的rec=3
      • 欧米伽 (rec = 1) 调用第二个欧米伽 (rec = 2)
        • 同上,这次的欧米伽也调用一个火花弹

所以,我们发现这样会射击三个火花弹的副本,非常高效(doge)

哪些法术是递归的?

如下表所示:

值得注意的是,一分为N系列法术不是递归的,因此,一分为N系列法术的递归等级与其调用者相同。

总结

希望您现在已经了解的递归的工作原理了!:) 如果你阅读过关于抽取的攻略,那么您就已经了解了法杖的原理了。剩下的知识学习每个法术的具体细节,在某些情况下,(如这里的欧米伽)可能非常的不直观。为此,请查看高级法术细节。最后,祝您在法杖探索之路上玩的开心!

Zoldort著 古峰译 群友提供技术支援。