轩辕春秋文化论坛 » 曹操传MOD制作交流 » 人物信息扩充纪要


2012-2-21 16:57 砖家叫兽
人物信息扩充纪要

Data编号*0x48,加上D60000就能得到对应的Data位置武将信息
00~01  表示武将代码                   00 10 第二个是01 10
02~03        R剧本形象代号
04~05        武将头象地址
06~07
08~0F   武将姓名(8字节,4个中文)
10      保留给武将姓名的结束符
11~12   攻击力
13~14   防御力
15~16   精神力
17~18   爆发力
19~1a   士气
1b
1C~1F   HP
20        MP
21      武
22      统
23      精
24      爆
25      士
26      致命一击台词类型
27      出阵场数
28
29      撤退场数
2a      是否我军     00是我军,FF不是我军
2b      兵种代码
2C      人物等级
2d      经验值
2e      武器
2f      等级
30      经验
31      防具
32      防具等级
33      防具经验
34      辅助
35      FF
36      FF
37~48   R剧本点击该人物是显示的名字


STAR引擎 ALLOC 大小是20000   修改一处 12000 变成1C000   即 腾出来  每个人物 0x70大小

00~01  表示武将代码                   00 10 第二个是01 10     
这个可以有6万5 的人物  暂时足够不需要扩充

02~03        R剧本形象代号
文件还没有这么大 双字节完全足够

04~05        武将头象地址
头像编号 6万5  最多也没有这么多头像,够用

06~07

08~15   武将姓名(7个中文)
16 17     保留给武将姓名的结束符 00 00

18   攻击力
1C   防御力
20   精神力
24   爆发力
28   士气
五围变四字节 死活都够用了吧

2C        HP
30        MP
34        SP
四字节  MP上限总不是问题了吧 双字节SP 哈哈

36      武
38      统
3A      精
3C      爆
3E      士

这个都扩双字节了

40    致命一击台词类型
42    出阵场数
44    撤退场数
46    兵种代码
48    是否我军     00是我军,FF不是我军
4A      人物等级

全部双字节

4C      经验值
四字节经验    那就可以 第一级100 二级 150  到99级是……

50      武器
52     等级
54      经验
56      防具
58      防具等级
5A      防具经验
5C      辅助
5E      FF
60      FF
62-6F  R剧本点击该人物是显示的名字 显示7个汉字
70      0

[color=Silver][[i] 本帖最后由 砖家叫兽 于 2012-2-21 17:10 编辑 [/i]][/color]

2012-2-21 17:12 砖家叫兽
STAR引擎有一点好  所有人物地址计算都变成了 CALL

所以 只要修改 DATA导入  以及取出的偏移就可以

2012-2-21 17:54 star175
回复 #2 砖家叫兽 的帖子

五围2字节足够了,省下2字节可以用来存放功勋

5.8引擎已经把R形象放到exe里去了,所以这2个字节可以用来做其他的

还有就是SP,其实当初设计SP时就犯了一个大错误,当是设计每人的sp max都是255,所以没有单独保存这个数据,但是错就错在把SPcur和data挂钩了,结果白费了1024字节来存放SPcur,事实上,SPcur应该和战场编号挂钩才是正确的

2012-2-21 17:57 砖家叫兽
[quote]原帖由 [i]star175[/i] 于 2012-2-21 17:54 发表
五围2字节足够了,省下2字节可以用来存放功勋

5.8引擎已经把R形象放到exe里去了,所以这2个字节可以用来做其他的

还有就是SP,其实当初设计SP时就犯了一个大错误,当是设计每人的sp max都是255,所以没有单独保 ... [/quote]


也不是这么说


SP 完全可以开启一种模式   就是 从头至尾可以积累  可以积累到下一关

同样 可以把 HPcurrent MPcurrent保存留到下一关  这样 连打三关的英杰模式  可以再次重现

四字节的情况属于太过于保守估计 还有就是为了格式美观

ALLOC 大小是20000   而实际上 +14000  的样子数据都是00 00 所以 完全可以把 +12000改 +1E000  ,就相当于每个人是0x78字节


另外 关于存档的修改

我就是直接 把每个人 的0X48  (修改后的按实际值算)的信息全部按顺序保存到存档

读档也是按顺序 全部取出来

这样的话 ,除了要重新开始存档以外,姓名可以保存下来

至少存档这里不用考虑地址对应的问题

DATA中长度明显不够的 所以引擎里头实际上读取了 武力以后 复制了一份给攻击力 那个偏移改一改就可以了

[color=Silver][[i] 本帖最后由 砖家叫兽 于 2012-2-21 18:03 编辑 [/i]][/color]

