之舞魔改

魔改机制

在此特别感谢是动听D温呐为此页面中许多概念的完善与纠错所做出的贡献。

什么是魔改?

魔改(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 等 }

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


不仅如此,输入也可以扩展至关卡集合,定义如下:

魔改仅包括一个关卡的集合等价于魔改该关卡。
例如: 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? 存储所有自魔改效果起效以来曾经经过的的独特循环。
临时数据会互不干扰地被分别存储在每个魔改实例内部。

迭代魔改

不言而喻,一目了然。

当前魔改: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,也可称作逆魔改
其运作方式类似于假设关卡被对应的魔改所魔改,并将其恢复到其未被对应的魔改所魔改的状态,
因而可以用于抵消(但不一定能保证抵消,原因见下)其对应魔改所导致的更改。

逆魔改定义为将对应魔改的映射中每一对输入与输出互换组成的新魔改。
逆魔改的定义域和陪域也会互换;参域和值域同理。


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

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

以下是一些推论:

一个魔改的逆魔改的逆魔改与其自身相等。

(8-X?-1)-1 = 8-X?

当且仅当一个魔改的映射集合里,对于任意X→Y,都有Y→X在集合内,那么其逆魔改与其自身相等。

任意一个关卡集合必定是对其先后施加任意魔改与其逆魔改得到的魔改关卡集合的子集。

{ 11-X } ⊆ 11-X?-1 ( 11-X? ( { 11-X } ) )

逆魔改一个不可能被对应的魔改魔改出来的关卡会导致逆魔改的输出集合为空。


在实际应用中,如果一个关卡不可能被对应的魔改魔改出来,
可以先将输入中导致关卡无法被逆魔改的部分移除,
或者直接将输入作为输出,就好像无事发生一样。
(感谢 PyrotechnicTriforce 提供的主意!)
(待补:可以用元魔改定义上述兜底行为)

元魔改

设存在一个关卡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 )

魔改集合的逆与对集合中的所有魔改取逆等效。

{ 5-X?, 11-X?, XC-X? }-1 = { 5-X?-1, 11-X?-1, XC-X?-1 }

使用空集作为魔改集合时,如果输入集合不为空,则输出集合为空:

∅ ( { 1-X } ) = ∅
∅ ( { 1-X, 2-X } ) = ∅

反之,输出集合为陪域。

空魔改集合的逆仍为空魔改集合。

-1 = ∅

对关卡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是什么魔改的信息。

省流:别。