mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-18 07:07:35 +01:00
shared-code-statsComputed (#7067)
* shared-code-statsComputed * \$w is in common/script/index.js
This commit is contained in:
committed by
Matteo Pagliazzi
parent
887aa478ec
commit
715bb5e047
@@ -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);
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
28
common/script/libs/statsComputed.js
Normal file
28
common/script/libs/statsComputed.js
Normal 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;
|
||||
};
|
||||
28
test/common/fns/statsComputed.test.js
Normal file
28
test/common/fns/statsComputed.test.js
Normal 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);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user