diff --git a/common/script/index.js b/common/script/index.js index 91c0a021ca..0a6cfae2c2 100644 --- a/common/script/index.js +++ b/common/script/index.js @@ -33,9 +33,8 @@ api.capByLevel = statHelpers.capByLevel; api.tnl = statHelpers.toNextLevel; api.diminishingReturns = statHelpers.diminishingReturns; -// TODO under api.libs? import splitWhitespace from './libs/splitWhitespace'; -const $w = api.$w = splitWhitespace; +api.$w = splitWhitespace; import dotSet from './libs/dotSet'; api.dotSet = dotSet; @@ -85,6 +84,8 @@ api.pickDeep = pickDeep; import count from './count'; api.count = count; +import statsComputed from './libs/statsComputed'; + // TODO As ops and fns are ported, exported them through the api object import scoreTask from './ops/scoreTask'; import sleep from './ops/sleep'; @@ -285,23 +286,14 @@ api.wrap = function wrapUser (user, main = true) { randomDrop: _.partial(importedFns.randomDrop, user), autoAllocate: _.partial(importedFns.autoAllocate, user), updateStats: _.partial(importedFns.updateStats, user), + statsComputed: _.partial(statsComputed, user), ultimateGear: _.partial(importedFns.ultimateGear, user), nullify: _.partial(importedFns.nullify, user), }; Object.defineProperty(user, '_statsComputed', { get () { - let computed = _.reduce(['per', 'con', 'str', 'int'], (m, stat) => { - m[stat] = _.reduce($w('stats stats.buffs items.gear.equipped.weapon items.gear.equipped.armor items.gear.equipped.head items.gear.equipped.shield'), (m2, path) => { - let item; - let val = user.fns.dotGet(path); - return m2 + (path.indexOf('items.gear') !== -1 ? (item = content.gear.flat[val], (Number(item ? item[stat] : undefined) || 0) * ((item ? item.klass : undefined) === user.stats.class || (item ? item.specialClass : undefined) === user.stats.class ? 1.5 : 1)) : Number(val[stat]) || 0); - }, 0); - m[stat] += Math.floor(api.capByLevel(user.stats.lvl) / 2); - return m; - }, {}); - computed.maxMP = computed.int * 2 + 30; - return computed; + return statsComputed(user); }, }); }; diff --git a/common/script/libs/statsComputed.js b/common/script/libs/statsComputed.js new file mode 100644 index 0000000000..a239b2039c --- /dev/null +++ b/common/script/libs/statsComputed.js @@ -0,0 +1,28 @@ +import _ from 'lodash'; +import content from '../content/index'; +import * as statHelpers from '../statHelpers'; + +module.exports = function statsComputed (user) { + let paths = ['stats', 'stats.buffs', 'items.gear.equipped.weapon', 'items.gear.equipped.armor', + 'items.gear.equipped.head', 'items.gear.equipped.shield']; + let computed = _.reduce(['per', 'con', 'str', 'int'], (m, stat) => { + m[stat] = _.reduce(paths, (m2, path) => { + let val = _.get(user, path); + let item = content.gear.flat[val]; + if (!item) item = {}; + if (!item[stat]) { + item[stat] = 0; + } else { + item[stat] = Number(item[stat]); + } + let thisMultiplier = item.klass === user.stats.class || item.specialClass === user.stats.class ? 1.5 : 1; + let thisReturn = path.indexOf('items.gear') !== -1 ? item[stat] * thisMultiplier : Number(val[stat]); + return m2 + thisReturn || 0; + }, 0); + m[stat] += Math.floor(statHelpers.capByLevel(user.stats.lvl) / 2); + return m; + }, {}); + + computed.maxMP = computed.int * 2 + 30; + return computed; +}; diff --git a/test/common/fns/statsComputed.test.js b/test/common/fns/statsComputed.test.js new file mode 100644 index 0000000000..07b009368d --- /dev/null +++ b/test/common/fns/statsComputed.test.js @@ -0,0 +1,28 @@ +import statsComputed from '../../../common/script/libs/statsComputed'; +import { + generateUser, +} from '../../helpers/common.helper'; + +describe('common.fns.statsComputed', () => { + let user; + + beforeEach(() => { + user = generateUser(); + }); + + it('returns the same result if called directly, through user.fns.statsComputed, or user._statsComputed', () => { + let result = statsComputed(user); + let result2 = user._statsComputed; + let result3 = user.fns.statsComputed(); + expect(result).to.eql(result2); + expect(result).to.eql(result3); + }); + + it('returns default values', () => { + let result = statsComputed(user); + expect(result.per).to.eql(0); + expect(result.con).to.eql(0); + expect(result.str).to.eql(0); + expect(result.maxMP).to.eql(30); + }); +});