2012-2-21 18:05 砖家叫兽
00408C07  /$  55            PUSH EBP                                 ;  读取DATA人物信息
00408C08  |.  8BEC          MOV EBP,ESP
00408C0A  |.  56            PUSH ESI
00408C0B  |.  8BF1          MOV ESI,ECX
00408C0D  |.  57            PUSH EDI
00408C0E  |.  8B7D 0C       MOV EDI,DWORD PTR SS:[EBP+C]
00408C11  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]
00408C14  |.  80CC 10       OR AH,10
00408C17  |.  66:8906       MOV WORD PTR DS:[ESI],AX
00408C1A  |.  8BCE          MOV ECX,ESI
00408C1C  |.  83C1 08       ADD ECX,8
00408C1F  |.  51            PUSH ECX
00408C20  |.  6A 09         PUSH 9
00408C22  |.  6A 00         PUSH 0
00408C24  |.  6A 00         PUSH 0
00408C26  |.  E8 05B10C00   CALL Ekd5.004D3D30
00408C2B  |.  8BD7          MOV EDX,EDI
00408C2D  |.  8BCE          MOV ECX,ESI
00408C2F  |.  83C1 08       ADD ECX,8
00408C32  |.  52            PUSH EDX
00408C33  |.  51            PUSH ECX
00408C34  |.  6A 00         PUSH 0
00408C36  |.  E8 25AB0C00   CALL Ekd5.004D3760
00408C3B  |.  C646 10 00    MOV BYTE PTR DS:[ESI+10],0
00408C3F  |.  8BCE          MOV ECX,ESI
00408C41  |.  E8 56E90200   CALL Ekd5.0043759C
00408C46  |.  83C7 0D       ADD EDI,0D
00408C49  |.  0FB70F        MOVZX ECX,WORD PTR DS:[EDI]
00408C4C  |.  83C7 02       ADD EDI,2
00408C4F  |.  837D 10 00    CMP DWORD PTR SS:[EBP+10],0
00408C53  |.  75 08         JNZ SHORT Ekd5.00408C5D
00408C55  |.  894E 04       MOV DWORD PTR DS:[ESI+4],ECX
00408C58  |.  8A07          MOV AL,BYTE PTR DS:[EDI]
00408C5A  |.  8846 02       MOV BYTE PTR DS:[ESI+2],AL
去掉MOV  只从DATA取数据 不存   那么R形象的地址还是可以用原来位置    只是DATA指定无效
00408C5D  |>  47            INC EDI
00408C5E  |.  8A07          MOV AL,BYTE PTR DS:[EDI]
00408C60  |.  8846 26       MOV BYTE PTR DS:[ESI+26],AL
00408C63  |.  47            INC EDI
00408C64  |.  8A07          MOV AL,BYTE PTR DS:[EDI]
00408C66  |.  8846 2A       MOV BYTE PTR DS:[ESI+2A],AL
00408C69  |.  47            INC EDI
00408C6A  |.  33D2          XOR EDX,EDX
00408C6C  |>  83FA 05       /CMP EDX,5
00408C6F  |.  73 15         |JNB SHORT Ekd5.00408C86
00408C71  |.  0FB607        |MOVZX EAX,BYTE PTR DS:[EDI]
00408C74  |.  884432 21     |MOV BYTE PTR DS:[EDX+ESI+21],AL
00408C78  |.  6BC0 03       |IMUL EAX,EAX,3
00408C7B  |.  D1E8          |SHR EAX,1
00408C7D  |.  66:894456 11  |MOV WORD PTR DS:[ESI+EDX*2+11],AX
00408C82  |.  47            |INC EDI
00408C83  |.  42            |INC EDX
00408C84  |.^ EB E6         \JMP SHORT Ekd5.00408C6C
00408C86  |>  0FB707        MOVZX EAX,WORD PTR DS:[EDI]
00408C89  |.  8A4F 02       MOV CL,BYTE PTR DS:[EDI+2]
00408C8C  |.  8946 1C       MOV DWORD PTR DS:[ESI+1C],EAX
00408C8F  |.  884E 20       MOV BYTE PTR DS:[ESI+20],CL
00408C92  |.  83C7 03       ADD EDI,3
00408C95  |.  33D2          XOR EDX,EDX
00408C97  |>  83FA 05       /CMP EDX,5
00408C9A  |.  73 0A         |JNB SHORT Ekd5.00408CA6
00408C9C  |.  8A07          |MOV AL,BYTE PTR DS:[EDI]
00408C9E  |.  884432 2B     |MOV BYTE PTR DS:[EDX+ESI+2B],AL
00408CA2  |.  47            |INC EDI
00408CA3  |.  42            |INC EDX
00408CA4  |.^ EB F1         \JMP SHORT Ekd5.00408C97
00408CA6  |>  33D2          XOR EDX,EDX
00408CA8  |.  EB 01         JMP SHORT Ekd5.00408CAB
00408CAA  |>  42            /INC EDX
00408CAB  |>  83FA 01        CMP EDX,1
00408CAE  |.  7F 23         |JG SHORT Ekd5.00408CD3
00408CB0  |.  8BCA          |MOV ECX,EDX
00408CB2  |.  6BC9 03       |IMUL ECX,ECX,3
00408CB5  |.  0FB607        |MOVZX EAX,BYTE PTR DS:[EDI]
00408CB8  |.  884431 2E     |MOV BYTE PTR DS:[ECX+ESI+2E],AL
00408CBC  |.  2D FF000000   |SUB EAX,0FF
00408CC1  |.  F7D8          |NEG EAX
00408CC3  |.  1BC0          |SBB EAX,EAX
00408CC5  |.  8AE0          |MOV AH,AL
00408CC7  |.  24 02         |AND AL,2
00408CC9  |.  80E4 01       |AND AH,1
00408CCC  |.  66:894431 2F  |MOV WORD PTR DS:[ECX+ESI+2F],AX
00408CD1  |.^ EB D7         \JMP SHORT Ekd5.00408CAA
00408CD3  |>  8A07          MOV AL,BYTE PTR DS:[EDI]
00408CD5  |.  8846 34       MOV BYTE PTR DS:[ESI+34],AL
00408CD8  |.  C646 35 FF    MOV BYTE PTR DS:[ESI+35],0FF
00408CDC  |.  C646 36 FF    MOV BYTE PTR DS:[ESI+36],0FF
00408CE0  |.  807E 2C 00    CMP BYTE PTR DS:[ESI+2C],0
00408CE4  |.  75 03         JNZ SHORT Ekd5.00408CE9
00408CE6  |.  FE46 2C       INC BYTE PTR DS:[ESI+2C]
00408CE9  |>  47            INC EDI
00408CEA  |.  8BC7          MOV EAX,EDI
00408CEC  |.  5F            POP EDI
00408CED  |.  5E            POP ESI
00408CEE  |.  8BE5          MOV ESP,EBP
00408CF0  |.  5D            POP EBP
00408CF1  \.  C2 0C00       RETN 0C

