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.
 
 
 

242 lines
5.1 KiB

  1. define([
  2. 'items/generator'
  3. ], function (
  4. itemGenerator
  5. ) {
  6. var config = {
  7. 'Runecrafter\'s Toil': {
  8. chance: 0.025,
  9. reward: 'Level 10 Rune',
  10. setSize: 3,
  11. mobLevel: [3, 100]
  12. },
  13. 'Godly Promise': {
  14. chance: 0.015,
  15. reward: 'Level 15 Legendary Weapon',
  16. setSize: 6,
  17. zone: 'sewer'
  18. },
  19. 'The Other Heirloom': {
  20. chance: 0.02,
  21. reward: 'Perfect Level 10 Ring',
  22. setSize: 3,
  23. mobName: 'flamingo'
  24. },
  25. 'Benthic Incantation': {
  26. chance: 0.015,
  27. reward: `Princess Morgawsa's Trident`,
  28. setSize: 12,
  29. zone: 'estuary'
  30. },
  31. 'Fangs of Fury': {
  32. chance: 0.2,
  33. reward: `Steelclaw's Bite`,
  34. setSize: 20,
  35. mobName: 'steelclaw'
  36. },
  37. 'Tradesman\'s Pride': {
  38. chance: 0.01,
  39. reward: 'Five Random Idols',
  40. setSize: 10
  41. }
  42. };
  43. return {
  44. init: function () {
  45. },
  46. fixCard: function (card) {
  47. var template = config[card.name];
  48. if (!template)
  49. return;
  50. card.setSize = template.setSize;
  51. },
  52. getCard: function (looter, mob) {
  53. var pool = [];
  54. var mobLevel = mob.stats.values.level;
  55. var configs = extend(true, {}, config);
  56. looter.instance.eventEmitter.emit('onBeforeGetCardsConfig', configs);
  57. Object.keys(configs).forEach(function (c) {
  58. var card = configs[c];
  59. if (!card.chance)
  60. return;
  61. var rqrLevel = card.mobLevel;
  62. if (rqrLevel) {
  63. if ((rqrLevel.push) && ((mobLevel < rqrLevel[0]) || (mobLevel > rqrLevel[1])))
  64. return;
  65. else if ((!rqrLevel.push) && (mobLevel != rqrLevel))
  66. return;
  67. }
  68. var mobName = card.mobName;
  69. if (mobName) {
  70. if ((mobName.toLowerCase) && (mob.name.toLowerCase() != mobName.toLowerCase()))
  71. return;
  72. else if ((mobName.push) && (!mobName.some(m => (m.toLowerCase() == mob.name.toLowerCase()))))
  73. return;
  74. }
  75. if ((card.zone) && (looter.zoneName != card.zone))
  76. return;
  77. if (Math.random() >= card.chance)
  78. return;
  79. pool.push(c);
  80. }, this);
  81. if (pool.length == 0)
  82. return;
  83. var pickName = pool[~~(Math.random() * pool.length)];
  84. var pick = configs[pickName];
  85. var card = {
  86. name: pickName,
  87. spritesheet: pick.spritesheet || `${this.folderName}/images/items.png`,
  88. type: 'Reward Card',
  89. description: 'Reward: ' + pick.reward,
  90. noSalvage: true,
  91. sprite: pick.sprite || [0, 0],
  92. quantity: 1,
  93. quality: pick.quality || 1,
  94. setSize: pick.setSize
  95. };
  96. return card;
  97. },
  98. getReward: function (looter, set) {
  99. var configs = extend(true, {}, config);
  100. looter.instance.eventEmitter.emit('onBeforeGetCardsConfig', configs);
  101. var reward = configs[set].reward;
  102. var msg = {
  103. reward: reward,
  104. handler: this.rewards[reward]
  105. };
  106. looter.instance.eventEmitter.emit('onBeforeGetCardReward', msg);
  107. return msg.handler(looter);
  108. },
  109. rewards: {
  110. 'Level 10 Rune': function (obj) {
  111. return itemGenerator.generate({
  112. level: 10,
  113. spell: true
  114. });
  115. },
  116. 'Level 15 Legendary Weapon': function () {
  117. var slot = ['oneHanded', 'twoHanded'][~~(Math.random() * 2)];
  118. return itemGenerator.generate({
  119. level: 15,
  120. quality: 4,
  121. noSpell: true,
  122. slot: slot
  123. });
  124. },
  125. 'Perfect Level 10 Ring': function () {
  126. return itemGenerator.generate({
  127. level: 10,
  128. noSpell: true,
  129. quality: 1,
  130. perfection: 1,
  131. slot: 'finger'
  132. });
  133. },
  134. "Princess Morgawsa's Trident": function () {
  135. return itemGenerator.generate({
  136. name: `Princess Morgawsa's Trident`,
  137. level: [18, 20],
  138. quality: 4,
  139. noSpell: true,
  140. slot: 'twoHanded',
  141. sprite: [0, 0],
  142. spritesheet: '../../../images/legendaryItems.png',
  143. type: 'Trident',
  144. spellName: 'magic missile',
  145. description: `Summoned from the ancient depths of the ocean by the Benthic Incantation.`,
  146. stats: ['elementFrostPercent', 'elementFrostPercent', 'elementFrostPercent'],
  147. effects: [{
  148. type: 'freezeOnHit',
  149. rolls: {
  150. i_chance: [2, 5],
  151. i_duration: [2, 4]
  152. }
  153. }],
  154. spellName: 'projectile',
  155. spellConfig: {
  156. statType: 'int',
  157. statMult: 0.9,
  158. element: 'arcane',
  159. auto: true,
  160. cdMax: 7,
  161. manaCost: 0,
  162. range: 9,
  163. random: {
  164. damage: [2, 15]
  165. }
  166. }
  167. });
  168. },
  169. "Five Random Idols": function () {
  170. var result = [];
  171. for (var i = 0; i < 5; i++) {
  172. result.push(itemGenerator.generate({
  173. currency: true
  174. }));
  175. }
  176. return result;
  177. },
  178. "Steelclaw's Bite": function () {
  179. return itemGenerator.generate({
  180. name: `Steelclaw's Bite`,
  181. level: [18, 20],
  182. quality: 4,
  183. noSpell: true,
  184. slot: 'oneHanded',
  185. sprite: [1, 0],
  186. spritesheet: '../../../images/legendaryItems.png',
  187. type: 'Curved Dagger',
  188. spellName: 'double slash',
  189. description: `The blade seems to be made of some kind of bone and steel alloy.`,
  190. stats: ['dex', 'dex', 'addCritMultiplier', 'addCritMultiplier'],
  191. effects: [{
  192. type: 'damageSelf',
  193. rolls: {
  194. i_percentage: [8, 22]
  195. }
  196. }, {
  197. type: 'alwaysCrit',
  198. rolls: {}
  199. }],
  200. spellName: 'melee',
  201. spellConfig: {
  202. statType: 'dex',
  203. statMult: 0.88,
  204. cdMax: 3,
  205. useWeaponRange: true,
  206. random: {
  207. damage: [1, 3.8]
  208. }
  209. }
  210. });
  211. }
  212. }
  213. };
  214. });