首页 攻略 单机攻略 查看内容

《仙剑奇侠传4》修改原理解析

游侠会员:sunbeyond   <原创>

仙剑4数据存储原理和地址规律
不想看原理的可以直接看最下面。 首先,系统下程序可用的内存地址是00400000-7FFFFFFF
但这回仙4的大部分人物属性相关地址都保存在7F966880之后……而且到现在为止都是双字节,装备是4字节,所以最大值是65535,但在一些情况下最好别取这个值,后面再说。
仙4的人物属性数据分4块
战斗临时数据:仙4中战斗时所调用的地址,但是这个地址是会变的,地址范围也是很靠后,但应该在7F966880之前,这个等地卷解决。
人物基础数据
人物现有MAX数据(就是在人物属性界面所看到的,但精气神保存的是最大值)
人物现有数据(同上,但精气神保存的是现有值)
接下来重点说每个部分,这里按云天河的内存地址为例(这里数据采用了2次收录,数据有差异,但位置没变) 以下地址我试了2次,50%认为地址是不变的。 人物基础数据,人物最基础的几个属性,这里的属性是人物的原始值,就是没加装备前的。依我判断,这里的值加上装备的加成就生成了[人物现有MAX数据]中的攻击。修改这里最有效,但升级后是加成还是新算还待确认,但也可以直接锁定掉。前面还有一些数据,没仔细研究。
7F966880 00 00 00 00 AA 06 00 00 05 00 00 00 6D 00 00 00
----------------------精----------?-----------气
7F966890 F7 00 00 00 AF 00 00 00 CB 00 00 00 DC 00 00 00
----------功----------防----------速-----------运
由于这里的功是人物基础值,基础值+装备加成才会=真正的输出攻击力,所以推荐这里基础值不要设到65535,容易溢出。如果想最大攻击输出,那就FFFF减该人物拿着的武器攻击力的16位值,得出来的就可以添在这。
7F9668A0 99 00 00 00 CD CC 4C 3E AE 47 E1 3D 00 00 00 00
----------灵----------4字节为一组的数据,暂时还不知道是什么
7F9668B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
7F9668C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
7F9668D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
7F9668E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
7F9668F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
7F966900 00 00 00 00 00 00 00 00 00 00 00 13 00 00 00 00
-------------------------------------------待确认
7F966910 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
7F966920 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
7F966930 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
7F966940 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

人物现有MAX数据,这里的值都是按照人物基础值+装备加成后的值,所以大部分都是动态生成的,比如功,防,在这里修改是没用的,因为这里只是显示在游戏中人物状态里的结果,当进入新的战斗后,战斗中的攻击会重新计算,而不是直接调用这里值。
7F966950 00 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00
----------------------------------------------等级
7F966960 99 8E 00 00 00 00 00 00 00 00 00 00 00 00 00 00
----------总经验值
7F966970 00 00 00 00 00 00 80 3F 00 00 80 3F 00 00 80 3F
7F966980 00 00 80 3F 00 00 00 00 00 00 80 3F 00 00 80 3F
7F966990 00 00 80 3F 00 00 80 3F 00 00 80 3F 00 00 80 3F
7F9669A0 00 00 80 3F 00 00 00 00 00 00 00 00 00 00 00 00
这一大段可能是分割符的作用
7F9669B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
7F9669C0 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00
----------------------------------未知
7F9669D0 00 00 00 00 09 06 00 00 05 00 00 00 61 00 00 00
----------------------精MAX------?----------气MAX
7F9669E0 21 01 00 00 AF 00 00 00 B3 00 00 00 BF 00 00 00
----------攻值--------防值---------速值--------运值
7F9669F0 84 00 00 00 9A 99 99 3E CD CC CC 3D 00 00 00 00
----------灵值--------这4个字节是武器,后4个字节就不知道了,而且这个武器我觉得,可能只是调用位置,而不是武器代码。
比如CD CC 4C 3E铸云铁,9A 99 99 3E峰岭刃,但下面有个土属性戒指也是9A 99 99 3E。
7F966A00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
7F966A10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
7F966A20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
7F966A30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
----------------------------------水装备加成---火装备加成
这里是指环的装备地址,4字节,9A 99 99 3E是2个相同装备,9A 99 19 3E是1个,但到底还有什么规律呢?
7F966A40 00 00 00 00 00 00 00 00 9A 99 99 3E 00 00 00 00
----------雷装备加成---风装备加成---土装备加成--水属性值
各属性值就是5灵的值,双字节,之间间隔2个字节,但直接改这里仍然对战斗中无影响
7F966A50 00 00 00 00 00 00 00 00 00 00 00 00 1F 00 00 00
----------火属性值-----雷属性值----风属性值-----土属性值 
7F966A60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
7F966A70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
7F966A80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
7F966A90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

