ryan_knight_12吧 关注:46,243贴子:2,738,889

【教程】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
        收起回复


          来自Android客户端8楼2019-04-25 15:18
          回复
            好麻烦……跟json差不多吗?


            IP属地:北京来自Android客户端9楼2019-04-25 15:18
            收起回复
              触发条件讲到这里,实际上还只是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
                          回复


                            IP属地:河南来自Android客户端21楼2019-04-25 15:40
                            回复
                              被吞的7楼,重新以图片形式发吧:




                              IP属地:北京22楼2019-04-25 15:40
                              收起回复