饥荒——摸索本地文件解锁“植物登记表”

前言:本文是一篇作者自己摸索尝试通过修改本地文件的形式来解锁“饥荒联机版”中“植物登记表”的记录和分析。
适用于喜欢饥荒种田,但是因为更换steam账号而需要重新解锁“植物登记表”的“新号老手”和初次接触饥荒种田而苦恼于各种植物生长阶段和配肥的“懒虫萌新”玩家,这是因为通过本文介绍的方法将会直接解锁“耕作者先驱帽”中的全部植物图鉴和全部肥料图鉴。
声明:本文更多是记录作者的尝试经历,作者本人并不提倡直接跨越饥荒种田的游戏历程,舍弃游戏探索过程中的经历和逐步解锁植物与肥料的累积喜悦感。希望各位玩家考虑清楚后再选择是否使用下文方法!
起因:作者在一个新号中耕种饥荒时,发现自己的“耕作者先驱帽”因为换号的原因没有解锁作物和肥料(注:相同账号下饥荒不同的档会通用一份“植物登记表”中的解锁),由于之前都解锁过,所以想能不能通过更改本地文件的方式,将“植物登记表”一步解锁开,以节省时间。(再次声明:不推荐新手玩家直接一次都不亲自解锁。)
过程:
0.猜想:由于我们知道关于有关“植物登记表”的文件科雷并不是云端存储,而是使用玩家本地存储,所以饥荒的配置文件中一定有一个文档是有关“植物登记表”的只需要更改这个文件就可以直接解锁全部的植物生长过程。
1.尝试:通过查阅我们得知有关文件是在"C:\Users\username\Documents\Klei\DoNotStarveTogether\*******\client_save"文件夹下的,可以通过游戏内“数据”按钮直接找到其父文件夹。



此文件可以使用“记事本”打开,下文中我使用了“VScode”编辑此文件,如下:
KLEI 1 return {last_selected_card={
asparagus=5,carrot=5,garlic=4,dragonfruit=4},
filters={tab=2},
pictures={},
plants={asparagus={[3]=true,[4]=true,[5]=true},
carrot={[2]=true,[3]=true,[4]=true,[5]=true},
garlic={[4]=true},
dragonfruit={[3]=true,[4]=true}},
fertilizers={}}
而我自己的新号的“植物登记表如下图”:





通过这一段代码不难看出,作物后跟的“[n]”代表的就是该作物的第n阶段是否解锁。按照这个思路,我将上述四种作物全部改为:
[1]=true,[2]=true,[3]=true,[4]=true,[5]=true
当然这里有一个关键点:last_selected_card中的值需要相应更改,默认可以改为,已解锁阶段的最大值。如上我将其改为:
asparagus=5,carrot=5,garlic=5,dragonfruit=5
但是当我满心以为问题迎刃而解重新打开饥荒后,却发现,“植物登记表”没有一丝更改,此时再次打开“plantregistry”文件,发现就连代码也被重新覆盖为了原样。
第一次尝试失败。
2.尝试:查阅百度饥荒贴吧之后,看到一条帖子:

由此我有了一个猜想,既然“植物登记表”还是在本地文件中读取,那么就算科雷修复也顶多是增加了新的检验机制。比如在我的尝试中,就是检验失败,所以文件被系统重写。那么,只需要找到饥荒系统是怎么检验的,即找到检验值文件,应该就可以了。
我直接在“client_save”文件夹下搜索字段“plantregistry”来找到所有有关植物登记的文件,果然这时候,另一个文件映入眼帘:

