mechanism combat defense - Mini-World-Dev-Org/Mini-World-Wiki GitHub Wiki

防御

防御是游戏对象的基本属性之一,任何生物和玩家等都有防御这个属性。
防御包括近战防御远程防御 ,它们分别对受到近战伤害和远程伤害有修改(通常是降低,极端情况会增加)的作用。
可以在背包界面中看到简单的角色防御面板。

API

设要获取或设置防御的对象 id 为 objid

获取防御:

  • Player:getAttr(objid, 19)
    返回 objid 所指玩家近战防御。
  • Player:getAttr(objid, 20)
    返回 objid 所指玩家远程防御。
  • Creature:getAttr(objid, 19)
    返回 objid 所指生物近战防御。
  • Creature:getAttr(objid, 20)
    返回 objid 所指生物远程防御。
  • Creature:getPunchDefense(objid)
    返回 objid 所指生物近战防御。
  • Creature:getRangeDefense(objid)
    返回 objid 所指生物远程防御。

设置防御:

设要设置的防御值为 defense

  • Player:setAttr(objid, 19, defense)
    设置 objid 所指玩家近战防御为 defense
  • Player:setAttr(objid, 20, defense)
    设置 objid 所指玩家远程防御为 defense
  • Creature:setAttr(objid, 19, defense)
    设置 objid 所指生物近战防御为 defense
  • Creature:setAttr(objid, 20, defense)
    设置 objid 所指生物远程防御为 defense
  • Creature:setPunchDefense(objid, defense)
    设置 objid 所指生物近战防御为 defense
  • Creature:setRangeDefense(objid, defense)
    设置 objid 所指生物远程防御为 defense

防御与受到伤害的关系

设原始伤害为 base, 实际伤害为 real ,防御(防御类型与伤害类型对应)为 defense ,那么存在关系:

real = 20/(defense+20)*base     (defense >= 0)

也就是说,防御大于等于 0 时(这是正常情况),你的受伤率为 20/(defense+20) ,减伤率为 defense/(defense+20)
注意,实际伤害最终会尽可能化为整数,且实际计算过程更复杂,因此存在一定的误差,该算法仅在理论上正确。

防御为负数时,受伤率会变得难以用表达式表示,例如在防御为 -20 时,根据算法和计算机对极端浮点数的处理, 20/(defense+20) 会等于 inf ,但实际不会将实际伤害增大到 inf
而且此时受伤率甚至还会和原始伤害有关,例如原始伤害为 10000 点时,受伤率为 1 ,但伤害为 2e9 时,受伤率会大于 1 。


最后更新: 2022/12/20