sakuya452 发表于 2013-10-15 17:04:33

[休闲娱乐]格挡降防的修复

本帖最后由 sakuya452 于 2013-12-31 21:07 编辑

所有该类脚本所用空间集中到一起,如有问题就名正言顺的使用全局Z变量占用的空间好了。一个全局Z变量占用512字节,平时很少用到那么多,拿来实现一个或几个棘手的问题是非常安全划算的:D


程序在被攻击单位触发格挡时总是添加一个防御标志给它(无论该单位是否有防御标志),以显示单位防御的动画,但是之后却没有把这个标志还原,这就造成了,新回合开始时,该格挡单位被当作防御单位处理,并扣掉防御时获得的防御奖励数值。只要该单位没有防御过,其防御奖励数值的地址中的数值是0,被扣掉0,防御还是不变的

问题就在于,该单位之前有防御过一次,无论何时,又没有退出整个WOG,那么该单位中防御奖励数值地址中的值就是上次防御过的值,在这种情况下,之后的行动不是防御,又触发格挡的话,到新回合开始时就会发生防御减少了上次防御奖励数值的情况。

按照这个思路,试写了一段脚本,在单位没有进行防御动作的回合,就会将其地址中防御奖励数值清0,以阻止这种减防现象

修正了下代码,地址没错,但是考虑不够全面......另外测试了FU77006和FU77007的调用顺序,感觉不够严谨,在单位动作后的这个时点,FU77007居然比FU77006先被调用,根据FU77006使用的情况,很可能造成FU77007无法获取到想要的堆栈地址......然后关键命令得不到执行,仍然会出现减防的情况。FU77007获取地址的时点太不方便了,也不知道有没有其他办法获取堆栈地址。

所以我又试着找了下堆栈物理地址,得到00699420(十六进制)这个地址中存放着堆栈地址序列的一个参照地址,参照地址+575C(十六进制)再-290(十六进制)就是0号堆栈的物理地址,而1号地址为0号地址+548(十六进制)的数值,往后类推直到41;21号地址为0号地址+6EE8(十六进制,十六进制表达式6EE8=548*15)的物理地址。这个应该无误

方法1:每次单位行动前,记录单位行动命令,如果是非防御,则在其受伤害时,将防御奖励数值清零。缺点是,治标不治本,好处是兼容性比方法2好一点
ZVSE

!?BF&1000;
!!DO41000/0/41/1:P;

!?BR&1000/v997>0;
!!DO41000/0/41/1:P;

!?FU41000;
!!SN:W^Stack.%X16.Action^/-1;

!?BG0&1000;
!!BG:N?y90 A?y1;
!!SN:W^Stack.%Y90.Action^/y1;

**更换参数的设置方法
!?MF1&1000;
!!MF:N?y90;
!!SN:W^Stack.%Y90.Action^/?y2;
!!if&y2>-1/y2<>3:;
!!BMy90:G209/0/d;
!!en:;
!!SN&y2>-1:W^Stack.%Y90.Action^/-1;

方法2:在格挡出现时,阻止添加防御标志。疏忽了,检查时发现个错误,逻辑考虑得不够严谨造成的,现已更正
ZVSE

!?BF&1000;
!!UN:C7456398/4/680075753;
!!UN:C7456402/2/36864;

!!UN:C4621928/4/1405679081;
!!UN:C4621932/2/36864;

!!UN:C10112948/4/4169239376;                   [格挡时,删除程序添加防御标志,改为记录这次格挡事件
!!UN:C10112952/4/2197815296;
!!UN:C10112956/4/62649;
!!UN:C10112960/4/2215575552;
!!UN:C10112964/4/3;
!!UN:C10112968/4/3323314307;
!!UN:C10112972/4/2588882560;
!!UN:C10112976/4/3914858752;
!!UN:C10112980/4/4292310716;                   ]

!!UN:C10112866/4/8491147;                      [每次受伤检查堆栈号+009A4F36的地址中是否有值,有的话再检查防御标志,若无防御标志,则
!!UN:C10112870/4/96862208;                     让程序显示防御动画
!!UN:C10112874/4/4621945;
!!UN:C10112878/4/2559267587;
!!UN:C10112882/4/245;
!!UN:C10112886/4/15841411;
!!UN:C10112890/4/1946157056;
!!UN:C10112894/4/365134595;
!!UN:C10112898/4/1328987008;
!!UN:C10112902/4/1946157210;
!!UN:C10112906/4/12777238;
!!UN:C10112910/4/1963458560;
!!UN:C10112914/4/2030421511;
!!UN:C10112918/4/67126918;
!!UN:C10112922/4/1328972742;
!!UN:C10112926/4/1526726810;
!!UN:C10112930/4/2889271273;
!!UN:C10112934/2/37119;                        ]

!!DO43009/0/41/1:P;

!?BA53&1000;
!!UN:C7456398/4/51841;
!!UN:C7456402/2/2048;

!!UN:C4621928/4/8491147;
!!UN:C4621932/2/0;

