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意义上是有差别的,虽然我还没有参透。