選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 

305 行
6.6 KiB

  1. define([
  2. 'items/generator'
  3. ], function(
  4. generator
  5. ) {
  6. return {
  7. type: 'trade',
  8. items: [],
  9. buyback: {},
  10. maxBuyback: 10,
  11. gold: 0,
  12. target: null,
  13. markup: {
  14. buy: 1,
  15. sell: 1
  16. },
  17. init: function(blueprint) {
  18. this.gold = blueprint.gold;
  19. if (!blueprint.items)
  20. return;
  21. this.markup = blueprint.markup;
  22. if (blueprint.faction) {
  23. this.obj.extendComponent('trade', 'factionVendor', blueprint);
  24. return;
  25. }
  26. var itemCount = blueprint.items.min + ~~(Math.random() * (blueprint.items.max - blueprint.items.min));
  27. for (var i = 0; i < itemCount; i++) {
  28. var level = 1;
  29. if (blueprint.level)
  30. level = blueprint.level.min + ~~(Math.random() * (blueprint.level.max - blueprint.level.min));
  31. var item = generator.generate({
  32. noSpell: true,
  33. level: level
  34. });
  35. var id = 0;
  36. this.items.forEach(function(checkItem) {
  37. if (checkItem.id >= id)
  38. id = checkItem.id + 1;
  39. });
  40. item.id = id;
  41. this.items.push(item);
  42. }
  43. },
  44. startBuy: function(msg) {
  45. var target = msg.target;
  46. var targetName = (msg.targetName || '').toLowerCase();
  47. if ((target == null) && (!targetName))
  48. return false;
  49. if ((target != null) && (target.id == null))
  50. target = this.obj.instance.objects.objects.find(o => o.id == target);
  51. else if (targetName != null)
  52. target = this.obj.instance.objects.objects.find(o => ((o.name) && (o.name.toLowerCase() == targetName)));
  53. this.target = null;
  54. if ((!target) || (!target.trade))
  55. return false;
  56. this.target = target;
  57. var itemList = target.trade.getItems(this.obj);
  58. var markup = target.trade.markup.sell;
  59. if (msg.action == 'buyback') {
  60. itemList = target.trade.buyback[this.obj.name] || [];
  61. markup = target.trade.markup.buy;
  62. }
  63. this.obj.syncer.set(true, 'trade', 'buyList', {
  64. markup: markup,
  65. items: itemList,
  66. buyback: (msg.action == 'buyback')
  67. });
  68. },
  69. buySell: function(msg) {
  70. if (msg.action == 'buy')
  71. this.buy(msg);
  72. else if (msg.action == 'sell')
  73. this.sell(msg);
  74. else if (msg.action == 'buyback')
  75. this.buyback(msg);
  76. },
  77. buy: function(msg) {
  78. var target = this.target;
  79. if (!target)
  80. return;
  81. var item = null
  82. var targetTrade = target.trade;
  83. var markup = targetTrade.markup.sell;
  84. if (msg.action == 'buyback') {
  85. item = targetTrade.findBuyback(msg.itemId, this.obj.name);
  86. markup = targetTrade.markup.buy;
  87. } else
  88. item = targetTrade.findItem(msg.itemId, this.obj.name);
  89. if (!item) {
  90. this.resolveCallback(msg);
  91. return;
  92. }
  93. var worth = ~~(item.worth * markup);
  94. if (this.gold < worth) {
  95. this.obj.instance.syncer.queue('onGetMessages', {
  96. id: this.obj.id,
  97. messages: [{
  98. class: 'q0',
  99. message: `you don't have enough gold to buy that item`,
  100. type: 'info'
  101. }]
  102. }, [this.obj.serverId]);
  103. this.resolveCallback(msg);
  104. return;
  105. }
  106. if (!targetTrade.canBuy(msg.itemId, this.obj, msg.action)) {
  107. this.resolveCallback(msg);
  108. return;
  109. }
  110. if (item.type == 'skin') {
  111. var haveSkin = this.obj.auth.doesOwnSkin(item.id);
  112. if (haveSkin) {
  113. this.obj.instance.syncer.queue('onGetMessages', {
  114. id: this.obj.id,
  115. messages: [{
  116. class: 'q0',
  117. message: `you have already unlocked that skin`,
  118. type: 'info'
  119. }]
  120. }, [this.obj.serverId]);
  121. this.resolveCallback(msg);
  122. return;
  123. }
  124. }
  125. if (msg.action == 'buyback')
  126. targetTrade.removeBuyback(msg.itemId, this.obj.name);
  127. else if (item.type != 'skin')
  128. targetTrade.removeItem(msg.itemId, this.obj.name);
  129. targetTrade.gold += worth;
  130. this.gold -= worth;
  131. this.obj.syncer.set(true, 'trade', 'gold', this.gold);
  132. if (item.type != 'skin') {
  133. this.obj.syncer.setArray(true, 'trade', 'removeItems', item.id);
  134. this.obj.inventory.getItem(item);
  135. }
  136. else {
  137. this.obj.auth.saveSkin(item.id);
  138. this.obj.instance.syncer.queue('onGetMessages', {
  139. id: this.obj.id,
  140. messages: [{
  141. class: 'q0',
  142. message: item.name + ' (unlocked)',
  143. type: 'info'
  144. }]
  145. }, [this.obj.serverId]);
  146. }
  147. this.resolveCallback(msg);
  148. },
  149. buyback: function(msg) {
  150. msg.action = 'buyback';
  151. this.buy(msg);
  152. },
  153. sell: function(msg) {
  154. var target = this.target;
  155. if (!target)
  156. return;
  157. var targetTrade = target.trade;
  158. var item = this.obj.inventory.destroyItem(msg.itemId, 1);
  159. if (!item)
  160. return;
  161. var worth = ~~(item.worth * targetTrade.markup.buy);
  162. this.gold += worth;
  163. this.obj.syncer.set(true, 'trade', 'gold', this.gold);
  164. this.obj.syncer.setArray(true, 'trade', 'removeItems', item.id);
  165. var buyback = this.buyback;
  166. var name = this.obj.name;
  167. if (!buyback[name])
  168. buyback[name] = [];
  169. buyback[name].push(item);
  170. if (buyback[name].length > this.maxBuyback)
  171. buyback[name].splice(0, 1);
  172. },
  173. startSell: function(msg) {
  174. var target = msg.target;
  175. var targetName = (msg.targetName || '').toLowerCase();
  176. if ((target == null) && (!targetName))
  177. return false;
  178. if ((target != null) && (target.id == null))
  179. target = this.obj.instance.objects.objects.find(o => o.id == target);
  180. else if (targetName != null)
  181. target = this.obj.instance.objects.objects.find(o => ((o.name) && (o.name.toLowerCase() == targetName)));
  182. this.target = null;
  183. if ((!target) || (!target.trade))
  184. return false;
  185. this.target = target;
  186. this.obj.syncer.set(true, 'trade', 'sellList', {
  187. markup: target.trade.markup.buy,
  188. items: this.obj.inventory.items.filter(i => ((i.worth > 0) && (!i.eq)))
  189. });
  190. },
  191. startBuyback: function(msg) {
  192. msg.action = 'buyback';
  193. this.startBuy(msg);
  194. },
  195. removeItem: function(itemId) {
  196. return this.items.spliceFirstWhere(i => i.id == itemId);
  197. },
  198. removeBuyback: function(itemId, name) {
  199. return (this.buyback[name] || []).spliceFirstWhere(i => i.id == itemId);
  200. },
  201. getItems: function(requestedBy) {
  202. return this.items;
  203. },
  204. canBuy: function(itemId, requestedBy, action) {
  205. return true;
  206. },
  207. findItem: function(itemId, sourceName) {
  208. return this.items.find(i => i.id == itemId);
  209. },
  210. findBuyback: function(itemId, sourceName) {
  211. return (this.buyback[sourceName] || []).find(i => i.id == itemId);
  212. },
  213. resolveCallback: function(msg, result) {
  214. var callbackId = (msg.callbackId != null) ? msg.callbackId : msg;
  215. result = result || [];
  216. if (callbackId == null)
  217. return;
  218. this.obj.instance.syncer.queue('serverModule', {
  219. module: 'atlas',
  220. method: 'resolveCallback',
  221. msg: {
  222. id: callbackId,
  223. result: result
  224. }
  225. });
  226. },
  227. simplify: function(self) {
  228. var result = {
  229. type: 'trade'
  230. };
  231. if (self)
  232. result.gold = this.gold;
  233. return result;
  234. }
  235. };
  236. });