ATTACK 类属性
ATTACK 类型的属性,会在对生物造成伤害时触发。
攻击力、防御力
我们写一个简单的攻击力、防御力的属性。
介绍
每1点攻击力,造成1点伤害。每1点防御力,减少1受到的一点伤害。
思路
触发 ATTACK 时,根据自身攻击力属性值和目标防御力属性值,计算出伤害值。
即 伤害=自身攻击力-目标防御力
我们将攻击力、防御力都放到 ATTACK 类属性中计算,而不将防御力编写为单独的 DEFENSE 类属性。因为一旦触发攻击力这个属性,就一定会计算受击者的防御力,在这里 DEFENSE 仅为被攻击者提供防御力的数值,而不触发 DEFENSE 类属性的对应执行逻辑,所以将防御力设定为 OTHER 类属性。
JavaScript
var priority = 1
var combatPower = 1.0
var attributeName = "攻击力"
var attributeType = "ATTACK"
var placeholder = "attack"
function onLoad(attr) {
//注册一个 OTHER 类属性,名为 防御力,战斗力为 1.0,属性变量为 defense
Utils.registerOtherAttribute("防御力", 1.0, "defense")
return attr
}
//编写对应的 runAttack 函数
function runAttack(attr, attacker, entity, handle) {
//通过 attr.getRandomValue 获取攻击者和被攻击者的对应属性值
var attackValue = attr.getRandomValue(attacker, "攻击力", handle)
var defenseValue = attr.getRandomValue(entity, "防御力", handle)
//计算伤害值
var damageValue = attackValue - defenseValue
//判断伤害值是否有效,若防御力>=攻击力时,伤害就为负数或0了
if (damageValue > 0) {
//为攻击者的本次属性处理增加伤害值(并不是现在造成伤害)
attr.addDamage(attacker, damageValue, handle)
}
//这个属性触发了,所以返回true
return true
}暴击几率、暴击倍率
我们引入暴击几率、暴击倍率的概念。
介绍
每1点攻击力,造成1点伤害。攻击力可以根据暴击几率触发暴击,若暴击则根据暴击倍率对伤害翻倍。每1点防御力,减少1受到的一点伤害。 即 伤害=自身攻击力*(1+暴击倍率/100)-目标防御力
思路
因为只有触发了攻击力这个属性,才会考虑暴击几率是否生效,暴击生效了再计算暴击倍率这个属性。它和攻击力是一个绑定的关系,这里的暴击几率和暴击倍率也只是提供一个属性值,所以我们继续从上面的攻击力、防御力属性入手。
JavaScript
function onLoad(attr) {
//注册一个 OTHER 类属性,名为 防御力,战斗力为 1.0,属性变量为 defense
Utils.registerOtherAttribute("防御力", 1.0, "defense")
//再注册 暴击几率 暴击倍率 两个属性
Utils.registerOtherAttribute("暴击几率", 1.0, "crit")
Utils.registerOtherAttribute("暴击倍率", 1.0, "crit_damage")
return attr
}
//编写对应的 runAttack 函数
function runAttack(attr, attacker, entity, handle) {
//通过 attr.getRandomValue 获取攻击者和被攻击者的对应属性值
var attackValue = attr.getRandomValue(attacker, "攻击力", handle)
var defenseValue = attr.getRandomValue(entity, "防御力", handle)
//通过 attr.getRandomValue 获取攻击者的暴击几率
var critValue = attr.getRandomValue(attacker, "暴击几率", handle)
//通过 attr.chance 并根据一个值决定是否生效
var critChance = attr.chance(critValue)
//如果生效
if (critChance) {
//通过 attr.getRandomValue 获取攻击者的暴击倍率
var critDamageValue = attr.getRandomValue(attacker, "暴击倍率", handle)
//因为这是一个百分比的倍率,所以 1 + 倍率 / 100,简单的数学
var rate = 1 + critDamageValue / 100
//重新赋值给 attackValue,此时的 attackValue 是经过暴击计算的
attackValue = attackValue * rate
}
// 其他相同
var damageValue = attackValue - defenseValue
if (damageValue > 0) {
attr.addDamage(attacker, damageValue, handle)
}
return true
}警告
因为暴击几率这个属性设定成了 OTHER 类属性,它不用编写单独的执行函数,所以也无法让暴击几率返回一个 true 或 false,这样我们就无法单独在 handle 中知道暴击几率有没有触发。
