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.
 
 
 

225 line
4.9 KiB

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