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.
 
 
 

212 lines
5.1 KiB

  1. let generatorStats = require('./generators/stats');
  2. let generatorSlots = require('./generators/slots');
  3. let generatorTypes = require('./generators/types');
  4. let generatorSpells = require('./generators/spellbook');
  5. let salvager = require('./salvager');
  6. let configCurrencies = require('./config/currencies');
  7. let configSlots = require('./config/slots');
  8. let generator = require('./generator');
  9. module.exports = {
  10. enchant: function (obj, item, msg) {
  11. let inventory = obj.inventory;
  12. let config = this.getEnchantMaterials(item, msg.action);
  13. let success = true;
  14. config.materials.forEach(function (m) {
  15. let hasMaterial = inventory.items.find(i => i.name === m.name);
  16. if (hasMaterial)
  17. hasMaterial = hasMaterial.quantity >= m.quantity;
  18. if (!hasMaterial)
  19. success = false;
  20. });
  21. if (!success) {
  22. inventory.resolveCallback(msg);
  23. return;
  24. }
  25. let result = {
  26. item: item,
  27. addStatMsgs: []
  28. };
  29. config.materials.forEach(function (m) {
  30. let invMaterial = inventory.items.find(i => i.name === m.name);
  31. inventory.destroyItem(invMaterial.id, m.quantity);
  32. });
  33. if (msg.action === 'reroll') {
  34. let enchantedStats = item.enchantedStats || {};
  35. delete item.enchantedStats;
  36. delete msg.addStatMsgs;
  37. if ((item.stats) && (item.stats.lvlRequire)) {
  38. item.level += item.stats.lvlRequire;
  39. delete item.originalLevel;
  40. }
  41. item.stats = {};
  42. let bpt = {
  43. slot: item.slot,
  44. type: item.type,
  45. sprite: item.sprite,
  46. spritesheet: item.spritesheet
  47. };
  48. generatorSlots.generate(item, bpt);
  49. generatorTypes.generate(item, bpt);
  50. generatorStats.generate(item, bpt);
  51. for (let p in enchantedStats) {
  52. if (!item.stats[p])
  53. item.stats[p] = 0;
  54. item.stats[p] += enchantedStats[p];
  55. if (p === 'lvlRequire') {
  56. item.level -= enchantedStats[p];
  57. if (item.level < 1)
  58. item.level = 1;
  59. }
  60. }
  61. item.enchantedStats = enchantedStats;
  62. } else if (msg.action === 'relevel') {
  63. if (item.slot === 'tool')
  64. return;
  65. let offset = 1 + ~~(Math.random() * 2);
  66. if (!item.originalLevel)
  67. item.level = Math.min(20, item.level + offset);
  68. else {
  69. offset = Math.min(20 - item.originalLevel, offset);
  70. item.originalLevel = Math.min(20, item.originalLevel + offset);
  71. item.level = Math.min(20, item.level + offset);
  72. }
  73. } else if (msg.action === 'reslot') {
  74. if (item.effects)
  75. return;
  76. if (item.originalLevel)
  77. item.level = item.originalLevel;
  78. let enchantedStats = item.enchantedStats || {};
  79. delete item.enchantedStats;
  80. delete msg.addStatMsgs;
  81. let newItem = generator.generate({
  82. slot: configSlots.getRandomSlot(item.slot),
  83. level: item.level,
  84. quality: item.quality,
  85. stats: Object.keys(item.stats || {})
  86. });
  87. delete item.spritesheet;
  88. delete item.stats;
  89. delete item.spell;
  90. for (let p in enchantedStats) {
  91. if (!newItem.stats[p])
  92. newItem.stats[p] = 0;
  93. newItem.stats[p] += enchantedStats[p];
  94. if (p === 'lvlRequire') {
  95. newItem.level -= enchantedStats[p];
  96. if (newItem.level < 1)
  97. newItem.level = 1;
  98. }
  99. }
  100. newItem.enchantedStats = enchantedStats;
  101. extend(true, item, newItem);
  102. } else if (msg.action === 'reforge') {
  103. if (!item.spell)
  104. return;
  105. let spellName = item.spell.name.toLowerCase();
  106. let oldSpell = item.spell;
  107. delete item.spell;
  108. generatorSpells.generate(item, {
  109. spellName: spellName
  110. });
  111. item.spell = extend(true, oldSpell, item.spell);
  112. } else if (msg.action === 'scour') {
  113. if (!item.power)
  114. return;
  115. for (let p in item.enchantedStats) {
  116. let value = item.enchantedStats[p];
  117. if (item.stats[p]) {
  118. result.addStatMsgs.push({
  119. stat: p,
  120. value: -value
  121. });
  122. item.stats[p] -= value;
  123. if (item.stats[p] <= 0)
  124. delete item.stats[p];
  125. if (p === 'lvlRequire') {
  126. item.level += value;
  127. delete item.originalLevel;
  128. }
  129. }
  130. }
  131. delete item.enchantedStats;
  132. delete item.power;
  133. } else {
  134. let newPower = (item.power || 0) + 1;
  135. if (newPower > 3) {
  136. inventory.resolveCallback(msg);
  137. return;
  138. }
  139. item.power = newPower;
  140. this.addStat(item, result);
  141. }
  142. obj.syncer.setArray(true, 'inventory', 'getItems', item);
  143. inventory.resolveCallback(msg, result);
  144. },
  145. addStat: function (item, result) {
  146. generatorStats.generate(item, {
  147. statCount: 1
  148. }, result);
  149. },
  150. getEnchantMaterials: function (item, action) {
  151. let result = null;
  152. if (action === 'reroll')
  153. result = [configCurrencies.getCurrencyFromAction('reroll')];
  154. else if (action === 'relevel')
  155. result = [configCurrencies.getCurrencyFromAction('relevel')];
  156. else if (action === 'reslot')
  157. result = [configCurrencies.getCurrencyFromAction('reslot')];
  158. else if (action === 'reforge')
  159. result = [configCurrencies.getCurrencyFromAction('reforge')];
  160. else if (action === 'scour')
  161. result = [configCurrencies.getCurrencyFromAction('scour')];
  162. else {
  163. let powerLevel = item.power || 0;
  164. let mult = null;
  165. if (powerLevel < 3)
  166. mult = [5, 10, 20][powerLevel];
  167. else
  168. return;
  169. result = salvager.salvage(item, true);
  170. result.forEach(r => r.quantity = Math.max(1, ~~(r.quantity * mult)));
  171. }
  172. return {
  173. materials: result
  174. };
  175. }
  176. };