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.
 
 
 

97 lines
2.2 KiB

  1. define([
  2. 'items/generators/stats',
  3. 'items/salvager'
  4. ], function(
  5. generatorStats,
  6. salvager
  7. ) {
  8. return {
  9. enchant: function(obj, item, msg) {
  10. var inventory = obj.inventory;
  11. var config = this.getEnchantMaterials(item, msg.action);
  12. var success = true;
  13. config.materials.forEach(function(m) {
  14. var hasMaterial = inventory.items.find(i => i.name == m.name);
  15. if (hasMaterial)
  16. hasMaterial = hasMaterial.quantity >= m.quantity;
  17. if (!hasMaterial)
  18. success = false;
  19. });
  20. if (!success) {
  21. inventory.resolveCallback(msg);
  22. return;
  23. }
  24. var result = {
  25. item: item,
  26. addStatMsgs: []
  27. };
  28. result.success = (Math.random() * 100) < config.successChance;
  29. config.materials.forEach(function(m) {
  30. var invMaterial = inventory.items.find(i => i.name == m.name);
  31. inventory.destroyItem(invMaterial.id, m.quantity);
  32. });
  33. var newPower = (item.power || 0) + 1;
  34. item.power = newPower;
  35. if ((result.success) && (msg.action != 'scour'))
  36. this.addStat(item, result);
  37. else if (item.enchantedStats) {
  38. for (var p in item.enchantedStats) {
  39. var value = item.enchantedStats[p];
  40. if (item.stats[p]) {
  41. result.addStatMsgs.push({
  42. stat: p,
  43. value: -value
  44. });
  45. item.stats[p] -= value;
  46. if (item.stats[p] <= 0)
  47. delete item.stats[p];
  48. }
  49. }
  50. delete item.enchantedStats;
  51. delete item.power;
  52. }
  53. obj.syncer.setArray(true, 'inventory', 'getItems', item);
  54. inventory.resolveCallback(msg, result);
  55. },
  56. addStat: function(item, result) {
  57. generatorStats.generate(item, {
  58. statCount: 1
  59. }, result);
  60. },
  61. getEnchantMaterials: function(item, action) {
  62. var result = salvager.salvage(item, true);
  63. var powerLevel = item.power || 0;
  64. powerLevel = Math.min(powerLevel, 9);
  65. var mult = [2, 3, 5, 8, 12, 17, 23, 30, 38, 47][powerLevel];
  66. if (action == 'scour')
  67. mult *= 0.2;
  68. result.forEach(r => r.quantity = Math.max(1, ~~(r.quantity * mult)));
  69. var successChance = [100, 60, 35, 15, 7, 3, 2, 1, 1, 1][powerLevel];
  70. if (action == 'scour') {
  71. successChance = 100;
  72. if (powerLevel == 0)
  73. result = [];
  74. }
  75. return {
  76. materials: result,
  77. successChance: successChance
  78. };
  79. }
  80. };
  81. });