Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

619 linhas
12 KiB

  1. let statsFishingRod = require('./statsFishingRod');
  2. module.exports = {
  3. generators: {
  4. elementDmgPercent: function (item, level, blueprint, perfection, calcPerfection) {
  5. let max = (level / 6.7);
  6. if (calcPerfection)
  7. return (calcPerfection / max);
  8. else if (!perfection)
  9. return random.norm(1, max) * (blueprint.statMult.elementDmgPercent || 1);
  10. return max * perfection * (blueprint.statMult.elementDmgPercent || 1);
  11. },
  12. addCritMultiplier: function (item, level, blueprint, perfection, calcPerfection) {
  13. let div = 1 / 11;
  14. if (item.slot === 'twoHanded')
  15. div *= 2;
  16. let max = (level * 15) * div;
  17. if (calcPerfection)
  18. return (calcPerfection / max);
  19. else if (!perfection)
  20. return random.norm(1, max) * (blueprint.statMult.addCritMultiplier || 1);
  21. return max * perfection * (blueprint.statMult.addCritMultiplier || 1);
  22. },
  23. addCritChance: function (item, level, blueprint, perfection, calcPerfection) {
  24. let div = 1 / 11;
  25. if (item.slot === 'twoHanded')
  26. div *= 2;
  27. let max = (level - 3) * 50 * div;
  28. if (calcPerfection)
  29. return (calcPerfection / max);
  30. else if (!perfection)
  31. return random.norm(1, max) * (blueprint.statMult.addCritChance || 1);
  32. return max * perfection * (blueprint.statMult.addCritChance || 1);
  33. },
  34. vit: function (item, level, blueprint, perfection, calcPerfection) {
  35. let div = 1 / 11;
  36. if (item.slot === 'twoHanded')
  37. div *= 2;
  38. let max = ((-0.6340155 + (13.68923 * level) - (0.34383 * Math.pow(level, 2)) + (0.06754871 * Math.pow(level, 3)) + (0.000174046 * Math.pow(level, 4)) + (0.000007675887 * Math.pow(level, 5))) / 10) * div;
  39. if (calcPerfection)
  40. return (calcPerfection / max);
  41. else if (!perfection)
  42. return random.norm(1, max) * (blueprint.statMult.vit || 1);
  43. return max * perfection * (blueprint.statMult.vit || 1);
  44. },
  45. mainStat: function (item, level, blueprint, perfection, calcPerfection) {
  46. let div = 1 / 11;
  47. if (item.slot === 'twoHanded')
  48. div *= 2;
  49. let min = (level / 15) * div;
  50. let max = (level * 5) * div;
  51. if (calcPerfection)
  52. return ((calcPerfection - min) / (max - min));
  53. else if (!perfection)
  54. return random.norm(min, max) * (blueprint.statMult.mainStat || 1);
  55. return (min + ((max - min) * perfection)) * (blueprint.statMult.mainStat || 1);
  56. },
  57. armor: function (item, level, blueprint, perfection, calcPerfection) {
  58. let min = (level * 20);
  59. let max = (level * 50);
  60. if (calcPerfection)
  61. return ((calcPerfection - min) / (max - min));
  62. else if (!perfection)
  63. return random.norm(min, max) * blueprint.statMult.armor;
  64. return (min + ((max - min) * perfection)) * (blueprint.statMult.armor || 1);
  65. },
  66. elementResist: function (item, level, blueprint, perfection, calcPerfection) {
  67. let div = 1 / 11;
  68. if (item.slot === 'twoHanded')
  69. div *= 2;
  70. if (calcPerfection)
  71. return (calcPerfection / (100 * div));
  72. else if (!perfection)
  73. return random.norm(1, 100) * (blueprint.statMult.elementResist || 1) * div;
  74. return ~~((1 + (99 * perfection)) * (blueprint.statMult.elementResist || 1) * div);
  75. },
  76. regenHp: function (item, level, blueprint, perfection, calcPerfection) {
  77. let div = 1 / 11;
  78. if (item.slot === 'twoHanded')
  79. div *= 2;
  80. let max = (-0.05426729 + (3.477385 * level) - (0.03890282 * Math.pow(level, 2)) + (0.009244822 * Math.pow(level, 3)) + (0.0001700915 * Math.pow(level, 4)) - (0.00000138085 * Math.pow(level, 5))) * div;
  81. if (calcPerfection)
  82. return (calcPerfection / max);
  83. else if (!perfection)
  84. return random.norm(1, max) * (blueprint.statMult.regenHp || 1);
  85. return max * perfection * (blueprint.statMult.regenHp || 1);
  86. },
  87. lvlRequire: function (item, level, blueprint, perfection, calcPerfection) {
  88. let max = ~~(level / 2);
  89. if (calcPerfection)
  90. return (calcPerfection / max);
  91. else if (!perfection)
  92. return random.norm(1, max) * (blueprint.statMult.lvlRequire || 1);
  93. return max * perfection * (blueprint.statMult.lvlRequire || 1);
  94. }
  95. },
  96. stats: {
  97. vit: {
  98. generator: 'vit'
  99. },
  100. regenHp: {
  101. generator: 'regenHp'
  102. },
  103. manaMax: {
  104. min: 1,
  105. max: 8
  106. },
  107. regenMana: {
  108. min: 1,
  109. max: 5
  110. },
  111. lvlRequire: {
  112. level: {
  113. min: 5
  114. },
  115. generator: 'lvlRequire'
  116. },
  117. str: {
  118. generator: 'mainStat'
  119. },
  120. int: {
  121. generator: 'mainStat'
  122. },
  123. dex: {
  124. generator: 'mainStat'
  125. },
  126. elementArcaneResist: {
  127. level: {
  128. min: 15
  129. },
  130. generator: 'elementResist'
  131. },
  132. elementFrostResist: {
  133. level: {
  134. min: 15
  135. },
  136. generator: 'elementResist'
  137. },
  138. elementFireResist: {
  139. level: {
  140. min: 15
  141. },
  142. generator: 'elementResist'
  143. },
  144. elementHolyResist: {
  145. level: {
  146. min: 15
  147. },
  148. generator: 'elementResist'
  149. },
  150. elementPoisonResist: {
  151. level: {
  152. min: 15
  153. },
  154. generator: 'elementResist'
  155. },
  156. elementAllResist: {
  157. level: {
  158. min: 15
  159. },
  160. generator: 'elementResist'
  161. },
  162. elementArcanePercent: {
  163. level: {
  164. min: 10
  165. },
  166. ignore: true,
  167. generator: 'elementDmgPercent'
  168. },
  169. elementFrostPercent: {
  170. level: {
  171. min: 10
  172. },
  173. ignore: true,
  174. generator: 'elementDmgPercent'
  175. },
  176. elementFirePercent: {
  177. level: {
  178. min: 10
  179. },
  180. ignore: true,
  181. generator: 'elementDmgPercent'
  182. },
  183. elementHolyPercent: {
  184. level: {
  185. min: 10
  186. },
  187. ignore: true,
  188. generator: 'elementDmgPercent'
  189. },
  190. elementPoisonPercent: {
  191. level: {
  192. min: 10
  193. },
  194. ignore: true,
  195. generator: 'elementDmgPercent'
  196. },
  197. physicalPercent: {
  198. level: {
  199. min: 10
  200. },
  201. ignore: true,
  202. generator: 'elementDmgPercent'
  203. },
  204. elementPercent: {
  205. level: {
  206. min: 10
  207. },
  208. ignore: true,
  209. generator: 'elementDmgPercent'
  210. },
  211. spellPercent: {
  212. level: {
  213. min: 10
  214. },
  215. ignore: true,
  216. generator: 'elementDmgPercent'
  217. },
  218. allAttributes: {
  219. generator: 'mainStat',
  220. ignore: true
  221. },
  222. attackSpeed: {
  223. min: 1,
  224. max: 8.75,
  225. ignore: true
  226. },
  227. castSpeed: {
  228. min: 1,
  229. max: 8.75,
  230. ignore: true
  231. },
  232. armor: {
  233. generator: 'armor',
  234. ignore: true
  235. },
  236. blockAttackChance: {
  237. min: 1,
  238. max: 10,
  239. ignore: true
  240. },
  241. blockSpellChance: {
  242. min: 1,
  243. max: 10,
  244. ignore: true
  245. },
  246. dodgeAttackChance: {
  247. min: 1,
  248. max: 10,
  249. ignore: true
  250. },
  251. dodgeSpellChance: {
  252. min: 1,
  253. max: 10,
  254. ignore: true
  255. },
  256. addCritChance: {
  257. generator: 'addCritChance',
  258. level: {
  259. min: 7
  260. }
  261. },
  262. addCritMultiplier: {
  263. generator: 'addCritMultiplier',
  264. level: {
  265. min: 12
  266. }
  267. },
  268. addAttackCritChance: {
  269. generator: 'addCritChance',
  270. level: {
  271. min: 7
  272. }
  273. },
  274. addAttackCritMultiplier: {
  275. generator: 'addCritMultiplier',
  276. level: {
  277. min: 12
  278. }
  279. },
  280. addSpellCritChance: {
  281. generator: 'addCritChance',
  282. level: {
  283. min: 7
  284. }
  285. },
  286. addSpellCritMultiplier: {
  287. generator: 'addCritMultiplier',
  288. level: {
  289. min: 12
  290. }
  291. },
  292. magicFind: {
  293. min: 1,
  294. max: 15
  295. },
  296. itemQuantity: {
  297. min: 2,
  298. max: 27
  299. },
  300. xpIncrease: {
  301. min: 1,
  302. max: 6
  303. },
  304. sprintChance: {
  305. min: 1,
  306. max: 20,
  307. ignore: true
  308. }
  309. },
  310. slots: {
  311. feet: {
  312. sprintChance: {
  313. min: 1,
  314. max: 20
  315. },
  316. dodgeAttackChance: {
  317. min: 1,
  318. max: 10
  319. },
  320. dodgeSpellChance: {
  321. min: 1,
  322. max: 10
  323. }
  324. },
  325. offHand: {
  326. },
  327. trinket: {
  328. attackSpeed: {
  329. min: 1,
  330. max: 8.75
  331. },
  332. castSpeed: {
  333. min: 1,
  334. max: 8.75
  335. }
  336. },
  337. finger: {
  338. elementArcanePercent: {
  339. generator: 'elementDmgPercent'
  340. },
  341. elementFrostPercent: {
  342. generator: 'elementDmgPercent'
  343. },
  344. elementFirePercent: {
  345. generator: 'elementDmgPercent'
  346. },
  347. elementHolyPercent: {
  348. generator: 'elementDmgPercent'
  349. },
  350. elementPoisonPercent: {
  351. generator: 'elementDmgPercent'
  352. },
  353. elementPercent: {
  354. generator: 'elementDmgPercent'
  355. },
  356. physicalPercent: {
  357. generator: 'elementDmgPercent'
  358. },
  359. spellPercent: {
  360. generator: 'elementDmgPercent'
  361. },
  362. allAttributes: {
  363. generator: 'mainStat'
  364. },
  365. attackSpeed: {
  366. min: 1,
  367. max: 8.75
  368. },
  369. castSpeed: {
  370. min: 1,
  371. max: 8.75
  372. }
  373. },
  374. neck: {
  375. elementArcanePercent: {
  376. generator: 'elementDmgPercent'
  377. },
  378. elementFrostPercent: {
  379. generator: 'elementDmgPercent'
  380. },
  381. elementFirePercent: {
  382. generator: 'elementDmgPercent'
  383. },
  384. elementHolyPercent: {
  385. generator: 'elementDmgPercent'
  386. },
  387. elementPoisonPercent: {
  388. generator: 'elementDmgPercent'
  389. },
  390. physicalPercent: {
  391. generator: 'elementDmgPercent'
  392. },
  393. elementPercent: {
  394. generator: 'elementDmgPercent'
  395. },
  396. spellPercent: {
  397. generator: 'elementDmgPercent'
  398. },
  399. allAttributes: {
  400. generator: 'mainStat'
  401. },
  402. attackSpeed: {
  403. min: 1,
  404. max: 8.75
  405. },
  406. castSpeed: {
  407. min: 1,
  408. max: 8.75
  409. }
  410. }
  411. },
  412. generate: function (item, blueprint, result) {
  413. if (item.slot === 'tool') {
  414. statsFishingRod.generate(item, blueprint, result);
  415. return;
  416. }
  417. if (!blueprint.statCount)
  418. item.stats = {};
  419. if (blueprint.noStats)
  420. return;
  421. //If we enchant something we don't add armor
  422. if (!blueprint.statMult)
  423. blueprint.statMult = {};
  424. for (let s in blueprint.statMult) {
  425. if (blueprint.statMult[s] > 0)
  426. this.buildStat(item, blueprint, s);
  427. }
  428. let statCount = blueprint.statCount || (item.quality + 1);
  429. if (blueprint.forceStats) {
  430. for (let i = 0; i < Math.min(statCount, blueprint.forceStats.length); i++) {
  431. let choice = blueprint.forceStats[i];
  432. this.buildStat(item, blueprint, choice, result);
  433. statCount--;
  434. }
  435. }
  436. let implicitStat = blueprint.implicitStat;
  437. if (implicitStat) {
  438. let value = implicitStat.value[0] + ~~(Math.random() * (implicitStat.value[1] - implicitStat.value[0]));
  439. item.implicitStats = [{
  440. stat: implicitStat.stat,
  441. value: value
  442. }];
  443. }
  444. if (blueprint.stats) {
  445. let useStats = extend([], blueprint.stats);
  446. let addStats = Math.min(statCount, blueprint.stats.length);
  447. for (let i = 0; i < addStats; i++) {
  448. let choice = useStats[~~(Math.random() * useStats.length)];
  449. useStats.spliceFirstWhere(s => s === choice);
  450. this.buildStat(item, blueprint, choice, result);
  451. statCount--;
  452. }
  453. }
  454. for (let i = 0; i < statCount; i++)
  455. this.buildStat(item, blueprint, null, result);
  456. for (let s in item.stats) {
  457. item.stats[s] = Math.ceil(item.stats[s]);
  458. if (item.stats[s] === 0)
  459. delete item.stats[s];
  460. }
  461. },
  462. buildStat: function (item, blueprint, stat, result, isImplicit) {
  463. let slotStats = this.slots[item.slot] || {};
  464. let statOptions = extend({}, this.stats, slotStats || {});
  465. for (let p in statOptions) {
  466. if ((!slotStats[p]) || (slotStats[p].ignore))
  467. continue;
  468. delete statOptions[p].ignore;
  469. }
  470. let statBlueprint = null;
  471. let value = null;
  472. if ((stat) && (stat.indexOf('|') > -1)) {
  473. let split = stat.split('|');
  474. stat = split[0];
  475. value = split[1];
  476. }
  477. if ((!stat) || (!statOptions[stat])) {
  478. let options = Object.keys(statOptions).filter(function (s) {
  479. let o = statOptions[s];
  480. if (o.ignore)
  481. return false;
  482. else if ((o.level) && (o.level.min) && (item.level < o.level.min))
  483. return false;
  484. return true;
  485. });
  486. stat = options[~~(Math.random() * options.length)];
  487. statBlueprint = statOptions[stat];
  488. } else
  489. statBlueprint = statOptions[stat];
  490. if (!value) {
  491. if (statBlueprint.generator) {
  492. let level = item.originalLevel || item.level;
  493. value = Math.ceil(this.generators[statBlueprint.generator](item, level, blueprint, blueprint.perfection));
  494. } else if (!blueprint.perfection)
  495. value = Math.ceil(random.norm(statBlueprint.min, statBlueprint.max));
  496. else
  497. value = statBlueprint.min + ((statBlueprint.max - statBlueprint.min) * blueprint.perfection);
  498. }
  499. if ((result) && (result.addStatMsgs)) {
  500. result.addStatMsgs.push({
  501. stat: stat,
  502. value: value
  503. });
  504. if (!item.enchantedStats)
  505. item.enchantedStats = {};
  506. if (item.enchantedStats[stat])
  507. item.enchantedStats[stat] += value;
  508. else
  509. item.enchantedStats[stat] = value;
  510. }
  511. if (stat === 'lvlRequire') {
  512. if (!item.originalLevel)
  513. item.originalLevel = item.level;
  514. item.level -= value;
  515. if (item.level < 1)
  516. item.level = 1;
  517. }
  518. if (item.stats[stat])
  519. value += item.stats[stat];
  520. item.stats[stat] = value;
  521. },
  522. rescale: function (item, level) {
  523. let stats = item.stats;
  524. let nStats = extend({}, stats);
  525. let bpt = {
  526. statMult: {}
  527. };
  528. for (let p in stats) {
  529. let generator = this.stats[p].generator;
  530. if (!generator)
  531. continue;
  532. else if (['lvlRequire'].indexOf(p) > -1)
  533. continue;
  534. generator = this.generators[generator];
  535. let perfection = generator(item, item.originalLevel || item.level, bpt, null, stats[p]);
  536. nStats[p] = Math.ceil(generator(item, level, bpt, perfection));
  537. }
  538. return nStats;
  539. }
  540. };