2008-10-15 13:38
godtype
STAR175新引擎商店自动售出物品的修改
最近因为重新修正本人的MOD,所以研究了一下STAR175新引擎中商店自动售出物品的相关内容,得出以下结论,希望大家都有用。
相关的函数:
00472C30 $ 55 PUSH EBP
00472C31 . 8BEC MOV EBP,ESP
00472C33 . 51 PUSH ECX
00472C34 . 894D FC MOV DWORD PTR SS:[EBP-4],ECX
[color=Blue]00472C37 . E8 2E95F9FF CALL 0040C16A --->计算我军人物的平均等级(即加入的默认等级)[/color]
00472C3C . 8B55 08 MOV EDX,DWORD PTR SS:[EBP+8]
00472C3F . 81E2 FF000000 AND EDX,0FF
00472C45 .^E9 8549FAFF JMP 004175CF
00472C4A > 8BE5 MOV ESP,EBP
00472C4C . 5D POP EBP
00472C4D . C2 0400 RETN 4
004175CF > 33C9 XOR ECX,ECX
[color=Red]004175D1 . 3C 14 CMP AL,14 --->检查我军所有人的平均等级是否20级,确定是否卖出中级物品[/color]
004175D3 . 76 06 JBE SHORT 004175DB
004175D5 . 41 INC ECX --->下面的482427开始的数值各加1,即00变01,03变04……
[color=Red]004175D6 . 3C 28 CMP AL,28 --->检查我军所有人的平均等级是否40级,确定是否卖出高级物品[/color]
004175D8 . 76 01 JBE SHORT 004175DB
004175DA . 41 INC ECX --->下面的482427开始的数值在上面已经增加1的基础上各自再加1,即变成02、05,08……
[color=Red]004175DB B0 09 MOV AL,9 --->卖出多少种武器(防具)[/color]
004175DD . 2AD0 SUB DL,AL
004175DF . 73 0C JNB SHORT 004175ED
004175E1 . 02D0 ADD DL,AL
004175E3 . 8A82 27244800 MOV AL,BYTE PTR DS:[EDX+482427]
004175E9 . 03C1 ADD EAX,ECX
004175EB . EB 09 JMP SHORT 004175F6
004175ED > 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
004175F0 . 8D4C11 08 LEA ECX,DWORD PTR DS:[ECX+EDX+8]
004175F4 . 8B01 MOV EAX,DWORD PTR DS:[ECX]
004175F6 > 25 FF000000 AND EAX,0FF
004175FB . E9 4AB60500 JMP 00472C4A
00482427 00 DB 00 --->以下是九种初级武器(防具)
00482428 03 DB 03
00482429 06 DB 06
0048242A 09 DB 09
0048242B 0C DB 0C
0048242C 0F DB 0F
0048242D 12 DB 12
0048242E 26 DB 26
0048242F 29 DB 29
UE地址:
169d2的14
169d7的28
169dc的09
81827开始9个字节
2008-10-15 13:49
37610716
B) 这个应该是4改的地址吧? 不知道加强的改变了没有。
如果不卖的话是否直接FF在DATA里指定?
___________________________________
看了下面就明白了。
[[i] 本帖最后由 37610716 于 2008-10-15 13:57 编辑 [/i]]
2008-10-15 13:53
godtype
以上适用于目前的所有STAR175版新引擎。
如果旧引擎想用这个自动售出,也可以对着来修改,因为我对照了一下原版,472C30函数是原版已经有的,STAR应该只是修改了,没有重写或新写。
2008-10-15 14:00
godtype
回复 #2 37610716 的帖子
可能是我写得不够好(我以前也说过我不擅于表达)。
最开始的时候是:00 03 06 09 0C 0F 12 26 29 即初级物品
加1之后就变成:01 04 07 0A 0D 10 13 27 2A 即中级物品
再加1之后就变成:02 05 08 0B 11 14 28 2B 即高级物品
就是这个样子。
——————
如果不卖其中某一类物品,就好像我下次更新时会将普通炮车取消卖出一样,改法是:
004175DB MOV AL,9 改成 8
00482427开始改成 00 03 06 09 0F 12 26 29,
中间的0C没有了,让后面的放上来,最后一个(原来的29)就可以不改。
[[i] 本帖最后由 godtype 于 2008-10-15 16:31 编辑 [/i]]
2008-10-15 14:09
37610716
:P 恩,看到后面的那9个地址就明白了。
2008-10-15 14:20
37610716
004175D1 . 3C 14 CMP AL,14 --->检查我军所有人的平均等级是否20级,确定是否卖出中级物品
004175D6 . 3C 28 CMP AL,28 --->检查我军所有人的平均等级是否40级,确定是否卖出高级物品
这2段函数表示会根据等级转换进阶卖2次装备:
初始的是最开始的时候是:00 03 06 09 0C 0F 12 26 29 即初级物品的话,进阶就是 01 04 07 0A 0D 10 13 27 2A 即中级物品和02 05 08 0B 11 14 28 2B 即高级物品
如果初始的是01 04 07 0A 0D 10 13 27 2A 即中级物品,那么进阶的话就是02 05 08 0B 11 14 28 2B 即高级物品和02 05 08 0B 11 14 28 2B 即高级物品
当然如果那9个地址是02 05 08 0B 11 14 28 2B 即高级物品,就会从开始就一直卖铁X这些高阶装备??
如果我所有的都不想卖的话 004175DB B0 09 MOV AL,9 --->卖出多少种武器(防具) 这里9改成0, 那么那9个位置是不是就不需要改了,因为他卖0个装备!
[[i] 本帖最后由 37610716 于 2008-10-15 14:35 编辑 [/i]]
2008-10-15 14:27
star175
取消自动售货的方法就就是把这个函数恢复原状,找一个原版ccz的exe对照着改回去就行了
2008-10-15 15:48
希布
俺也补充一下,不是根据等级自动售出武器防具,而是还原为原CCZ的每关必须由DATA指定,可以这样改(感谢阿斌指导)
00472C30 55 push ebp
00472C31 8BEC mov ebp, esp
00472C33 51 push ecx
00472C34 894D FC mov dword ptr [ebp-4], ecx
00472C37 8B45 08 mov eax, dword ptr [ebp+8]
00472C3A 25 FF000000 and eax, 0FF
00472C3F 8B4D FC mov ecx, dword ptr [ebp-4]
00472C42 8A4401 08 mov al, byte ptr [ecx+eax+8]
00472C46 8BE5 mov esp, ebp
00472C48 5D pop ebp
00472C49 C2 0400 retn 4
00472C4C 90 nop
00472C4D 90 nop
00472C4E 90 nop
00472C4F 90 nop
2008-10-15 16:28
godtype
回复 #8 希布 的帖子
这个本身就是原版的。
2008-10-15 21:55
yanguodong
回复 #6 37610716 的帖子
你说的这些都是原版曹操传没有的。曹操传的道具出售是在DATA中设定,你想从哪一关起买到高级装备,只能从DATA中选取,而这些新的功能(最早用于岳飞传)是能根据我军等级自动出现在商店中,当然DATA设定任然保留,这项功能最大好处是可根据玩家不同情况,自动做出相应调整。
MOV AL,9 的意思是可自动出售设定前9种普通道具,改成0等于去除了自动出售武器这项功能,回归到原曹操传在DATA中设定要出售的道具
2008-10-15 22:10
37610716
回复 #10 yanguodong 的帖子
:loveliness: 感谢了。
2008-10-15 22:35
周瑜
没错,动态商店的功能旧引擎就有了,以岳飞传为例,只是地址稍稍不同而已。
:00472C30 55 push ebp
:00472C31 8BEC mov ebp, esp
:00472C33 51 push ecx
:00472C34 894DFC mov dword ptr [ebp-04], ecx
:00472C37 E81395F9FF call 0040C14F--->计算我军最高15人的平均等级(即加入的默认等级)
:00472C3C 8B5508 mov edx, dword ptr [ebp+08]
:00472C3F 81E2FF000000 and edx, 000000FF
:00472C45 E9760CF9FF jmp 004038C0
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403919(U)
|
:00472C4A 8BE5 mov esp, ebp
:00472C4C 5D pop ebp
:00472C4D C20400 ret 0004
:004038C0 33C9 xor ecx, ecx
:004038C2 3C14 cmp al, 14--->检查我军所有人的平均等级是否20级,确定是否卖出全部低级物品和三种中级物品
:004038C4 7224 jb 004038EA
:004038C6 41 inc ecx
:004038C7 3C16 cmp al, 16--->检查我军所有人的平均等级是否22级,确定是否卖出六种低级物品和六种中级物品
:004038C9 721F jb 004038EA
:004038CB 41 inc ecx
:004038CC 3C18 cmp al, 18--->检查我军所有人的平均等级是否24级,确定是否卖出三种低级物品和全部中级物品
:004038CE 721A jb 004038EA
:004038D0 41 inc ecx
:004038D1 3C1A cmp al, 1A--->检查我军所有人的平均等级是否26级,确定是否卖出全部中级物品
:004038D3 7215 jb 004038EA
:004038D5 41 inc ecx
:004038D6 3C28 cmp al, 28--->检查我军所有人的平均等级是否40级,确定是否卖出全部中级物品和三种高级物品
:004038D8 7210 jb 004038EA
:004038DA 41 inc ecx
:004038DB 3C2A cmp al, 2A--->检查我军所有人的平均等级是否42级,确定是否卖出六种中级物品和六种高级物品
:004038DD 720B jb 004038EA
:004038DF 41 inc ecx
:004038E0 3C2C cmp al, 2C--->检查我军所有人的平均等级是否44级,确定是否卖出三种中级物品和全部高级物品
:004038E2 7206 jb 004038EA
:004038E4 41 inc ecx
:004038E5 3C2E cmp al, 2E--->检查我军所有人的平均等级是否46级,确定是否卖出全部高级物品
:004038E7 7201 jb 004038EA
:004038E9 41 inc ecx
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004038C4(C), :004038C9(C), :004038CE(C), :004038D3(C), :004038D8(C)
|:004038DD(C), :004038E2(C), :004038E7(C)
|
:004038EA 8A811E394000 mov al, byte ptr [ecx+0040391E]--->根据ecx由0到8求出有多少种武器防具可卖。
:004038F0 2AD0 sub dl, al
:004038F2 7317 jnb 0040390B--->所求道具在exe列表之外,取data中的道具
:004038F4 02D0 add dl, al
:004038F6 8BC1 mov eax, ecx
:004038F8 2403 and al, 03--->初中高级同样处理
:004038FA 6BC00C imul eax, 0000000C--->道具列表偏移地址
:004038FD 8A841027394000 mov al, byte ptr [eax+edx+00403927]--->eax+00403927为道具列表首地址, edx为第几种道具
:00403904 C1E902 shr ecx, 02
:00403907 02C1 add al, cl--->道具升级
:00403909 EB09 jmp 00403914
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004038F2(C)
|
:0040390B 8B4DFC mov ecx, dword ptr [ebp-04]--->data中出售的道具
:0040390E 8D4C1108 lea ecx, dword ptr [ecx+edx+08]
:00403912 8B01 mov eax, dword ptr [ecx]
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403909(U)
|
:00403914 25FF000000 and eax, 000000FF
:00403919 E92CF30600 jmp 00472C4A
:0040391E 090C0C0C090C0C0C09--->道具数量
:00403927 000306090C0F122629000000--->只有同级道具的情况,最后三字节浪费
:00403933 00030607090A0C0F1226292A--->三种道具升级
:0040393F 000103070A0C0F101226272A--->六种道具升级
:0040394B 010304070A0C0D101213272A--->全部道具升级,保留最后升级的三种的对应低级道具出售
[[i] 本帖最后由 周瑜 于 2008-10-15 10:44 编辑 [/i]]
2008-10-16 09:12
godtype
哇哇哇,还是周大这个更强悍啊。
页:
[1]
Powered by Discuz! Archiver 5.0.0
© 2001-2006 Comsenz Inc.