Files
habitica/website/common/script/fns/autoAllocate.js
Matteo Pagliazzi 98c019a0b6 Upgrade lodash to v4 and lint more files (#8495)
* common: import lodash modules separately

* remove test/content from .eslintignore, fix with eslint --fix content/index

* lint test/content

* lint content/index except for lodash methods

* upgrade server/models

* upgrade server/middlewares and server/libs

* port server/controllers/top-level

* port server/controllers/api-v3

* port views and tests

* client old port lodash and _(, missing _.

* upgrade client-old

* port common/script (root level files only)

* port common/script/fns

* port common/libs

* port common/script/ops

* port common/script/content and common/script/libs/shops.js

* misc fixes

* misc fixes

* misc fixes

* more tests fixes

* fix payments test stubbing, down to 2 failing tests

* remove more instances of lodash wrapping

* fix bug where toObject does not clone object

* fix tests

* upgrade migration or add lodash 4 note

* update shrinkwrap

* fix linting

* upgrade eslint-config-habitrpg

* update shrinkwrap

* recompile shrinkwrap
2017-03-01 17:10:48 +01:00

83 lines
2.2 KiB
JavaScript

import min from 'lodash/min';
import pick from 'lodash/pick';
import values from 'lodash/values';
import invert from 'lodash/invert';
import findIndex from 'lodash/findIndex';
import max from 'lodash/max';
import splitWhitespace from '../libs/splitWhitespace';
/*
Updates user stats with new stats. Handles death, leveling up, etc
{stats} new stats
{update} if aggregated changes, pass in userObj as update. otherwise commits will be made immediately
*/
function getStatToAllocate (user) {
let suggested;
let statsObj = user.stats.toObject ? user.stats.toObject() : user.stats;
switch (user.preferences.allocationMode) {
case 'flat': {
let stats = pick(statsObj, splitWhitespace('con str per int'));
return invert(stats)[min(values(stats))];
}
case 'classbased': {
let preference;
let lvlDiv7 = statsObj.lvl / 7;
let ideal = [lvlDiv7 * 3, lvlDiv7 * 2, lvlDiv7, lvlDiv7];
switch (statsObj.class) {
case 'wizard': {
preference = ['int', 'per', 'con', 'str'];
break;
}
case 'rogue': {
preference = ['per', 'str', 'int', 'con'];
break;
}
case 'healer': {
preference = ['con', 'int', 'str', 'per'];
break;
}
default: {
preference = ['str', 'con', 'per', 'int'];
}
}
let diff = [
statsObj[preference[0]] - ideal[0],
statsObj[preference[1]] - ideal[1],
statsObj[preference[2]] - ideal[2],
statsObj[preference[3]] - ideal[3],
];
suggested = findIndex(diff, (val) => {
if (val === min(diff)) return true;
});
return suggested !== -1 ? preference[suggested] : 'str';
}
case 'taskbased': {
suggested = invert(statsObj.training)[max(values(statsObj.training))];
user.stats.training.str = 0;
user.stats.training.int = 0;
user.stats.training.con = 0;
user.stats.training.per = 0;
return suggested || 'str';
}
default: {
return 'str';
}
}
}
module.exports = function autoAllocate (user) {
let statToIncrease = getStatToAllocate(user);
return user.stats[statToIncrease]++;
};