選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 

128 行
3.5 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 you kill a mob that's too low of a level, idols are much more rare
  37. if (
  38. blueprint.level &&
  39. ownerLevel &&
  40. ownerLevel - blueprint.level > 4
  41. ) {
  42. const levelDelta = ownerLevel - blueprint.level;
  43. currencyChance /= Math.pow(levelDelta - 3, 2);
  44. }
  45. if (blueprint.noCurrency)
  46. currencyChance = 0;
  47. if (!blueprint.slot && !blueprint.noSpell && !blueprint.material) {
  48. isSpell = blueprint.spell;
  49. isCurrency = blueprint.currency;
  50. if ((!isCurrency) && (!isSpell) && ((!hadBlueprint) || ((!blueprint.type) && (!blueprint.slot) && (!blueprint.stats)))) {
  51. isSpell = Math.random() < dropChancesEvent.spellChance;
  52. if (!isSpell)
  53. isCurrency = Math.random() < currencyChance;
  54. }
  55. }
  56. if (blueprint.isSpell)
  57. isSpell = true;
  58. if (isSpell)
  59. spellGenerators.forEach(g => g.generate(item, blueprint));
  60. else if (isCurrency)
  61. currencyGenerators.forEach(g => g.generate(item, blueprint));
  62. else if (blueprint.material) {
  63. item.material = true;
  64. item.sprite = blueprint.sprite || null;
  65. item.noDrop = blueprint.noDrop || null;
  66. item.noSalvage = blueprint.noSalvage || null;
  67. item.noDestroy = blueprint.noDestroy || null;
  68. item.quality = blueprint.quality || 0;
  69. materialGenerators.forEach(g => g.generate(item, blueprint));
  70. } else if (blueprint.type === 'mtx') {
  71. item = extend({}, blueprint);
  72. delete item.chance;
  73. } else if (blueprint.type === 'recipe')
  74. recipeGenerators.forEach(g => g.generate(item, blueprint));
  75. else {
  76. generators.forEach(g => g.generate(item, blueprint));
  77. if (blueprint.spellName)
  78. g9.generate(item, blueprint);
  79. }
  80. if (blueprint.spritesheet)
  81. item.spritesheet = blueprint.spritesheet;
  82. if (blueprint.noSalvage)
  83. item.noSalvage = true;
  84. if (blueprint.uses)
  85. item.uses = blueprint.uses;
  86. return item;
  87. },
  88. removeStat: function (item, stat) {
  89. if (!stat) {
  90. stat = Object.keys(item.stats)
  91. .filter(s => (s !== 'armor'));
  92. stat = stat[~~(Math.random() * stat.length)];
  93. }
  94. delete item.stats[stat];
  95. if (stat === 'lvlRequire') {
  96. item.level = item.originalLevel;
  97. delete item.originalLevel;
  98. }
  99. },
  100. pickRandomSlot: function () {
  101. let item = {};
  102. let blueprint = {};
  103. g3.generate(item, blueprint);
  104. return item.slot;
  105. }
  106. };