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.
 
 
 

222 lines
5.0 KiB

  1. let generator = require('../../items/generator');
  2. let skins = require('../../config/skins');
  3. let factions = require('../../config/factions');
  4. let itemEffects = require('../../items/itemEffects');
  5. module.exports = {
  6. baseItems: [],
  7. cdMax: 10,
  8. blueprint: null,
  9. init: function (blueprint) {
  10. this.baseItems = this.items;
  11. this.items = {};
  12. this.faction = blueprint.faction;
  13. this.blueprint = blueprint;
  14. },
  15. getItems: function (requestedBy) {
  16. let name = requestedBy.name;
  17. let requestLevel = requestedBy.stats.values.level;
  18. let list = this.items[name];
  19. if (!list) {
  20. list = {
  21. items: [],
  22. level: requestLevel,
  23. cd: this.cdMax
  24. };
  25. this.items[name] = list;
  26. this.regenList(list);
  27. } else if (list.level !== requestLevel)
  28. this.regenList(list);
  29. let reputation = requestedBy.reputation;
  30. let result = list.items
  31. .map(function (i) {
  32. let item = extend(true, {}, i);
  33. if (item.effects) {
  34. item.stats = {
  35. stats: '???'
  36. };
  37. item.quality = 0;
  38. item.name = item.type;
  39. item.effects = item.effects
  40. .map(function (e) {
  41. if (e.factionId) {
  42. return {
  43. factionId: e.factionId,
  44. text: e.text,
  45. properties: e.properties
  46. };
  47. }
  48. let effectUrl = itemEffects.get(e.type);
  49. let effectModule = require('../../' + effectUrl);
  50. return {
  51. text: effectModule.events.onGetText(item)
  52. };
  53. });
  54. }
  55. if (item.factions) {
  56. item.factions = item.factions.map(function (f) {
  57. let faction = reputation.getBlueprint(f.id);
  58. let factionTier = reputation.getTier(f.id);
  59. let noEquip = null;
  60. if (factionTier < f.tier)
  61. noEquip = true;
  62. return {
  63. name: faction.name,
  64. tier: f.tier,
  65. tierName: ['Hated', 'Hostile', 'Unfriendly', 'Neutral', 'Friendly', 'Honored', 'Revered', 'Exalted'][f.tier],
  66. noEquip: noEquip
  67. };
  68. }, this);
  69. }
  70. return item;
  71. });
  72. return result;
  73. },
  74. regenList: function (list) {
  75. let blueprint = this.blueprint;
  76. list.items = null;
  77. list.items = [];
  78. let faction = factions.getFaction(blueprint.faction.id);
  79. let statGenerator = faction.uniqueStat;
  80. let itemCount = blueprint.items.min + ~~(Math.random() * (blueprint.items.max - blueprint.items.min));
  81. for (let i = 0; i < itemCount; i++) {
  82. let minLevel = blueprint.items.minLevel || Math.max(1, list.level * 0.75);
  83. let maxLevel = blueprint.items.maxLevel || (list.level * 1.25);
  84. let level = ~~(minLevel + (Math.random() * (maxLevel - minLevel)));
  85. let item = generator.generate({
  86. noSpell: true,
  87. magicFind: 150,
  88. slot: blueprint.items.slot,
  89. level: level
  90. });
  91. let randomQuality = ~~(Math.random() * 5);
  92. item.worth = Math.pow(item.level, 1.5) + (Math.pow((randomQuality + 1), 2) * 10);
  93. let id = 0;
  94. list.items.forEach(function (checkItem) {
  95. if (checkItem.id >= id)
  96. id = checkItem.id + 1;
  97. });
  98. item.id = id;
  99. generator.removeStat(item);
  100. statGenerator.generate(item);
  101. item.factions = [{}];
  102. item.factions[0].id = blueprint.faction.id;
  103. item.factions[0].tier = blueprint.faction.tier;
  104. list.items.push(item);
  105. }
  106. let baseItems = this.baseItems;
  107. let bLen = baseItems.length;
  108. for (let i = 0; i < bLen; i++)
  109. list.items.push(baseItems[i]);
  110. let extra = blueprint.items.extra;
  111. if (!extra)
  112. return;
  113. let eLen = extra.length;
  114. for (let i = 0; i < eLen; i++) {
  115. let e = extra[i];
  116. let item = extend(true, {}, e);
  117. if (item.type === 'skin') {
  118. let skinBlueprint = skins.getBlueprint(item.id);
  119. item.skinId = item.id;
  120. item.name = skinBlueprint.name;
  121. item.sprite = skinBlueprint.sprite;
  122. } else if (item.generate) {
  123. let generated = generator.generate(item);
  124. if (item.worth)
  125. generated.worth = item.worth;
  126. if (item.infinite)
  127. generated.infinite = true;
  128. if (item.factions)
  129. generated.factions = item.factions;
  130. item = generated;
  131. }
  132. let id = 0;
  133. list.items.forEach(function (checkItem) {
  134. if (checkItem.id >= id)
  135. id = checkItem.id + 1;
  136. });
  137. item.id = id;
  138. list.items.push(item);
  139. }
  140. },
  141. canBuy: function (itemId, requestedBy, action) {
  142. let item = null;
  143. if (action === 'buy')
  144. item = this.findItem(itemId, requestedBy.name);
  145. else if (action === 'buyback')
  146. item = this.findBuyback(itemId, requestedBy.name);
  147. let result = true;
  148. if (item.factions)
  149. result = requestedBy.reputation.canEquipItem(item);
  150. if (!result) {
  151. requestedBy.instance.syncer.queue('onGetMessages', {
  152. id: requestedBy.id,
  153. messages: [{
  154. class: 'color-redA',
  155. message: 'your reputation is too low to buy that item',
  156. type: 'info'
  157. }]
  158. }, [requestedBy.serverId]);
  159. }
  160. return result;
  161. },
  162. findItem: function (itemId, sourceName) {
  163. let list = this.items[sourceName];
  164. if (!list)
  165. return null;
  166. return list.items.find(i => i.id === itemId);
  167. },
  168. removeItem: function (itemId, sourceName) {
  169. let list = this.items[sourceName];
  170. if (!sourceName)
  171. return null;
  172. return list.items.spliceFirstWhere(i => i.id === itemId);
  173. }
  174. };