You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

68 lines
1.5 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 statValue = 0;
  11. var statType = config.statType;
  12. if (!(statType instanceof Array))
  13. statType = [statType];
  14. var dmg = 0;
  15. statType.forEach(function(s) {
  16. statValue += srcValues[s];
  17. });
  18. statValue = max(1, statValue);
  19. var dmgPercent = srcValues.dmgPercent;
  20. var resist = srcValues.elementAllResist;
  21. if (config.element) {
  22. var elementName = 'element' + config.element[0].toUpperCase() + config.element.substr(1);
  23. dmgPercent += srcValues[elementName + 'Percent'];
  24. resist += (tgtValues[elementName + 'Resist'] || 0);
  25. }
  26. var dps = (
  27. (config.statMult * statValue * config.damage) *
  28. max((0.5 + (dmgPercent / 100)), 0.5)
  29. );
  30. //Don't mitigate heals
  31. if (!config.noMitigate) {
  32. dps = (
  33. dps *
  34. max(0.5 + max((1 - ((tgtValues.armor || 0) / (srcValues.level * 51.2))) / 2, -0.5), 0.5) *
  35. max(0.5 + max((1 - (resist / 75)) / 2, -0.5), 0.5)
  36. );
  37. }
  38. var cd = config.source.mob ? 1 : config.cd;
  39. var amount = dps * cd * 0.3;
  40. var isCrit = false;
  41. if (!config.noCrit) {
  42. var critChance = srcValues.critChance;
  43. var roll = mathRandom() * 100;
  44. if ((roll < critChance) || (config.crit)) {
  45. isCrit = true;
  46. amount *= 1.5;
  47. }
  48. }
  49. return {
  50. amount: amount,
  51. crit: isCrit,
  52. element: config.element
  53. };
  54. }
  55. };
  56. });