轩辕春秋文化论坛 » 曹操传MOD制作交流 » 瓦岗升级能力显示


2011-2-15 23:01 godtype
瓦岗升级能力显示

如题,不多说,直接上图。

[color=Silver][[i] 本帖最后由 godtype 于 2011-2-17 11:31 编辑 [/i]][/color]

2011-2-15 23:12 leo003
楼主又有超级研究出炉:hz1023:

2011-2-15 23:34 白云苍狗
从浮动成长刚导入游戏系统的时候我就建议岱岱搞个升级时的数值成长界面出来,可是一直没有时间做。
神型毅大人的这个很先进,可能的话,希望界面能更贴心一些,目前这样一滴一滴地显示太有个性了。:hz1026:

2011-2-16 00:10 墨叶
这个太好了。能否一次显示所有的成长。

2011-2-16 00:12 WHITESHIP
唔……同LS,一个版面能全部显示么?
就像毛利元就/炎龙骑士团那样。

会比较方便,如果能做到的话

2011-2-16 01:31 狂笑四海
想起了当年的毛利元就...   :hz1016:

2011-2-16 09:37 大官人
对于刷成长的筒子们来说是福音哈

2011-2-16 09:39 godtype
[quote]原帖由 [i]白云苍狗[/i] 于 2011-2-15 23:34 发表
从浮动成长刚导入游戏系统的时候我就建议岱岱搞个升级时的数值成长界面出来,可是一直没有时间做。
神型毅大人的这个很先进,可能的话,希望界面能更贴心一些,目前这样一滴一滴地显示太有个性了。:hz1026: [/quote]
我也想做一个好像火纹的界面,但是能力有限啊,要做一个好看的界面,恐怕只有你征用的那两位了。

当然在目前的能力范围里面我还有另一套方案,不过仍在设想中。
附上理论上的效果图。
[attach]106020[/attach]

[color=Silver][[i] 本帖最后由 godtype 于 2011-2-16 10:15 编辑 [/i]][/color]

2011-2-16 10:31 墨叶
回复 #8 godtype 的帖子

这个就很好了。

这样刷成长就舒服太多了。尤其是带了瓦面金装锏。

2011-2-16 12:03 godtype
最终效果出来了。

2011-2-16 12:29 stevenyhs
膜拜下毅大,真乃强人  的确是刷成长的福音啊

2011-2-16 12:46 godtype
第二套最终方案。
真正的最终方案了,再也想不到更好的。

2011-2-16 13:02 KYOKO
回复 #12 godtype 的帖子

如果稍微改进一下的话,攻击力换成攻击就行了,同士气还能对齐

2011-2-16 13:09 godtype
回复 #13 KYOKO 的帖子

这样吗?

2011-2-16 13:27 marrew
希望下次更新能够引入这套系统

2011-2-17 12:22 godtype
最终方案的代码

首先将7项能力的升级值另外保存起来:
[font=宋体]004074A2   . E8 69140D00    CALL 004D8910

004D8910   55               PUSH EBP
004D8911   8BEC             MOV EBP,ESP
004D8913   51               PUSH ECX
004D8914   FF75 0C          PUSH DWORD PTR SS:[EBP+C]
004D8917   FF75 08          PUSH DWORD PTR SS:[EBP+8]
004D891A   E8 F8E4F2FF      CALL 00406E17
004D891F   0FB655 08        MOVZX EDX,BYTE PTR SS:[EBP+8]
004D8923   8B45 0C          MOV EAX,DWORD PTR SS:[EBP+C]
004D8926   890495 50CA4800  MOV DWORD PTR DS:[EDX*4+48CA50],EAX
004D892D   8BE5             MOV ESP,EBP
004D892F   5D               POP EBP
004D8930   C2 0800          RETN 8[/font]
懒得找其他空的内存了,直接将48CA50开始的7*4个字节置零,每次有人升级的时候就会将7项能力的升级值存到这里。
PS:这里是原来教学的文字部分。

