恶魔城III密码算法

2021-01-01 08:49:39

本文介绍了用于通过密码媒介保存和还原游戏状态的机制。此处讨论的信息适用于为NES发布的北美和PAL版本,而不是为Famicom发布的日语版本。

采用了组合的名称和密码系统。在游戏开始时,提示玩家输入名称:

名称由8个字符组成;出现的名称比用空格右填充的名称短。可用的字符集包括英文字母的大写字母,空格,感叹号,问号和句点。完全空白的名称(8个空格)有效。

游戏结束时,会为玩家提供一个选择:立即从上一个保存点继续进行,或将游戏状态编码为密码,从而使游戏可以在将来的某个时间恢复。

在这种情况下,名称设置为“ EXAMPLE”;它显示在屏幕顶部的框中。名称的正下方是一个水平表,其中包含密码中使用的标记:空白,鞭子,念珠和心脏。密码下面是一个4×4矩阵,其中每个元素都是一个标记。请注意,密码往往是稀疏矩阵。

为了保持游戏状态,玩家使用书写工具和一些艺术技巧将姓名和密码记在纸上。完成后,播放器可以关闭NES,这会擦除系统的内存,游戏状态以及所有内容。

要恢复游戏状态,玩家首先从标题屏幕中选择“ PASSWORD”:

如下所示,提示播放器输入与密码关联的名称。

屏幕上显示2个青色光标,一个用于从水平表中选择标记,另一个用于将标记放置在密码矩阵中。下图显示了输入的密码。

正确输入后,游戏将从保存点恢复。但是,丝毫错误会导致以下消息。

这通常是由于标记放错位置或未能写下名称而忘记了使用的内容。该密码仅适用于在游戏开始时输入的名称。

尽管《愤怒的电子游戏》书呆子Nerd在其恶魔城(第二部分)的视频中进行了演示,但“帮助我”仍然包含一个空格。

“ OKUDA”,“ URATA”和“ FUJIMOTO”这两个特殊名称从一个伙伴开始普通模式,但是在游戏的其余部分,它们也迫使玩家坚持该伙伴。在硬模式下,获取或交换伙伴也同样被禁用。在“ AKAMA”的情况下,这意味着要完全通过硬模式进行播放。

一些网站声称使用名称“ GAMETEAM”和特殊密码会在硬模式下启动播放器。并且,如果玩家成功击败游戏,则将显示真实的结局信用,从而揭示了制作游戏的实际团队。的确如此,但是名称和密码组合并没有什么特别的。无论名称如何,备用学分都是击败“困难模式”的奖励。此外,备用信用表示特殊名称的来源:

密码封装保存点,伙伴和模式。这些是玩家在游戏结束后继续进行时保留的游戏状态的唯一属性。其他所有内容均已重置。

在失去所有生命之后,玩家会回到最近的保存点。这通常意味着从当前块开始重新启动它。但是由于快捷方式和子老板,情况并非总是如此,如下表所示。

有18个保存点,索引为$ 00– $ 11。游戏中从未提及过地点和老板的名字;说明因来源而异。相反,块和子块的值出现在HUD中。所有块均以1或A子块开头,除了“黑暗之森”,它们可以从保存点$ 03或$ 04输入:

保存点$ 0B和$ 0C共享公共块值。但是它们是2个完全不同的级别:

在普通模式下,没有特殊名称的情况下,只能沿保存点的路径使用伙伴,该路径始于在游戏中首次遇到该伙伴。密码解码期间,将对照下表检查保存点和伙伴的组合。如果它是无效的组合,则密码被拒绝。

对于特殊名称(“帮助我”除外),将跳过此检查。剩下的特殊名称从一开始就将游戏锁定为特定的合作伙伴,对于“ AKAMA”,则没有合作伙伴。

另外,解码始终使用封装在密码中的伙伴,而不必使用与特殊名称关联的伙伴。例如,如果以“ OKUDA”开始新游戏,则玩家会立即陷入Alucard的困境。但是,可以在任何保存点和模式下为任何伙伴构造一个有效的“ OKUDA”密码。正常游戏不会显示这样的密码。但是尽管如此,它还是可以构建和使用的。

“ AKAMA”也一样,但是无论密码中封装了哪种模式,始终使用“硬模式”。

在正常模式下击败游戏后,游戏将在困难模式下重新启动,这从一开始就困难得多。敌人越多,移动速度越快,造成的伤害也更多。下方是“普通模式”的第一个屏幕之一。右边是它的“硬模式”对手,带有更多敌人。

在普通模式结束时与播放器配对的伙伴进入硬模式。但是,在“硬模式”下,交换伙伴的功能被禁用;如果单独击败普通模式,则玩家会无限期地与同一个伙伴卡住,或者根本没有伙伴。

在困难模式下击败游戏后,它将重新启动,但在某些困难模式下不会重启。只有2种模式,“硬模式”循环不断。

密码并没有封装整个8个字符的名称,而是仅包含3位哈希。哈希是通过将所有字符值的总和加4并取模8得出范围为0-7的值来计算的:

有趣的是,游戏代码使用一个表根据循环的索引向运行总和添加不同的常量:

; hashName() ; out:A =名称哈希(0--7) 03:B6CD LDA#$ 00 03:B6CF STA $ 0000;总和= 0; 03:B6D1税 03:B6D2 LDA $ 07F8,X;对于(X = 0; X< 8; ++ X){ 03:B6D5 CLC 03:B6D6 ADC $ B6E6,X 03:B6D9 CLC 03:B6DA ADC $ 0000 03:B6DC STA $ 0000; sum + =名称[X] + NAME_HASH_SEEDS [X]; 03:B6DE INX 03:B6DF CPX#$ 08 03:B6E1 BNE $ B6D2; } 03:B6E3 AND#$ 07; A =总和%8; 03:B6E5 RTS;返回; ; NAME_HASH_SEEDS ;由于取模运算,该表是没有意义的。可以提前计算这些值。然而 ;意图是仅将此表应用于非空白字符。但是那张支票不存在。 03:B6E6 .byte $ 07,$ 03,$ 01,$ 06,$ 02,$ 04,$ 05,$ 00

如评论中所述,该表毫无意义。 目的可能是只为非空白字符添加常量。 而且,无论出于何种原因,都没有支票。 字符值是模式表的图块索引。 如下所示,A–Z,后跟感叹号和问号,对应于$ 50– $ 6B。 期间为$ 4B。 而空间是$ 00。 特殊名称的散列方式与其他任何名称相同。 对于空白名称(以8个空格表示),情况也是如此。 有效负载字节包含模式(位0),伙伴(位1-2),切换掩码索引(位3),保存点的最低有效位(位4)和名称哈希