ryan_knight_12吧 关注:46,238贴子:2,738,483

【教程】eve文件详解、如何自定义剧情、如何制作称霸模式

取消只看楼主收藏回复

一楼防吞


IP属地:四川1楼2019-04-25 15:14回复
    二楼备用


    IP属地:四川2楼2019-04-25 15:15
    收起回复
      三楼目录


      IP属地:四川3楼2019-04-25 15:15
      收起回复
        然后,来详细说说触发条件的表述形式,从“剧本编号为0”这个触发条件为例进行解析:
        【00 1c0e 02 00 04 00 26 15 08 00 11 1e 00 04 ,剧本编号为0】
        00 1c 0e,这3个双字代表着全局属性的类,这个类有许多函数可供调用;
        02 00 04,02 代表全局属性类的第2号函数,即读取剧本编号。04的意义,容后再表;
        那么,这个类还有哪些其他函数呢?这个可以通过对其他事件触发条件进行解构归纳出来,简单列举几个我目前找到的:(函数号均为16进制)
        2号:读取剧本编号
        14号:读取剧本开始日期
        15号:读取当前日期
        16号:计算从剧本开始算起到目前为止经过的日数
        对于其他函数的挖掘还可以通过对汇编代码的阅读来完成,这个就不在这个帖子的讨论范围了。
        00 26 15,00代表0, 26代表这个0的类别(常数?武将id?城市id?)为剧本编号。15的意义,容后再表;
        08 00 11,08是对前面的比较进行一个取值,如果剧本编号= 0,那么这个08会从这个比较返回true的逻辑值。11的意义,容后再表;
        综合来看,剧本编号= X 这个触发条件表述为001c 0e 02 00 04 X 26 15 08 00 ??,??这个双字与不同条件之间的逻辑结合有关。
        以此类推,剧本开始至多X日的触发条件可以解析为:
        剧本开始后的日数<= X:00 1c0e 16 00 04 X 02 15 08 00 ??
        ??的常见取值为11,12 或15,与不同条件之间的结合有关,容后再表。
        那么,剧本开始后的日数>= X怎么表述呢?这个可以将001c 03 16 00 04(全局属性类的第16号属性)与X 02 15(X日)次序颠倒:
        X 02 04 00 1c 0e 16 00 15 08 00 ??
        注意这个颠倒过程中,15和04的次序仍然不变。对于所有比较两个量的判断,都是04接的量在前,15接的量在后。这个原则适用于所有触发条件。
        武将空闲的触发条件可以解析为:
        武将X空闲:X 14 0e 43 00 ??
        这个条件不涉及两个量的比较,因为X 14 0e(武将X的类)的第43号函数直接返回一个逻辑布尔值,true或false。代表武将空闲或武将处于任务中。


        IP属地:四川6楼2019-04-25 15:17
        收起回复
          触发条件讲到这里,实际上还只是eve文件的冰山一角。有很多剧情,例如推荐武将,它们的剧情并不是简单的几个条件作且或运算,而是涉及到for循环、if/else判定等等。。。。但我对这一块也没有吃透,所以就不做讨论了。
          那么,如何知道各种子条件的表述方式呢?比如,我要做玄武门之变,其中有一个触发条件是李世民功绩>=10000。我怎么知道这个子条件怎么写呢?很简单,想一想原版311中有哪些剧情和武将功绩有关?吕蒙变身的剧情!
          然后,我们想想吕蒙变身在游戏中,人物会说什么话?嗯,孙权会劝吕蒙蒋钦多读点书。
          那么,我们用van修改器打开msg003,搜索“读书”二字,发现MSG778就是孙权和吕蒙谈及读书问题的话语!
          然后,MSG003.s11的778号MSG,其msg序号为(778+3*5000)=15778,转成16进制,就是 0x3da2.
          用一些能够16进制形式打开文件的软件(比如UltraEditor,或Notepad++的hex editor 插件),打开66.eve,搜索a2 3d,就能找到吕蒙变身的剧情内容在eve文件中的位置,检索eve文件中的目录,发现吕蒙变身实际上是第44号剧情,在找到44号剧情的触发条件并拆解之,不难发现吕蒙功绩>=5000的子条件:
          1388 02 04 295 14 0e 22 00 15 0c 00 15 0e 00 11 20 00 04
          也就是说,武将X1功绩>= X2的子条件,应表述为:
          X2 02 04 X1 14 0e 22 00 15 0c 00 ??


          IP属地:四川10楼2019-04-25 15:20
          收起回复
            谈到这里,关于触发条件的部分就结束了,接下来,谈谈剧情内容的部分。
            由于黄巾起义的剧情内容比较长,这里举刘备与赵云重逢的剧情为例。
            刘备赵云重逢为第32号剧情,现摘取eve文件中第32号剧情内容,逐双字解析:
            57bf3 48 00 28 96 01 730 734 00 00 00
            这一行是所有剧情内容的开头形式,前4个双字、第6个双字,后3个双字都是固定的,
            第5个双字,0x96,为(剧情内容占有字节数– 48)/12,
            第7个双字,0x730,为(剧情内容占有字节数– 8),
            第8个双字,0x734,为(第7个双字+ 4);


            IP属地:四川11楼2019-04-25 15:21
            回复
              00 00 04 64 02 04 01 01 04 12 5e 04 00 8a 0e 08 03 00
              从这一行,开始记录剧情的实际内容,每一行剧情内容必定以:
              00 00 04(第一行或者if判断后的第一行)或
              ffffffff 00 10(后接跳转语句)或
              ffffffff 00 04(其余语句)
              开头,仅有的特例只出现在我还没有完全参透的for循环中。
              除去00 0004,后面的6402 04 01 01 04 【12】 5e 04 00 8a 0e 08 03 00即存储着这一行的实际意义的语句。这一行的意义是播放第0x12,即18号BGM(友情)。
              对这个语句逐三个双字(下面简称为三双字),从后往前解析:
              08 03 00,08 代表第8号函数,03代表这个函数需要3个输入,所有语句最后一个三双字的最后一个双字必定是00 。而任何一个最后一个双字是00的三双字都必定某一语句的结尾。这一点是帮助我们拆分语句的关键所在。
              00 8a 0e,这个是游戏与音效相关的类,之前所提到的8号函数,就是指这个类的第8号函数了。这个函数就是设置当前播放的bgm。
              12 5e 04,即第一个输入,5e代表这个输入的类别是BGM序号,12是序号的值,即0x12= 18号BGM。
              01 01 04,64 0204,分别是第二个、第三个输入。这两个输入的意义,目前我还不清楚。总之套用这两个输入就对了;


              IP属地:四川13楼2019-04-25 15:22
              回复
                ffffffff 00 04 3e8 02 04 27b 14 0e 04 00 04 00 7f 0e 0b 0200
                第二行语句,同样撇去ffffffff00 04解读剩下的,007f 0e是关于显示的类,这个语句是调用这个类的0b号函数,这个函数有2个输入。
                第一个输入,27b14 0e 04 00 04,27b 140e代表武将0x27b(即刘备)的类,04 00 04代表这个武将类的第4号函数,即读取武将所属。因此,第一个输入是刘备的所属。
                第二个输入,3e802 04,代表时间,0x3e8= 1000,即1000 毫秒,即1秒。
                综合解读,这个语句的作用是移动地图至刘备所属,移动时间为1秒。


                IP属地:四川14楼2019-04-25 15:22
                回复
                  ffffffff 00 04 ffffffff 12 04 2e8 14 04 27b 14 04 3c6e 12 0c0b 04 00
                  第三行语句,同前两个语句不同,这个是直接调用第0b号全局函数,这个函数有4个输入。
                  第一个输入,3c6e12 0c,12代表这个输入是MSG序号,0x3c6e=15470,即MSG003中的第470号MSG,用van修改器读取之,其内容是:
                  (……那麼,关於今後我军的方略,
                   到底该如何制订呢?
                   真希望能多拥有一些人材……)
                  这个输入代表说的话
                  第二个输入,27b14 04,14代表这个输入为武将id,0x27b号武将即刘备,为说话者
                  第三个输入,2e814 04,即事件武将卫兵,为聆听着
                  第四个输入,ffffffff12 04,从12可以看出,这个也是MSG序号。这个代表对话框中说话者的名字。如果是ffffffff,则使用第二个输入的名字。
                  这个第四号输入在什么地方会用到呢?答案是原版称霸模式逆贼讨伐战的开场剧情,最开始献帝的自言自语,对话框的名字里还是献帝,过场后献帝复活,进入if分支,所有献帝说的话中对话框里的说话者名字都变成“刘协”了。
                  同样的,在血色衣冠的决战称霸模式里,有一个地方也用到了这个第四号输入,不知道有没有玩家注意到呢?
                  答案:百战灭梁关卡胜利时李存勖在说:“如今大仇已经得报,接下来,总算可以坐下来好好享受生活了啊。”时,对话框的名字变成了“李天下”。
                  综上,这行语句的作用是出现【刘备】向【卫兵】说:
                  (……那麼,关於今後我军的方略,
                   到底该如何制订呢?
                   真希望能多拥有一些人材……)
                  的对话框。
                  在编辑这条MSG时,[0x02][0x0A],即A号武将,代表的就是说话者刘备,[0x02][0x0B],即B号武将,代表的就是聆听者卫兵。
                  拓展一下,如果说话者的输入是ffffffff14 04,就会变成一个没有说话者的对话框,即旁白。


                  IP属地:四川15楼2019-04-25 15:22
                  回复
                    ffffffff 00 04 ffffffff 12 04 27b 14 04 18b 14 04 3c71 12 0c0b 04 00
                    ffffffff 00 04 ffffffff 12 04 18b 14 04 27b 14 04 3c72 12 0c0b 04 00
                    ffffffff 00 04 ffffffff 12 04 27b 14 04 18b 14 04 3c73 12 0c0b 04 00
                    ffffffff 00 04 ffffffff 12 04 18b 14 04 27b 14 04 3c74 12 0c0b 04 00
                    ffffffff 00 04 ffffffff 12 04 27b 14 04 18b 14 04 3c75 12 0c0b 04 00
                    ffffffff 00 04 ffffffff 12 04 18b 14 04 27b 14 04 3c76 12 0c0b 04 00
                    这几行都是对话框
                    ffffffff 00 04 ffffffff 02 04 ffffffff 5d 04 ffffffff 02 04ffffffff 02 04 ffffffff 02 04 06 43 04 00 7f 0e 11 06 00
                    调用00 7f0e,即显示类的第11号函数,有6个输入
                    第1号输入,06 43 04,43代表这个输入的类别是那种一闪而过的画面的序号。
                    这里所说的一闪而过的画面,即RPGViewer解包san11pkres.bin后的第67~89号图片。这些图片里大致都有,得意地笑的画面(84号)、脚步声的画面(85号)、凌厉目光的画面(87号)等。。
                    第2~6号输入,意义都不明,总之套用就对了。
                    综上,这个语句是出现第0x06,即第6号一闪而过的画面,67+6= 73,即san11pkres.bin第75号图片,这个图片是什么呢?就是赵云跪拜于刘备面前,关张侍立的图片。
                    ffffffff 00 04 ffffffff 12 04 27b 14 04 18b 14 04 3c77 12 0c0b 04 00
                    ffffffff 00 04 ffffffff 12 04 18b 14 04 27b 14 04 3c78 12 0c0b 04 00
                    ffffffff 00 04 64 02 04 264 5d 04 00 8a 0e 00 02 00
                    ffffffff 00 04 ffffffff 12 04 27b 14 04 18b 14 04 3c79 12 0c0b 04 00
                    这些都是对话框、播放音效的语句,之前都解析过了。


                    IP属地:四川17楼2019-04-25 15:24
                    收起回复
                      ffffffff 00 04 ffffffff 14 04 27b 14 0e 1b 00 04 18b 14 0e6e 02 00
                      18b 14 0e,即第0x18b号武将(赵云)的类,这个语句调用了武将类的第6e号函数,输入有两个。这个函数是武将加入势力的函数。
                      第一个输入,27b14 0e 1b 00 04,即第0x27b号武将(刘备)的第1b号函数,这个函数是调用武将所属的势力。因此,第一个输入即为刘备势力。
                      第二个输入,ffffffff14 04,由14可见这个输入应该是一个武将序号,然而这个武将序号意义不明,总之套用就对了。
                      综上,这个语句的作用是令武将赵云加入刘备所属势力。注意,这个语句执行后,赵云所属地会自动变成刘备所属地。
                      ffffffff 00 04 27b 14 0e 04 00 04 18b 14 0e 51 01 00
                      赵云武将类的第51号函数,即设置武将所在。唯一的输入27b 14 0e 04 00 04之前已讲过,是调用刘备的所属。综上,这个语句的作用是设置赵云所在为刘备所属。
                      ffffffff 00 04 96 02 04 18b 14 0e 47 01 00
                      赵云武将类的第47号函数,即设置武将忠诚,只有一个输入96 02 04 。0x96 = 150 。这个语句的作用是设置赵云忠诚为150.
                      ffffffff 00 04 fa0 02 04 18b 14 0e 48 01 00
                      赵云武将类的第48号函数,即设置武将功绩。0xfa0 = 4000。这个语句的作用是设置赵云功绩为4000.
                      ffffffff 00 15 16 00 00
                      00
                      所有剧情内容都固定以ffffffff00 15 16 00 00 00 结尾。如果剧情内容最后是一个if/else判断或for循环中的跳转函数,ffffffff这个双字可能会发生变化。


                      IP属地:四川18楼2019-04-25 15:24
                      回复
                        被吞的7楼,重新以图片形式发吧:




                        IP属地:四川22楼2019-04-25 15:40
                        收起回复
                          If/else的判断,我们以马氏五常的剧情(43号剧情)为例进行讲解,马氏五常的剧情中,马谡、马良会加入玩家势力,
                          而玩家君主如果是刘备,则:
                          马良忠诚=100, 功绩=4000, 马谡忠诚=100, 功绩=500。
                          如果玩家君主不是刘备,则:
                          马良忠诚=100, 功绩=2000, 马谡忠诚=100, 功绩=500
                          这是一个典型的if/else判断,我们打开eve文件,找到第43号剧情最末尾的内容,有这样一段:
                          ffffffff 00 04 00 1d 0e 04 00 04 27b 14 15 08 00 14 13 00 00
                          这一行是【玩家君主= 刘备】的判断。撇去固定的开头及结尾的三双字,中间一段可拆解为:
                          00 1d 0e 04 00 04 27b 14 15 08 00 ?? + 14
                          基于我们在触发条件部分的讲解,前者是一个子条件。001d 0e是玩家势力的类,第4号函数是读取势力君主。这个子条件其实是比较【武将27b(刘备)】和【玩家势力君主】。即【玩家君主=刘备】的判断。
                          如果这个子条件为真,则接着执行后续的剧情语句。否则,就要用到结尾的三双字1300 00了。这个三双字的含义是跳过0x13=19个三双字(包含13 00 00 这个三双字本身)。
                          综上,剧情内容中的if判断,表述为:
                          条件+ 14 + X 00 00。
                          若条件为真,则接着执行后续的语句,否则,跳过后续X个三双字。
                          00 00 04 64 02 04 207 14 0e 47 01 00
                          ffffffff 00 04 fa0 02 04 207 14 0e 48 01 00
                          ffffffff 00 04 64 02 04 1ff 14 0e 47 01 00
                          ffffffff 00 04 1f4 02 04 1ff 14 0e 48 01 00
                          这四行,设置马良忠诚=100,功绩=4000,马谡忠诚=100, 功绩=500,也就是玩家君主等于刘备的情况。注意第一行以00 00 04开头,这也是之前所提到的,if判断后第一个语句必定以0000 04开头的印证。
                          ffffffff 00 10 12 00 00
                          这一行,是一个跳转语句,跳转语句以ffffffff00 10开头,后接X 00 00或X 00 04(如果接X 0004,紧挨其后的语句就不需要在前面添上ffffffff00 04的开头了),X为跳过的三双字数目(包含X 00 00本身)。这里X=0x12=18,也就是说,设置马良忠诚=100,功绩=4000,马谡忠诚=100, 功绩=500后,跳过18个三双字。
                          00 00 04 64 02 04 207 14 0e 47 01 00
                          ffffffff 00 04 7d0 02 04 207 14 0e 48 01 00
                          ffffffff 00 04 64 02 04 1ff 14 0e 47 01 00
                          ffffffff 00 04 1f4 02 04 1ff 14 0e 48 01 00
                          这四行,设置马良忠诚=100,功绩=2000,马谡忠诚=100, 功绩=500,也就是玩家君主不等于刘备的情况。注意这里第一行以00 00 04开头,也就是说跳转语句后的第一句也以00 00 04开头。但是经过我实际测试,即使这里改成ffffffff 00 04,也不会有影响。
                          ffffffff 00 15 16 00 00
                          00
                          之前提到过,这个是所有剧情内容的固定结尾。
                          那么,现在回过头来看:
                          如果玩家君主是刘备,则设置马良忠诚=100,功绩=4000,马谡忠诚=100, 功绩=500,然后跳过18个三双字,即跳到1600 00,结束剧情。
                          否则,跳过19个三双字,即跳到00 00 04,然后接着执行00 00 04后面的【马良忠诚=100,功绩=2000,马谡忠诚=100, 功绩=500】的片段,之后结束剧情。
                          这个就是一个典型的if/else判断的案例。实质上由if判断分叉+跳转语句组成。
                          另外有必要提到,如果跳转语句ffffffff00 10 12 00 00后面的00 00 04改成ffffffff00 04,那么最开头的if判断结尾的跳转语句需要多跳一个三双字,即14 00 00。这也说明00 00 04和ffffffff 00 04意义上是有差别的,虽然我还没有参透。


                          IP属地:四川45楼2019-04-26 14:27
                          回复
                            讲完了if/else判断,我们就可以做选择框了。选择框的原理是执行一个出现选择框的语句,然后执行一个玩家选择的if判断。
                            以袁术称帝(3号剧情)为例,这个剧情中,如果玩家扮演袁术势力,则需要做一个【称帝】与【不称帝】的选择。Eve文件中关于这个选择框的内容为:
                            01 00 04 ffffffff 12 04 ffffffff 12 04 ffffffff 12 04ffffffff 12 04 3c51 12 04 3c50 12 04 00 81 0e 01 06 00
                            这个语句执行0081 0e的第1号函数,6个输入皆为msg序号。
                            这个语句的作用是设置好选择框,选择框最多有六种选择,每种选择从对应输入的msg中加载。
                            这里后4个输入皆为ffffffff,故只出现两种选择,0x3c50 = 15440,0x3c51= 15441。用van修改器打开MSG003的msg440和msg441,内容为:
                            MSG15440:自封为[0x02][0x96][0x31][0x31][0x78]皇帝[0x02][0x96][0x30][0x78](0号选择)
                            MSG15441:放弃(1号选择)
                            注意这个设置选择框的语句开头是0100 04,我目前尚不懂这个开头代表着怎样一种含义,总之,对所有选择框语句,都套用这个开头就对了。
                            ffffffff 00 01 01 02 04 ffffffff 12 04 ffffffff 14 04 10 1404 3c4f 12 04 00 81 0e 06 04 07 01 01 06 01 01 04 00 02 15 08 00 14 03 00 00
                            这是一个if判断,若条件不满足,则跳过3个三双字。这个条件的内容为:
                            01 02 04 ffffffff 12 04 ffffffff 14 04 10 14 04 3c4f 12 0400 81 0e 06 04 07 01 01 06 01 01 04 00 02 15 08 00 ??
                            这是比较两个量的条件。
                            第一个量后接04:
                            ffffffff 12 04 ffffffff 14 04 10 14 04 3c4f 12 04 00 81 0e06 04 07 01 01 06 01 01 04
                            第二个量后接15:
                            00 02 15
                            这里简单解释一下第一个量。将开头4个三双字拿出来:
                            ffffffff 12 04 ffffffff 14 04 10 14 04 3c4f 12 04
                            这个形式非常眼熟,是之前讲过的【对话框】的语句形式。那么,游戏在读取这个量时,会出现一个对话框,即0x10号武将(袁术)说MSG 0x3c4f:
                            (……嗯,反抗的情况,
                             比我所预想的还要激烈……
                             那麼,该怎麼做好呢?)
                            再看看后面的三双字中,出现了0081 0e这个在之前设置选择框的语句中出现的类。可以推想,这个对话框在出现的同时,选择框也会出现,迫使玩家在之前设置好的两个选择中做出选择。
                            那么,这个第一个量,就是玩家最终选择的序号。这个if判断将比较【玩家选择序号】和【0】,若玩家选择序号=0,即玩家选择称帝,则接着执行后续语句。若不等于0,即玩家选择放弃,则跳过3个三双字。
                            注意这个出现选择框的if判断语句,以ffffffff 00 01开头,而非传统的ffffffff 00 04。这个区别的意义我尚未参透,总之套用就对了。
                            00 00 10 09 00 00
                            这个语句为玩家选择称帝后接着执行的语句,为一个跳转语句,跳过9个三双字。
                            注意,这个跳转语句的开头是0000 10,而非ffffffff00 10。回想之前所提到过的,if判断后的第一个语句由00 00 04开头,而非ffffffff 00 10开头。可见if判断后的第一个语句的首双字通常会由ffffffff改成00。
                            00 00 04 ffffffff 12 17 00 01 04 10 14 04 3c52 12 0c 0b 0400
                            这个语句是玩家之前选择【放弃】,跳转到的语句,这个语句执行内容会出现一个对话框。
                            ffffffff 00 15 16 00 00
                            这个语句通常出现在剧情内容的结束段。在这里出现也是相同的作用,即结束剧情,不执行后续语句。
                            综上,可见,若玩家选择【放弃】,则出现一个对话框,然后直接结束剧情。
                            ffffffff 00 04 ffffffff 02 04 ffffffff 5d 04 ffffffff 02 04ffffffff 02 04 ffffffff 02 04 14 43 04 00 7f 0e 11 06 00
                            玩家选择称帝后接着执行的跳转语句将跳转到该语句,该语句的内容是出现一个一闪而过的画面。
                            选择框的关键已经讲述完毕,后面的内容都是袁术称帝的剧情了,就不继续说下去了。
                            总结一下,选择框的实质是:
                            1. 执行一个设置选择框的语句
                            2. 执行一个出现选择框的if判断
                            If判断就讲到这里。


                            IP属地:四川46楼2019-04-26 14:28
                            回复
                              接着说循环,举刘备称汉中王(6号剧情)为例。这个剧情中,刘备属下所有城市治安+15,气力+15,所有武将忠诚+15. 那么,这势必要首先产生一个刘备属下城市、武将的列表,再对这个列表进行循环。
                              打开eve文件中关于这段循环的部分,进行解析:
                              ffffffff 00 04 00 02 04 00 62 17 00 01 04 fffffffe 4e 04 0068 0e 03 04 00
                              这一段是执行0068 0e的第3号函数,共4个输入。
                              00 68 0e,68代表城市列表,也就是0号城市列表,这个函数的意义是将【刘备属下所有城市】加载进这个列表中。
                              Ffffffffe 4e 04,意义不明,总之套用就对了。
                              00 01 04,01代表这是一个变量,00是变量号,即0号变量。在汉中王剧情之前的部分,已经在某个语句中将刘备势力置入了这个变量,这里就不赘述了。而且,这个0001 04是可以替换为27b14 0e 1b 00 04的(即刘备所属势力)的。
                              00 62 17,这个实际上应该写成0062 04的。但是由于后面紧挨着变量(0001 04),04只好改为17,这个应该是语法上的一些规则,总之记住这个规则就行了。另外,如果将后面的00 01 04替换为27b 14 0e 1b 00 04,这个00 62 17则需要替换为0062 04。这个输入的意义也不明,套用就对了。
                              00 02 04,意义不明,套用就对了。
                              ffffffff 00 04 00 68 0e 0d 00 1416 00 00
                              这个是一个if判断,判断列表00 68 0e是否已经被读完,如果读完,跳过16个三双字。
                              01 00 01 01 16 04 00 68 0e 0e 00 07 01 01 04 0f 02 06 01 010e 26 01 00
                              这个语句实际上应拆成两个语句:
                              01 00 01 01 16 04 00 68 0e 0e 0007 01 01 04
                              这个语句的作用是从列表0068 0e中读取一个元素,置入到变量0101 04中,即1号变量。具体每个双字的意义我就不懂了,尚未参透。
                              0f 02 06 01 01 0e 26 01 00
                              这个语句的作用是执行1号变量(01 01 0e)的第26号函数,由于1号变量是从00 68 0e中读取的城市类。这个语句就是执行城市类的第26号函数。这个函数的作用是增减城市的治安。
                              唯一的一个输入0f02 06,实际应写成0f02 04,但同样的,由于这个三双字后面跟的是一个变量,04必须替换成06,这是一个语法规则,需要记住。0x0f = 15,即城市治安+15。
                              那么,城市治安– 15 如何表达呢?这个可以将0f02 04替换为0f 0215 01 00 04。
                              ffffffff 00 06 01 01 0e 0b 00 04 00 02 15 09 00 14 06 00 00
                              这个语句是一个if判断,以ffffffff 00 06开头而非ffffffff 00 04,是因为第二个三双字01 01 0e是一个变量,所以04替换为06。
                              条件为比较【1号变量的第0b号函数,即读取城市士兵数】和【00】,后接0900 14而非08 0014,是因为这里需要判定的是这两个量是否不相等。若不相等,则该条件为真。
                              综合来看,这个if判断是判断城市士兵数是否不等于0,如果不等于0,接着执行后续语句,否则,跳过6个三双字。
                              00 00 04 0f 02 06 01 01 0e 24 01 00
                              这个语句是执行1号变量的第24号函数,即城市类的第24号函数,即增减城市士气。这个语句的作用是城市士气+15.
                              ffffffff 00 00
                              我其实不明白这个ffffffff00 00的意义,但总之,套用就对了。
                              ffffffff 00 10 ffffffe9 00 04 7d0 02 04 121 14 0e 5c 01 00
                              前两个三双字,是一个跳转函数,跳转ffffffe9个三双字,这个ffffffe9是一个有符号的整数,实质上等于【-23】,即往回跳23个三双字。这个跳转回到了ffffffff 00 04 00 68 0e 0d00 14 16 00 00的【00 680e】处,即【列表0068 0e 是否已读完】的if判断。
                              这个往回跳的跳转函数是循环的实质所在。
                              撇去跳转函数,后面3个三双字独成一个语句:
                              7d0 02 04 121 14 0e 5c 01 00
                              这个语句是执行121 14 0e(武将诸葛亮)的第5c号函数(增减功绩),即诸葛亮+2000功绩。
                              到这个语句为止,刘备属下所有都市增减治安士气的循环已经结束,接下来是第二个循环,即刘备属下所有武将加忠诚的循环。
                              ffffffff 00 04 00 02 04 00 62 17 00 01 04 4b 57 04 00 6b 0e03 04 00
                              类似的,这个语句是作用是将刘备属下所有武将加载入列表00 6b 0e(0号武将列表)中
                              ffffffff 00 17 00 01 0e 04 00 04 00 6b 0e 12 01 00
                              执行列表00 6b0e的第12号函数,即删除列表中的武将。唯一的输入为00 01 0e(0号变量)的第4号函数,前面提到过,这个剧情在最开头将刘备势力置入到了0号变量中。故这个输入为刘备势力的第4号函数(读取势力君主)。综上,这个语句的作用是从列表中删去刘备势力的君主,即刘备本人。
                              语句的开头为ffffffff00 17,这仍然是因为后面跟着的是变量,所有把04替换为17.
                              至于什么时候04替换为06,什么时候替换为17。我不知道。。。。。
                              ffffffff 00 04 00 6b 0e 0d 00 14 0c 00 00
                              类似的,这是判定列表006b 0e是否已读完的if判断
                              01 00 01 01 14 04 00 6b 0e 0e 00 07 01 01 04 0f 02 06 01 010e 5b 01 00
                              类似的,拆成两个语句:
                              01 00 01 01 14 04 00 6b 0e 0e 00 07 01 01 04(从00 6b 0e读取一个武将置入1号变量中)
                              0f 02 06 01 01 0e 5b 01 00(1号变量第5b号函数,武将忠诚+15)
                              ffffffff 00 00
                              不懂其意义,套用就对了
                              ffffffff 00 10 fffffff3 00 04
                              跳转语句,往回跳13个三双字,回到列表是否读完的if判断。
                              综合来看,一个循环主要由如下组件构成:
                              1. 一个加载列表的语句
                              2. 一个列表是否已读完的if判定,如果已经读完,直接跳出循环
                              3. 从列表中读取元素置入某变量的操作
                              4. 对这个变量进行操作的部分
                              5. 一个往回跳到【列表是否读完】的if判定,的跳转函数
                              以上就是我目前对循环所能做的讲解了。我自知讲的很不清楚,没有之前的部分讲的完善。这是因为我自己对循环仍处于一知半解的状态,目前也只能将我的一些略微的理解分享给大家。


                              IP属地:四川47楼2019-04-26 14:28
                              回复