25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 

579 satır
12 KiB

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