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.
 
 
 

138 regels
3.9 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.emitNoSticky('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. if (isSpell)
  65. spellGenerators.forEach(g => g.generate(item, blueprint));
  66. else if (isCurrency)
  67. currencyGenerators.forEach(g => g.generate(item, blueprint));
  68. else if (blueprint.material) {
  69. item.material = true;
  70. item.sprite = blueprint.sprite || null;
  71. item.noDrop = blueprint.noDrop || null;
  72. item.noSalvage = blueprint.noSalvage || null;
  73. item.noDestroy = blueprint.noDestroy || null;
  74. item.quality = blueprint.quality || 0;
  75. materialGenerators.forEach(g => g.generate(item, blueprint));
  76. } else if (blueprint.type === 'mtx' || blueprint.type === 'toy') {
  77. //TODO: MTXs have been moved to a mod so we shouldn't have this any more
  78. item = extend({}, blueprint);
  79. delete item.chance;
  80. } else if (blueprint.type === 'recipe')
  81. recipeGenerators.forEach(g => g.generate(item, blueprint));
  82. else {
  83. generators.forEach(g => g.generate(item, blueprint));
  84. if (blueprint.spellName)
  85. g9.generate(item, blueprint);
  86. }
  87. if (blueprint.spritesheet)
  88. item.spritesheet = blueprint.spritesheet;
  89. if (blueprint.noSalvage)
  90. item.noSalvage = true;
  91. if (blueprint.uses)
  92. item.uses = blueprint.uses;
  93. return item;
  94. },
  95. removeStat: function (item, stat) {
  96. if (!stat) {
  97. stat = Object.keys(item.stats)
  98. .filter(s => (s !== 'armor'));
  99. stat = stat[~~(Math.random() * stat.length)];
  100. }
  101. delete item.stats[stat];
  102. if (stat === 'lvlRequire') {
  103. item.level = item.originalLevel;
  104. delete item.originalLevel;
  105. }
  106. },
  107. pickRandomSlot: function () {
  108. let item = {};
  109. let blueprint = {};
  110. g3.generate(item, blueprint);
  111. return item.slot;
  112. }
  113. };