用武将说话来显示升级值:
[font=宋体]00407506   . 90             NOP
00407507   . 90             NOP
00407508   . 90             NOP
00407509   . 90             NOP
0040750A   . 90             NOP
0040750B   . 90             NOP
0040750C   . 90             NOP
0040750D   . 90             NOP
0040750E   . 90             NOP
0040750F   . 8B4D E8        MOV ECX,DWORD PTR SS:[EBP-18]
00407512   . E8 B9BF0200    CALL 004334D0
00407517   . 90             NOP
00407518   . 90             NOP
00407519   . 90             NOP
0040751A   . 90             NOP
0040751B   . 90             NOP
0040751C   . 90             NOP
0040751D   . 90             NOP
0040751E   . 90             NOP
0040751F   . 90             NOP
00407520   . 90             NOP
00407521   . 90             NOP
00407522   . 90             NOP
00407523   . 90             NOP
00407524   . 90             NOP

004334D0  /$ 55             PUSH EBP
004334D1  |. 8BEC           MOV EBP,ESP
004334D3  |. 81EC 04040000  SUB ESP,404
004334D9  |. 894D FC        MOV DWORD PTR SS:[EBP-4],ECX
004334DC  |. E8 EF30FDFF    CALL 004065D0
004334E1  |. 83C1 08        ADD ECX,8
004334E4  |. 50             PUSH EAX                                 ; /Arg4
004334E5  |. 51             PUSH ECX                                 ; |Arg3
004334E6  |. 68 50B14800    PUSH 0048B150                      ; |Arg2 = 0048B150
004334EB  |. 6A 02          PUSH 2                                   ; |Arg1 = 00000002
004334ED  |. E8 A7C1FFFF    CALL 0042F699                      ; \WaGan.0042F699
004334F2  |. 83C4 10        ADD ESP,10
[color=DarkOrange]上面这部分是显示“某某升为N级”,我将这段代码从原来位置调了过来。[/color]
004334F5  |. 8D8D FCFBFFFF  LEA ECX,DWORD PTR SS:[EBP-404]
004334FB  |. 51             PUSH ECX                                 ; /Arg1
004334FC  |. E8 AFFEFFFF    CALL 004333B0                      ; \WaGan.004333B0
[color=DarkOrange]另外再写一个函数用来文字显示的准备工作。[/color]
00433501  |. 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]
00433504  |. E8 F75FFDFF    CALL 00409500
00433509  |. 50             PUSH EAX                                 ; /Arg2
0043350A  |. 8D95 FCFBFFFF  LEA EDX,DWORD PTR SS:[EBP-404]           ; |
00433510  |. 52             PUSH EDX                                 ; |Arg1
00433511  |. B9 F05D4B00    MOV ECX,004B5DF0                   ; |
00433516  |. E8 42610200    CALL 0045965D                      ; \WaGan.0045965D
0043351B  |. 8BE5           MOV ESP,EBP
0043351D  |. 5D             POP EBP
0043351E  \. C3             RETN

