魔改机制
什么是魔改?
魔改(Curse)是一种可以作用在冰与火之舞关卡上 并对其中满足某些条件(Condition)的部分 执行对应的某种变换操作(Action)的对象。
一个魔改通常会绑定于一个冰与火之舞关卡之上,并将其关卡标识符(稍作修改后)作为魔改的标识符。
也存在不绑定于关卡的魔改效果,例如小绿君的颜色魔改系列。
但式
对魔改效果的简要描述称为但式(But Statement)。
魔改的实际效果可能会与但式所述的效果有一点小差距。
但式通常会写在其所属关卡的标题结尾,例如:
本站推荐使用以下关卡标题格式:
{level ID} {level title} but {curse effect introduction}
如何以文本格式记录魔改?
玩家将体验到的魔改,包括当前(Current)正在生效的魔改以及后继(Next)即将生效的魔改, 可以通过在屏幕底部添加两行文本装饰以提示(Hint)。
提示文本不应随着镜头的变化而改变位置或大小,否则将无法起到提示作用。 虽说本来也没多少人能看懂就是了……
倒计时
魔改效果更换前会进行倒计时(Countdown)。
倒计时从 3 开始,并以相等时间间隔每次减少 1。
倒计时预计降到 -1 的那一瞬间,就是魔改更换的时刻。
每次倒计时减少应同时发出一声可被注意到且无歧义的打击音,通常使用与暂停节拍倒计时相同的音效。
倒计时通常位于行尾全角冒号之前,被半角括号括起,并仅在左括号之前多出一个半角空格:
像函数一样的魔改
函数:
- 拿到一个数
- 修改那个数
- 返回被修改的数
魔改:
- 拿到一个关卡
- 魔改那个关卡
- 返回被魔改的关卡
这俩概念实在是太像了,因此可以像对待函数那样对待魔改,例如:
等价于:
然而,这无法解释“即使输入相同,某些魔改也有可能返回不同的结果”的现象。
例如,2-X?
不仅有可能多重复一次B-X? 请你别玩我的关卡了的尾杀,也有可能多重复两次。
这导致:
不等于:
为解决此问题,可以将魔改所输出的类型,从单个关卡,改为关卡的集合:
而最终结果则是其中的一个元素。
这也同时解决了以下问题:
- 某些魔改的定义不是很严谨,导致一千个魔改者心中有一千种魔改结果
-
然而魔改圈压根就凑不齐一千人qwq
所有结果都属于输出集合。可以自行忽略自己所不认可的结果。 - 某些魔改的定义不是很严谨,导致有些情况下完全无法给出合理的结果
-
输出集合应为空集
∅。
输入也会改为关卡集合,定义如下:
魔改仅包括一个关卡的集合等价于魔改该关卡。例如,
2-X? ( B-X )
等价于
2-X? ( { B-X } ) .
魔改包括多个关卡的集合等价于魔改其中每个关卡的结果的并集。例如:
等价于
魔改以空集作为输入集合时,输出集合定义为以全集作为输入集合的输出集合的补集。
推论:在输入集合都不为空的情况下,魔改应用对并运算满足分配律。
这不仅是为了保持一致性,也是由于这对后续的概念定义很有帮助,例如:
同时施加多个魔改效果
乘号 * 可用于表示多个魔改效果以从左到右的顺序依次生效。
函数组合符号
∘ 可用于表示多个魔改效果以从右到左的顺序依次生效。
此处给出一个示例:
乘号可以省略,但函数组合符号不可省略:
嵌套函数也可以体现魔改生效顺序:
然而,过度使用函数嵌套会导致大量括号累积,从而使魔改提示更加难以解析。
关键词
同一魔改效果的不同实例
施加一个魔改效果其实是在施加魔改效果的一个实例(Instance)。
下标可用于显式指出多个魔改效果是否为同一实例。
(感谢 Regularly 提供的表述格式!)
魔改实例在首次出现时会被初始化。
魔改实例即使在首次消失后也可被复用,然而默认行为是,
如果某个没有下标的魔改实例首次在当前魔改中消失,后继魔改就不会再使用那个魔改实例。
后继魔改: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? 存储所有自魔改效果起效以来曾经经过的的独特循环。
临时数据会互不干扰地被分别存储在每个魔改实例内部。
迭代魔改
不言而喻,一目了然。
反魔改
魔改的反(Anti)通过将但式中的一个概念替换为与其相反的概念以创建新的魔改。
反魔改应通过将减号 - 改为加号 + 来表示,如果可能的话:
在已被弃用的顺序式表示法中,反魔改曾通过将减号 - 置于开头来表示:
以下是一种由于确实方便而未被弃用的 通过正负号来缩写相邻且互反的魔改 的表示法:
(感谢 DragonFire28 提议的文本颜色!)
反魔改的反魔改应为其原始魔改。
反魔改不一定唯一。例如:
要是能存在一种可以以确定的方式翻转魔改的方法就好了……
逆魔改
魔改的逆(Cure)假设关卡被对应的魔改所魔改,并将其恢复到其未被对应的魔改所魔改的状态。
此概念与反函数的概念类似,但又有所区别。
对于任意魔改C,
其逆魔改C-1存在,
使得对于任意关卡L和LC,
LC ∈ C ( L ) 等价于
L ∈ C-1 ( LC )。
逆魔改与反函数的区别在于逆魔改使用∈而非=。
由于以上区别,如果多个关卡可被魔改成同一魔改关卡, 逆魔改会返回上述所有关卡的集合,因此最终结果可能并非原关卡。
逆魔改应使用函数的幂运算来表示:
逆魔改的逆魔改是其原始魔改。[需要证明]
某些魔改的逆魔改是其自身,换言之,
LC ∈ C ( L ) 等价于
L ∈ C ( LC )。
那些魔改就像硬币翻转器,总是完美地将硬币翻转到另一面,因此使用它们两次就好像无事发生一样。
逆魔改一个不可能被魔改出的关卡会将空集∅作为返回的输出集合。
在实际情况中,可以将输入作为新的输出,就好像无事发生一样。
(感谢 PyrotechnicTriforce 提供的主意!)
(待补:可以用元魔改定义上述兜底行为)
逆魔改的结果数量通常多到恐怖(
O(2n),
O(n!),
理论上甚至可以达到O(∞)
)。
元魔改
在特定情况下,被施加魔改效果的对象可以不是关卡。(待补)