关于怪物血量得一些资料

一般怪物的血量是21亿,这是因为dnf的客户端本身是32位的,有符号整形的数最大值为2^31 – 1
= 2147483648 -1 = 2147483647,最开头的数会被当作符号位,所以实际上只有31位用于表示血量
要让血量耐打血量超过21亿其实不一定非要直接把血量类型直接突破,而且不实际,也无法突破。
所以折中的方法是,让血量看起来像突破了一样的写法。给血量以nut的方法进行翻倍

这里举个简单的算法,假定一个怪物生命为20000,

但是我有一个数组,第一个存了10,第二个存了10

我对怪物造成25000伤害,一般情况下怪物是直接没了

但是这里血量加入了算法后,这样设定,对怪物造成25000伤害后,20000-25000 = -5000,多出来的5000谁补给它?

从数组第二个值扣去1,结果为9,

同时-5000加上怪物生命20000为15000,这样怪物就没死了,如果此时再造成25000伤害,-10000,

接着从第二个值扣个1,为8,将血量加上20000,为10000,依次循环,直到第二个数值为0了,且怪物的血量确实

无法可扣了,返回0,怪物死亡判定,这就相当于怪物血量被翻了10倍的感觉。

使用一个ap,里面定义好onSetHp函数,给定一个getVar数组里面写上最大的翻倍数a和当前的翻倍数b
默认赋值时b = a – 1,然后怪物最大血量(真实血量)c和当前怪物血量(真实血量)d两个分别放进数组里去

将每次改变时的hp值算出来,(在onsethp里使用getHp函数获取怪物的血量然后和参 数提供的hp相减就是hp的变化值)这个改变的hp和你数组进行存储的d进行计算,如果
发现超过了c则b自增(但是不能超过最大翻倍数a),如果变化后的hp小于等于0,则
b作为血量倍数需要减少1,中间进行循环(可以使用递归)直到b扣不起了,且数组内的d确实是负数了,才
返回怪物死亡,hp为0.

计算怪物血量百分比(整合血条计算百分比和怪物act判断血量百分比时需要使用)的算法就是(a / b) + (c / d) * (100 / b)

最后返回的值是 你计算后的血量百分比 和 血量最大值进行计算后 的值

将其扩展成act扩展机制,然后这样翻倍的血量可以直接写进act里去。本质上只要改动数组的值就能改动血量

当然此时血量你打的时候是显示不对的,用tbl把boss显示血量翻一下特定倍数。就能达到血量特别厚的情况了。

这样翻倍的好处是,你的mob里的怪物血量根本不需要写太多,只要写1000,100都行,然后再把act翻倍+tbl翻倍
加上去怪物血量就上来了。
(3W管子的黑龙mob里写的只有1000,但是act和tbl翻了20000倍,吗,每管子大概50w的生命)

用21亿以上的伤害打,你会惊奇的发现,打不出来伤害,也打不死怪物。绝了

顺带一提,当翻的血量太多了(10W,100W倍以上后怪物的显示血量会变得不太正常),就是有时扣的显示血量
不对劲,猜测是因为nut的精度问题,只能保留后面两位可能是原因?这个具体后期如果确实需要了再进行分析。

然后几乎act的百分比全部失效,因为它获取的还是翻倍前的hp,回复肯定是不对的,这里也需要额外扩展对对象
单独百分比回血的机制。但也正因为如此,像裂创等这种百分比扣血的会出现稀释,因为它获取的还是翻倍前的血量
可以避免一个幻影剑舞直接秒怪的情况,怪物足够硬。
当然固定回血扣血是没有问题的,是正常可以参与血量的运算的
(在军团本黑龙三阶段测试过,黑龙的三阶段设定是每发射一次长矛黑龙自身扣除20w固定的血量)

可选性柔化,这个是在刃影才正式实施的写法。

意思其实很简单,就是刃影的技能整体上属于大开大合的,后摇很长,要摆很长时间pose,此时就是想实现
比如秘术 心斩后会产生长时间的后摇,使用这个写法让在后摇期间可以施放其他技能。

proc内写入,将skill cancel写好,当然光写好没用,你还需要额外在ani里加入全局的set flag
(这个全局id鬼一点别跟其他的冲突比如114514)

然后找到你要中断的ani里插入set flag,就能实现斩击后立马可以换上其他的技能。
老技能的ani只要在就能插入。很方便,只要你知道这个ani是干啥的

技能设置状态成功后记得得把obj.getVar("GLOBAL_PARAMETER_CANCEL") 重置回0,

if (obj.getVar("GLOBAL_PARAMETER_CANCEL").size_vector() <= 0) {
	obj.getVar("GLOBAL_PARAMETER_CANCEL").clear_vector();
	obj.getVar("GLOBAL_PARAMETER_CANCEL").push_vector(0);
}


local ani = sq_GetCurrentAnimation(obj);


local state = sq_GetState(obj);

if (state <= 20) {
	if (obj.getVar("GLOBAL_PARAMETER_CANCEL").get_vector(0) == 1) {
		obj.getVar("GLOBAL_PARAMETER_CANCEL").set_vector(0, 0);
	}
}




local isFlag = obj.sq_IsKeyFrameFlag(ani, 105);
if (isFlag)
	obj.getVar("GLOBAL_PARAMETER_CANCEL").set_vector(0, 1);


if (obj.getVar("GLOBAL_PARAMETER_CANCEL").get_vector(0) == 1) {
	//skill cancel
}
© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容