Files
habitica/common/script/src/content/helpers.js
2015-09-26 16:02:11 -05:00

183 lines
4.4 KiB
JavaScript

import {each, defaults, assign} from 'lodash';
import capitalize from 'lodash.capitalize';
import camelCase from 'lodash.camelcase';
require('coffee-script');
import i18n from '../../../script/i18n.coffee';
//----------------------------------------
// Translator Helpers
//----------------------------------------
export function translator(string, vars={a: 'a'}) {
let func = (lang) => {
return i18n.t(string, vars, lang);
};
func.i18nLangFunc = true; // Trick to recognize this type of function
return func;
};
export function formatForTranslator(name) {
let camelCasedName = camelCase(name);
let capitalCamelCasedName = capitalize(camelCasedName);
return capitalCamelCasedName;
};
//----------------------------------------
// Object Merger
//----------------------------------------
export function merge(array=[]) {
let mergedObject = {};
each(array, (item) => {
assign(mergedObject, item);
});
return mergedObject;
}
//----------------------------------------
// Set Defaults Helpers
//----------------------------------------
export function setSpellDefaults (className, spells) {
let capitalClassName = formatForTranslator(className);
each(spells, (spell, key) => {
let capitalSpellKey = formatForTranslator(key);
let spellDefaults = {
text: translator(`spell${capitalClassName}${capitalSpellKey}Text`),
notes: translator(`spell${capitalClassName}${capitalSpellKey}Notes`),
};
defaults(spell, spellDefaults);
});
};
export function setFoodDefaults(food, options={}) {
each(food, (item, name) => {
let formattedName = formatForTranslator(name);
defaults(item, {
canBuy: options.canBuy || false,
canDrop: options.canDrop || false,
text: translator(`food${formattedName}`),
value: 1,
key: name,
notes: translator('foodNotes'),
});
});
};
export function setHatchingPotionDefaults(hatchingPotions) {
each(hatchingPotions, (potion, key) => {
let text = translator(`hatchingPotion${key}`);
defaults(potion, {
key: key,
value: 2,
text: text,
notes: translator('hatchingPotionNotes', {
potText: text
}),
});
});
}
//----------------------------------------
// Generators
//----------------------------------------
export function generateGearSet(gear, options={}) {
let setName = formatForTranslator(options.setName);
let gearType = options.gearType;
each(gear, (item, number) => {
let text = `${gearType}${setName}${number}Text`;
let notes = `${gearType}${setName}${number}Notes`;
let attributes = _getGearAttributes(item);
let gearDefaults = {
text: translator(text),
notes: translator(notes, attributes),
}
defaults(item, gearDefaults);
});
}
export function generateBackgrounds(sets) {
let backgrounds = {};
each(sets, (names, set) => {
let setName = `backgrounds${set}`;
backgrounds[setName] = {};
each(names, (name) => {
let formattedName = formatForTranslator(name);
backgrounds[setName][name] = {
text: translator(`background${formattedName}Text`),
notes: translator(`background${formattedName}Notes`),
};
});
});
return backgrounds;
}
export function generateEggs(set, options={}) {
let eggs = {};
let type = options.type;
let canBuy = options.canBuy;
each(set, (pet) => {
let text = translator(`${type}Egg${pet}Text`);
let adj = translator(`${type}Egg${pet}Adjective`);
eggs[pet] = {
text: text,
mountText: translator(`${type}Egg${pet}MountText`),
adjective: adj,
canBuy: canBuy,
value: 3,
key: pet,
notes: translator('eggNotes', {
eggText: text,
eggAdjective: adj,
}),
}
});
return eggs;
}
//----------------------------------------
// Spell Helpers
//----------------------------------------
export function diminishingReturns(bonus, max, halfway=max/2) {
return max * (bonus / (bonus + halfway));
};
export function calculateBonus(value, stat, crit=1, stat_scale=0.5) {
return (value < 0 ? 1 : value + 1) + (stat * stat_scale * crit);
};
//----------------------------------------
// Gear Helpers
//----------------------------------------
function _getGearAttributes(gear) {
let attr = {};
if (gear.str) { attr.str = gear.str };
if (gear.con) { attr.con = gear.con };
if (gear.int) { attr.int = gear.int };
if (gear.per) { attr.per = gear.per };
return attr;
}