外设天下 - 电脑外设发烧友聚集地

我的人缘1

关于神族护盾参与防御时对伤害值的具体影响

0 7562
楼主
跳转到指定楼层
发表于 2008-3-5 07:57 只看该作者 倒序浏览 阅读模式
首先感谢startoss、victim.csa和plp等同学的启发,让我有了思考和分析这个问题的想法,他们还帮我解决了一些问题。

其实研究这个问题对于游戏的进行,真是没什么帮助。大家星际打到现在了,这种东西已经毫不重要了,还不如吞噬者减防那个的知识有用。不过既然都花了一笔时间了,还是总结一下发个帖吧。

问题主要是围绕着“神族护盾数值不足以承受一击时,单位所受伤害是怎么算的”展开的。

多数人都认为,这个时候的伤害计算公式应该是 (攻击伤害-护盾防御力-护盾值-HP防御力)*伤害系数(这是没考虑溅射伤害的情况)。

然而,实际上。。。。   这个是对的。

但是实际操作中经常会有伤害少了1的情况发生,比如SCV焊0防0盾的Probe时。假如这个Probe护盾是1,血是20,SCV焊下去之后实际效果是护盾变0了,血变成了17。看上去SCV只造成了4点伤害。同样的,攻击神族别的单位的时候,即便是不同的攻防情况,这个情况也时有发生。上面的公式的正确性因此受到了挑战。

因为已知星际里有非整数伤害的存在,所以为搞清神族护盾究竟是怎么回事,我搜索内存来看护盾是如何记录的。

结果发现护盾存储的前一个字节,是用来表示小数的,比如护盾如果剩4,他的表示是 4D 04,高位的4是护盾的显示值,而低位的那个字节的数值是不停递增的,这里4D只是举个例子。

我认为星际里计时的最短单位是一帧,所以把星际的游戏速度调到最慢,用变速齿轮调到2^(-4)倍的速度,一帧一帧观察护盾增长。

每一帧护盾涨7(指的是低字节的数值)。也就是说护盾增长最小单位是7/256(0.02734375),并非很整的数。
同时说明护盾记录的最小单位是1/256点护盾。

星际fastest下,每秒24帧,也就是说每秒回护盾0.65625,龙骑80点护盾回满需要约121秒,和秒表成绩相符。


好了,弄清楚护盾是怎么回事并不够,还得看看HP对非整数的处理。

HP的表示也是同理,高位是显示的血量,低位记录不足1的部分。

先算算满血坦克被ghost打(都是未升攻防的)
tank被ghost打一枪,伤害应该是(10-1)x0.25=2.25
打完之后坦克显示的血量是148,我们知道其实应该是147.75
看内存里:
低位是C0,十进制也就是192,192/256=0.75,正好表示剩余的不足1的血量,
(这点说明在HP方面,最小单位也是1/256。)
同时高位是93,十进制是147。说明内存里记录的还是147.75,只是显示成了148。

看起来星际有把小数位入到整数的习惯。

为了验证到底什么情况下才把小数的HP入到整数位,我手动修改坦克HP的低字节,发现只要不是00,都会入到整数位,意思就是即便真实血量是147.00390625,在星际里也会显示成148。

而护盾不同,高位是什么就显示什么。(否则就看不到护盾显示为0的情况了)
比如护盾实际值是0.9,会显示成0,实际值是8.9,会显示成8。


护盾以非整数速率增长,HP显示会把不足1的部分入到整数位,似乎已经说明了什么。文章开始所说的SCV攻击后的Probe,因为护盾是1.X,可能实际上剩的HP是16.X,SCV的攻击力并没有缩水。
但是雷车两炮就能打死一个probe,又与上面的假设有悖。
那么就只能再次假设,护盾整数位为0时,不能抵消伤害。

为了验证这一点,我继续用超慢速观察护盾在受伤害时的变化。
过程略去,直接说结论,
护盾大于1的时候(比如1.5),小数部分也会用来抵消伤害(抵消的就是小数,不会取整的),而且抵消之后彻底清零,重新增长。同时经它抵消的伤害,也会变成非整数。

而如果护盾小于1(比如0.5),小数部分会被无视,伤害直接作用于HP,伤害不会被减少,而这小数部分的护盾也不会被清零,继续增长。

这样的话,护盾承受伤害的细节就搞清楚了,而且解释了为什么攻击神族单位时伤害会有一些浮动。


---------------------------------------分割線の憂鬱---------------------------------------

除了护盾,还顺便实验了点儿些别的,一并说一下。

虫族回血,每帧回复4,即0.015625,每秒就是0.375。

之所以会有虫族一被打就会回1点血的情况,是因为HP的小数部分都入到整数位的缘故。
假如SCV打drone,drone一下会变成35.0HP,但是下一帧就变成35.015625了,因此星际里会显示成36。


科学船辐射问题。
科学船辐射减血是每8帧减少3.33203125的血,并非每帧都减,和护盾回复有别。
还以fastest 24fps计算,每秒辐射的减血是9.99609375。
从实践来看,辐射死一个SCV需要六七秒,也是符合这个速率的。
一次辐射一共输出伤害是249.90234375,共25秒。


---------------------------------------分割線の嘆息---------------------------------------

类似的还有defiler瘟疫减血速率、medic医疗速率、电池充电速率之类的,但是没有进行测试,因为实在是意义不大了。。。


本文完。
0
已赞
微信分享 收藏
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则