找回密码
 立即注册
查看: 1237|回复: 0

自制Diablo说明信息

[复制链接]
发表于 2013-6-8 08:08:52 | 显示全部楼层 |阅读模式
  自制Diablo说明信息(按H键弹出的说明框),CE的,800和640都适用。
下面是帮助页显示的函数开始地址
  6FAD8310 $ 83EC 48 sub esp,48 ;帮助页显示
  其中有一个检测显示分辨率的地方,分开800X600和640X480的显示,在
  6FAD8345 /0F85 B4050000 jnz D2Client.6FAD88FF ;到640X480显示
  因为修改了显示函数,而同时整理了一些空间,对应的修改转移地址为
  6FAD8345 /0F85 AC050000 jnz D2Client.6FAD88F7 ;到新640X480显示
这里就是640X480显示的程序。先显示外框等等东西,在跳到某处显示文本。
  
  6FAD88FF |E8 1C000000 call D2Client.6FAD8920 ;显示外框
  6FAD8904 |E8 C7170000 call D2Client.6FADA0D0 ;显示取消按钮
  6FAD8909 |E8 62010000 call D2Client.6FAD8A70 ;8个小图标
  6FAD890E |E8 BD010000 call D2Client.6FAD8AD0 ;一些连线
  6FAD8913 |5E pop esi
  6FAD8914 |5B pop ebx
  6FAD8915 |83C4 48 add esp,48
  6FAD8918 |E9 B30E0000 jmp D2Client.6FAD97D0 ;转到文字显示
我们只需要外框和取消按钮的显示,并且用新的文本显示,故修改为
  
  6FAD88F7 E8 24000000 call D2Client.6FAD8920 ;显示外框
  6FAD88FC E8 CF170000 call D2Client.6FADA0D0 ;显示取消按钮
  6FAD8901 5E pop esi
  6FAD8902 5B pop ebx
  6FAD8903 83C4 48 add esp,48
  6FAD8906 ^ E9 89FBFFFF jmp D2Client.6FAD8494
  E8 24 00 00 00 E8 CF 17 00 00 5E 5B 83 C4 48 E9 89 FB FF FF
以下是显示一个TBL字串函数。因为DIABLO的显示文本的函数是由下到上的,另外各种MOD的说明也不是有相同的行数,有多有少,所以每个TBL字串为一行一次显示一行,在程序中设定显示几行。
  
  6FAD890B 8BCD mov ecx,ebp
  6FAD890D E8 C6340900 call <jmp.&D2Lang.#10004>
  6FAD8912 6A 00 push 0
  6FAD8914 53 push ebx
  6FAD8915 57 push edi
  6FAD8916 8BC8 mov ecx,eax
  6FAD8918 8BD6 mov edx,esi
  6FAD891A E8 99360900 call <jmp.&D2Win.#10117>
  6FAD891F C3 retn
  8B CD E8 C6 34 09 00 6A 00 53 57 8B C8 8B D6 E8 99 36 09 00 C3
