mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-18 15:17:25 +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.tnl = statHelpers.toNextLevel;
|
||||||
api.diminishingReturns = statHelpers.diminishingReturns;
|
api.diminishingReturns = statHelpers.diminishingReturns;
|
||||||
|
|
||||||
// TODO under api.libs?
|
|
||||||
import splitWhitespace from './libs/splitWhitespace';
|
import splitWhitespace from './libs/splitWhitespace';
|
||||||
const $w = api.$w = splitWhitespace;
|
api.$w = splitWhitespace;
|
||||||
|
|
||||||
import dotSet from './libs/dotSet';
|
import dotSet from './libs/dotSet';
|
||||||
api.dotSet = dotSet;
|
api.dotSet = dotSet;
|
||||||
@@ -85,6 +84,8 @@ api.pickDeep = pickDeep;
|
|||||||
import count from './count';
|
import count from './count';
|
||||||
api.count = count;
|
api.count = count;
|
||||||
|
|
||||||
|
import statsComputed from './libs/statsComputed';
|
||||||
|
|
||||||
// TODO As ops and fns are ported, exported them through the api object
|
// TODO As ops and fns are ported, exported them through the api object
|
||||||
import scoreTask from './ops/scoreTask';
|
import scoreTask from './ops/scoreTask';
|
||||||
import sleep from './ops/sleep';
|
import sleep from './ops/sleep';
|
||||||
@@ -285,23 +286,14 @@ api.wrap = function wrapUser (user, main = true) {
|
|||||||
randomDrop: _.partial(importedFns.randomDrop, user),
|
randomDrop: _.partial(importedFns.randomDrop, user),
|
||||||
autoAllocate: _.partial(importedFns.autoAllocate, user),
|
autoAllocate: _.partial(importedFns.autoAllocate, user),
|
||||||
updateStats: _.partial(importedFns.updateStats, user),
|
updateStats: _.partial(importedFns.updateStats, user),
|
||||||
|
statsComputed: _.partial(statsComputed, user),
|
||||||
ultimateGear: _.partial(importedFns.ultimateGear, user),
|
ultimateGear: _.partial(importedFns.ultimateGear, user),
|
||||||
nullify: _.partial(importedFns.nullify, user),
|
nullify: _.partial(importedFns.nullify, user),
|
||||||
};
|
};
|
||||||
|
|
||||||
Object.defineProperty(user, '_statsComputed', {
|
Object.defineProperty(user, '_statsComputed', {
|
||||||
get () {
|
get () {
|
||||||
let computed = _.reduce(['per', 'con', 'str', 'int'], (m, stat) => {
|
return statsComputed(user);
|
||||||
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;
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
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