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.
 
 
 

100 lines
2.7 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 generators = [g1, g2, g3, g4, g5, g6, g11, g12, g7];
  14. let materialGenerators = [g6, g8];
  15. let spellGenerators = [g1, g9, g7];
  16. let currencyGenerators = [g10];
  17. module.exports = {
  18. spellChance: 0.02,
  19. currencyChance: 0.025,
  20. generate: function (blueprint, ownerLevel) {
  21. let isSpell = false;
  22. let isCurrency = false;
  23. let hadBlueprint = !!blueprint;
  24. blueprint = blueprint || {};
  25. let item = {};
  26. let currencyChance = this.currencyChance;
  27. if ((blueprint.level) && (ownerLevel))
  28. currencyChance *= Math.max(0, (10 - Math.abs(ownerLevel - blueprint.level)) / 10);
  29. if ((!blueprint.slot) && (!blueprint.noSpell)) {
  30. isSpell = blueprint.spell;
  31. isCurrency = blueprint.currency;
  32. if ((!isCurrency) && (!isSpell) && ((!hadBlueprint) || ((!blueprint.type) && (!blueprint.slot) && (!blueprint.stats)))) {
  33. isSpell = Math.random() < this.spellChance;
  34. if (!isSpell)
  35. isCurrency = Math.random() < currencyChance;
  36. }
  37. }
  38. if (blueprint.isSpell)
  39. isSpell = true;
  40. if (isSpell)
  41. spellGenerators.forEach(g => g.generate(item, blueprint));
  42. else if (isCurrency)
  43. currencyGenerators.forEach(g => g.generate(item, blueprint));
  44. else if (blueprint.material) {
  45. item.material = true;
  46. item.sprite = blueprint.sprite;
  47. item.noDrop = blueprint.noDrop;
  48. item.noSalvage = blueprint.noSalvage;
  49. item.noDestroy = blueprint.noDestroy;
  50. materialGenerators.forEach(g => g.generate(item, blueprint));
  51. } else if (blueprint.type === 'mtx') {
  52. item = extend(true, {}, blueprint);
  53. delete item.chance;
  54. } else {
  55. generators.forEach(g => g.generate(item, blueprint));
  56. if (blueprint.spellName)
  57. g9.generate(item, blueprint);
  58. }
  59. if (blueprint.spritesheet)
  60. item.spritesheet = blueprint.spritesheet;
  61. if (blueprint.noSalvage)
  62. item.noSalvage = true;
  63. if (blueprint.uses)
  64. item.uses = blueprint.uses;
  65. return item;
  66. },
  67. removeStat: function (item, stat) {
  68. if (!stat) {
  69. stat = Object.keys(item.stats)
  70. .filter(s => (s !== 'armor'));
  71. stat = stat[~~(Math.random() * stat.length)];
  72. }
  73. delete item.stats[stat];
  74. },
  75. pickRandomSlot: function () {
  76. let item = {};
  77. let blueprint = {};
  78. g3.generate(item, blueprint);
  79. return item.slot;
  80. }
  81. };