Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 
 

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