下面我们分析一下菜单中对应的功能,看看都做了些什么呢?
先上菜单图,看看菜单长什么样子
我们先来分析下高级选项,也就是高级难度开局
00404AB0 /$ 56 PUSH ESI
00404AB1 |. 8BF1 MOV ESI,ECX
00404AB3 |. B8 01000000 MOV EAX,1
00404AB8 |. C786 B40A0000>MOV DWORD PTR DS:[ESI+AB4],3 ; 难度
00404AC2 |. C786 C40A0000>MOV DWORD PTR DS:[ESI+AC4],0 ; 得分
00404ACC |. C786 BC0A0000>MOV DWORD PTR DS:[ESI+ABC],4 ; 生命
00404AD6 |. C786 C00A0000>MOV DWORD PTR DS:[ESI+AC0],8 ; 提示
00404AE0 |. 8986 B80A0000 MOV DWORD PTR DS:[ESI+AB8],EAX ;关卡
00404AE6 |. 8986 DC050000 MOV DWORD PTR DS:[ESI+5DC],EAX ;开局标志
00404AEC |. E8 EF2F0000 CALL llk4.00407AE0
; menu的一些处理,
;比如灰化初级,中级,高级。。。这些选项
;激活放弃,洗牌这些选项
00404AF1 |. 8BCE MOV ECX,ESI
00404AF3 |. E8 38F8FFFF CALL llk4.00404330
; 填充棋盘棋子ID等一些操作
00404AF8 |. 8B46 1C MOV EAX,DWORD PTR DS:[ESI+1C]
00404AFB |. 6A 00 PUSH 0 ; /Timerproc = NULL
00404AFD |. 68 20030000 PUSH 320 ; |Timeout = 800. ms
00404B02 |. 6A 02 PUSH 2 ; |TimerID = 2
00404B04 |. 50 PUSH EAX ; |hWnd
00404B05 |. FF15 E0B44300 CALL DWORD PTR DS:[<&USER32.SetTimer>] ; \SetTimer
;设置了1个定时器
00404B0B |. 8B4E 1C MOV ECX,DWORD PTR DS:[ESI+1C]
00404B0E |. 6A 00 PUSH 0 ; /Erase = FALSE
00404B10 |. 6A 00 PUSH 0 ; |pRect = NULL
00404B12 |. 51 PUSH ECX ; |hWnd
00404B13 |. FF15 B8B44300 CALL DWORD PTR DS:[<&USER32.InvalidateRe>; \InvalidateRect
;刷新
00404B19 |. 5E POP ESI
00404B1A \. C3 RETN
高级开局的结构很简单吧?哈哈,初级,中级都是一样的
看了开局,我们再看个结束游戏,也就是放弃,
00404B20 /$ 83EC 54 SUB ESP,54
00404B23 |. 56 PUSH ESI ; llk4.0043BB18
00404B24 |. 8BF1 MOV ESI,ECX
00404B26 |. 6A 02 PUSH 2 ; /TimerID = 2
00404B28 |. 8B46 1C MOV EAX,DWORD PTR DS:[ESI+1C] ; |
00404B2B |. 50 PUSH EAX ; |hWnd
00404B2C |. FF15 80B44300 CALL DWORD PTR DS:[<&USER32.KillTimer>] ; \KillTimer
;销毁定时器
00404B32 |. 8BCE MOV ECX,ESI
00404B34 |. C786 DC050000>MOV DWORD PTR DS:[ESI+5DC],0
; 开局标志置零
00404B3E |. C786 94000000>MOV DWORD PTR DS:[ESI+94],1
00404B48 |. E8 932F0000 CALL llk4.00407AE0
;菜单的一些处理
00404B4D |. 8B46 64 MOV EAX,DWORD PTR DS:[ESI+64]
00404B50 |. 85C0 TEST EAX,EAX
00404B52 |. 74 3A JE SHORT llk4.00404B8E
;可能是检查它的背景大图是否已经加载了,它跳转去下面了
00404B54 |. 6A 00 PUSH 0
00404B56 |. 8D4C24 0C LEA ECX,DWORD PTR SS:[ESP+C]
00404B5A |. 68 EC664400 PUSH llk4.004466EC ; ASCII "img\z%d.jpg"
00404B5F |. 51 PUSH ECX
00404B60 |. C746 68 00000>MOV DWORD PTR DS:[ESI+68],0
00404B67 |. E8 A9970100 CALL llk4.0041E315
00404B6C |. 83C4 08 ADD ESP,8
00404B6F |. 8D5424 0C LEA EDX,DWORD PTR SS:[ESP+C]
00404B73 |. 8BCC MOV ECX,ESP
00404B75 |. 896424 08 MOV DWORD PTR SS:[ESP+8],ESP
00404B79 |. 52 PUSH EDX
00404B7A |. E8 A4CC0200 CALL llk4.00431823
00404B7F |. 8D4E 7C LEA ECX,DWORD PTR DS:[ESI+7C]
00404B82 |. E8 09E0FFFF CALL llk4.00402B90
00404B87 |. C746 64 00000>MOV DWORD PTR DS:[ESI+64],0
;;跳转到这里
00404B8E |> 8B46 1C MOV EAX,DWORD PTR DS:[ESI+1C]
00404B91 |. 6A 00 PUSH 0 ; /Erase = FALSE
00404B93 |. 6A 00 PUSH 0 ; |pRect = NULL
00404B95 |. 50 PUSH EAX ; |hWnd
00404B96 |. FF15 B8B44300 CALL DWORD PTR DS:[<&USER32.InvalidateRe>; \InvalidateRect
;刷新
00404B9C |. 5E POP ESI
00404B9D |. 83C4 54 ADD ESP,54
00404BA0 \. C3 RETN
结束和开始的过程基本上都是对应的,先分析到这里,休息一下