Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

149 linhas
4.2 KiB

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