文字显示的准备工作。(另外还需要在原教学的文字部分写上一些固定的格式,见附图。)
[attach]106031[/attach]
工作原理是先从固定格式中读取文字,并加上由能力值转化而成的能力显示数字,按照显示的顺序将所有文字存入一个临时地址中,即[EBP+8]所在的内存地址开始的一大段内存中,最后再从这一大段内存读取代码显示给玩家看。
004333B0  /$ 55             PUSH EBP
004333B1  |. 8BEC           MOV EBP,ESP
004333B3  |. 83EC 0C        SUB ESP,0C
004333B6  |. 33C0           XOR EAX,EAX
004333B8  |. 8945 FC        MOV DWORD PTR SS:[EBP-4],EAX
004333BB  |. EB 03          JMP SHORT 004333C0
004333BD  |> FF45 FC        /INC DWORD PTR SS:[EBP-4]
004333C0  |> 837D FC 07      CMP DWORD PTR SS:[EBP-4],7  [color=DarkOrange]因为有7项升级,所以需要循环7次。[/color]
004333C4  |. 0F8D 60000000  |JGE 0043342A
004333CA  |. 8B45 FC        |MOV EAX,DWORD PTR SS:[EBP-4]
004333CD  |. 6BC0 10        |IMUL EAX,EAX,10
004333D0  |. 05 70CA4800    |ADD EAX,0048CA70  [color=DarkOrange]每一个固定格式占用16个字节,加上起始地址48CA70就可以确定每个升级项的文字格式地址。[/color]
004333D5  |. 8945 F8        |MOV DWORD PTR SS:[EBP-8],EAX
004333D8  |> 8B4D F8        |/MOV ECX,DWORD PTR SS:[EBP-8]
004333DB  |. 33C0           ||XOR EAX,EAX
004333DD  |. 8A01           ||MOV AL,BYTE PTR DS:[ECX]  [color=DarkOrange]从文字固定格式中读取一个字节。[/color]
004333DF  |. 85C0           ||TEST EAX,EAX  [color=DarkOrange]判断这个字节是否为00,是就要跳出这次循环。[/color]
004333E1  |. 0F84 41000000  ||JE 00433428
004333E7  |. 83F8 30        ||CMP EAX,30
004333EA  |. 72 15          ||JB SHORT 00433401
004333EC  |. 83F8 36        ||CMP EAX,36  [color=DarkOrange]该字节不为00,就要判断是否30--36这7个数值。小于或大于这一段的数值就要跳过。[/color]
004333EF  |. 77 10          ||JA SHORT 00433401
004333F1  |. FF75 08        ||PUSH DWORD PTR SS:[EBP+8]              ; /Arg2
004333F4  |. FF75 FC        ||PUSH DWORD PTR SS:[EBP-4]              ; |Arg1
004333F7  |. E8 54000000    ||CALL 00433450                    ; \WaGan.00433450
[color=DarkOrange]另外再写一条函数,用来将上升/下降的能力值转化为文字显示,所以之前的30--36就是为了区分固定格式中的固定文字与随能力值变化的能力显示文字。[/color]
004333FC  |. 8945 08        ||MOV DWORD PTR SS:[EBP+8],EAX
004333FF  |. EB 1F          ||JMP SHORT 00433420
00433401  |> 3C FC          ||CMP AL,0FC
00433403  |. 75 16          ||JNZ SHORT 0043341B
00433405  |. 8079 FF A1     ||CMP BYTE PTR DS:[ECX-1],0A1
00433409  |. 75 10          ||JNZ SHORT 0043341B
[color=DarkOrange]这里又是一个特殊的显示,A1FC是向上箭头,A1FD是向下箭头,这里是判断出是否读取到箭头这里。[/color]
0043340B  |. 8B4D FC        ||MOV ECX,DWORD PTR SS:[EBP-4]
0043340E  |. 8B148D 50CA480>||MOV EDX,DWORD PTR DS:[ECX*4+48CA50]
00433415  |. 83FA 00        ||CMP EDX,0
00433418  |. 7D 01          ||JGE SHORT 0043341B
0043341A  |. 40             ||INC EAX
[color=DarkOrange]这里是判断升级的能力值是否为负数,即HP和MP独有的下降情况,如果是负数,就将前面的FC加1就变成FD,也就是变成向下箭头了。[/color]
0043341B  |> 8B55 08        ||MOV EDX,DWORD PTR SS:[EBP+8]
0043341E  |. 8802           ||MOV BYTE PTR DS:[EDX],AL
00433420  |> FF45 F8        ||INC DWORD PTR SS:[EBP-8]
00433423  |. FF45 08        ||INC DWORD PTR SS:[EBP+8]
00433426  |.^EB B0          |\JMP SHORT 004333D8
00433428  |>^EB 93          \JMP SHORT 004333BD
[color=DarkOrange]然后就是将从固定格式中读取出来的字符存入临时内存中,然后临时内存地址和固定格式地址均加一后跳回前面继续循环。[/color]
0043342A  |> 8B45 08        MOV EAX,DWORD PTR SS:[EBP+8]
0043342D  |. C600 00        MOV BYTE PTR DS:[EAX],0
最后所有循环都完成后,将最后一个字节置为00,表示完全结束。
00433430  |. 8BE5           MOV ESP,EBP
00433432  |. 5D             POP EBP
00433433  \. C2 0400        RETN 4

