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.
 
 
 

239 lines
4.9 KiB

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