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

更新时间:2022-03-30 09:10:22作者:佚名

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

会员:sunbeyond<原创>

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

人物现有MAX数据,这里的值都是按照人物基础值+装备加成后的值,所以大部分都是动态生成的,比如功,防,在这里修改是没用的,因为这里只是显示在游戏中人物状态里的结果,当进入新的战斗后,战斗中的攻击会重新计算,而不是直接调用这里值。
7F96695000000000000000000000000014000000
----------------------------------------------等级
7F966960998E0000000000000000000000000000
----------总经验值
7F966970000000000000803F0000803F0000803F
7F9669800000803F000000000000803F0000803F
7F9669900000803F0000803F0000803F0000803F
7F9669A00000803F000000000000000000000000
这一大段可能是分割符的作用
7F9669B000000000000000000000000000000000
7F9669C000000000000000000001000000000000
----------------------------------未知
7F9669D000000000090600000500000061000000
----------------------精MAX------?----------气MAX
7F9669E021010000AF000000B3000000BF000000
----------攻值--------防值---------速值--------运值
7F9669F0840000009A99993ECDCCCC3D00000000
----------灵值--------这4个字节是武器,后4个字节就不知道了,而且这个武器我觉得,可能只是调用位置,而不是武器代码。
比如CDCC4C3E铸云铁,9A99993E峰岭刃,但下面有个土属性戒指也是9A99993E。
7F966A0000000000000000000000000000000000
7F966A1000000000000000000000000000000000
7F966A2000000000000000000000000000000000
7F966A3000000000000000000000000000000000
----------------------------------水装备加成---火装备加成
这里是指环的装备地址,4字节,9A99993E是2个相同装备,9A99193E是1个,但到底还有什么规律呢?
7F966A4000000000000000009A99993E00000000
----------雷装备加成---风装备加成---土装备加成--水属性值
各属性值就是5灵的值,双字节,之间间隔2个字节,但直接改这里仍然对战斗中无影响
7F966A500000000000000000000000001F000000
----------火属性值-----雷属性值----风属性值-----土属性值
7F966A6000000000000000000000000000000000
7F966A7000000000000000000000000000000000
7F966A8000000000000000000000000000000000
7F966A9000000000000000000000000000000000

人物现有数据,是人物现有的状态,比如还剩多少血就在这里。也就是锁定这里的最大精就可以战斗结束后自动满精了。
7F966AA000000000000000000000000014000000
----------------------------------------------现在等级
7F966AB0998E0000000000000906000064000000
----------现有总经验---------------现有精------现有气
7F966AC0520000000000803F0000803F0000803F
----------现有神

战斗临时数据,是随机产生的,但应该有个范围,我抓了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人物的剩余血量=0then状态=死亡)

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