剧本指令【人物点击】修改
最近一次更新《江湖》,特意增加了个南州镖局的作战剧情。其中包括了战场上点击人物的修改。
在我印象中好像剧本中【人物点击】那个指令只能在R场景下使用。经过修改后,发现可以这么修改一下,在战场上进行触发判断。
004119E7 /$ 55 PUSH EBP ; 点击人物
004119E8 |. 8BEC MOV EBP,ESP
004119EA |. 6A 02 PUSH 2
004119EC |. 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8]
004119EF |. E8 036A0000 CALL Ekd5.004183F7
004119F4 |. 50 PUSH EAX
004119F5 |. 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8]
004119F8 |. E8 DB720C00 CALL Ekd5.004D8CD8
004119FD |. 8BE5 MOV ESP,EBP
004119FF |. 5D POP EBP
00411A00 \. C3 RETN
把后头一串的函数都重新写过,留了原先这个函数位置获取判断点击人物的值
然后这个值作为参数传入 进行检测
004D8CD8 55 PUSH EBP ; 点击人物
004D8CD9 8BEC MOV EBP,ESP
004D8CDB 51 PUSH ECX
004D8CDC 6A FF PUSH -1
004D8CDE E8 3F2CF3FF CALL Ekd5.0040B922
004D8CE3 85C0 TEST EAX,EAX
004D8CE5 74 20 JE SHORT Ekd5.004D8D07
004D8CE7 B9 DC9F4D00 MOV ECX,Ekd5.004D9FDC ; 战场
004D8CEC C641 02 01 MOV BYTE PTR DS:[ECX+2],1
004D8CF0 0FB701 MOVZX EAX,WORD PTR DS:[ECX]
004D8CF3 66:83F8 FF CMP AX,0FFFF
004D8CF7 74 49 JE SHORT Ekd5.004D8D42
004D8CF9 66:C701 FFFF MOV WORD PTR DS:[ECX],0FFFF
004D8CFE 6A 00 PUSH 0
004D8D00 E8 7B000000 CALL Ekd5.004D8D80
004D8D05 EB 24 JMP SHORT Ekd5.004D8D2B
004D8D07 B9 70074B00 MOV ECX,Ekd5.004B0770 ; 非战场
004D8D0C E8 FF1BF5FF CALL Ekd5.0042A910
004D8D11 83E0 20 AND EAX,20
004D8D14 85C0 TEST EAX,EAX
004D8D16 74 2A JE SHORT Ekd5.004D8D42
004D8D18 6A 04 PUSH 4
004D8D1A 8D4D F8 LEA ECX,DWORD PTR SS:[EBP-8]
004D8D1D 51 PUSH ECX
004D8D1E 6A 01 PUSH 1
004D8D20 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
004D8D23 E8 2573F3FF CALL Ekd5.0041004D
004D8D28 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
004D8D2B A3 F07F5000 MOV DWORD PTR DS:[507FF0],EAX
004D8D30 66:837D 08 FF CMP WORD PTR SS:[EBP+8],0FFFF
004D8D35 74 06 JE SHORT Ekd5.004D8D3D
004D8D37 66:3B45 08 CMP AX,WORD PTR SS:[EBP+8]
004D8D3B 75 05 JNZ SHORT Ekd5.004D8D42
004D8D3D 33C0 XOR EAX,EAX
004D8D3F 40 INC EAX
004D8D40 EB 02 JMP SHORT Ekd5.004D8D44
004D8D42 33C0 XOR EAX,EAX
004D8D44 8BE5 MOV ESP,EBP
004D8D46 5D POP EBP
004D8D47 C3 RETN
非战场可以不变,我这里多加了个保存到指针2044,以及点击【无】时绝对响应。
这个主要是为了方便大场景的计算。比方众多按钮,每条SECTION弄个人物点击测试很烦人。现在配合上指针2044,只需要取出值来进行计算就可以。
战场部分 4D9FDC +2的内存标记1 用于战场点击人物后的响应标记
004D8CE7 B9 DC9F4D00 MOV ECX,Ekd5.004D9FDC ; 战场
004D8CEC C641 02 01 MOV BYTE PTR DS:[ECX+2],1
这一段从战场点击人物后的响应段切出来
004D8D50 55 PUSH EBP ; 战场点击
004D8D51 8BEC MOV EBP,ESP
004D8D53 BA DC9F4D00 MOV EDX,Ekd5.004D9FDC
004D8D58 807A 02 01 CMP BYTE PTR DS:[EDX+2],1
004D8D5C 75 10 JNZ SHORT Ekd5.004D8D6E
004D8D5E 8B01 MOV EAX,DWORD PTR DS:[ECX]
004D8D60 66:8902 MOV WORD PTR DS:[EDX],AX
004D8D63 6A 01 PUSH 1
004D8D65 8BCA MOV ECX,EDX
004D8D67 E8 14000000 CALL Ekd5.004D8D80
004D8D6C EB 02 JMP SHORT Ekd5.004D8D70
004D8D6E 33C0 XOR EAX,EAX
004D8D70 8BE5 MOV ESP,EBP
004D8D72 5D POP EBP
004D8D73 C3 RETN
其中EAX为1代表不需要移动等,否则就要移动 选择攻击什么的
0043DDE2 /$ 55 PUSH EBP
0043DDE3 |. 8BEC MOV EBP,ESP
0043DDE5 |. 83EC 34 SUB ESP,34
0043DDE8 |. 53 PUSH EBX
0043DDE9 |. 894D D4 MOV DWORD PTR SS:[EBP-2C],ECX
0043DDEC |. 33C0 XOR EAX,EAX
0043DDEE |. 8945 E8 MOV DWORD PTR SS:[EBP-18],EAX
0043DDF1 |. 8945 F4 MOV DWORD PTR SS:[EBP-C],EAX
0043DDF4 |. 8945 E4 MOV DWORD PTR SS:[EBP-1C],EAX
0043DDF7 |. 8A41 0F MOV AL,BYTE PTR DS:[ECX+F]
0043DDFA |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
0043DDFD |. 66:8B41 06 MOV AX,WORD PTR DS:[ECX+6]
0043DE01 |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
0043DE04 |. E8 47AF0900 CALL Ekd5.004D8D50
0043DE09 |. 85C0 TEST EAX,EAX
0043DE0B |. 75 37 JNZ SHORT Ekd5.0043DE44
实际上,引擎的顺序是,战场点击一次,然后剧本判断一次,二者交替进行
实际上,在剧本判断时,【点击测试】的指令负责将点击的人物记录到指定地址
然后点击人物的时候检测相应位置,看是否有相应的指令
004D8D80 55 PUSH EBP ; 写入,搜索
004D8D81 8BEC MOV EBP,ESP
004D8D83 51 PUSH ECX
004D8D84 8B55 08 MOV EDX,DWORD PTR SS:[EBP+8]
004D8D87 85D2 TEST EDX,EDX
004D8D89 74 20 JE SHORT Ekd5.004D8DAB
004D8D8B 8B01 MOV EAX,DWORD PTR DS:[ECX]
004D8D8D 66:3B41 FE CMP AX,WORD PTR DS:[ECX-2]
004D8D91 74 54 JE SHORT Ekd5.004D8DE7
004D8D93 83E9 04 SUB ECX,4
004D8D96 66:3B01 CMP AX,WORD PTR DS:[ECX]
004D8D99 74 51 JE SHORT Ekd5.004D8DEC
004D8D9B 66:8339 FE CMP WORD PTR DS:[ECX],0FFFE
004D8D9F 74 46 JE SHORT Ekd5.004D8DE7
004D8DA1 66:8339 FF CMP WORD PTR DS:[ECX],0FFFF
004D8DA5 74 3C JE SHORT Ekd5.004D8DE3
004D8DA7 49 DEC ECX
004D8DA8 49 DEC ECX
004D8DA9 ^ EB EB JMP SHORT Ekd5.004D8D96
004D8DAB 50 PUSH EAX
004D8DAC 8B4D 00 MOV ECX,DWORD PTR SS:[EBP]
004D8DAF 66:8B41 08 MOV AX,WORD PTR DS:[ECX+8]
004D8DB3 66:83F8 FF CMP AX,0FFFF
004D8DB7 75 01 JNZ SHORT Ekd5.004D8DBA
004D8DB9 48 DEC EAX
004D8DBA 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
004D8DBD 83E9 04 SUB ECX,4
004D8DC0 66:3B01 CMP AX,WORD PTR DS:[ECX]
004D8DC3 74 1B JE SHORT Ekd5.004D8DE0
004D8DC5 66:8339 FF CMP WORD PTR DS:[ECX],0FFFF
004D8DC9 74 0C JE SHORT Ekd5.004D8DD7
004D8DCB 81F9 928D4D00 CMP ECX,Ekd5.004D8D92
004D8DD1 76 0D JBE SHORT Ekd5.004D8DE0
004D8DD3 49 DEC ECX
004D8DD4 49 DEC ECX
004D8DD5 ^ EB E9 JMP SHORT Ekd5.004D8DC0
004D8DD7 66:8901 MOV WORD PTR DS:[ECX],AX
004D8DDA 66:C741 FE FFFF MOV WORD PTR DS:[ECX-2],0FFFF
004D8DE0 58 POP EAX
004D8DE1 EB 15 JMP SHORT Ekd5.004D8DF8
004D8DE3 33C0 XOR EAX,EAX
004D8DE5 EB 08 JMP SHORT Ekd5.004D8DEF
004D8DE7 E8 94000000 CALL Ekd5.004D8E80
004D8DEC 33C0 XOR EAX,EAX
004D8DEE 40 INC EAX
004D8DEF 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
004D8DF2 8B11 MOV EDX,DWORD PTR DS:[ECX]
004D8DF4 66:8951 FE MOV WORD PTR DS:[ECX-2],DX
004D8DF8 8BE5 MOV ESP,EBP
004D8DFA 5D POP EBP
004D8DFB C3 RETN
考虑一个FFFF的情况,也就是默认允许的情况
004D8E80 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004D8E83 8078 03 00 CMP BYTE PTR DS:[EAX+3],0
004D8E87 75 04 JNZ SHORT Ekd5.004D8E8D
004D8E89 832C24 09 SUB DWORD PTR SS:[ESP],9
004D8E8D C3 RETN
多一个开关,决定是否要移动,用指针修改这个值,在战场上就可以实现在剧情触发完以前,点击战场人物仅仅用于剧情
测试情况以及剧本示例见《江湖英烈纪事》南州镖局第四回合的剧情
[ 本帖最后由 砖家叫兽 于 2011-12-14 14:29 编辑 ]
|