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.
 
 
 

269 lines
5.2 KiB

  1. define([
  2. ], function(
  3. ) {
  4. return {
  5. generators: {
  6. hpMax: function(item, blueprint) {
  7. var max = ((item.level * 15) + item.level) / 10;
  8. return random.norm(1, max) * (blueprint.statMult.hpMax || 1);
  9. },
  10. mainStat: function(item, blueprint) {
  11. var min = ((item.level * 6.05) - ((item.level - 1) * 1.2)) / 10;
  12. var max = ((item.level * 14.9) + ((item.level - 1) * 31.49)) / 10;
  13. return random.norm(min, max) * (blueprint.statMult.mainStat || 1);
  14. },
  15. armor: function(item, blueprint) {
  16. var min = (item.level * 20);
  17. var max = (item.level * 51.2);
  18. return random.norm(min, max) * blueprint.statMult.armor;
  19. },
  20. elementResist: function(item, blueprint) {
  21. return random.norm(1, 7.5) * (blueprint.statMult.elementResist || 1);
  22. },
  23. regenHp: function(item, blueprint) {
  24. var max = (((10 + (item.level * 200)) / 20) / 2) / 10;
  25. return random.norm(1, max) * (blueprint.statMult.regenHp || 1);
  26. }
  27. },
  28. stats: {
  29. hpMax: {
  30. generator: 'hpMax'
  31. },
  32. regenHp: {
  33. generator: 'regenHp'
  34. },
  35. manaMax: {
  36. min: 1,
  37. max: 5
  38. },
  39. regenMana: {
  40. min: 1,
  41. max: 7
  42. },
  43. str: {
  44. generator: 'mainStat'
  45. },
  46. int: {
  47. generator: 'mainStat'
  48. },
  49. dex: {
  50. generator: 'mainStat'
  51. },
  52. elementArcaneResist: {
  53. generator: 'elementResist'
  54. },
  55. elementFrostResist: {
  56. generator: 'elementResist'
  57. },
  58. elementFireResist: {
  59. generator: 'elementResist'
  60. },
  61. elementHolyResist: {
  62. generator: 'elementResist'
  63. },
  64. elementPhysicalResist: {
  65. generator: 'elementResist'
  66. },
  67. elementPoisonResist: {
  68. generator: 'elementResist'
  69. },
  70. elementAllResist: {
  71. generator: 'elementResist'
  72. },
  73. armor: {
  74. generator: 'armor',
  75. ignore: true
  76. },
  77. addCritChance: {
  78. min: 1,
  79. max: 90
  80. },
  81. magicFind: {
  82. min: 1,
  83. max: 15
  84. },
  85. xpIncrease: {
  86. min: 1,
  87. max: 6
  88. }
  89. },
  90. slots: {
  91. feet: {
  92. sprintChance: {
  93. min: 1,
  94. max: 20
  95. }
  96. },
  97. finger: {
  98. dmgPercent: {
  99. min: 1,
  100. max: 5
  101. },
  102. elementArcanePercent: {
  103. min: 1,
  104. max: 5
  105. },
  106. elementFrostPercent: {
  107. min: 1,
  108. max: 5
  109. },
  110. elementFirePercent: {
  111. min: 1,
  112. max: 5
  113. },
  114. elementHolyPercent: {
  115. min: 1,
  116. max: 5
  117. },
  118. elementPhysicalPercent: {
  119. min: 1,
  120. max: 5
  121. },
  122. elementPoisonPercent: {
  123. min: 1,
  124. max: 5
  125. },
  126. allAttributes: {
  127. generator: 'mainStat'
  128. }
  129. },
  130. neck: {
  131. dmgPercent: {
  132. min: 1,
  133. max: 10
  134. },
  135. elementArcanePercent: {
  136. min: 1,
  137. max: 10
  138. },
  139. elementFrostPercent: {
  140. min: 1,
  141. max: 10
  142. },
  143. elementFirePercent: {
  144. min: 1,
  145. max: 10
  146. },
  147. elementHolyPercent: {
  148. min: 1,
  149. max: 10
  150. },
  151. elementPhysicalPercent: {
  152. min: 1,
  153. max: 10
  154. },
  155. elementPoisonPercent: {
  156. min: 1,
  157. max: 10
  158. },
  159. allAttributes: {
  160. generator: 'mainStat'
  161. }
  162. }
  163. },
  164. mainStatChance: 0.7,
  165. generate: function(item, blueprint, result) {
  166. if (!blueprint.statCount)
  167. item.stats = {};
  168. if (blueprint.noStats)
  169. return;
  170. //If we enchant something we don't add armor
  171. if (!blueprint.statMult)
  172. blueprint.statMult = {};
  173. if (blueprint.statMult.armor)
  174. this.buildStat(item, blueprint, 'armor');
  175. var statCount = blueprint.statCount || (item.quality + 1);
  176. if (blueprint.forceStats) {
  177. for (var i = 0; i < Math.min(statCount, blueprint.forceStats.length); i++) {
  178. var choice = blueprint.forceStats[i];
  179. this.buildStat(item, blueprint, choice, result);
  180. statCount--;
  181. }
  182. }
  183. if (blueprint.stats) {
  184. var useStats = extend(true, [], blueprint.stats);
  185. var addStats = Math.min(statCount, blueprint.stats.length);
  186. for (var i = 0; i < addStats; i++) {
  187. var choice = useStats[~~(Math.random() * useStats.length)];
  188. useStats.spliceWhere(s => s == choice);
  189. this.buildStat(item, blueprint, choice, result);
  190. statCount--;
  191. }
  192. }
  193. for (var i = 0; i < statCount; i++) {
  194. this.buildStat(item, blueprint, null, result);
  195. }
  196. for (var s in item.stats) {
  197. item.stats[s] = Math.ceil(item.stats[s]);
  198. if (item.stats[s] == 0)
  199. delete item.stats[s];
  200. }
  201. },
  202. buildStat: function(item, blueprint, stat, result) {
  203. var statOptions = extend(true, {}, this.stats, this.slots[item.slot] || {});
  204. var statBlueprint = null;
  205. if (!stat) {
  206. var options = Object.keys(statOptions).filter(s => !statOptions[s].ignore);
  207. stat = options[~~(Math.random() * options.length)];
  208. statBlueprint = statOptions[stat];
  209. } else
  210. statBlueprint = statOptions[stat];
  211. var value = null;
  212. if (statBlueprint.generator) {
  213. value = Math.ceil(this.generators[statBlueprint.generator](item, blueprint, statBlueprint));
  214. } else
  215. value = Math.ceil(random.norm(statBlueprint.min, statBlueprint.max));
  216. if (blueprint.statCount) {
  217. if (result) {
  218. result.addStatMsgs.push({
  219. stat: stat,
  220. value: value
  221. });
  222. }
  223. if (!item.enchantedStats)
  224. item.enchantedStats = {};
  225. if (item.enchantedStats[stat])
  226. item.enchantedStats[stat] += value;
  227. else
  228. item.enchantedStats[stat] = value;
  229. }
  230. if (item.stats[stat])
  231. value += item.stats[stat];
  232. item.stats[stat] = value;
  233. }
  234. };
  235. });