吞食天地诸葛孔明传64物深入研究
存档文件(吞食天地.sav)部分地址意义:
540~57f 役所物品ID 580~5bf 役所物品数量 5c0~5ff 空闲!
600~603 空闲
604~607 我方阵型
608~60f 空闲
610~614 我方5位出阵武将序号
615~61b 我方7人状态(80:正常,c0:军师,其他:负伤)
61c~620 对阵5人状态(80:正常,其他:负伤)
621~627 我方7人武将ID
628~62c 对阵5人武将ID
62d~641 我方7人现存兵力
642~650 对阵5人现存兵力
651~665 我方7人最大兵力
666~674 对阵5人最大兵力
675~67b 我方7人武力
67c~680 对阵5人武力
540~57f分别对应役所64件物品的种类ID,540代表第1件物品的种类,57f代表第64件物品的种类。与上述相似,580~5bf分别对应役所64件物品的数量信息,580代表第1件物品的数量,5bf代表第64件物品的数量。
每使用一次64物法,地址540~57e向上偏移1个字节,地址580~5be向上偏移2个字节。
举个例子,使用第一次64物法后,原本地址57e(第63件物品ID)的信息偏移到了57d(第62件物品ID)的位置,而原本地址580(第1件物品的数量)的信息偏移到了57e(第63件物品的ID)的位置。
换言之,现在第62件物品是原来第63件物品,现在第63件物品则是原来第1件物品的数量。
我们已经知道物品数量会向上搬移2个字节,比较好理解的是,现在第60、61件物品的数量来自于原来第62、63件物品的数量,那么原来第62、63件物品的数量来自于哪里呢?这里可以告诉你,这两个位置(57d、57e)填充的是0,也就是256件。有人可能会困惑,当使用64物法的次数”足够多”时,第63件物品会凭空消失,我们使用64物法的时候,还需要重新补充物品,这是为什么呢?
这里也可以解释一下,首先”足够多”的现象,其实是从第33次使用64物法时发生的。我们已经知道,第1次使用64物法时,原来第63件物品的数量偏移成现在第61件物品的数量。以此推算,第31次使用64物法时,最早第63件物品的数量已经偏移成现在第1件物品的数量;第32次使用64物法时,最早第63件物品的数量则会偏移成第63件物品的ID;第33次使用64物法时,先前我们第1次使用64物法时用来填充到第63件物品数量的0(256件),会偏移成现在第63件物品的ID——而0用来表示物品的种类/ID时,表示的正是”无”,因此我们会看到第63件物品”消失”。下面说一下实际应用。
首先,我们可以凭空变出一些物品,每使用一次64物法,原来第1件物品的数量,都会变成现在第63件物品的ID。具体的ID映射关系,可以百度搜索”吞食天地2 金手指”之类的关键词,想把物品数量变为0(256件),可以百度搜索”吞食天地2 无线复制”之类的关键词查阅,本贴不再赘述。值得一提的是,原版一共有00~7f共128个物品ID(00代表的是”无”),而物品数量则是0~255共256种情形,因此同一个物品ID可以对应两个数字,比如21号和a1表示的都是青铜剑。
其次,我们可以把一件物品变无限,每使用一次64物法,原来的第62、63件物品的数量会变为0(也就是256件)。当然,无限复制法也可以办到这件事情。凭空变出物品,还有着诸多妙用。
比如,提前变出关键道具火药,可以在第二章到达荆州后,立刻收了襄阳的铁器和孟达山洞的火焰甲;第三章火烧曹仁后,可以直奔襄阳灭掉蔡瑁、张允,然后江夏渡口坐船前往柴桑,与孙权对话即可去找庞统实施连环计。如此一来,可以跳过大量第三章的剧情,还可以避免刘表之死……再比如,提前变出关键道具青铜钥匙,可以在到达涪城后,立刻前去开水闸,然后前往落凤坡触发庞统之死,便可以坐船前往巴城,通过后方进攻成都了。这样可以跳过攻打张鲁等剧情。其他的不再一一赘述,大家自己去发现吧。接下来讲武将部分,相比物品部分的明了,武将部分要复杂一些。
使用64物法后,地址604~607会发生一些改变,理论上会改变我方的阵型,暂时还没有做过多研究。地址610~620会向上偏移2个字节,这几处数据改变的实用性不大。真正有意义的是接下来的部分:
地址621~627是我方队列武将的ID,此处的改变,直接影响我方队列的现有武将。每使用一次64物法,地址621~641会向上偏移2个字节,地址642~680会向上偏移1个字节,地址680及之后则不会发生变化。
简而言之,通过64物法造成的偏移,可以把对阵武将、各种兵力信息和武力信息转化为我方队列武将。武将ID信息,用1个字节储存,00表示刘刘……ff表示海贼,具体的映射关系,可以百度搜索”吞食天地2 金手指”等关键词查阅。
兵力信息,用3个字节倒序表示,例如”b1 0e 00″则为0xeb1,等同十进制的3761。
武力信息,也用1个字节表示,例如”f0″等同于十进制的240。现存兵力与最大兵力的区别:现存兵力为上次战斗结束后,双方剩余的兵力。如果非战斗中主动撤退,通常情况下战胜后,敌方现存兵力为0。存档复位后,我方出阵队列(地址610~614),及所有对方的武将ID、兵力、武力等信息都会被清零。查看编所武将后,对阵武将中大将的武将ID、最大兵力、武力等信息会被查看武将的信息所覆盖,对阵大将的现有兵力信息不会发生改变。
接下来是数学课时间,我们举个例子。
我方武将ID,7个字节,621~627分别为:
关平(9)
周仓(c)
孔明(8)
赵云(b)
张飞(3)
关羽(2)
伊籍(d)
对阵武将ID,5个字节,628~62c分别为:
吕布(43)
李傕(39)
郭汜(3a)
张济(3b)
李肃(3d)
我方当前兵力,21个字节,62d~641分别为:
关平兵力 1588 (34 06 00)
周仓兵力 1140 (74 04 00)
孔明兵力 915 (93 03 00)
赵云兵力 1085 (3d 04 00)
张飞兵力 1258 (ea 04 00)
关羽兵力 970 (ca 03 00)
伊籍兵力 1375 (5f 05 00)
对方当前兵力,21个字节,642~650分别是:
吕布兵力 3800 (d8 0e 00)
李傕兵力 3100 (1c 0c 00)
郭汜兵力 3000 (b8 0b 00)
张济兵力 3200 (80 0c 00)
李肃兵力 2800 (f0 0a 00)
我们已经知道,每使用一次64物法621~641向上偏移2个字节。
第1次使用64物法后,我方武将ID地址段的关平、周仓被挤走,其余5位武将向上偏移2个字节,吕布、李傕占有了原来关羽、伊籍的位置。
第2次使用64物法后,孔明、赵云被挤走,郭汜、张济加入队列。
第3次使用64物法后,张飞、关羽被挤走,李肃、『赵范』加入队列。
第4次使用64物法后,伊籍、吕布被挤走,
『张苞』、『刘刘』加入队列。
为什么是第3次64物法后,『赵范』会加入队列呢?
地址62c是李肃的武将ID(3d),
地址62d是关平兵力信息的一部分(34),
0x34对应到武将ID中,恰好是赵范。
同理,62e、62f的0e、00,对应的武将ID分别是张苞、刘刘。
至于使用64物法后,所引发的兵力的暴涨,也可以按此楼的方法进行准确推理。
综上所述,可以通过64物法,结合我方武将现有兵力的调整,变出想要的任意武将。神秘武将、颜良、太史慈等等,都可以轻易收至麾下。接下来,我们探讨更为深入的话题:第一章如何避免64物法引起的各种卡死问题,以及第二章开始如何保留一些特殊武将。我们假定地址627~621,分别为1~7号位置。
开局之后,刘备、关羽、张飞、路昭、朱灵,分别在在1~5号位。
朱路离队后,陈登继承5号位,颜良、文丑、赵云先后继承4号位。夫人、关平先后为7号位,周仓为6号位。
多说几句,第三章卧龙出山后,孔明继承陈登的5号位,鲁肃继承刘备的1号位;第四章鲁肃离队后,1号位则由伊籍继承。以陈登入队为例,我们讲一下武将入队还是入编的问题。
陈登入队的条件:
A. 1~5号位对应地址(627~623)的数据为〖0〗;
B.队列不满7人(包含刘刘和复制武将)。
这里的数据〖0〗,又有两种情况:
a.该位置为显示武将刘刘;
b.该位置不显示(空置),且没有”隐藏武将”(包括该位置为隐藏武将刘刘的情形)。
下面举几个例子:
1.朱路离队前,打败纪灵后,我们一路护身烟返回徐州使用1次64物法,朱路分别被偏移到7、6号位,因为当前队列只显示1~5号位,所以7号位的朱灵、6号位的路昭变成了”隐藏武将”。此时,1~5号位分别为”显示武将”纪灵、梁刚、刘备、关羽、张飞,等我们打败袁胤、袁术、车胄后,回到徐州是无法使陈登入队的(陈登会入编所),因为1~5号位都已经被占满了。
2.朱路离队前,打败纪灵后,我们一路护身烟返回徐州,『复位重载后』使用1次64物法。此时,1~5号位分别为”显示武将”刘刘、刘刘、刘备、关羽、张飞,等我们回到徐州是可以使陈登入队的,因为1~2号位是显示武将刘刘。陈登入队后,队列会有1个刘刘消失,同时新增2个陈登。
3.打败袁术,我们一路护身烟回到徐州,朱路离队后,使用1次64物法。此时,1~3号位分别为”显示武将”袁术、纪灵、刘备,4~5号位分别为”隐藏武将”关羽、张飞,6~7号位不显示,且没有隐藏武将(因为原本4/5号位的路昭/朱灵已经离队)。此时。打败车胄后,也不能使陈登入队,因为1~5号位都已经被占满了,尽管4、5号位是被”隐藏武将”占据。理解了陈登入队的问题后,下面的各种场景将变得容易理解。
1.徐州撤退战。撤出循环战+保证有船开往冀州的条件:队列中必须有关羽!至于张飞,则可有可无。
2.冀州颜良/文丑/杨怀可入队的条件,与陈登入队的条件相同。各种使用64物法后的具体情形,有兴趣的吧友可以自行分析。
3.正常情况下,可以用信先后收颜良、文丑、杨怀入队,按照入队顺序,三人分别占用4~2号位。2号位注意别把关羽的石刀弄丢,另外可以提前装个鳞盾,降低二爷过五关斩六将的难度。
4.剧情跳转至宛城的关羽/夫人时,如果不想被关在宛城出不了门,要求7号位地址的数据必须为〖0〗(约等于必须要在夫人的物品栏中看到『赤兔马』)。具体的数据〖0〗规则,与陈登入队楼的说明相同。
5.过五关斩六将时,如果不想被卡死在荥阳关(王植到处乱走,不再接待关羽,从而无法通过此关,导致前往冀州的渡船不会出现),剧情跳转关羽/夫人前,与袁绍对话时,队伍中必须有陈登。
6.剧情跳转至关平找刘备时,如果不想因为丢了刘备,导致关定庄陷入循环找刘备或者第二章开始队伍隐形的话,剧情跳转前,关羽与关定对话时,要求1号位地址的数据必须为〖0〗。具体的数据〖0〗规则,与陈登入队楼的说明相同。
陈登加入时,默认为5号位。
如果5号位被占用(即地址数据非〖0〗),则会向下论询,去查看4号位的状况。以此类推,如果5~1号位都被占用,则陈登入编。
如果某位置为〖0〗,且为显示武将刘刘,则刘刘消失,加入两个陈登;如果某位置为〖0〗,且无隐藏武将,则陈登正常入队。
冀州颜良/文丑/杨怀(默认4号位)的加入,跳转宛城时关羽(默认2号位)/夫人(默认7号位)的加入,跳转关平找刘备时刘备(默认1号位)/陈登(默认5号位)/关平(默认7号位)的加入,都会遵循向下论询的定律。两次剧情跳转(跳转宛城关羽/夫人,跳转关平找刘备),都会将我方队列中的显示武将清空一次。
如若队列中有多个ID相同的武将,比如跳转关平找刘备之前,我方队列有3个神秘武将,则只会清空位置号最大的一个,另外2个随剧情跳转至刘备处。至于隐藏武将,剧情的跳转不会对其造成影响。利用这两个特性,我们可以将神秘武将、夏侯惇、杨怀、曹操等武将,保留至第二章的荆州使用!说一下第二章(荆州)开始,队列刷新的问题:
1.所有的隐藏武将都会变为显示武将;
2.所有的重影武将都会变成一个;
3.所有的刘刘都会消失;
4.1~3位需要对应为刘关张三人。
如果这三个位置号存在不匹配的情况,第二章的指令将不完整:
a.如果1号位不匹配,此时队列为空,强行执行队列指令的话,会导致武将的物品/装备栏混乱,有可能出现藤甲等高级装备,也有可能出现一堆石斧。此外,不能查看我方武将状态,不能调整物品、装备,非战斗状态不能使用物品、谋略等等。同时,大地图不显示武将模型(即队列处于幽灵状态)。
b.如果1号位匹配且2号位不匹配,则只能对刘备使用上述指令,大地图只显示刘备模型。
c.如果1.2号位匹配但3号位不匹配,则只能对刘备关羽使用上述指令,大地图也只显示刘备关羽的模型。
关定庄张飞、赵云加入时,我们已经知道张飞自3号位向下论询,赵云自4号位向下论询:如果4号位被占用,1~3位只有1个空闲名额的话,张飞会优先入队,赵云则会入编;如果1~3号位被占用,4号位空闲,赵云会加入到4号位,张飞则会入编;如果1~4号位都被占用,则张飞、赵云一起入编。
关羽、周仓加入时,情况略有不同:如果1~2号位只有一个空闲位置,周仓会优先入队;如果周仓加入后,队列满7人,则关羽不会入编,导致游戏卡死。
第四章出现编所后,我们可以随意让武将入队/离队。
武将入队时,位置号的选取原则:从7号位开始向下论询,跳过所有存在武将的位置号(包括存在隐藏武将的位置号)。
武将离队时,则会判断队列长度是否等于1。当前队列长度≠1,任意武将(除去不可离队的剧情武将)都可以离队;当前队列长度=1,任何武将不能离队。
那么”队列长度”是如何计算的呢?
之前已经交代过,地址615~61b表示我方队列7人的状态——80:正常、c0:军师、00:负伤、81~ff:异常、01~7f:异常负伤。异常(负伤)状态的武将,在战斗界面中不能出场。
当然,正常通关流程中,武将不会处于异常(负伤)状态。如果连续使用多次64物法,导致其他地址段的数据(例如武将ID)偏移至地址615~61b时,才会出现这些情况。
回归正题,地址615~61b每个字节的值——如果小于80(负伤/异常负伤),则队列长度+0;如果大于/等于80(正常/异常/军师),则队列长度+1。正常通关流程中,队列长度不会出现为0的情况,但是通关64物法覆写地址615~61b的数据,我们可以轻易做到。当队列长度为0时,便可以让全部武将离队了。拓展一下”向下论询”定理。
让我们回忆一下,一开始举的陈登的例子:
徐州陈登加入时,默认5号位。当5号位被占用(显示武将 或者 非”刘刘”的隐藏武将均可)时,陈登会遵循向下论询定理,依次查看4~1号位是否被占用。如果有空闲位置,陈登会入队;如果都被占用,陈登则会进入编成所。
剧情进入第四章后,我们可以利用向下论询定理制造BUG。
老规矩,举个例子:
第四章新野收伊籍后,队列7~1号位分别为:关平、周仓、孔明、赵云、张飞、关羽、伊籍。
樊城挑战吕布前,我们让伊籍离队。此时队列为:关平、周仓、孔明、赵云、张飞、关羽、空置。
挑战吕布后,使用第1次64物法。此时队列为:孔明、赵云、张飞、关羽、:刘刘、吕布、[李傕](负伤武将前加 : ,隐藏武将加[ ])。
稍微做下解释,因为伊籍离队,造成了1号位的空置。本质上,此时1号位其实是一个武将状态为”00″(负伤)的隐藏武将刘刘。所以,1号位偏移到3号位变为显示武将时,呈现出来的效果就是一个负伤的刘刘。
由于1号位为隐藏武将,此时队列只有6人,还可以通过编成所加入1人。如果直接加入,按照向下论询定理,新入武将会占用3号位,同时形成重影武将。所以我们先将3号位负伤的刘刘离队,然后再加入关平占据3号位,最后加入伊籍占据1号位。这时候,神奇的事情发生了,7号位的孔明变成了”杨平”,而且伊籍失去物品/装备栏,武将属性也变得非常混乱。这是为什么呢?
可以用武将入队的向下论询定理来解释。
负伤的刘刘离队、关平入队占据3号位后,此时的队列为:孔明、赵云、张飞、关羽、关平、吕布、[李傕]。
剧情入队时,由于7~1号位均被占用,剧情武将会直接入编。而编成所入队时,由于队列未满(只有6人),是可以继续入队的。但是,由于1号位(地址627)已经被[李傕]占用,新入的伊籍不得不向下继续寻找数据为〖0〗地址。地址628~62a,分别为对阵武将郭汜、张济、李肃的武将ID使用;地址62b~62d,被使用64物法之前,原7号位关平的现有兵力(十进制1588)使用,分别是34 06 00。地址62d的数据为〖0〗,因此被伊籍的武将ID使用。如果1号位没有隐藏武将李傕,伊籍的武将ID本应是使用地址627,伊籍的武将状态本应是使用地址61b,伊籍的武力信息本应是使用地址67b……
如今伊籍的武将ID在地址62d,
向下偏移了6个字节,因此可以推算出,伊籍的武将状态在地址61b+6=621,伊籍的武力信息在地址67b+6=681。
而地址621先前存放的正是我方7号位的武将ID,如今被伊籍的武将状态80(正常状态)所覆盖。武将ID(80)恰好是杨平,因此7号位的孔明变成了杨平。
此时,如果你将伊籍离队入编,伊籍的武将状态会变为00(离队),7号位会变成刘刘。如果你将杨平离队入编,7号位的武将ID会变为00(空置),伊籍的武将状态会变为负伤。好,我们已经了解了这个bug产生的原理。那么这个bug有什么用途呢?
【重点在于,伊籍的武将ID地址向下偏移到了62d。】
根据本贴一开始的地址介绍,我们知道62d是用来存放我方7号位现有兵力的低位数据的。OK,我们使用一次存档复位+住宿,让杨平的现有兵力恢复到初始值4300。
可以看到,此时伊籍变成了张南。原因很简单,7号位杨平的现有兵力4300,存放到地址42d~42f分别是cc 10 00,地址42d被覆写为cc,换算成武将ID正是张南。
出门刷几个小兵,使杨平的现有兵力发生变化,我们可以观察到杨平现有兵力的变化,紧密地关键着队列最后一位武将ID的变化。等到出现你喜欢的武将,便可以把他存入编成所。
存放编成所时,先将杨平离队,再将喜欢的武将离队。如果先将喜欢的武将离队的话,记得我们前面讲过,杨平会变成刘刘哦。上述两人离队后,重新加入两位武将:
第一位加入者会继续使用杨平的7号位;
第二位加入者的武将ID使用地址,取决于你离队入编前,最后一次战斗时对面的武将数目。
如果上次战斗对面为5人,第二位加入者将失去作用。如果想要第二位加入者,发挥一如之前伊籍跟随7号位现有兵力变换武将的作用——第一位加入者的兵力需要调整为256的倍数,通过打怪掉兵的方式调整完成后,再让第二位加入者入队;更为快捷的方式是,第一位加入者为盗贼、山贼、海贼、兵士(兵士慎用,容易卡死)等兵力为0的武将。
如果上次战斗对面为4人,第二位加入者会持续变化为每次战斗时对面的第5人。
以此类推……
如果上次战斗对面为1人,第二位加入者会持续变化为每次战斗时对面的第2人。
第二位加入者入队前,执行过一次存档复位,第二位加入者也会持续变化为每次战斗时对面的第2人。
有兴趣的话,可以根据我之前所讲的伊籍ID使用地址的”向下寻址”原则,自行分析第二位加入者的映射原理。
总之,如今我们的队列,自带强大的花样换人功能(相当于行走的64物法)。
当然,如果你不想制造此类bug,使用64物法的时候,还是乖乖把队列填满7人吧。