之舞魔改

魔改机制

下文中,中旋默认按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? 首先移除所有旋转,然后为每一块砖添加旋转,因此每一块砖都有旋转。


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

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

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

关键词

None

恒等函数:None(x) = x

当前魔改:
省略号

通常会单独出现在后继魔改中以用于表达请稍候

后继魔改:

有时也可用作需要更多信息
当魔改提示的其中一部分长时间保持不变,而另一部分变化频繁时, 省略号可用于代表在其他位置单独列出的变化频繁的那部分魔改。

当前魔改:5-X? * 10-X?
后继魔改:5-X? * ... * 10-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

逆魔改

魔改是反函数的类比概念。


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

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


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

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


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


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

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

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

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

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

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

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

逆魔改也可以使用函数的幂运算来表示:

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

元魔改

在特定情况下,被施加魔改效果的对象可以不是关卡。(待补)