- 积分
- 34677
- 威望
- 499
- 魅力
- 507
- 经验
- 20326
- 热心度
- 9
- 注册时间
- 2006-3-13
- 最后登录
- 2024-9-30
- 主题
- 134
- 回帖
- 4949
- 精华
- 35
- 阅读权限
- 150
TA的每日心情 | 郁闷 2015-6-6 16:12 |
---|
签到天数: 52 天 连续签到: 1 天 [LV.5]女巫
超级版主
- 积分
- 34677
|
楼主 |
发表于 2014-11-3 16:32:43
|
显示全部楼层
探讨无限移动力BUG的内部机制
无限移动力BUG存在于各个版本中,不管是SOD还是WOG/ERA.
一般操作方法是:
1.英雄需要有海洋之帽(自由上下船)以及增加陆地移动力的宝物(如神行靴或骑士手套).
2.下水前不能带"增加陆地移动力"的宝物,然后带上"增加陆地移动力"宝物后上岸,一般可以看到移动力比之前更多了.如此反复可不断递增到一个很大的数.
相信很多人都只知道这个效果,但不清楚内部机制.通过研究内存可以略知一二.
1.内部有个专门函数来判断英雄的基准移动力,分开陆地和海洋2个部分.比如轮到某颜色玩家操作时,系统会根据这个函数来给予该系列颜色英雄一个初始移动力(HE:G).
2.这个判断基准移动力的函数可以实时反应,由英雄的当前状态来决定.比如一些英雄陆地或海洋移动力的宝物,当英雄装备和卸载时,其计算的移动力都会不一样.
3.当英雄带有海洋之帽时,陆地和海洋间移动力的转换是一套简单机制:分别计算地形前后的英雄基准移动力作为一个除法比例再乘以当前移动力.
具体就是:
陆地到海洋后移动力=当前移动力*(海洋基准移动力/陆地基准移动力)
海洋到陆地后移动力=当前移动力*(陆地基准移动力/海洋基准移动力)
透明这个机制,你可以很容易想象到,下水之前脱下神行靴和骑士手套,则能获得最佳的航海移动力.(因为系统计算的陆地基准移动力将减少)
由于海洋基准移动力一般不变化(海洋之帽是前提),无限移动力的BUG就是因为陆地基准移动力的改变问题.另外需要了解的是,下水或上岸英雄都移动了一步,也就是移动力会先减少100.
下面来实际计算一下,一次下水上岸的过程,神行靴和骑士手套能增加多少移动力.
克里斯丁(6)大哥带了一队枪兵(速度=4).没有后勤术等其它因素影响移动力.
首先说明一下怎么获得内部系统的计算基准移动力.也就是调用内存函数.
- !?FU9999953;
- *计算当前英雄状态的基准移动力
- *x1=英雄ID,x2=0陆地1海洋,返回变量
- !!VRx3:S0;
- !!FU|x1<0/x1>155/x2<0/x2>1:E;
- !!UN:C6919480/4/?y1;
- !!VRy2:Sx1 *1170 +136736 +y1;[n=英雄编号]
- !!SN:E5131264/2/y2/x2;
- !!VRx3:Sv1;
- !?CM0&1000; [大地图右键]
- !!CM:F?y1 I?y2 S?y3;
- !!FU|y1<>512/y2<>1/y3<>14:E; [右键小地图]
- !!FU9999953:P6/0/?v2;
- !!FU9999953:P6/1/?v3;
- !!HE6:W?v4;
- !!IF:M^6#英雄
- 陆地=%V2
- 海洋=%V3
- 当前移动力=%V4^;
复制代码
我们分别在英雄"下水前/下水后/下水装备宝物后/上岸后"的4个阶段分别用ERM语句检测英雄的陆地基准移动力+海洋基准移动力和当前移动力.
然后可以对比上下船机制的算法,看看是否一致.
结果如下图.
可以看到,一个上下船的过程,英雄的移动力由1560上升至2231.
基本可以归纳为,只要上岸时的基准陆地移动力高于下水时的陆地基准移动力,就有机会增大英雄的移动力.
宝典中也提到,可以通过英雄交换高低速的兵来得到相似效果,不过操作略显麻烦而已.
数学方面:
假设
A=下水前基准陆地移动力
B=基准海洋移动力(上下船基本不会变)
C=下水前的当前移动力
D=上岸时基准陆地移动力的增幅(比如神行靴+600,骑士手套+300之类)
那么最终计算结果为:(数学公式)
((C-100)*B/A -100)*(A+D)/B
此时可以和原来的C比较.有数学基础的不妨推论一下各种情况.
要修复这个BUG,最有效的方法是:
让英雄上岸时系统计算的陆地基准移动力不再考虑"带兵速度影响和宝物影响",因为玩家能操控的增幅移动力无非就这2种情况.
具体一点可以这样:
1.用bersy的ERM_HOOK插件HOOK住英雄上岸时计算陆地基准移动力的过程.
2.由于手动计算英雄基准移动力非常繁琐(几乎不可能),可考虑先通过内存修改更改掉原计算基准移动力的内存函数,让它忽略带兵速度和宝物的影响,再调用这个函数获得一个修正后的基准移动力.
3.把修正后的基准移动力回调到原HOOK相关位置上.再还原一下修改过的内存函数即可.
(暂没有修复BUG的脚本放出,因为这是个繁琐的工作,有空我会跟进处理的)
|
|