您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

92 行
2.4 KiB

  1. define([
  2. ], function (
  3. ) {
  4. var max = Math.max.bind(Math);
  5. var mathRandom = Math.random.bind(Math);
  6. return {
  7. getDamage: function (config) {
  8. var srcValues = config.source.stats.values;
  9. var tgtValues = config.target.stats.values;
  10. var amount = config.damage;
  11. var blocked = false;
  12. var dodged = false;
  13. var isCrit = false;
  14. //Don't block heals
  15. if (!config.noMitigate) {
  16. var blockChance = config.isAttack ? tgtValues.blockAttackChance : tgtValues.blockSpellChance;
  17. if (mathRandom() * 100 < blockChance) {
  18. blocked = true;
  19. amount = 0;
  20. }
  21. if (!blocked) {
  22. var dodgeChance = config.isAttack ? tgtValues.dodgeAttackChance : tgtValues.dodgeSpellChance;
  23. if (mathRandom() * 100 < dodgeChance) {
  24. dodged = true;
  25. amount = 0;
  26. }
  27. }
  28. }
  29. if ((!blocked) && (!dodged)) {
  30. var statValue = 0;
  31. if (config.statType) {
  32. var statType = config.statType;
  33. if (!(statType instanceof Array))
  34. statType = [statType];
  35. var dmg = 0;
  36. statType.forEach(function (s) {
  37. statValue += srcValues[s];
  38. });
  39. }
  40. statValue = max(1, statValue);
  41. var statMult = config.statMult || 1;
  42. var dmgPercent = 100 + (srcValues.dmgPercent || 0);
  43. amount *= statValue * statMult;
  44. if (config.element) {
  45. var elementName = 'element' + config.element[0].toUpperCase() + config.element.substr(1);
  46. dmgPercent += (srcValues[elementName + 'Percent'] || 0);
  47. //Don't mitigate heals
  48. if (!config.noMitigate) {
  49. var resist = tgtValues.elementAllResist + (tgtValues[elementName + 'Resist'] || 0);
  50. amount *= max(0.5 + max((1 - (resist / 100)) / 2, -0.5), 0.5);
  51. }
  52. } else if (!config.noMitigate)
  53. amount *= max(0.5 + max((1 - ((tgtValues.armor || 0) / (srcValues.level * 50))) / 2, -0.5), 0.5);
  54. amount *= (dmgPercent / 100);
  55. if (!config.noCrit) {
  56. var critChance = srcValues.critChance;
  57. critChance += (config.isAttack) ? srcValues.attackCritChance : srcValues.spellCritChance;
  58. var critMultiplier = srcValues.critMultiplier;
  59. critMultiplier += (config.isAttack) ? srcValues.attackCritMultiplier : srcValues.spellCritMultiplier;
  60. if ((config.crit) || (mathRandom() * 100 < critChance)) {
  61. isCrit = true;
  62. amount *= (critMultiplier / 100);
  63. }
  64. }
  65. }
  66. return {
  67. amount: amount,
  68. blocked: blocked,
  69. dodged: dodged,
  70. crit: isCrit,
  71. element: config.element
  72. };
  73. }
  74. };
  75. });