weyl 2008-2-3 16:23
修改z.dat教程—详解物品选单的修改
[font=宋体]实际上修改物品选单的难度还是比较高的,与状态选单的修改比较在于物品选单多了一个光标,而状态选单只要看看。但是就工作的繁琐来看状态选单又要复杂一些,因为状态选单涉及的项比较多。
阅读这个教程需要汇编语言基础,并且最好读过我前面写的“简明指南”并大致看懂。
目的:扩大物品选单,将5*3扩展为12*8。
这是原版的物品选单,在高分辨率下面显然看来比较别扭,那么我们的目的就是将其扩大。
[img]http://scarscc.yo2.cn/wp-content/uploads/186/18636/2008/03/z-019-thumb.png[/img][/font]
[font=宋体]
[img]http://scarscc.yo2.cn/wp-content/uploads/186/18636/2008/03/z-020-thumb.png[/img]
阅读前辈留下的反汇编文件,看这个子程:
[color=navy]dseg02:0002A0D9 wupin_sub proc near ; CODE XREF: sub_212C0+173p
dseg02:0002A0D9 push 10h
dseg02:0002A0DE call check_stack
dseg02:0002A0E3 mov byte_51B6B, 0 ; 键值
dseg02:0002A0EA push 0
[color=red]dseg02:0002A0EC call sub_2A10F[/color]
dseg02:0002A0F1 add esp, 4
dseg02:0002A0F4 push 0
dseg02:0002A0F6 push 0
dseg02:0002A0F8 push 0
[color=red]dseg02:0002A0FA call sub_2A186[/color]
dseg02:0002A0FF add esp, 0Ch
dseg02:0002A102 push 0FFFFFFFFh
dseg02:0002A104 push 0
[color=red]dseg02:0002A106 call sub_2A86C ; 使用物品[/color]
dseg02:0002A10B add esp, 8
dseg02:0002A10E retn
dseg02:0002A10E wupin_sub endp[/color]
既然名字是wupin那估计不是乱写,前辈们的工作还是相当严谨的。注意到这个函数调用了三个子程,后面一个有注释“使用物品”,那么上面那两个可能是生成物品选单,进去看看。
进去之后可能发现尽管有一些注释,但仍然一头雾水。但是我们记住这里有两个重要数字,5和3,看看有没有连续使用它们的地方。经查看在2A186子程中发现这样一段程序。
[color=navy]dseg02:0002A2FF inc ebx
[color=red]dseg02:0002A300 cmp ebx, 5[/color]
dseg02:0002A303 jl short loc_2A287
dseg02:0002A305 inc ebp
[color=red]dseg02:0002A306 cmp ebp, 3[/color]
dseg02:0002A309 jl loc_2A285
dseg02:0002A30F push offset array_VRAM[/color]
就是上面这里,连续使用了5和3。现在还不能明白它们各自控制什么,但是无论如何修改一下看看效果。把它们各自改成0C和08。
[img]http://scarscc.yo2.cn/wp-content/uploads/186/18636/2008/03/z-021.png[/img]
这就是修改之后的效果,那么我们知道了这个是控制物品贴图数量的。但是物品贴图显然还有些错误,多出来的部分在新的一行又重新出现了一遍。
猜想贴图是一行一行画的,所以在上面可能会出现5这个重要数字。但是似乎并未发现5的踪影,注意这几行:
[color=navy]dseg02:0002A262 mov eax, edx
dseg02:0002A264 shl eax, 2
dseg02:0002A267 add eax, edx[/color]
这个实际上是eax=edx*5,与imul eax,edx,5是相同的。在编译时,乘以与2^n仅相差1的数字时,多数是这种形式。
改成
[color=navy]dseg02:0002A262 imul eax, edx, 0c
dseg02:0002A268 nop[/color]
nop是空指令,是用来占位的。
修改后发现还是不正常,这应该是修改的位置不全,找找附近有没有类似的地方。果然,有:
[color=indigo][color=navy]dseg02:0002A2AE mov eax, edx
dseg02:0002A2B0 shl eax, 2
dseg02:0002A2B3 add eax, edx[/color]
[/color]
跟上面是相同的,也作相同的修改。看看效果:
[img]http://scarscc.yo2.cn/wp-content/uploads/186/18636/2008/03/z-022-thumb.png[/img]
贴图顺序正常了,但是物品的介绍跟贴图显然对不上。在显示物品介绍的部分应该还有类似的语句没有改。
继续向下观察,发现有:
[color=navy]dseg02:0002A33F mov ebx, edx
dseg02:0002A341 shl ebx, 2
dseg02:0002A344 add ebx, edx[/color]
把这句改成imul edx, ebx, 0c,注意这里是ebx和edx,修改后看看效果:
[img]http://scarscc.yo2.cn/wp-content/uploads/186/18636/2008/03/z-023-thumb.png[/img]
物品名字正常了。但是你的人参真的是“起死回生的丹药”吗?对比一下物品数量和介绍,发现实际上是天王保命丹。
实际上,类似的语句在下面还有很多。在寻找物品,显示物品名称,介绍,使用人,数量时都要进行类似的计算,把它们找出来全部进行对应的修改。
[img]http://scarscc.yo2.cn/wp-content/uploads/186/18636/2008/03/z-024-thumb.png[/img]
现在我们已经把这个子程里面的乘5全改成12了,看来物品的显示已经基本正常了,但是使用人参时,发现还是天王保命丹。那么我们考虑物品的使用子程中可能还有一个乘5指令。进入那个子程看看,果然是这样:
[color=navy]dseg02:0002A98A mov eax, edx
dseg02:0002A98C shl eax, 2
dseg02:0002A98F add eax, edx[/color]
把这个也改掉,物品选单就正常了。
[img]http://scarscc.yo2.cn/wp-content/uploads/186/18636/2008/03/z-025-thumb.png[/img]
但是这时还有一个问题,就是物品选单多出来的部分根本选不到。那么我们猜测可能是存在一些控制“溢出”的部分,实现横坐标是5时,再按右就是1这样的功能。4个方向键都可能对应类似的功能,试着找一下。
[color=navy][color=red]dseg02:0002A8CD cmp esi, 4
[/color]dseg02:0002A8D0 jnz short loc_2A8D6
[color=red]dseg02:0002A8D2 xor esi, esi[/color]
dseg02:0002A8D4 jmp short loc_2A8D7[/color]
这里实际上是把4变成0,跟我们提到的功能是类似的。对应的把0变成4的:
[color=navy][color=red]dseg02:0002A916 test esi, esi
[/color]dseg02:0002A918 jnz short loc_2A921
[color=red]dseg02:0002A91A mov esi, 4[/color]
dseg02:0002A91F jmp short loc_2A8D7[/color]
把这两处的4改掉,改为0B。至于上下方向键作用和修改方法也是类似的,把03改成08,或者把02改成07。
[img]http://scarscc.yo2.cn/wp-content/uploads/186/18636/2008/03/z-026-thumb.png[/img]
现在你的物品选单已经可以正常使用了。到这里主要的功能都完成了,后面可以做些美化工作。比如扩大那3个黑色矩形,把显示说明文字的位置移到中间等等。还有可能出现的上下箭头,也许要改一下位置(我是偷懒把箭头都去掉了)。另外翻页键的作用也需要修改一下。[/font]
[[i] 本帖最后由 scarscc 于 2008-4-13 15:58 编辑 [/i]]
Bullteats 2008-2-4 17:51
学习了~~还有谢谢LZ换了空间~~让我亦能下载~~谢谢LZ!!!![s:01] [s:01]
降龙18掌 2008-2-4 18:12
哇!!看了高手的文章,真是获益匪浅,希望LZ能多发一些,让我们这些晚辈学习一下
小弟在此谢过LZ[s:06]
weyl 2008-2-4 18:19
懂汇编的话,照着这个例子练习一下,就能清楚很多修改的原理。
不过并不是很容易。。。
其实我用的基本上全部方法都在那几个帖子里面了。
zhi86311 2008-3-20 01:44
[s:06] [s:06] [s:06]
[table=100%,#FFFFE6][tr][td][size=9pt][发帖际遇]: [url=http://www.txdx.net/event.php]zhi86311参与红花会陈家洛的计划:叛变勾结清廷,得到赏赐银两6.
[/url][/font][/td][/tr][/table]
游客 2008-3-20 09:33
匯編語言不懂阿[s:02]
不過修改技巧的方向大致上能抓到了
[table=100%,#FFFFE6][tr][td][size=9pt][发帖际遇]: [url=http://www.txdx.net/event.php]参与红花会陈家洛的计划:游客向清廷告密,遭到红花会追杀损失银两2.
[/url][/font][/td][/tr][/table]
weyl 2008-3-20 20:04
像改中毒效果那樣改幾個數字還是比較簡單的,這個例子中需要改寫某些語句,懂彙編的可以用C32Asm比較快。
涉及到屬性值就要改重定位表,就複雜一些。
在NT系統下DOS程序無法用調試工具直接調試,所以大多數時間只能靜態修改。
[table=100%,#FFFFE6][tr][td][size=9pt][发帖际遇]: [url=http://www.txdx.net/event.php]scarscc在海边沙滩上捡到一支圣火令,当废铜卖了,获得银两6.
[/url][/font][/td][/tr][/table]
翠花上欢喜陀 2008-4-21 14:04
同意楼上意见~
*** 作者被禁止或删除 内容自动屏蔽 ***
幻阴指 2008-4-21 23:38
期待更多好贴。。。
感谢之。。。。[s:06]
[table=100%,#cbb48a][tr][td][size=9pt][发帖际遇]: [url=http://www.txdx.net/event.php]幻阴指遭遇四大恶人,奋力拼搏,得到银两14两银子
[/url][/font][/td][/tr][/table]
幻阴指 2008-4-21 23:52
问题!
问了个傻问题。。。。已经解决。。。
[table=100%,#cbb48a][tr][td][size=9pt][发帖际遇]: [url=http://www.txdx.net/event.php]幻阴指请陈园园签名,被胡逸之发现,引为知己,增加奖惩积分8.
[/url][/font][/td][/tr][/table]
[[i] 本帖最后由 幻阴指 于 2008-4-22 00:08 编辑 [/i]]
aa2ss2dd2 2008-4-27 13:22
虽然看不懂,但还是谢谢LZ了
[table=100%,#cbb48a][tr][td][size=9pt][发帖际遇]: [url=http://www.txdx.net/event.php]aa2ss2dd2跑去泰国取经,回来后出版《葵花宝典--2008奥运免自宫限量特别珍藏版》,获利银两18.
[/url][/font][/td][/tr][/table]
qqqqqliji 2008-4-28 22:17
太难了.....看不懂.....[s:02]
[table=100%,#cbb48a][tr][td][size=9pt][发帖际遇]: [url=http://www.txdx.net/event.php]qqqqqliji买通太监进宫偷葵花,转手挣到银两22.
[/url][/font][/td][/tr][/table]
sfzcyy 2008-8-28 17:09
受教[s:09] [s:09] [s:09]
[table=100%,#cbb48a][tr][td][size=9pt][发帖际遇]: [url=http://www.txdx.net/event.php]sfzcyy找到一柄破剑,经专家鉴定为独孤求败早年使用的不知名利剑,价值银两17.
[/url][/font][/td][/tr][/table]