Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 

640 řádky
13 KiB

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