mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-16 22:27:26 +01:00
* 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
27 lines
985 B
JavaScript
27 lines
985 B
JavaScript
import omit from 'lodash/omit';
|
|
import reduce from 'lodash/reduce';
|
|
import isNumber from 'lodash/isNumber';
|
|
|
|
// Because the same op needs to be performed on the client and the server (critical hits, item drops, etc),
|
|
// we need things to be "random", but technically predictable so that they don't go out-of-sync
|
|
|
|
module.exports = function predictableRandom (user, seed) {
|
|
if (!seed || seed === Math.PI) {
|
|
let stats = user.stats.toObject ? user.stats.toObject() : user.stats;
|
|
// These items are not part of the stat object but exists on the server (see controllers/user#getUser)
|
|
// we remove them in order to use the same user.stats both on server and on client
|
|
stats = omit(stats, ['toNextLevel', 'maxHealth', 'maxMP']);
|
|
|
|
seed = reduce(stats, (accumulator, val) => {
|
|
if (isNumber(val)) {
|
|
return accumulator + val;
|
|
} else {
|
|
return accumulator;
|
|
}
|
|
}, 0);
|
|
}
|
|
|
|
let x = Math.sin(seed++) * 10000;
|
|
return x - Math.floor(x);
|
|
};
|