undertale吧 关注:144,328贴子:1,900,941

【走进U学】file0、8、9与undertale.ini分析

只看楼主收藏回复

之前就想把自己写过的技术向文章往吧里转一点,但贴吧格式单一、难以修改、吞楼严重等问题让这个计划很难实施。近两天整理了一下文章列表,感觉这个系列的内容似乎还是比较容易转的,而且写的时间够晚也保证了严谨丰富程度,希望能给吧里愿意深入了解UT的同好带来一点帮助吧。
本系列文章原本共分为4篇,同时发布在LOFTER(giasfclfebrehber)、知乎(santizhizi)、B站(杜若想要变得可爱)的账号上。这些地方的格式都是完整的,也没有缺漏,如果可以的话推荐搜索标题去任意一个贴吧以外的渠道阅读。不过我猜贴吧还是能给我留几层楼的?
二楼开始正文。


IP属地:黑龙江1楼2020-04-29 20:21回复
    第一部分——UT存档读档机制简述
    一、找到存档文件
    在UNDERTALE的游戏世界里,玩家可以称得上是神一般的存在了。拥有从存档点复活的能力,可以用无限的机会去在游戏世界中作出各种不同的选择。要说唯一有哪点不够方便的话,大概就是存档点的“覆盖”机制了吧?

    在这种机制下,我们能操控的时间线被限制为仅有一条,一旦有哪一步选错后存了档,想要纠正这个错误就不得不关闭游戏选择“RESET”,或者在达成某个普通结局后自动重置,一切都从头开始……除非备份存档【手动滑稽】。


    IP属地:黑龙江本楼含有高级字体2楼2020-04-29 20:22
    回复
      那么,存档文件要到哪里去找呢?这一点在之前写战斗系统分析时给出过一个Windows版的GIF教程:

      总而言之就是找到 C:\Users\【你的用户名】\AppData\Local\UNDERTALE
      如果你至少完成过一次普通结局且存过档的话,文件夹里大概长这样:

      config.ini只记录界面语言选择以及控制杆的设置,这里不细说。主要就是下面的四个文件。其中undertale.ini也可以用在全局搜索中来快速找到这个文件夹。因为你即使还刚刚进入游戏,没来得及存过档,只要在废墟开头见过一次Flowey,这个文件就一定会存在。具体的后面会说明。
      这几个文件的具体作用,如果看过之前的分析应该差不多都有一些了解了,在这里复习一下:undertale.ini是游戏用来记录跨周目变量的文件,正因为有了这个文件的存在,部分角色才会对玩家在其他时间线里发生的事有认知。而file0、8、9则是记录存档的文件。那么问题来了,既然我们能控制的只有一条时间线,为什么会有三个存档文件?


      IP属地:黑龙江3楼2020-04-29 20:24
      回复
        二、file0、8、9的异同
        为了让大家有个基本的概念,先直接上简单结论:
        file0在使用存档点手动存档时出现或更新内容,在平时关游戏进入标题画面(如下图)读档时,其中数据具有最高的优先度。

        file9除手动存档外,还在部分剧情节点自动存储以作为备份,在游戏内死亡直接读档时,其中数据具有最高的优先度。
        file8在第一次打过Asgore,Flowey出现并强制关游戏时出现,以免关游戏的过程让无存档通关玩家失去未备份的数据,在刚打完Omega Flowey战后,file8内容对普通结局电话的内容判定有着最高的优先度。
        (怎么感觉都没其他可说的了呢……)
        也可以换一种理解方式:当玩家控制角色与大地图上的金色存档点互动时,这是“玩家”与“角色”共同进行的一次存储行为,所以file0和file9都会被更新记录。而当角色本身经历某些特殊事件时(比如乘过某个电梯后,后文详细列举),“意识到”需要记录的只有“角色”本身,所以只有file9会被更新记录。最后一种情况,当Flowey吸收了所有灵魂,强制关游戏时,是他在“SAVE for you”(意外地挺良心),所以动的是file8。
        读档的情况下,上面的读档界面很明显是只有玩家才能看到的,而右上角/ESC关闭游戏也是用电脑控制游戏的玩家特权,所以在此界面读档以属于玩家的file0为准。而如果在游戏内经历死亡并读档回来,在游戏世界观内就可以解释,所以读取属于角色的file9。只有在你刚刚和Omega Flowey打过一场时,之前对时间线的控制力是他更强,才会以属于Flowey的file8进行读档。这么理解或许更清楚一些?
        如果还有疑问,下面这张图或许能帮大家想起来一些问题。

        在本次战斗中,Flowey会频繁以各种不同编号存档或读档,经统计屏幕上显示过的包括file2、3、4、6,代码里还有一个读取失败的file5。按照Flowey已吸收所有人类灵魂的设定也说得通。换句话说,在UNDERTALE的世界观内,很可能每一个能够存读档的个体都对应一个属于自身的FILE
        但是这又引出了一个新的问题。Flowey共吸收了六个灵魂,但存读档时只用了五个编号,对比我们自己的存档仍空缺file1和file7两个编号。所以我们无从得知到底是 a)“第一个坠落的孩子”对应file1,六魂中未出现的那个对应file7;还是 b)“The Fallen Child”并没有对应的存档,file7是六魂之后小花之前的其他存在。根据前传设定的不同,这个问题可以有任何解释,我就不乱猜了。
        啊对了,顺带一提,小花战中虽然出现了这些SL的文字,但实际上并没在玩家的电脑里存储任何类似的东西。只有开启debug模式的玩家,才能靠数字键0~4选择使用不同的存读档文件。至于这里为什么是除本身的0之外多出来1~4,我觉得debug模式就不用多想了吧……
        ——又或者Toby选择890这三个数字也纯粹是因为它们在键盘上挨着呢?


        IP属地:黑龙江本楼含有高级字体4楼2020-04-29 20:26
        收起回复
          dd,这个技术贴写得很好


          IP属地:上海6楼2020-04-29 20:30
          回复
            第二部分——ini全变量解析
            点击进入上一部分讲过的file0所在目录,打开undertale.ini(电脑自带记事本即可,其他文本编辑软件更好)。每个人看到的列表可能会各有不同,不过整体结构应该还是大同小异的。

            文件内部没有难懂的十六进制编码,也没有复杂的逻辑,只有用方括号分类的几组简单的单词和数值而已。对于修改数据的新手来说也十分友好。不过……如果这样看起来还是觉得麻烦的话,还有更简单的。

            再次强烈推荐这个超好用的GitHub神器,Cofeiini制作的UndertaleSaveEditor,汉化版链接以前发的贴子有,本吧精品贴可见。因为有修改游戏相关文件的功能所以下载时360可能会误报隔离,但真的没有任何病毒。接下来也将以本工具的列表顺序讲解各个ini变量。


            IP属地:黑龙江7楼2020-04-29 20:33
            收起回复
              前排


              IP属地:江西来自Android客户端8楼2020-04-29 20:33
              回复
                dd


                IP属地:陕西来自Android客户端9楼2020-04-29 20:34
                回复
                  一想到我看过无数遍的东西也将会被其他人看无数遍,我充满了决心


                  IP属地:江苏来自Android客户端10楼2020-04-29 20:36
                  回复
                    Gameover
                    存储:在战斗中灵魂破碎,看见这几个字的画面,准备出现回忆台词时+1(包括会同时记录特殊数值的Asgore战,也包括音乐不同的“背叛杀”,但不包括Omega Flowey的论外战斗)。
                    调用:【重点】这里补充一下ini数值+1的机制,是先调用一次原数值,将其存储为某个中间变量,接下来对中间变量进行根据剧情的条件判定,再存储回ini。所以本数值最常见的自然是每次死亡时在+1之前的调用。除此之外还有两个大家都有印象的场景——
                    1.Temmie商店,在进商店的一瞬间调用数值,根据Gameover的大小给Temmie Armor降价。当死亡次数至少为25次时,降到最低价750。代码中还出现了一个30次降到500G的,但商品序号被更改过导致没有出现,不清楚是刻意更改还是又出了bug(咦我为什么要说又呢?)。
                    2.gml_Object_obj_sansdate3_Step_0.gml,就是想放一下这个gml文件名【不是】。在MTT酒店,“you haven't died a single time.(你从来没有死过。)”一句出现后,读取Gameover数值。根据是否为0影响后面的台词,没死过的情况下是“that's right, isn't it? well, chalk it up to my great skills.”,死过的情况下是“hey, what's that look supposed to mean? am i wrong...?”。
                    Kills
                    存储:在每次进行手动存档时,当前的杀怪数量被写入ini。
                    调用:只被调用到某个名为self.kills的中间变量过,然而这个中间变量从来没被用过,包括屠杀线存档界面显示看的也是file0而不是ini。
                    Love
                    存储:在每次进行手动存档时,当前的LV被写入ini。
                    调用:在关游戏后重新打开时的读档界面显示。
                    Name
                    存储:在每次进行手动存档时,当前的名字被写入ini。
                    调用:在关游戏后重新打开时的读档界面显示。
                    Room
                    存储:在每次进行手动存档时,当前的房间名被写入ini。
                    调用:在关游戏后重新打开时的读档界面显示。
                    Tale
                    存储:在新家各种小怪物讲述第一名人类和Asriel的故事后,Froggit说完“You are going to be free”时,Tale被设定为1。屠杀线换成Flowey讲故事的情况下这个量不会变化。
                    调用:在讲故事的一开始调用,如果Tale为0,那么第一次听整段故事的过程中是不能按X跳过文本的。但在Tale大于0的情况下,即第二次听故事,就可以加速跳过了(虽然也快不了多少)。
                    Time
                    存储:在每次进行手动存档时,当前周目的时间被写入ini。
                    调用:在关游戏后重新打开时的读档界面显示。


                    IP属地:黑龙江本楼含有高级字体13楼2020-04-29 20:41
                    回复
                      Truth
                      存储:从未被存储,猜测可能是初期计划但正式版被删除的内容。
                      调用:【重点】在这里介绍一个你可能知道也可能不知道的UT彩蛋。在UNDERTALE的标题界面(不是刚打开游戏时出现的,而是开场动画后让你按Z或Enter的那个)连续点击五次Shift键,就会在界面的左下角显示Activity Level。最多是像这样:

                      当然这是ini里几乎什么都有了的情况下出现的列表,大多数人的游戏界面中应该会缺个一两条。这里也提前简单说一下和此界面相关的其他ini变量好了。
                      Activity Level A:在ini中存在“Won”(完成过普通结局),或“Truth”(不会被存入),或“EndF”(完成过真和平结局),或“reset”(进行过真重置)的情况下,此变量出现。事实上,从真和平结局的前置条件来看,“Activity Level A”基本可视作已经了解了普通路线的“真相”。
                      Activity Level B:在ini中存在“Truth”(不会被存入),或“EndF”(完成过真和平结局),或“reset”(进行过真重置)的情况下,此变量出现。稍微对比一下就知道这是只能和A共同出现的内容,可视作已经了解了真和平路线的“真相”。
                      Activity Level C:在ini的[Sans]分类下存在“Intro”(存活过了开场攻击),或“F”(进入了战斗界面),或“SK”(杀死了Sans),或者在系统/steam云文件中存在system_information_963(已经卖了灵魂),此变量出现。可视作已经了解了屠杀路线的“真相”。


                      IP属地:黑龙江本楼含有高级字体14楼2020-04-29 20:42
                      回复
                        Won
                        存储:在普通结局出门并看到标题时,此变量+1。
                        调用:除了上面提到过的BW以及写入之前的调用外,还有以下几处:
                        1.在Asgore死后,Flowey出现的界面,如果Won=0,Flowey会吸收灵魂关闭游戏,后续进入Omega Flowey战。如果Won=1,Flowey会解释说自己知道这么做没意义,然后直接让主角出门接电话。如果Won=2,Flowey会开始不耐烦地说“Well, let's getting this over with.”当Won至少为3时,Flowey的台词只有一串省略号。
                        2.在Undyne约会的结尾,离开燃烧的房子以后,如果Won大于0,Undyne会直接让主角帮忙给Alphys送信。
                        3.如果之前已经完成了Undyne的约会但没有完成普通结局(常见于第一次无Kill普通结局后读档的情况),在走到MTT酒店与核心中间的那段路(如下图)时会接到Undyne的电话,叫主角去找她,同样是完成送信任务。


                        IP属地:黑龙江本楼含有高级字体15楼2020-04-29 20:43
                        回复
                          变量直接是单词。。。感觉不用修改器了


                          16楼2020-04-29 20:43
                          回复
                            fun
                            存储:在第一次打开游戏,或每次重置(普通重置或真重置都算)的白屏后设定为一个1到100之间的随机整数。在部分fun值相关事件结束后会被归零。
                            调用:虽然我觉得fun值相关事件应该已经挺广为人知的了,但最近发现谣言传得也挺多,什么事都有人说是和fun值有关。这里干脆来个完整版的列表,也算存个档了。
                            【重点】注意ini中的fun值与游戏状态中flag[5]的不同。某些fun值事件(如Clam Girl、refrigerator running电话、pizza电话、wrong number song电话)只看当前flag[5]的fun值,而与ini无关。但其他的则需要两方同时满足条件才会出现,比如所有Gaster Follower的事件。
                            1.
                            undertale.ini:fun=65
                            游戏运行状态:Flag[5]=65
                            概率:0.5
                            room_tundra3A (47)(雪镇箱子路口)将连接到room_soundtest (270)(声音测试房间)。同时ini中的fun值清零,游戏状态中的Flag[5]也清零。

                            共有四段游戏中未出现的音轨,其中的一个是Gaster's Theme。播放结束后回到原来的地图。


                            IP属地:黑龙江本楼含有高级字体17楼2020-04-29 20:44
                            收起回复
                              2.
                              undertale.ini:fun=56
                              游戏运行状态:Flag[5]=56
                              雪镇森林的无解找词游戏谜题将变为“噩梦”模式,如图所示。

                              记得这个Ice-E只有在deltarune里还有出现过啊……
                              3.
                              undertale.ini:fun=66
                              游戏运行状态:Flag[5]=66
                              在room_water_savepoint1 (94)(奶酪被封在水晶里的存档点)右侧将会多出一条走廊,进入后ini中的fun值清零,游戏状态中的Flag[5]也清零。这条走廊有0.1的概率出现隐藏的灰色门,进入后看到神秘人。神秘人无碰撞体积,点击互动后伴随特殊音效消失,出门后灰色门也消失。

                              通过简单的概率知识就可以知道正常流程中想进入这个房间,概率只有千分之一,别被同人里重置几次就碰上的欧皇误导了,像我这种非酋就算改过fun值也还是试了十多次才终于打开了灰色门。


                              IP属地:黑龙江18楼2020-04-29 20:45
                              收起回复