UNPKG

genshin-db

Version:

Genshin Impact v6.2 JSON data. Search and get results in all in-game languages! Sources from the fandom wiki and GenshinData repo.

175 lines (150 loc) 5.72 kB
const helper = {}; /** * */ helper.makeFilename = function(englishname) { englishname = englishname.normalize('NFD').replace(/[\u0300-\u036f]/g, ''); return englishname.toLowerCase().replace(/[^a-z]/g,''); } /** * english only :( */ helper.substat = function(substat, subvalue) { if(subvalue === undefined) return; return substat.replace(/([^%]*)(%?)/, `$1 ${subvalue}$2`) } /** * If you're too lazy to make your own String.format function, then use this one. * replaces {0} etc with values. can separate with slashes */ helper.effect = function(effect, ...numbers) { if(effect === undefined || numbers.length === 0) return; for(let i = 0; i < numbers[0].length; i++) { let values = numbers.reduce((acc, curr) => { if(acc !== "") acc += '/'; return acc + curr[i]; }, ""); effect = effect.replace(new RegExp(`\\{${i}\\}`, 'g'), values); } return effect; } /** * Enum of available formatting for formatWeaponEffect */ helper.WeaponFormat = { R1: 0, // "When HP is above 90%, increases CRIT Rate by 14%." R2: 1, // "When HP is above 90%, increases CRIT Rate by 17.5%." R3: 2, // "When HP is above 90%, increases CRIT Rate by 21%." R4: 3, // "When HP is above 90%, increases CRIT Rate by 24.5%." R5: 4, // "When HP is above 90%, increases CRIT Rate by 28%." AllSlash: 5, // "When HP is above 90%, increases CRIT Rate by 14/17.5/21/24.5/28%." AllSlashWSuffix: 6, // "When HP is above 90%, increases CRIT Rate by 14%/17.5%/21%/24.5%/28%." AllDash: 7, // "When HP is above 90%, increases CRIT Rate by 14-28%." AllDashWSuffix: 8 // "When HP is above 90%, increases CRIT Rate by 14%-28%." } /** * Formats and returns the string for weapon effect. * weapon - weapon object as returned by genshin-db * formattype - the format provided by helper.WeaponFormat * markdownbold - boolean. whether or not to add markdown bold around variable numbers * Returns the string for the weapon effect at a specific refine level or all refine levels. * Examples: "Increases DMG against opponents affected by Hydro or Cryo by 12%." * "Increases DMG against opponents affected by Hydro or Cryo by 12/15/18/21/24%." */ helper.formatWeaponEffect = function(weapon, formattype, markdownbold) { let values = []; let suffix; switch(formattype) { case helper.WeaponFormat.R1: values = weapon.r1; break; case helper.WeaponFormat.R2: values = weapon.r2; break; case helper.WeaponFormat.R3: values = weapon.r3; break; case helper.WeaponFormat.R4: values = weapon.r4; break; case helper.WeaponFormat.R5: values = weapon.r5; break; case helper.WeaponFormat.AllSlash: for(let i = 0; i < weapon.r1.length; i++) { suffix = getSuffix(weapon.r1[i]); if(suffix) values.push(`${rmLast(weapon.r1[i])}/${rmLast(weapon.r2[i])}/${rmLast(weapon.r3[i])}/${rmLast(weapon.r4[i])}/${rmLast(weapon.r5[i])}${suffix}`); else values.push(`${weapon.r1[i]}/${weapon.r2[i]}/${weapon.r3[i]}/${weapon.r4[i]}/${weapon.r5[i]}`); } break; case helper.WeaponFormat.AllSlashWSuffix: for(let i = 0; i < weapon.r1.length; i++) { values.push(`${weapon.r1[i]}/${weapon.r2[i]}/${weapon.r3[i]}/${weapon.r4[i]}/${weapon.r5[i]}`); } break; case helper.WeaponFormat.AllDash: for(let i = 0; i < weapon.r1.length; i++) { suffix = getSuffix(weapon.r1[i]); if(suffix) values.push(`${rmLast(weapon.r1[i])}-${rmLast(weapon.r5[i])}${suffix}`); else values.push(`${weapon.r1[i]}-${weapon.r5[i]}`); } break; case helper.WeaponFormat.AllDashWSuffix: for(let i = 0; i < weapon.r1.length; i++) { values.push(`${weapon.r1[i]}-${weapon.r5[i]}`); } break; } let effect = weapon.effect; for(let i = 0; i < values.length; i++) { effect = effect.replace(`{${i}}`, values[i]); } return effect; } function getSuffix(param) { let last = param[param.length-1]; return isNaN(parseInt(last, 10)) ? last : undefined; } function rmLast(param) { return param.substring(0, param.length-1); } /*==============================================================================================*/ /** * attributes - the attributes object from genshin-db. for example: genshindb.talents('klee').combat1.attributes * talentlevel - the talent level that you wish to get the formatted labels of * Returns an array of labels. * Example: ['1-Hit DMG|72.2%', '2-Hit DMG|62.4%', ...] */ helper.formatTalentLabels = function(attributes, talentlevel) { if(!Number.isInteger(talentlevel) || !(talentlevel >= 1 && talentlevel <= 15)) throw 'talentlevel parameter must be an integer between 1 and 15'; // if(!attributes.labels && attributes.attributes && attributes.attributes.labels) attributes = attributes.attributes; let outlabels = []; const rx = /{(.*?)}/g; for(let label of attributes.labels) { let matches = label.matchAll(rx); for(let match of matches) { const grab = match[1]; // example: param5:F1 const [paramnum, format] = grab.split(':'); let value = attributes.parameters[paramnum][talentlevel-1]; if(format === 'I') { // integer label = label.replace(match[0], value); continue; } if(format.includes('P')) // percent value = value*100; if(format.includes('F')) // float value = value.toFixed(format[1]); if(format.includes('P')) // percent value = value+'%'; label = label.replace(match[0], value); } outlabels.push(label); } return outlabels; } module.exports = helper;