超级玩家
 
- 贡献度
- 135
- 金元
- 2659
- 积分
- 816
- 精华
- 1
- 注册时间
- 2005-6-9
|
本帖最后由 ADSL0125 于 2012-7-21 22:54 编辑
注意:这是一个转帖,有任何问题请不要问我
1。字体文件,游戏默认字库没有汉字,需要自己生成
00499F97 |. 68 342D4F00 push 004F2D34 ; /mode = "rb"
00499F9C |. 68 382D4F00 push 004F2D38 ; |path = "URW.FNT"
00499FA1 |. FF15 7095FA1F call dword ptr [<&MSVCRTD.fopen>] ; \fopen
2.字体文件长度及字体载入内存位置
00499FC1 |. 50 push eax ; /stream
00499FC2 |. 6A 01 push 1 ; |n = 1
00499FC4 |. 68 00500000 push 5000 ; |size = 5000 (20480.) 字体文件长度
00499FC9 |. 68 6027041F push 1F042760 ; |ptr = urw.1F042760
00499FCE |. FF15 7495FA1F call dword ptr [<&MSVCRTD.fread>] ; \fread
字体文件长度是写死的,需要修改以适应包含汉字的字体文件
1F042760是字体载入内存的位置,有两处使用,当字库包含汉字过多时,可能需要换个位置存放
0049A139 |. 8A9408 602704>||mov dl, byte ptr [eax+ecx+1F042760>
0049A1E0 |. 8A9408 602704>||mov dl, byte ptr [eax+ecx+1F042760>
3.绘制文本
游戏处理单字节文本,需要修改
0049B83B /> \55 push ebp
0049B83C |. 8BEC mov ebp, esp
0049B83E |. 81EC 3C010000 sub esp, 13C
0049B844 |. 56 push esi
0049B845 |. 57 push edi
0049B846 |. 8DBD C4FEFFFF lea edi, dword ptr [ebp-13C]
0049B84C |. B9 4F000000 mov ecx, 4F
0049B851 |. B8 CCCCCCCC mov eax, CCCCCCCC
0049B856 |. F3:AB rep stos dword ptr es:[edi]
0049B858 |. 8B45 08 mov eax, dword ptr [ebp+8]
0049B85B |. 8985 CCFEFFFF mov dword ptr [ebp-134], eax
0049B861 |. 8B4D 0C mov ecx, dword ptr [ebp+C]
0049B864 |. 898D C8FEFFFF mov dword ptr [ebp-138], ecx
0049B86A |. 8B55 10 mov edx, dword ptr [ebp+10]
0049B86D |. 52 push edx ; /src
0049B86E |. 8D85 D0FEFFFF lea eax, dword ptr [ebp-130] ; |
0049B874 |. 50 push eax ; |dest
0049B875 |. E8 EA850300 call <jmp.&MSVCRTD.strcpy> ; \strcpy
0049B87A |. 83C4 08 add esp, 8
0049B87D |. 8BF4 mov esi, esp
0049B87F |. 6A 0A push 0A ; /c = 0A (Line Feed)
0049B881 |. 8D8D D0FEFFFF lea ecx, dword ptr [ebp-130] ; |
0049B887 |. 51 push ecx ; |s
0049B888 |. FF15 5C95FA1F call dword ptr [<&MSVCRTD.strchr>] ; \strchr 查找文本中的换行符(0x0A)
0049B88E |. 83C4 08 add esp, 8
0049B891 |. 3BF4 cmp esi, esp
0049B893 |. E8 D8850300 call <jmp.&MSVCRTD._chkesp>
0049B898 |. 8945 FC mov dword ptr [ebp-4], eax
0049B89B |. 837D FC 00 cmp dword ptr [ebp-4], 0
0049B89F |. 74 13 je short 0049B8B4
0049B8A1 |. 8B55 FC mov edx, dword ptr [ebp-4]
0049B8A4 |. 8D85 D0FEFFFF lea eax, dword ptr [ebp-130]
0049B8AA |. 2BD0 sub edx, eax
0049B8AC |. C68415 D0FEFF>mov byte ptr [ebp+edx-130], 0
0049B8B4 |> C785 C4FEFFFF>mov dword ptr [ebp-13C], 0
0049B8BE |. EB 0F jmp short 0049B8CF
0049B8C0 |> 8B8D C4FEFFFF /mov ecx, dword ptr [ebp-13C]
0049B8C6 |. 83C1 01 |add ecx, 1 ; 处理文本时,每次前进1个字节
0049B8C9 |. 898D C4FEFFFF |mov dword ptr [ebp-13C], ecx
0049B8CF |> 8D95 D0FEFFFF lea edx, dword ptr [ebp-130]
0049B8D5 |. 52 |push edx ; /s
0049B8D6 |. E8 8F850300 |call <jmp.&MSVCRTD.strlen> ; \strlen
0049B8DB |. 83C4 04 |add esp, 4
0049B8DE |. 3985 C4FEFFFF |cmp dword ptr [ebp-13C], eax
0049B8E4 |. 73 35 |jnb short 0049B91B
0049B8E6 |. 8B85 C4FEFFFF |mov eax, dword ptr [ebp-13C]
0049B8EC |. 8A8C05 D0FEFF>|mov cl, byte ptr [ebp+eax-130] ; 从文本中读取1个字节
0049B8F3 |. 51 |push ecx
0049B8F4 |. 8B95 C8FEFFFF |mov edx, dword ptr [ebp-138]
0049B8FA |. 52 |push edx
0049B8FB |. 8B85 CCFEFFFF |mov eax, dword ptr [ebp-134]
0049B901 |. 50 |push eax
0049B902 |. E8 2666F6FF |call 00401F2D
0049B907 |. 83C4 0C |add esp, 0C
0049B90A |. 8B8D CCFEFFFF |mov ecx, dword ptr [ebp-134]
0049B910 |. 83C1 08 |add ecx, 8
0049B913 |. 898D CCFEFFFF |mov dword ptr [ebp-134], ecx
0049B919 |.^ EB A5 \jmp short 0049B8C0
0049B91B |> 5F pop edi
0049B91C |. 5E pop esi
0049B91D |. 81C4 3C010000 add esp, 13C
0049B923 |. 3BEC cmp ebp, esp
0049B925 |. E8 46850300 call <jmp.&MSVCRTD._chkesp>
0049B92A |. 8BE5 mov esp, ebp
0049B92C |. 5D pop ebp
0049B92D \. C3 retn
4。绘制一个文字
游戏使用的文字是 宽8像素,高10像素的,如果是汉字至少要11*11个像素(9号宋体)
0049A0CF /> \55 push ebp
0049A0D0 |. 8BEC mov ebp, esp
0049A0D2 |. 83EC 0C sub esp, 0C
0049A0D5 |. C745 F4 CCCCC>mov dword ptr [ebp-C], CCCCCCCC
0049A0DC |. C745 F8 CCCCC>mov dword ptr [ebp-8], CCCCCCCC
0049A0E3 |. C745 FC CCCCC>mov dword ptr [ebp-4], CCCCCCCC
0049A0EA |. C745 F4 00000>mov dword ptr [ebp-C], 0
0049A0F1 |. 8B45 0C mov eax, dword ptr [ebp+C]
0049A0F4 |. 8945 F8 mov dword ptr [ebp-8], eax
0049A0F7 |. EB 09 jmp short 0049A102
0049A0F9 |> 8B4D F8 /mov ecx, dword ptr [ebp-8]
0049A0FC |. 83C1 01 |add ecx, 1
0049A0FF |. 894D F8 |mov dword ptr [ebp-8], ecx
0049A102 |> 8B55 0C mov edx, dword ptr [ebp+C]
0049A105 |. 83C2 0A |add edx, 0A ; 文字高度为10
0049A108 |. 3955 F8 |cmp dword ptr [ebp-8], edx
0049A10B |. 7D 5B |jge short 0049A168
0049A10D |. 8B45 08 |mov eax, dword ptr [ebp+8]
0049A110 |. 8945 FC |mov dword ptr [ebp-4], eax
0049A113 |. EB 09 |jmp short 0049A11E
0049A115 |> 8B4D FC |/mov ecx, dword ptr [ebp-4]
0049A118 |. 83C1 01 ||add ecx, 1
0049A11B |. 894D FC ||mov dword ptr [ebp-4], ecx
0049A11E |> 8B55 08 | mov edx, dword ptr [ebp+8]
0049A121 |. 83C2 08 ||add edx, 8 ; 文字宽度为8
0049A124 |. 3955 FC ||cmp dword ptr [ebp-4], edx
0049A127 |. 7D 3D ||jge short 0049A166
0049A129 |. 8B45 10 ||mov eax, dword ptr [ebp+10]
0049A12C |. 25 FF000000 ||and eax, 0FF ; 限定文本为单字节
0049A131 |. 6BC0 50 ||imul eax, eax, 50 ; 计算文字像素信息位置 (信息长度:0x08 * 0x0A = 0x50)
0049A134 |. 8B4D F4 ||mov ecx, dword ptr [ebp-C]
0049A137 |. 33D2 ||xor edx, edx
0049A139 |. 8A9408 602704>||mov dl, byte ptr [eax+ecx+1F042760>
0049A140 |. 83FA 01 ||cmp edx, 1
0049A143 |. 75 16 ||jnz short 0049A15B
0049A145 |. A1 6489041F ||mov eax, dword ptr [1F048964]
0049A14A |. 50 ||push eax
0049A14B |. 8B4D F8 ||mov ecx, dword ptr [ebp-8]
0049A14E |. 51 ||push ecx
0049A14F |. 8B55 FC ||mov edx, dword ptr [ebp-4]
0049A152 |. 52 ||push edx
0049A153 |. E8 3983F6FF ||call 00402491
0049A158 |. 83C4 0C ||add esp, 0C
0049A15B |> 8B45 F4 ||mov eax, dword ptr [ebp-C]
0049A15E |. 83C0 01 ||add eax, 1
0049A161 |. 8945 F4 ||mov dword ptr [ebp-C], eax
0049A164 |.^ EB AF |\jmp short 0049A115
0049A166 |>^ EB 91 \jmp short 0049A0F9
0049A168 |> 83C4 0C add esp, 0C
0049A16B |. 3BEC cmp ebp, esp
0049A16D |. E8 FE9C0300 call <jmp.&MSVCRTD._chkesp>
0049A172 |. 8BE5 mov esp, ebp
0049A174 |. 5D pop ebp
0049A175 \. C3 retn
5。另一段处理文本的过程
看上去像一段处理固定200字节文本的,暂时不知道游戏哪里用到
相关绘制文字过程地址在 0049A176 与前一个相似
0049A21C /> \55 push ebp
0049A21D |. 8BEC mov ebp, esp
0049A21F |. 51 push ecx
0049A220 |. C745 FC CCCCC>mov dword ptr [ebp-4], CCCCCCCC
0049A227 |. C745 FC 00000>mov dword ptr [ebp-4], 0
0049A22E |. EB 09 jmp short 0049A239
0049A230 |> 8B45 FC /mov eax, dword ptr [ebp-4]
0049A233 |. 83C0 01 |add eax, 1 ; 处理文本时,每次前进1个字节
0049A236 |. 8945 FC |mov dword ptr [ebp-4], eax
0049A239 |> 817D FC C8000> cmp dword ptr [ebp-4], 0C8 ; 最大读200字节
0049A240 |. 7D 17 |jge short 0049A259
0049A242 |. 8A4D FC |mov cl, byte ptr [ebp-4] ; 从文本中读取1个字节
0049A245 |. 51 |push ecx
0049A246 |. 6A 00 |push 0
0049A248 |. 8B55 FC |mov edx, dword ptr [ebp-4]
0049A24B |. C1E2 03 |shl edx, 3
0049A24E |. 52 |push edx
0049A24F |. E8 5C7CF6FF |call 00401EB0
0049A254 |. 83C4 0C |add esp, 0C
0049A257 |.^ EB D7 \jmp short 0049A230
0049A259 |> 83C4 04 add esp, 4
0049A25C |. 3BEC cmp ebp, esp
0049A25E |. E8 0D9C0300 call <jmp.&MSVCRTD._chkesp>
0049A263 |. 8BE5 mov esp, ebp
0049A265 |. 5D pop ebp
0049A266 \. C3 retn
7/21 看架势UW会被坑
|
评分
-
1
查看全部评分
-
|