【走进U学】file0、8、9与undertale.ini分析
undertale吧
全部回复
仅看楼主
level 10
santizhizi 楼主
之前就想把自己写过的技术向文章往吧里转一点,但贴吧格式单一、难以修改、吞楼严重等问题让这个计划很难实施。近两天整理了一下文章列表,感觉这个系列的内容似乎还是比较容易转的,而且写的时间够晚也保证了严谨丰富程度,希望能给吧里愿意深入了解UT的同好带来一点帮助吧。
本系列文章原本共分为4篇,同时发布在LOFTER(giasfclfebrehber)、知乎(santizhizi)、B站(杜若想要变得可爱)的账号上。这些地方的格式都是完整的,也没有缺漏,如果可以的话推荐搜索标题去任意一个贴吧以外的渠道阅读。不过我猜贴吧还是能给我留几层楼的?[开心]
二楼开始正文。
2020年04月29日 12点04分 1
level 10
santizhizi 楼主
第一部分——UT存档读档机制简述
一、找到存档文件
在UNDERTALE的游戏世界里,玩家可以称得上是神一般的存在了。拥有从存档点复活的能力,可以用无限的机会去在游戏世界中作出各种不同的选择。要说唯一有哪点不够方便的话,大概就是存档点的“覆盖”机制了吧?
在这种机制下,我们能操控的时间线被限制为仅有一条,一旦有哪一步选错后存了档,想要纠正这个错误就不得不关闭游戏选择“RESET”,或者在达成某个普通结局后自动重置,一切都从头开始……除非备份存档【手动滑稽】。
2020年04月29日 12点04分 2
level 10
santizhizi 楼主
那么,存档文件要到哪里去找呢?这一点在之前写战斗系统分析时给出过一个Windows版的GIF教程:
总而言之就是找到 C:\Users\【你的用户名】\AppData\Local\UNDERTALE
如果你至少完成过一次普通结局且存过档的话,文件夹里大概长这样:
config.ini只记录界面语言选择以及控制杆的设置,这里不细说。主要就是下面的四个文件。其中undertale.ini也可以用在全局搜索中来快速找到这个文件夹。因为你即使还刚刚进入游戏,没来得及存过档,只要在废墟开头见过一次Flowey,这个文件就一定会存在。具体的后面会说明。
这几个文件的具体作用,如果看过之前的分析应该差不多都有一些了解了,在这里复习一下:undertale.ini是游戏用来记录跨周目变量的文件,正因为有了这个文件的存在,部分角色才会对玩家在其他时间线里发生的事有认知。而file0、8、9则是记录存档的文件。那么问题来了,既然我们能控制的只有一条时间线,为什么会有三个存档文件?
2020年04月29日 12点04分 3
level 10
santizhizi 楼主

二、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这三个数字也纯粹是因为它们在键盘上挨着呢?
2020年04月29日 12点04分 4
这里的5楼被隐藏了,推荐直接去看原文章,或者在27楼查看截图版
2020年04月29日 13点04分
1是猹
2020年06月10日 11点06分
猜想:福的存档上写的是猹的名字,可能福猹使用同一存档——甚至是同一灵魂——甚至是改头换面的同一人 小花没有灵魂,但是他有决心,所以他自己也有属于自己的存档(还记得三角符文里asgore的花店里,红色的花被换成了金色的花吗?)
2020年08月11日 14点08分
弄不好【八个人类】的概念是toby的误导,是【死去的六个孩子+生死边转悠的两个孩子】(红色灵魂人类+白色灵魂山羊)
2020年08月11日 14点08分
level 10
dd,这个技术贴写得很好[真棒]
2020年04月29日 12点04分 6
level 10
santizhizi 楼主
第二部分——ini全变量解析
点击进入上一部分讲过的file0所在目录,打开undertale.ini(电脑自带记事本即可,其他文本编辑软件更好)。每个人看到的列表可能会各有不同,不过整体结构应该还是大同小异的。
文件内部没有难懂的十六进制编码,也没有复杂的逻辑,只有用方括号分类的几组简单的单词和数值而已。对于修改数据的新手来说也十分友好。不过……如果这样看起来还是觉得麻烦的话,还有更简单的。
再次强烈推荐这个超好用的GitHub神器,Cofeiini制作的UndertaleSaveEditor,汉化版链接以前发的贴子有,本吧精品贴可见。因为有修改游戏相关文件的功能所以下载时360可能会误报隔离,但真的没有任何病毒。接下来也将以本工具的列表顺序讲解各个ini变量。
2020年04月29日 12点04分 7
这里的12楼被隐藏了,建议直接看原文章或者跳转28楼查看。
2020年04月29日 13点04分
level 15
前排
2020年04月29日 12点04分 8
level 11
dd
2020年04月29日 12点04分 9
level 14
[滑稽]一想到我看过无数遍的东西也将会被其他人看无数遍,我充满了决心[心碎]
2020年04月29日 12点04分 10
level 10
santizhizi 楼主

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。
调用:在关游戏后重新打开时的读档界面显示。
2020年04月29日 12点04分 13
level 10
santizhizi 楼主

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(已经卖了灵魂),此变量出现。可视作已经了解了屠杀路线的“真相”。
2020年04月29日 12点04分 14
level 10
santizhizi 楼主

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的电话,叫主角去找她,同样是完成送信任务。
2020年04月29日 12点04分 15
level 8
变量直接是单词。。。感觉不用修改器了
2020年04月29日 12点04分 16
level 10
santizhizi 楼主

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。播放结束后回到原来的地图。
2020年04月29日 12点04分 17
这里补充一下,声音测试房间的条件除了两处fun值、0.5概率以外,还必须在Papyrus战斗后,之前无法触发。
2020年06月12日 10点06分
以及楼下的那个楼中楼太长了,在这里补一下找词游戏“噩梦”模式的条件,fun值为57也可以触发,甚至file0和ini分别是56和57都行
2020年06月12日 10点06分
level 10
santizhizi 楼主
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值也还是试了十多次才终于打开了灰色门。
2020年04月29日 12点04分 18
在DR里应该是作为一个冰淇淋店的吉祥物,Bpants和“Blue ears(好冰棒小哥?)”在那儿工作,喵呜~
2020年04月29日 15点04分
@怪盗小雨QAQ 所以才有猜测Sans来自dr的啊(大量证据中比较不起眼的一条)。话说既然你在线要不要去隔壁贴补充一下Toby回答Asgore杀死六人类的图啊?我也想存一个[滑稽]
2020年04月29日 15点04分
@santizhizi 如果没被吞的话,我应该是发了xwx,喵呜~
2020年04月29日 15点04分
如果你发的是8楼的话,那没错,确实被吞了
2020年04月29日 15点04分
1 2 3 4 5 尾页