魔改机制
什么是魔改?
魔改(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? 存储所有自魔改效果起效以来曾经经过的的独特循环。
临时数据会互不干扰地被分别存储在每个魔改实例内部。
迭代魔改
不言而喻,一目了然。
逆魔改
逆魔改是反函数的类比概念。
对于任意魔改C,其逆魔改C-1存在,
使得对于任意关卡L和LC,
LC ∈ C ( L ) 等价于
L ∈ C-1 ( LC )。
逆魔改与反函数的区别在于逆魔改使用∈而非=。
逆魔改一个不可能被魔改出的关卡会将空集∅作为返回的输出集合。
在实际情况中,可以将输入作为新的输出,就好像魔改啥也没改一样。
(感谢 PyrotechnicTriforce 提供的主意!)
(待补:可以用元魔改定义上述兜底行为)
逆魔改的结果数量通常多到恐怖(
O(2n),
O(n!),
理论上甚至可以达到O(∞)
)。
逆魔改可以通过将减号 - 改为加号 + 来表示,如果可能的话:
在已被弃用的顺序式表示法中,逆魔改曾通过将减号 - 置于开头来表示:
以下是一种由于确实方便而未被弃用的 通过正负号来缩写相邻且互逆的魔改 的表示法:
(感谢 DragonFire28 提议的文本颜色!)
逆魔改也可以使用函数的幂运算来表示:
元魔改
在特定情况下,被施加魔改效果的对象可以不是关卡。(待补)