!!UN:C10112948/4/0;
!!UN:C10112952/4/0;
!!UN:C10112956/4/0;
!!UN:C10112960/4/0;
!!UN:C10112964/4/0;
!!UN:C10112968/4/0;
!!UN:C10112972/4/0;
!!UN:C10112976/4/0;
!!UN:C10112980/4/0;

!!UN:C10112866/4/0;
!!UN:C10112870/4/0;
!!UN:C10112874/4/0;
!!UN:C10112878/4/0;
!!UN:C10112882/4/0;
!!UN:C10112886/4/0;
!!UN:C10112890/4/0;
!!UN:C10112894/4/0;
!!UN:C10112898/4/0;
!!UN:C10112902/4/0;
!!UN:C10112906/4/0;
!!UN:C10112910/4/0;
!!UN:C10112914/4/0;
!!UN:C10112918/4/0;
!!UN:C10112922/4/0;
!!UN:C10112926/4/0;
!!UN:C10112930/4/0;
!!UN:C10112934/2/0;

!!UN:C4621945/1/3;

!!DO43009/0/41/1:P;

!?FU43009;
!!VRy1:Sx16+10112822;
!!UN:Cy1/1/0;

贤知有您 发表于 2013-10-15 20:16:47

有人验证一下吗?
我记得JimV还是谁也写过修复的语句,印象中没用内存修改的。
楼主莫非是传说中的高手 。话说这样写有没副作用?

sakuya452 发表于 2013-10-15 20:22:04

本帖最后由 sakuya452 于 2013-10-15 21:04 编辑

自测没出现问题,更复杂的情况我也不知道怎么测试啊,不WOG化地图,给英雄带上龙巫妖,仅加上这脚本,去挨打就行了
一般防御奖励数值只是用来防御后还原防御力的,其他时候不用,副作用嘛,也许算没有吧。但要是别人的脚本里在单位防御以外的行动中使用了这个地址的值,也许就会出现问题。这种脚本冲突都算家常便饭了

当然也可以去掉强制加防御标志的那条命令,但是出现格挡时,播放的是单位非防御状态下受到伤害时的动画,有点不协调了

更好的当然是修改程序逻辑了;bf;不过本人还在学习,算不上高手,更看不懂逻辑;bf;

贤知有您 发表于 2013-10-15 22:28:12

还请教楼主堆栈地址+1244 ,这个1244数据是哪里出来的?
我关心的是,有没有完整的关于各个堆栈内存参数的地址。

神奇的卡片 发表于 2013-10-15 22:58:57

本帖最后由 神奇的卡片 于 2013-10-15 23:01 编辑

贤知有您 发表于 2013-10-15 22:28
还请教楼主堆栈地址+1244 ,这个1244数据是哪里出来的?
我关心的是,有没有完整的关于各个堆栈内存参数的 ...
刚我用龙巫妖测试过了几遍,原来的版本是有这个bug,不防御时被攻击,出现格挡效果时要减格挡者的防御,并且一直减少,(PS:不过有几次又不会减)
防御时,被攻击出现格挡,不减格挡者的防御。

加载了楼主这个脚本后时能有效的解决这个问题,
不过不知道有什么后遗症。(PS:可能没有。)



sakuya452 发表于 2013-10-15 23:22:23

本帖最后由 sakuya452 于 2013-10-15 23:33 编辑

贤知有您 发表于 2013-10-15 22:28
还请教楼主堆栈地址+1244 ,这个1244数据是哪里出来的?
我关心的是,有没有完整的关于各个堆栈内存参数的 ...
一般来说,不是写这个游戏的程序员,都不可能知道其游戏中内存地址代表的意义的

但是可以通过游戏修改,分析数值变化和地址中的值变化来分析其意义,有些还要懂一定的汇编知识

知道了其地址代表的意义,它的参数(也就是存储的值)的意义只要对照游戏变动相应的项,也可以分析得出,比如某些存储标志能力的地址,那么有可能是1表示有这个能力,0表示没有这个能力,也可能是1表示开,0表示关等等

简而言之,我是用CE这个内存修改工具找到地址的,看汇编代码时,追踪到这个地址的,查看/分析代码后看到+4DC(也就是十进制的1244)的偏移量,并得知这个堆栈结构开始地址偏移4DC后的地址,表示在这个堆栈中生物的防御后获得的奖励。

如果有其他方法能得到或弄清楚各个内存地址的意义和值意义,请恕我无知吧,我也正在学

sakuya452 发表于 2013-10-15 23:24:55

神奇的卡片 发表于 2013-10-15 22:58
刚我用龙巫妖测试过了几遍,原来的版本是有这个bug,不防御时被攻击,出现格挡效果时要减格挡者的防御, ...

要在程序自动去掉防御标志的时候才会减,所以一般就是在新回合开始时减

yearn1025 发表于 2013-10-15 23:53:28

楼主强力党╮(╯▽╰)╭谢谢分享了

贤知有您 发表于 2013-10-16 08:49:17

sakuya452 发表于 2013-10-15 23:22
一般来说,不是写这个游戏的程序员,都不可能知道其游戏中内存地址代表的意义的

但是可以通过游戏修改 ...

看来又找到了汇编高手.
我也是用CE研究过内存地址.但我对汇编不熟.
所以感觉找地址很烦躁,我都没心思.