人物现有数据,是人物现有的状态,比如还剩多少血就在这里。也就是锁定这里的最大精就可以战斗结束后自动满精了。
7F966AA0 00 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00
----------------------------------------------现在等级
7F966AB0 99 8E 00 00 00 00 00 00 09 06 00 00 64 00 00 00
----------现有总经验---------------现有精------现有气
7F966AC0 52 00 00 00 00 00 80 3F 00 00 80 3F 00 00 80 3F
----------现有神

战斗临时数据,是随机产生的,但应该有个范围,我抓了2次,分别在6FB2CB94,78BD2FdC附近。数据的结构和人物现有MAX数据里的一样,可以参考。
如果你在战斗临时数据中修改了人物的攻击力,之后受到加攻击或减攻击等法书的影响,那这个值将会从人物基础数据处+装备加成+法术中得出,再赋值给战斗临时数据。而且战斗临时数据在结束战斗后就消失,下场开始时再动态生成一个新的地址范围,所以锁定无用。

所以,仙4的人物数值可以这么来理解:
人物基础数据+装备加成=人物现有MAX数据里显示的
人物现有数据<->战斗临时数据是互导的关系,也就是战斗结束后HP为1004,会保存在人物现有数据中的7F966AB8,然后再次进入战斗模式时,会把这个值赋回给战斗临时数据中的HP地址。那么战斗中的数值是赋值给动态地址的,所以还没办法战斗中进行锁定。
对于其他人物,他们之间的间隔为B14,也可以说一个人物的所有数据占用了B14,就是2836字节。
按照这个可以想到,如果你想建立一个已经离队的人物,你起码得自己建起2836字节的数据。
那么,其他人的地址分别如下,如果想要韩菱纱的攻击,只要云天河的攻击地址7F966890+B14=7F9673A4,就是韩菱纱的基础攻击地址。
韩菱纱 7F967394
柳梦璃 7F967EA8
慕容紫英 7F9689BC
现在还没确认的就是这个排列是否固定,我现在玩得人物少一个慕容紫英。

以下都为双字节,数值最大65535,但避免溢出,不推荐设成那么大的值。不用锁定,但暂时还不知道升级后是不是又重新算了。
7F966890 云天河的攻
7F966894 云天河的防
7F966898 云天河的速
7F96689C 云天河的运
7F9668A0 云天河的灵
7F9673A4 韩菱纱的攻
7F9673A8 韩菱纱的防
7F9673BC 韩菱纱的速
7F9673B0 韩菱纱的运
7F9673B4 韩菱纱的灵
7F967EB8 柳梦璃的攻
7F967EBC 柳梦璃的防
7F967EC0 柳梦璃的速
7F967EC4 柳梦璃的运
7F967EC8 柳梦璃的灵
7F9689CC 慕容紫英的攻
7F9689D0 慕容紫英的防
7F9689D4 慕容紫英的速
7F9689D8 慕容紫英的运
7F9689DC 慕容紫英的灵

还不肯定这个4个人物范围是固定排列还是剩谁就排在前面。

如果要真正能够锁定精,气,神,则需要找到战斗临时数据地址生成的规律,锁定了就可以。对了,如果HP锁定后被一击必杀打中(比如淮南王的夺魂)……不死亡(可以想到必杀的方程式不是,怪物攻击输出的值(显示用)=人物的剩余血量,状态=死亡(直接死亡);可能是怪物攻击输出的值=人物的剩余血量,人物的剩余血量=人物的剩余血量-怪物攻击输出的值,再 if 人物的剩余血量=0 then 状态=死亡)

地卷待解决的问题
1。对于64位系统而言,是否地址会随着变更?
2。在32位对于XP和VISTA的内存地址是否会变更?(可能性小)
3。战斗时的内存地址范围是多少,只见是否有个规律?
4。在7F966880修改的数值,人物升级后是在7F966880得值上修改加成还是被替换掉?
5。游戏的地址是不是固定的?