Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 

98 řádky
2.6 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. dmgPercent += srcValues.elementPercent;
  48. if (!config.isAttack)
  49. dmgPercent += srcValues.spellPercent;
  50. //Don't mitigate heals
  51. if (!config.noMitigate) {
  52. var resist = tgtValues.elementAllResist + (tgtValues[elementName + 'Resist'] || 0);
  53. amount *= max(0.5 + max((1 - (resist / 100)) / 2, -0.5), 0.5);
  54. }
  55. } else if (!config.noMitigate) {
  56. dmgPercent += srcValues.physicalPercent;
  57. amount *= max(0.5 + max((1 - ((tgtValues.armor || 0) / (srcValues.level * 50))) / 2, -0.5), 0.5);
  58. }
  59. amount *= (dmgPercent / 100);
  60. if (!config.noCrit) {
  61. var critChance = srcValues.critChance;
  62. critChance += (config.isAttack) ? srcValues.attackCritChance : srcValues.spellCritChance;
  63. var critMultiplier = srcValues.critMultiplier;
  64. critMultiplier += (config.isAttack) ? srcValues.attackCritMultiplier : srcValues.spellCritMultiplier;
  65. if ((config.crit) || (mathRandom() * 100 < critChance)) {
  66. isCrit = true;
  67. amount *= (critMultiplier / 100);
  68. }
  69. }
  70. }
  71. return {
  72. amount: amount,
  73. blocked: blocked,
  74. dodged: dodged,
  75. crit: isCrit,
  76. element: config.element
  77. };
  78. }
  79. };
  80. });