shared-code-statsComputed (#7067)

* shared-code-statsComputed

* \$w is in common/script/index.js
This commit is contained in:
Victor Pudeyev
2016-04-16 12:24:13 -05:00
committed by Matteo Pagliazzi
parent 887aa478ec
commit 715bb5e047
3 changed files with 61 additions and 13 deletions

View File

@@ -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);
},
});
};

View File

@@ -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;
};

View File

@@ -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);
});
});