数值转化为文字字符函数:
00433450  /$ 55             PUSH EBP
00433451  |. 8BEC           MOV EBP,ESP
00433453  |. 8B4D 08        MOV ECX,DWORD PTR SS:[EBP+8]
00433456  |. 8B048D 50CA480>MOV EAX,DWORD PTR DS:[ECX*4+48CA50]  [color=DarkOrange]读取升降数值。[/color]
0043345D  |. 50             PUSH EAX
0043345E  |. 83F8 00        CMP EAX,0  [color=DarkOrange]判断是否为负数[/color]
00433461  |. 7D 05          JGE SHORT 00433468
00433463  |. F7D8           NEG EAX  [color=DarkOrange]负数要取反变回正数[/color]
00433465  |. 8945 FC        MOV DWORD PTR SS:[EBP-4],EAX
00433468  |> 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
0043346B  |. 33D2           XOR EDX,EDX
0043346D  |. B9 0A000000    MOV ECX,0A  [color=DarkOrange]除以10(如果等级过大会产生MP减少超过10点的,慎重起见还是加上这一段)[/color]
00433472  |. F7F1           DIV ECX
00433474  |. 85C0           TEST EAX,EAX  [color=DarkOrange]除10后,EAX的值相当于十位数,EDX的值相当于个位数,这里就判断升降数值是否超过10。[/color]
00433476  |. 74 0B          JE SHORT 00433483
00433478  |. 8B4D 0C        MOV ECX,DWORD PTR SS:[EBP+C]
0043347B  |. 83C0 30        ADD EAX,30
0043347E  |. 8801           MOV BYTE PTR DS:[ECX],AL
00433480  |. FF45 0C        INC DWORD PTR SS:[EBP+C]
00433483  |> 8B4D 0C        MOV ECX,DWORD PTR SS:[EBP+C]
00433486  |. 83C2 30        ADD EDX,30
00433489  |. 8811           MOV BYTE PTR DS:[ECX],DL
[color=DarkOrange]然后十位和个位数值各加上30后保存到临时内存中。[/color]
0043348B  |. 8B45 0C        MOV EAX,DWORD PTR SS:[EBP+C]
0043348E  |. 8BE5           MOV ESP,EBP
00433490  |. 5D             POP EBP
00433491  \. C2 0800        RETN 8[/font]

这样就完成了。

2011-2-17 12:44 drinksun
:hz1020:忍不住刷版了,真是好东西!

2011-2-17 12:55 godtype
等着楼上的剩余四虎。

2011-2-17 17:27 希布
俺也过来膜拜一下:hz1009:

2011-2-17 20:35 wndrnrvhfja
回复 #16 godtype 的帖子



[color=Silver][[i] 本帖最后由 wndrnrvhfja 于 2011-2-19 09:30 编辑 [/i]][/color]

2011-2-18 04:04 狂笑四海
这个代码被研发出来真是不错。

2011-2-18 15:39 wndrnrvhfja
回复 #18 godtype 的帖子



[color=Silver][[i] 本帖最后由 wndrnrvhfja 于 2011-2-19 09:30 编辑 [/i]][/color]

2011-2-20 08:01 墨叶
请问什么时候能加入到瓦岗传中。

2011-2-20 09:00 feiyingsike
膜拜啊,再也不用开着记事本刷能力了:hz1018:

2011-2-20 10:35 js2223
[quote]原帖由 [i]drinksun[/i] 于 2011-2-17 12:44 发表
:hz1020:忍不住刷版了,真是好东西! [/quote]
终于看见形象喝出现了。

2011-2-21 17:46 513633522
好东西啊……就是看不下去了,最近看代码看的快神经了:hz1008:

页: [1]
查看完整版本: 瓦岗升级能力显示


Powered by Discuz! Archiver 5.0.0  © 2001-2006 Comsenz Inc.