利用剧本指令来修改当前天气
最近研究了一下如何在剧本中改天气,经常发现有时会失败,最终还是研究了一下代码,基本上搞清楚了其中的原因。
总的来说,和天气有关的指令大概是3条,或许还有其他的,不过有这三个指令足够了,所以不再作更多的讨论
这3条指令分别是
45 战场全局变量
56 天气类别设定
57 当前天气设定
56指令修改的是4B3D08+11处的地址,这个位置和45指令里的天气类别指定所设置的值是同一个地址。
这个天气类别决定了一组天气序列,而这个天气序列的具体值又是在48E100(不可修改)开始的30个字节,这里是6个字节一组,共5组,
一般会现在45指令里预先指定一个类别,指定后就决定了这个S可能会出现的天气
48E100的值是事先在exe里设置好的,不能修改
0048E100 的值
00 00 00 01 02 03 普通
00 00 00 00 01 02 晴好
00 01 02 02 03 03 阴雨
00 00 01 01 04 04 小雪
00 01 04 04 04 04 大雪
这些数值的含义如下
0 晴天 1 阴天 2 雨天 3 豪雨 4 雪
以上五个值只是决定了使用那个天气图片,并且2 3 4都同样是用恶劣天气来描述,
在每次回合变换的时候,不知道是用随机还是顺序的方法(这个未经测试)来得到一个值,再根据设定的45指令里设定的天气类别,对应到一个具体值
举个例子来说 如果在45指令设置了小雪,由于小雪这组天气序列没有02(雨),那么出现的恶劣天气必然是用下雪的图片,而决不会出现下雨的图片,即使玩家用豪雨策略也只能得到下雪天,当然,这时下雪还是下雨对电脑来说其实并没什么区别了,都是恶劣天气,而我们看到的就是图片不同而已。
再看看57指令
这条指令修改的是4B3D08+4处的地址,这个位置和45指令里的起始天气指定所修改的值是同一个地址。
这里要注意的是这条指令在剧本编辑器的描述有点讲究,要对照前面我贴的48E100的地址竖着看,就一目了然了,第一列是5个0,就是晴天,而剧本编辑器是用一个晴来描述的。45指令里也是这样理解
这里我认为,修改当前天气应该用57指令才是对的,而56指令的天气类别是属于一个指导性的取值,最好不要修改
这样修改当前回合天气的规律就出来了
比如你这个s设置了 普通 类型的天气,那么你要是想用剧本来改变当前回合的天气为雨,只要用57指令,下拉列表选第五个(雨)或第六个(豪雨)都可以。当然在目前的代码下,这样方法只能改变天气,但图片是不会变化的。
改变天气后的图片变化代码(已5.5版为基础)
00414F03 |. E8 0804FFFF CALL 55Ekd5.00405310 ; \55Ekd5.00405310
00405310 /$ 55 PUSH EBP
00405311 |. 8BEC MOV EBP,ESP
00405313 |. 51 PUSH ECX
00405314 |. 0FB651 11 MOVZX EDX,BYTE PTR DS:[ECX+11]
00405318 |. 6BD2 06 IMUL EDX,EDX,6
0040531B |. 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
0040531E |. 8A8410 00E14800 MOV AL,BYTE PTR DS:[EAX+EDX+48E100]
00405325 |. 50 PUSH EAX
00405326 |. 8A41 04 MOV AL,BYTE PTR DS:[ECX+4]
00405329 |. 8A8410 00E14800 MOV AL,BYTE PTR DS:[EAX+EDX+48E100]
00405330 |. 3845 F8 CMP BYTE PTR SS:[EBP-8],AL
00405333 |. 74 2D JE SHORT 55Ekd5.00405362
00405335 |. 6A 01 PUSH 1 ; /Arg2 = 00000001
00405337 |. 68 86000000 PUSH 86 ; |Arg1 = 00000086
0040533C |. B9 B0694B00 MOV ECX,55Ekd5.004B69B0 ; |
00405341 |. E8 34F30600 CALL 55Ekd5.0047467A ; \55Ekd5.0047467A
00405346 |. 6A 1E PUSH 1E ; /Arg1 = 0000001E
00405348 |. B9 181B4B00 MOV ECX,55Ekd5.004B1B18 ; |
0040534D |. E8 EEDFFFFF CALL 55Ekd5.00403340 ; \55Ekd5.00403340
00405352 |. E8 89710200 CALL 55Ekd5.0042C4E0
00405357 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; /Arg1
0040535A |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4] ; |
0040535D |. E8 2F4C0400 CALL 55Ekd5.00449F91 ; \55Ekd5.00449F91
00405362 |> 8BE5 MOV ESP,EBP
00405364 |. 5D POP EBP
00405365 \. C2 0400 RETN 4
[ 本帖最后由 star175 于 2009-9-8 18:09 编辑 ]
|