下面的就是新的文本显示的程序,地址开始处为8000X600显示程序中显示了外框和取消按钮后。参考注释,EBX、EBP、ESI、EDI寄存器分别用于颜色、TBL字串INDEX、显示X坐标、显示Y坐标。在TBL文件中加入标题字串、正文。其中正文要一行接一行,在程序中修改第一行TBL字串INDEX就可以了。INDEX的获取方法为:AFJ
  tbl Edit下面的状态栏有选中的字串的初始INDEX,再加上每个TBL文件的INDEX就是真正的INDEX了。string.tbl的INDEX为0,patchstring.tbl的INDEX为10000,expansionstring.tbl的INDEX为20000。由上到下依次增加,第一个为颜色0。
  
  6FAD848E . 5F pop edi
  6FAD848F . 5E pop esi
  6FAD8490 . 5B pop ebx
  6FAD8491 . 83C4 48 add esp,48
  6FAD8494 > 53 push ebx
  6FAD8495 . 55 push ebp
  6FAD8496 . 56 push esi
  6FAD8497 . 57 push edi
  6FAD8498 . 8B35 48A7BB6F mov esi,dword ptr ds:[6FBBA748]
  6FAD849E . 81C6 EF000000 add esi,0EF
  6FAD84A4 . BF 11000000 mov edi,11
  6FAD84A9 . BD 8A2B0000 mov ebp,2B8A ;标题TBL字串INDEX
  6FAD84AE . BB 02000000 mov ebx,2 ;标题颜色
  6FAD84B3 . E8 53040000 call D2Client.6FAD890B ;显示文本行即TBL字串函数
  6FAD84B8 . 81EE DF000000 sub esi,0DF
  6FAD84BE . BF 48000000 mov edi,48
  6FAD84C3 . BD 8B2B0000 mov ebp,2B8B ;正文第一行TBL字串INDEX
  6FAD84C8 . BB 00000000 mov ebx,0 ;正文颜色
  6FAD84CD . B9 15000000 mov ecx,15 ;正文有15H=21行
  6FAD84D2 > 51 push ecx
  6FAD84D3 . E8 33040000 call D2Client.6FAD890B
  6FAD84D8 . 59 pop ecx
  6FAD84D9 . 49 dec ecx
  6FAD84DA . 83C7 0D add edi,0D
  6FAD84DD . 45 inc ebp
  6FAD84DE . 85C9 test ecx,ecx
  6FAD84E0 .^ 75 F0 jnz short D2Client.6FAD84D2
  6FAD84E2 . 83C7 10 add edi,10
  6FAD84E5 . 81C6 DF000000 add esi,0DF
  6FAD84EB . BD 932B0000 mov ebp,2B93 ;显示任务标题的TBL字串INDEX
  6FAD84F0 . BB 08000000 mov ebx,8 ;任务标题颜色
  6FAD84F5 . E8 11040000 call D2Client.6FAD890B
  6FAD84FA . E8 D1FE0400 call D2Client.6FB283D0
  6FAD84FF . 6A 00 push 0
  6FAD8501 . 68 D4000000 push 0D4
  6FAD8506 . 50 push eax
  6FAD8507 . E8 76250900 call <jmp.&D2Common.#10519> ;获取新任务显示状态
  6FAD850C . 81EE DF000000 sub esi,0DF
  6FAD8512 . 83C7 0D add edi,0D
  6FAD8515 . BB 09000000 mov ebx,9 ;新任务状态说明颜色
  6FAD851A . BD 942B0000 mov ebp,2B94 ;新任务第一行状态说明TBL字串INDEX
  6FAD851F . B9 04000000 mov ecx,4 ;设定新任务有4个
  6FAD8524 > 51 push ecx
  6FAD8525 . 50 push eax
  6FAD8526 . 83E0 0F and eax,0F
  6FAD8529 . 03E8 add ebp,eax
  6FAD852B . E8 DB030000 call D2Client.6FAD890B
  6FAD8530 . 58 pop eax
  6FAD8531 . 59 pop ecx
  6FAD8532 . C1E8 04 shr eax,4
  6FAD8535 . 49 dec ecx
  6FAD8536 . 83C5 06 add ebp,6 ;每个新任务有6个状态,6行说明,+6后为下一个新任务说明
  6FAD8539 . 83C7 0D add edi,0D
  6FAD853C . 85C9 test ecx,ecx
  6FAD853E .^ 75 E4 jnz short D2Client.6FAD8524 ;显示下一个新任务说明
  6FAD8540 . 5F pop edi
  6FAD8541 . 5E pop esi
  6FAD8542 . 5D pop ebp
  6FAD8543 . 5B pop ebx
  6FAD8544 . C3 retn
  5F 5E 5B 83 C4 48 53 55 56 57 8B 35 48 A7 BB 6F 81 C6 EF 00 00 00 BF 11 00 00
  00 BD 8A 2B 00 00
  BB 02 00 00 00 E8 53 04 00 00 81 EE DF 00 00 00 BF 48 00 00 00 BD 8B 2B 00 00
  BB 00 00 00 00 B9
  15 00 00 00 51 E8 33 04 00 00 59 49 83 C7 0D 45 85 C9 75 F0 83 C7 10 81 C6 DF
  00 00 00 BD 93 2B
  00 00 BB 08 00 00 00 E8 11 04 00 00 E8 D1 FE 04 00 6A 00 68 D4 00 00 00 50 E8
  76 25 09 00 81 EE
  DF 00 00 00 83 C7 0D BB 09 00 00 00 BD 94 2B 00 00 B9 04 00 00 00 51 50 83 E0
  0F 03 E8 E8 DB 03
  00 00 58 59 C1 E8 04 49 83 C5 06 83 C7 0D 85 C9 75 E4 5F 5E 5D 5B C3
考虑到添加任务而没有显示的问题,上面的显示程序中包含了新任务状态说明,就像每完成一步任务任务栏下方的任务说明一样。其中用了itemstatcost的D4位来记录新任务显示状态。4bit为一个新任务记录,16个状态。可以在CE新任务时在程序中加入修改D4位的任务显示记录,每完成一步加一,就可以显示任务说明下一条TBL。以上只设定了6个状态,但还是4bit储存。另外TBL字串也要一行接一行,一个接一个。如果不想显示任务说明,可以修改部分程序为
  6FAD84E2 5F pop edi
  6FAD84E3 5E pop esi
  6FAD84E4 5D pop ebp
  6FAD84E5 5B pop ebx
  6FAD84E6 C3 retn
然后把多余的程序用nop清除。
  6FAD8545 90 nop
  6FAD88F6 90 nop
最后修改重定位表
  000FE97A 9A 34 E3 34
  为
  000FE97A 90 34 00 00
整个帮助页显示的函数修改完了,就那么短。当然,原来程序还有4K多的空间
  6FAD8E50 > \81EC B4040000 sub esp,4B4
  |
  6FADA0CF 90 nop
  以上地方都可以用nop清除。待以后写其他程序。
主要的修改的PATCH可以在我的暂存库找到。颜色、TBL字串INDEX、TBL文件中的字串就由你们修改了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|网站地图|联系我们|关于我们|隐私条款|免责声明|小黑屋|D2home暗黑1.09战网 ( 鲁ICP备2020047197号 )

GMT+8, 2024-5-4 05:00 , Processed in 0.242589 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表