之舞魔改

魔改机制

下文中,中旋默认按0°角处理。

什么是魔改?

魔改(Curse是一种可以作用在冰与火之舞关卡上 并对其中满足某些条件(Condition的部分 执行对应的某种变换操作(Action的对象。


一个魔改通常会绑定于一个冰与火之舞关卡之上,并将其关卡标识符(稍作修改后)作为魔改的标识符。
也存在不绑定于关卡的魔改效果,例如小绿君的颜色魔改系列。

但式

对魔改效果的简要描述称为但式(But Statement
魔改的实际效果可能会与但式所述的效果有一点小差距。


但式通常会写在其所属关卡的标题结尾,例如:

1-X? 冰与火之舞但音乐变得很不对劲
2-X? 弱拍之略微加长版

本站推荐使用以下关卡标题格式:

{关卡ID} {关卡标题},但{魔改效果简述}
{level ID} {level title} but {curse effect introduction}

如何以文本格式记录魔改?

玩家将体验到的魔改,包括当前(Current正在生效的魔改以及后继(Next即将生效的魔改, 可以通过在屏幕底部添加两行文本装饰以提示(Hint

当前魔改:8-X?
后继魔改:10-X?

提示文本不应随着镜头的变化而改变位置或大小,否则将无法起到提示作用。 虽说本来也没多少人能看懂就是了……

倒计时

魔改效果更换前会进行倒计时(Countdown


倒计时从 3 开始,并以相等时间间隔每次减少 1。 倒计时预计降到 -1 的那一瞬间,就是魔改更换的时刻。

每次倒计时减少应同时发出一声可被注意到且无歧义的打击音,通常使用与暂停节拍倒计时相同的音效。


倒计时通常位于行尾全角冒号之前,被半角括号括起,并仅在左括号之前多出一个半角空格:

当前魔改:8-X?
后继魔改 (3):10-X?

当前魔改:8-X?
后继魔改 (2):10-X?

当前魔改:8-X?
后继魔改 (1):10-X?

当前魔改:8-X?
后继魔改 (0):10-X?

当前魔改:10-X?
后继魔改:XC-X?
注意:魔改效果的起效时间先后顺序并不是生效顺序,也不存在直接关系。

像函数一样的魔改

函数:

  • 拿到一个数
  • 修改那个数
  • 返回被修改的数

魔改:

  • 拿到一个关卡
  • 魔改那个关卡
  • 返回被魔改的关卡

这俩概念实在是太像了,因此可以像对待函数那样对待魔改,例如:

等价于:

当前关卡:1-X? ( B-X )

然而,这无法解释“即使输入相同,某些魔改也有可能返回不同的结果”的现象。


例如,2-X? 不仅有可能多重复一次B-X? 请你别玩我的关卡了的尾杀,也有可能多重复两次。

这导致:

当前关卡:2-X? ( B-X )

等于:

当前关卡:2-X? ( B-X )

为解决此问题,可以将魔改所输出的类型,从单个关卡,改为关卡的集合:

2-X? ( B-X ) → { 被多重复一次的 B-X , 被多重复二次的 B-X , 被多重复三次的 B-X 等 }

而最终结果则是其中的一个元素。


这也同时解决了以下问题:

某些魔改的定义不是很严谨,导致一千个魔改者心中有一千种魔改结果
然而魔改圈压根就凑不齐一千人qwq
所有结果都属于输出集合。可以自行忽略自己所不认可的结果。
某些魔改的定义不是很严谨,导致有些情况下完全无法给出合理的结果
输出集合应为空集


输入也会改为关卡集合,定义如下:

魔改仅包括一个关卡的集合等价于魔改该关卡。例如, 2-X? ( B-X ) 等价于 2-X? ( { B-X } ) .

注意:此处所标注的不是KirbyCreep的魔改由于本人当时欠考虑,后者现今通常使用大括号作为其魔改系列记号{N-X}

魔改包括多个关卡的集合等价于魔改其中每个关卡的结果的并集。例如:

5-X? ( { 5-X, 11-X, XC-X } )

等价于

5-X? ( 5-X ) ∪ 5-X? ( 11-X ) ∪ 5-X? ( XC-X )

魔改以空集作为输入集合时,输出集合定义为以全集作为输入集合的输出集合的补集。

推论:在输入集合都不为空的情况下,魔改应用对并运算满足分配律。

这不仅是为了保持一致性,也是由于这对后续的概念定义很有帮助,例如:

同时施加多个魔改效果

使用 加号 + 表示魔改效果从左到右依次生效的记录方法已被弃用!

乘号 * 可用于表示多个魔改效果以从左到右的顺序依次生效。

函数组合符号 可用于表示多个魔改效果以从右到左的顺序依次生效。


此处给出一个示例:

当前魔改:11-X? * XC-X?
后继魔改:11-X?XC-X?

11-X? * XC-X? 首先为每一块砖添加旋转,然后移除所有旋转,因此旋转都不见了;

11-X?XC-X? 首先移除所有旋转,然后为每一块砖添加旋转,因此每一块砖都有旋转。


乘号可以省略,但函数组合符号不可省略:

当前魔改:11-X? XC-X?
后继魔改:11-X?XC-X?

嵌套函数也可以体现魔改生效顺序:

当前关卡:XC-X?( 11-X?( 5-X ) )
后继关卡:11-X?( XC-X?( 5-X ) )

然而,过度使用函数嵌套会导致大量括号累积,从而使魔改提示更加难以解析。

关键词

None

恒等函数:None(x) = x

当前魔改:
省略号

替换掉你出于某些原因不想写进提示中的魔改,举个例子,你不想过早揭露下个魔改的具体信息。

后继魔改:

或者,就直接把它当省略号用也行:

当前魔改:8-X? * 10-X? * 5-X? * 11-X?
后继魔改:... * 2-X?
迭代终止 StopIteration

在关卡结束之前,魔改效果不会再次更换,玩家现在可以忽略魔改提示,而将注意力完全放在谱面上了。

后继魔改:迭代终止

同一魔改效果的不同实例

施加一个魔改效果其实是在施加魔改效果的一个实例(Instance
下标可用于显式指出多个魔改效果是否为同一实例。

当前魔改:12-X?1
后继魔改:12-X?2
当前魔改:12-X?_1
后继魔改:12-X?_2

(感谢 Regularly 提供的表述格式!)

魔改实例在首次出现时会被初始化。
魔改实例即使在首次消失后也可被复用,然而默认行为是, 如果某个没有下标的魔改实例首次在当前魔改中消失,后继魔改就不会再使用那个魔改实例。

后继魔改:12-X? # 实例 a
后继魔改:12-X? * XR-X? # 实例 a * 实例 x
后继魔改:XR-X? # 实例 x
后继魔改:12-X? # 实例 b
后继魔改:12-X?1 # 实例 1
后继魔改:12-X? # 实例 c
后继魔改:12-X?1 * 12-X? # 实例 1 * 实例 c
后继魔改:12-X? * 12-X? # 实例 c * 实例 d

某些魔改效果可能需要存储一些用于计算的临时数据,例如, 12-X? 存储所有自魔改效果起效以来曾经经过的的独特循环。
临时数据会互不干扰地被分别存储在每个魔改实例内部。

迭代魔改

不言而喻,一目了然。

当前魔改:XH-X? * XH-X? * XH-X?
当前魔改:XH-X?3
当前魔改:XH-X? ^ 3

反魔改

提示:本条目的主题不是逆魔改,另一种生成成对魔改的方式。

魔改的反(Anti通过将但式中的一个概念替换为与其相反的概念以创建新的魔改。


反魔改应通过将减号 - 改为加号 + 来表示,如果可能的话:

当前魔改:XC-X?
后继魔改:XC+X?

在已被弃用的顺序式表示法中,反魔改曾通过将减号 - 置于开头来表示:

当前魔改:- XC-X?
后继魔改:XC-X? - XC-X?

以下是一种由于确实方便而未被弃用的 通过正负号来缩写相邻且互反的魔改 的表示法:

当前魔改:XC-X? - XC-X?
当前魔改:± XC-X?
当前魔改:- XC-X? + XC-X?
当前魔改: XC-X?

(感谢 DragonFire28 提议的文本颜色!)


反魔改的反魔改应为其原始魔改。

反魔改不一定唯一。例如:

当前魔改:2-X? # 弱拍之略微加长版
后继魔改:2+X? # 弱拍之显著加长版
后继魔改:2+X? # 弱拍之略微减短

要是能存在一种可以以确定的方式翻转魔改的方法就好了……

逆魔改

提示:本条目的主题不是反魔改,另一种生成成对魔改的方式。

魔改的逆(Cure假设关卡被对应的魔改所魔改,并将其恢复到其未被对应的魔改所魔改的状态。
此概念与反函数的概念类似,但又有所区别。


对于任意魔改C, 其逆魔改C-1存在, 使得对于任意关卡LLC
LC ∈ C ( L ) 等价于 L ∈ C-1 ( LC )

逆魔改与反函数的区别在于逆魔改使用而非=

由于以上区别,如果多个关卡可被魔改成同一魔改关卡, 逆魔改会返回上述所有关卡的集合,因此最终结果可能并非原关卡。


逆魔改应使用函数的幂运算来表示:

当前魔改:XH-X?-1
当前魔改:XH-X? ^ -1
当前魔改:XH-X?-1 * XH-X?-1 * XH-X?-1
当前魔改:XH-X?-3

逆魔改的逆魔改是其原始魔改。

某些魔改的逆魔改是其自身,换言之, LC ∈ C ( L ) 等价于 L ∈ C ( LC )
这些魔改就像硬币翻转器,总是完美地将硬币翻转到另一面,因此使用它们两次就好像无事发生一样。


逆魔改一个不可能被魔改出的关卡会将空集作为返回的输出集合。

在实际情况中,可以将输入作为新的输出,就好像无事发生一样。 (感谢 PyrotechnicTriforce 提供的主意!)
(待补:可以用元魔改定义上述兜底行为)


逆魔改的结果数量通常多到恐怖( O(2n)O(n!), 理论上甚至可以达到O(∞) )。

元魔改

设存在一个关卡L,以及两个魔改CM
其中魔改C用于魔改关卡L
而魔改M用于对C造成影响。

目前,魔改社区中存在的元魔改定义方法如下所示:


对关卡L应用被魔改M所魔改的魔改C
当前魔改:M ( C ) L → M ( C ) ( L )

这是本站推荐的元魔改定义方法。
既然魔改的输入应为要被其影响的对象,影响魔改的魔改M自然就应当将要被其影响的魔改C作为输入。

缺点是,由于元魔改作为魔改,其输出也是魔改的集合,就需要额外定义将魔改的集合应用在元素上的行为:

使用包括多个魔改的集合等价于使用该集合中的每个魔改的结果的并集。例如:

{ 5-X?, 11-X?, XC-X? } ( 5-X )

等价于

5-X? ( 5-X ) ∪ 11-X? ( 5-X ) ∪ XC-X? ( 5-X )

使用空集作为魔改集合时,无论被魔改的集合是否为空,输出集合都为空集[需要证明]

本站假定元魔改均以此方式运作。


对关卡L应用魔改C之后再应用魔改M
当前魔改:C * M L → M ( C ( L ) )

这种元魔改定义方法避免了难以阅读魔改提示和定义魔改集合魔改关卡的麻烦,
代价是牺牲了元魔改的独特性和部分合理性。

由于M得到的输入并非C本身,而是其输出集合,
M无法直接得知C具体是什么魔改,以及被魔改前的元素的具体内容。

尽管M技术上可以通过读取魔改提示以间接确定前者,并基于此使用C-1去魔改其输入集合以间接得到后者的超集,
但这一套操作下来确实要比将C直接扔给M处理要繁琐得多,更何况逆魔改还会产生副作用。

取决于M的定义,在使用任意魔改之前就先使用M也可能导致其产生未定义行为。


对关卡L应用魔改C之前先应用魔改M
当前魔改:M * C L → C ( M ( L ) )

这是所有元魔改定义方法中最离谱的那个。

C本身无法在M生效时就被其影响,
因为此时C不仅没有输出结果,也没有从M拿到输入,更没有被输入到M中,甚至可能还没来得及存在,又或许甚至压根就不存在。

C本身也无法在其自身生效时才被M影响,
因为此时已经完成了其魔改过程的M无法再对其他任何元素主动造成影响。

综上所述,M不可能对C本身造成影响。对C的输出结果造成影响同样不可能,推理过程类似。

M可能的运作方式只剩下一种:其输出结果在被C魔改后符合其设计。然而:

  • 无法确保这样的流程对于每个M魔改和每个C都存在;
  • 无法确保在M即为最后一个魔改的情况下给出合理的结果;
  • 无法确保M在生效时就可以获取C是什么魔改的信息。

省流:别。