level 10
关于 99% NP 进位到 100% 的说明
战斗时对于从者的 NP 的变动(例如攻击时每hit增加NP、使用技能减少NP),
都会调用到 addNp(int npAdd) 这个函数,
而这个函数内有个特殊判断(C#代码):
if (0 < npAdd && (float)this.lineMaxNp * 0.99f <= (float)this.np && this.np < this.lineMaxNp) { this.np = this.lineMaxNp; }
从代码本意上看,盐川想要的效果是:
如果 np 增加后,其值处于 [9900,9999](即99%NP范围内),则自动向上进位至 10000(100%)。但是中间这句判断是有问题的:
(float)this.lineMaxNp * 0.99f <= (float)this.np
C# 运算时,float 会自动转为 double 进行对比,左侧数字由于浮点数精度问题,会变为 9900.00009536743,如果右侧是 9900.0 ,则会对比失败,这就会导致 99% NP 的状态。
修复问题的办法是把 C# 代码改为整形判断:
this.lineMaxNp * 99 / 100 <= this.np
对于 Unity 程序,Android 是用 mono 虚拟机跑的 C# dll,而 iOS 则是用 il2cpp 编译为原生的 C++ 代码。编译后 C++ 代码反而是
正确的
:
(!(((float)((float)((float)(((float)((float)lineMaxNp)))*(float)(0.99f)))) <= ((float)(((float)((float)np))))))
所以,实现的结果是:只有iOS在NP增加为99%时进位100%,安卓在正好为99.00%时不会进位,仍显示99%。
日服1.40.0(2018.6.13)将float类型全部改为double,修复了这一问题,iOS和Android表现一致,NP增加时都会从99%进位100%。
if (0 < npAdd && (double)this.lineMaxNp * 0.99 <= (double)this.np && this.np < this.lineMaxNp) {
this.np = this.lineMaxNp;
}
2019年02月25日 01点02分
