Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 

231 righe
5.1 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 = blueprint.items.minLevel || Math.max(1, list.level * 0.75);
  91. var maxLevel = blueprint.items.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. slot: blueprint.items.slot,
  97. level: level
  98. });
  99. var randomQuality = ~~(Math.random() * 5);
  100. item.worth = Math.pow(item.level, 1.5) + (Math.pow((randomQuality + 1), 2) * 10)
  101. var id = 0;
  102. list.items.forEach(function (checkItem) {
  103. if (checkItem.id >= id)
  104. id = checkItem.id + 1;
  105. });
  106. item.id = id;
  107. generator.removeStat(item);
  108. statGenerator.generate(item);
  109. item.factions = [{}];
  110. item.factions[0].id = blueprint.faction.id;
  111. item.factions[0].tier = blueprint.faction.tier;
  112. list.items.push(item);
  113. }
  114. var baseItems = this.baseItems;
  115. var bLen = baseItems.length;
  116. for (var i = 0; i < bLen; i++) {
  117. list.items.push(baseItems[i]);
  118. }
  119. var extra = blueprint.items.extra;
  120. if (!extra)
  121. return;
  122. var eLen = extra.length;
  123. for (var i = 0; i < eLen; i++) {
  124. var e = extra[i];
  125. var item = extend(true, {}, e);
  126. if (item.type == 'skin') {
  127. var skinBlueprint = skins.getBlueprint(item.id);
  128. item.skinId = item.id;
  129. item.name = skinBlueprint.name;
  130. item.sprite = skinBlueprint.sprite;
  131. } else if (item.generate) {
  132. var generated = generator.generate(item);
  133. if (item.worth)
  134. generated.worth = item.worth;
  135. if (item.infinite)
  136. generated.infinite = true;
  137. if (item.factions)
  138. generated.factions = item.factions;
  139. item = generated;
  140. }
  141. var id = 0;
  142. list.items.forEach(function (checkItem) {
  143. if (checkItem.id >= id)
  144. id = checkItem.id + 1;
  145. });
  146. item.id = id;
  147. list.items.push(item);
  148. }
  149. },
  150. canBuy: function (itemId, requestedBy, action) {
  151. var item = null;
  152. if (action == 'buy')
  153. item = this.findItem(itemId, requestedBy.name);
  154. else if (action == 'buyback')
  155. item = this.findBuyback(itemId, requestedBy.name);
  156. var result = true;
  157. if (item.factions)
  158. result = requestedBy.reputation.canEquipItem(item);
  159. if (!result) {
  160. requestedBy.instance.syncer.queue('onGetMessages', {
  161. id: requestedBy.id,
  162. messages: [{
  163. class: 'color-redA',
  164. message: `your reputation is too low to buy that item`,
  165. type: 'info'
  166. }]
  167. }, [requestedBy.serverId]);
  168. }
  169. return result;
  170. },
  171. findItem: function (itemId, sourceName) {
  172. var list = this.items[sourceName];
  173. if (!list)
  174. return null;
  175. return list.items.find(i => i.id == itemId);
  176. },
  177. removeItem: function (itemId, sourceName) {
  178. var list = this.items[sourceName];
  179. if (!sourceName)
  180. return null;
  181. return list.items.spliceFirstWhere(i => i.id == itemId);
  182. }
  183. };
  184. });