不过我心中有一个想法,一直想找到一个内存地址,但之前的"梦魇"朋友也没帮我找出来.(也许没空)
关于这个地址,是决定堆栈攻击次数的.
比如堆栈带有双击FLAG,堆栈主动攻击时,等别人反击完成后(也许无法反击),继续再攻击一次.
另外WOG有个增加肉搏攻击的宝物"野蛮人之斧",能再攻击多一次.
所以我认为应该有这么一个堆栈内存参数,它能决定每次攻击回合的攻击次数.
不知道楼主认为是否有这样一个地址?又是否可以分析出来呢?

如果能找到这个的话,一回合内连续多次攻击就也许成为现实了.我一直都想着.

dadds 发表于 2013-10-16 10:05:52

LZ大才啊,研究游戏内存地址真心需要毅力:good_job:

sakuya452 发表于 2013-10-16 10:08:32

贤知有您 发表于 2013-10-16 08:49
看来又找到了汇编高手.
我也是用CE研究过内存地址.但我对汇编不熟.
所以感觉找地址很烦躁,我都没心思.
...

;bf;不瞒你,其实我也想找出这个连击数的地址,或者其相关指令,但一直不知道从什么地方下手。不过最近有了点新想法,会再试试,不一定有结果

贤知有您 发表于 2013-10-16 10:45:07

本帖最后由 贤知有您 于 2013-10-16 10:46 编辑

sakuya452 发表于 2013-10-16 10:08
不瞒你,其实我也想找出这个连击数的地址,或者其相关指令,但一直不知道从什么地方下手。不过最近有 ...

太好了,有楼主这等 汇编和内存分析的高手.希望又重新燃起.

我觉得可以从佩戴或者不佩戴 野蛮人之斧
来分析 堆栈的参数,看是否有变化.

贤知有您 发表于 2013-10-16 14:49:17

这个 FU77006 的触发器很有用.
可以临时改变下一个行动堆栈.
这样不使用的话,似乎有点可惜了.
堆栈的内存地址应该可以通过堆栈号直接获取的,我帮你找找看.好像看过类似的地址.

兽哥哥 发表于 2013-10-16 14:56:08

PHP编程楼主会不会?急需要这类型的坛友帮忙解决问题。

sakuya452 发表于 2013-10-16 19:21:44

本帖最后由 sakuya452 于 2013-10-16 19:25 编辑

贤知有您 发表于 2013-10-16 14:49
这个 FU77006 的触发器很有用.
可以临时改变下一个行动堆栈.
这样不使用的话,似乎有点可惜了.

;cool;虽然找出了攻击动画,伤害计算相关的程序开始地址,但是逻辑好难看懂啊。而且找了很多地址,都感觉不到存着攻击次数的嫌疑,很可能是程序检测到某个条件后,再跳回攻击指令那里开始执行啊,这样完全用不到攻击次数

eva2000as 发表于 2013-10-17 10:26:10

sakuya452 发表于 2013-10-16 19:21
虽然找出了攻击动画,伤害计算相关的程序开始地址,但是逻辑好难看懂啊。而且找了很多地址,都感觉 ...

我没实际看过代码或内存,只是从以上各楼的信息推测。有一个可能就是,攻击次数分两种:
1、基础
2、技能等额外附加
这样的话,静态的攻击次数就是X+Y的格式。动态的话就是以下判断:
A、基础的固定一次攻击
B、技能等额外附加的攻击次数
执行攻击指令后,消耗A,判定反击,判定B如有则消耗。

sakuya452 发表于 2013-10-17 14:24:25

本帖最后由 sakuya452 于 2013-10-17 15:12 编辑

;bf;根本就没有攻击次数的概念,检测到双击后调用攻击相关的子程序而已。只要在h3era.exe+41BFC这个地址自动汇编一下,修改代码跳到00441B85,还真的就无限攻击了,不退程序不中止,打到天荒地老,不过有些参数不正确会出点问题,这个就是需要看懂程序才能做出没问题的修改啊

h3era.exe+41BFC里的这个call h3era.exe+356EDE就是攻击的子程序,修改就是在其执行后跳到合理的位置,重新检测到正确的参数后再调用,这里我不清楚哪个位置才是对的,所以就跳到了00441B85

不对,还是再找找吧,我修改过能力的单位,和正常的单位,不共用

大概就是这个效果


贤知有您 发表于 2013-10-17 14:49:23

sakuya452 发表于 2013-10-17 14:24
根本就没有攻击次数的概念,检测到双击后调用攻击相关的子程序而已。只要在h3era.exe+41BFC这个地址自 ...

恭喜找到入口了啊.
期待早日实现这个连击调用.
{:2_183:}

兽哥哥 发表于 2013-10-19 10:10:06

太牛了,刚看到贴图,这个帖子都已经呗云斯搞到论坛官方微薄了




Archer30 发表于 2015-2-15 22:43:56

传说中的内存修改!别怪我挖坟,这东西真心有价值
页: [1] 2
查看完整版本: [休闲娱乐]格挡降防的修复

捐赠