查看完整版本: 修改z.dat教程—详解物品选单的修改

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

懂汇编的话,照着这个例子练习一下,就能清楚很多修改的原理。
不过并不是很容易。。。

其实我用的基本上全部方法都在那几个帖子里面了。

ayu518786 2008-2-6 18:49

好 顶一个[s:03] [s:03]

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-3-30 09:15

也不算太难,不过没试过的还是不好弄

翠花上欢喜陀 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]

jhg10000 2008-4-27 13:25

好贴 收藏了先~~~~[s:06]

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]
页: [1]
查看完整版本: 修改z.dat教程—详解物品选单的修改