很明显这个应该就是我要找的文件,而且他的关键词“keyvalue”(关键值)更让我确定了这一点。
打开该文件后代码结构如下:
{"Events":{
"COOKBOOK":{"KeyValues":{"baconeggs"://无关代码},"Revision":151,"Unchanged":true},
"GENERIC_KV":{"Revision":1,"Unchanged":true},
"PLANTREGISTRY":{"KeyValues":{
"asparagus":"1c",
"carrot":"1e",
"garlic":"8",
"dragonfruit":"c"},"Revision":21,"Unchanged":false},
"SCRAPBOOK0":{"KeyValues":{//无关代码},"Revision":29,"Unchanged":false},
"SCRAPBOOK1":{"KeyValues":{//无关代码},"Revision":29,"Unchanged":false},
"SCRAPBOOK10":{"KeyValues":{//无关代码},"Revision":31,"Unchanged":false},
"SCRAPBOOK11":{"KeyValues":{//无关代码},"Revision":32,"Unchanged":false},
"SCRAPBOOK12":{"KeyValues":{//无关代码},"Revision":44,"Unchanged":false},
"SCRAPBOOK13":{"KeyValues":{//无关代码},"Revision":41,"Unchanged":false},
"SCRAPBOOK14":{"KeyValues":{//无关代码},"Revision":29,"Unchanged":false},
"SCRAPBOOK15":{"KeyValues":{//无关代码},"Revision":25,"Unchanged":false},
"SCRAPBOOK2":{"KeyValues":{//无关代码},"Revision":35,"Unchanged":false},
"SCRAPBOOK3":{"KeyValues":{//无关代码},"Revision":38,"Unchanged":false},
"SCRAPBOOK4":{"KeyValues":{//无关代码},"Revision":28,"Unchanged":false},
"SCRAPBOOK5":{"KeyValues":{//无关代码},"Revision":43,"Unchanged":false},
"SCRAPBOOK6":{"KeyValues":{//无关代码},"Revision":34,"Unchanged":false},
"SCRAPBOOK7":{"KeyValues":{//无关代码},"Revision":38,"Unchanged":false},
"SCRAPBOOK8":{"KeyValues":{//无关代码},"Revision":24,"Unchanged":false},
"SCRAPBOOK9":{"KeyValues":{//无关代码},"Revision":35,"Unchanged":false},
"SKILLTREE":{"Revision":1,"Unchanged":true}}}
很明显一眼就能看到和“plantregistry”有关的“keyvalues”:
"asparagus":"1c",
"carrot":"1e",
"garlic":"8",
"dragonfruit":"c"
我猜测每个作物对应的值就是检验值,但是这其中的值又含有什么信息呢?如果有一点计算机基础的小伙伴应该很容易发现每个作物后的数是“十六进制数”。
所以我列出如下表:

起先我还在看解锁阶段和十进制数的关系,但是很快,就会发现,实际是解锁阶段对应的是二进制数。二进制数00000从低位到高位分别对应作物生长的五个阶段,解锁了的阶段就会被从0置1。比如芦笋的3、4、5阶段已经解锁,所以第3、4、5位0就被置为1,在转化为十六进制为“1c”。
由此,我在按照之前的想法更改了“plantregistry”文件的基础上,同时更改了文件“keyvalue_plantregistry_prod”中的代码,将对应的作物都改为了“1f”(“1f”的二进制位“11111”对应的五个阶段都被解锁)。
当我怀揣着忐忑的心再次打开饥荒的时候,终于看到“植物登记表”中相应的四个作物已经被解锁全阶段:




第二次尝试成功!
3.解锁:后面的事情就很简单了,那就是找到所有有关作物的代码,然后根据其拥有的阶段数,将其全部选择“置1”获得其十六进制数就可以了。
下面废话不多说,直接上代码:
plants={weed_forgetmelots={true,true,true,true,true},
asparagus={true,true,true,true,true},
carrot={true,true,true,true,true},
garlic={true,true,true,true,true},
dragonfruit={true,true,true,true,true},
pomegranate={true,true,true,true,true},
watermelon={true,true,true,true,true}, c
orn={true,true,true,true,true},
onion={true,true,true,true,true},
tomato={true,true,true,true,true},
pumpkin={true,true,true,true,true},
pepper={true,true,true,true,true},
durian={true,true,true,true,true},
weed_ivy={true,true,true},
weed_firenettle={true,true,true,true},
weed_tillweed={true,true,true,true},
potato={true,true,true,true,true},
eggplant={true,true,true,true,true}}
(“plantregistry”文件中的plants)
last_selected_card={ weed_forgetmelots=5,asparagus=5,carrot=5,garlic=5,dragonfruit=5,pomegranate=5,watermelon=5,corn=5,onion=5,tomato=5,pumpkin=5,pepper=5,durian=5,weed_ivy=3,weed_firenettle=4,weed_tillweed=4,potato=5,eggplant=5}
(“plantregistry”文件中的last_selected_card)
"PLANTREGISTRY":{"KeyValues":{
"corn":"1f",
"durian":"1f",
"eggplant":"1f",
"onion":"1f",
"pepper":"1f",
"potato":"1f",
"pumpkin":"1f",
"tomato":"1f",
"asparagus":"1f",
"carrot":"1f",
"garlic":"1f",
"dragonfruit":"1f",
"pomegranate":"1f",
"watermelon":"1f",
"weed_forgetmelots":"1f",
"weed_ivy":"7",
"weed_firenettle":"f",
"weed_tillweed":"f"},"Revision":**,"Unchanged":false},
(“keyvalue_plantregistry_prod”文件中的"PLANTREGISTRY"。注:“**”中填写自己的修订码。)
值得注意的是,在作物中有三种作物不是五个阶段:weed_ivy(刺针旋花:三个阶段), weed_firenettle(火荨麻:四个阶段),weed_tillweed(犁地草:四个阶段)。
相应的文件中就分别是:{true,true,true}、{true,true,true,true}和“7”、“f”(分别对应十六进制“111”、“1111”)。
做完上述这些改动之后重启你 的饥荒你就会看到自己的“植物登记表”中的所有作物已经全部解锁开啦!

4.肥料:解锁完作物后,我们不难发现,其实肥料代码应该在“plantregistry”文件中的“fertilizers={}”代码段中。
经过查阅B站博主:呐年丶韶华似水在2020年更新的一篇名为【饥荒联机】代码——农务篇(截止到12月16日种瓜得瓜更新)的帖子,可以得知部分肥料的代码:

这里对其给出一定更正:首先,饥荒后来额外添加了一种肥料:树果酱(treegrowthsolution)。其次,催长剂使用soil_amender是无法解锁“催长剂起子”的。需要将其分别改写为“soil_amender_low”、“soil_amender_med”、“soil_amender_high”,分别对应着“催长剂起子”、“正在发酵的催长剂”、“已经发酵的催长剂”。代码如下:
fertilizers={spoiled_fish_small=true,
spoiled_fish=true,
soil_amender_low=true,
soil_amender_med=true,
soil_amender_high=true,
soil_amender_fermented=true,
spoiled_food=true,
rottenegg=true,
compost=true,
compostwrap=true,
poop=true,
guano=true,
fertilizer=true,
glommerfuel=true,
treegrowthsolution=true}
(“plantregistry”文件中的fertilizers)

总结:截止目前为止,通过作者的尝试可以看到科雷确实仍将“植物登记表”的有关文件都保存在玩家本地,也说明了通过修改文件解锁全作物阶段和肥料是完全可行的。
最后仍需说明:本文不是单一解锁攻略,略显啰嗦,这是因为对于作者本人也是一次解锁过程的记录,如给读者冗长感受,略表歉意。再者就是,本文仅代表作者探寻的一种可能性,并不代表作者本人支持通过这种方式来跨越游戏体验(详见前文声明),请各位玩家慎用。
(看到最后,请给新人up一个关注,或者一个赞吧!)