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.
 
 
 

142 lines
3.8 KiB

  1. const events = require('../misc/events');
  2. let g1 = require('./generators/level');
  3. let g2 = require('./generators/quality');
  4. let g3 = require('./generators/slots');
  5. let g4 = require('./generators/types');
  6. let g5 = require('./generators/stats');
  7. let g6 = require('./generators/names');
  8. let g7 = require('./generators/worth');
  9. let g8 = require('./generators/quantity');
  10. let g9 = require('./generators/spellbook');
  11. let g10 = require('./generators/currency');
  12. let g11 = require('./generators/effects');
  13. let g12 = require('./generators/attrRequire');
  14. let g13 = require('./generators/recipeBook');
  15. let generators = [g1, g2, g3, g4, g5, g6, g11, g12, g7];
  16. let materialGenerators = [g6, g8];
  17. let spellGenerators = [g1, g2, g9, g7];
  18. let currencyGenerators = [g10, g8];
  19. let recipeGenerators = [g6, g13];
  20. module.exports = {
  21. spellChance: 0.035,
  22. currencyChance: 0.035,
  23. generate: function (blueprint, ownerLevel) {
  24. let isSpell = false;
  25. let isCurrency = false;
  26. let hadBlueprint = !!blueprint;
  27. blueprint = blueprint || {};
  28. let item = {};
  29. const generateEvent = {
  30. blueprint,
  31. item,
  32. ignore: false
  33. };
  34. events.emit('onBeforeGenerateItem', generateEvent);
  35. if (generateEvent.ignore)
  36. return item;
  37. const dropChancesEvent = {
  38. blueprint,
  39. spellChance: this.spellChance,
  40. currencyChance: this.currencyChance
  41. };
  42. if (!blueprint.slot && !blueprint.type && !blueprint.spell)
  43. global.instancer.instances[0].eventEmitter.emitNoSticky('onBeforeGetDropChances', dropChancesEvent);
  44. let currencyChance = dropChancesEvent.currencyChance;
  45. //If you kill a mob that's too low of a level, idols are much more rare
  46. if (
  47. blueprint.level &&
  48. ownerLevel &&
  49. ownerLevel - blueprint.level > 4
  50. ) {
  51. const levelDelta = ownerLevel - blueprint.level;
  52. currencyChance /= Math.pow(levelDelta - 3, 2);
  53. }
  54. if (blueprint.noCurrency)
  55. currencyChance = 0;
  56. if (!blueprint.slot && !blueprint.noSpell && !blueprint.material) {
  57. isSpell = blueprint.spell;
  58. isCurrency = blueprint.currency;
  59. if ((!isCurrency) && (!isSpell) && ((!hadBlueprint) || ((!blueprint.type) && (!blueprint.slot) && (!blueprint.stats)))) {
  60. isSpell = Math.random() < dropChancesEvent.spellChance;
  61. if (!isSpell)
  62. isCurrency = Math.random() < currencyChance;
  63. }
  64. }
  65. if (blueprint.isSpell)
  66. isSpell = true;
  67. if (isSpell)
  68. spellGenerators.forEach(g => g.generate(item, blueprint));
  69. else if (isCurrency)
  70. currencyGenerators.forEach(g => g.generate(item, blueprint));
  71. else if (blueprint.material) {
  72. item.material = true;
  73. item.sprite = blueprint.sprite || null;
  74. item.noDrop = blueprint.noDrop || null;
  75. item.noSalvage = blueprint.noSalvage || null;
  76. item.noDestroy = blueprint.noDestroy || null;
  77. item.quality = blueprint.quality || 0;
  78. materialGenerators.forEach(g => g.generate(item, blueprint));
  79. } else if (blueprint.type === 'mtx') {
  80. item = extend({}, blueprint);
  81. delete item.chance;
  82. } else if (blueprint.type === 'recipe')
  83. recipeGenerators.forEach(g => g.generate(item, blueprint));
  84. else {
  85. generators.forEach(g => g.generate(item, blueprint));
  86. if (blueprint.spellName)
  87. g9.generate(item, blueprint);
  88. }
  89. if (blueprint.spritesheet)
  90. item.spritesheet = blueprint.spritesheet;
  91. if (blueprint.noSalvage)
  92. item.noSalvage = true;
  93. if (blueprint.uses)
  94. item.uses = blueprint.uses;
  95. events.emit('onAfterGenerateItem', generateEvent);
  96. return item;
  97. },
  98. removeStat: function (item, stat) {
  99. if (!stat) {
  100. stat = Object.keys(item.stats)
  101. .filter(s => (s !== 'armor'));
  102. stat = stat[~~(Math.random() * stat.length)];
  103. }
  104. delete item.stats[stat];
  105. if (stat === 'lvlRequire') {
  106. item.level = item.originalLevel;
  107. delete item.originalLevel;
  108. }
  109. },
  110. pickRandomSlot: function () {
  111. let item = {};
  112. let blueprint = {};
  113. g3.generate(item, blueprint);
  114. return item.slot;
  115. }
  116. };