像我已经把攻击力的初始值改到了1.5倍武力


00408F2E  /$  55            PUSH EBP                                 ;  存档
00408F2F  |.  8BEC          MOV EBP,ESP
00408F31  |.  51            PUSH ECX
00408F32  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]
00408F35  |.  53            PUSH EBX
00408F36  |.  33DB          XOR EBX,EBX
00408F38  |>  83FB 48       /CMP EBX,48
00408F3B  |.  73 09         |JNB SHORT Ekd5.00408F46
00408F3D  |.  8A11          |MOV DL,BYTE PTR DS:[ECX]
00408F3F  |.  8810          |MOV BYTE PTR DS:[EAX],DL
00408F41  |.  40            |INC EAX
00408F42  |.  41            |INC ECX
00408F43  |.  43            |INC EBX
00408F44  |.^ EB F2         \JMP SHORT Ekd5.00408F38
00408F46  |>  5B            POP EBX
00408F47  |.  8BE5          MOV ESP,EBP
00408F49  |.  5D            POP EBP
00408F4A  \.  C2 0400       RETN 4

存档也是 全部信息保存

00409018  /$  55            PUSH EBP                                 ;  读档
00409019  |.  8BEC          MOV EBP,ESP
0040901B  |.  51            PUSH ECX
0040901C  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]
0040901F  |.  53            PUSH EBX
00409020  |.  33DB          XOR EBX,EBX
00409022  |>  83FB 48       /CMP EBX,48
00409025  |.  73 09         |JNB SHORT Ekd5.00409030
00409027  |.  8A10          |MOV DL,BYTE PTR DS:[EAX]
00409029  |.  8811          |MOV BYTE PTR DS:[ECX],DL
0040902B  |.  40            |INC EAX
0040902C  |.  41            |INC ECX
0040902D  |.  43            |INC EBX
0040902E  |.^ EB F2         \JMP SHORT Ekd5.00409022
00409030  |>  5B            POP EBX
00409031  |.  8BE5          MOV ESP,EBP
00409033  |.  5D            POP EBP
00409034  \.  C2 0400       RETN 4

[color=Silver][[i] 本帖最后由 砖家叫兽 于 2012-2-21 18:12 编辑 [/i]][/color]

2012-2-21 18:10 砖家叫兽
最常见的那些 HP 攻击力  姓名 等 都可以直接搜索相应的偏量
比方搜索1C  找到【XX+1C】 判断是否血量

而R形象的话 其实完全可以靠剧本指令,每个R中出场人物 第一次出场加一条R形象指定   现在问题是在DATA编辑器不能输入双字节  要么修改DATA编辑器  要么就用剧本指定 从DATA复制信息时可以  只取 不存


应该对于制作者来讲 用编辑器在引擎中指定R形象应该比 剧本中指定复杂一些吧

超过255的不需要DATA,那么完全可以在导入时判断一次  是否 FF  不是的话 继续从DATA取值   是则靠剧本指定


[color=Indigo]
如果扩充需要对DATA进行大手术,首先需要设置一下新的DATA文件格式,是用字符 还是用数值(字符转换数值这个我已经导入了若干TXT文件)使用TXT格式 还是用XLS 的EXCEL格式   文件信息就是个编码与解码的过程,用UE来研究文件中信息的格式很有效

[/color]

我一直以来尝试着另外一条路,就是脱离编号。

首先是剧本和地图,采用汉字命名的文件,依靠剧本来衔接。

其实这条路如果走下去的话,完全可以无视编号,而唯一的限制 [color=Red]是硬盘的大小[/color]。

[color=Silver][[i] 本帖最后由 砖家叫兽 于 2012-2-21 18:27 编辑 [/i]][/color]

页: [1]
查看完整版本: 人物信息扩充纪要


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