GenshinData-1/myscripts/collateCharacter.js
2022-05-29 16:31:29 -04:00

103 lines
4.3 KiB
JavaScript

// avatar extra info
const xextrainfo = getExcel('FetterInfoExcelConfigData');
// object map that converts player's avatar id to TextMapHash
const playerIdToTextMapHash = { 10000005: 2329553598, 10000007: 3241049361 };
const moraNameTextMapHash = getExcel('MaterialExcelConfigData').find(ele => ele.Id === 202).NameTextMapHash;
const xmat = getExcel('MaterialExcelConfigData');
function collateCharacter(lang) {
const language = getLanguage(lang);
const xsubstat = getExcel('AvatarPromoteExcelConfigData');
// console.log(xplayableAvatar.map(ele => ele.ImageName));
// console.log(avatarIdToFileName)
let myavatar = xplayableAvatar.reduce((accum, obj) => {
let data = {};
let extra = xextrainfo.find(ele => ele.AvatarId === obj.Id);
data.name = language[obj.NameTextMapHash];
if(isPlayer(obj)) data.name = language[playerIdToTextMapHash[obj.Id]];
//if(data.name === 'Traveler') data.name = capitalizeFirst(avatarIdToFileName[obj.Id]);
data.description = language[obj.DescTextMapHash];
data.weapontype = language[weaponTextMapHash[obj.WeaponType]];
data.body = obj.BodyType.slice(obj.BodyType.indexOf('BODY_')+5);
data.rarity = obj.QualityType === 'QUALITY_PURPLE' ? '4' : '5';
if(!isPlayer(obj)) {
data.birthmonth = extra.InfoBirthMonth;
data.birthday = extra.InfoBirthDay;
}
if(isPlayer(obj) && (data.birthmonth || data.birthday)) console.log('warning player has birthday');
data.affiliation = isPlayer(obj) ? '' : language[extra.AvatarNativeTextMapHash];
data.element = language[extra.AvatarVisionBeforTextMapHash];
data.constellation = language[extra.AvatarConstellationBeforTextMapHash];
if(obj.Id === 10000030) data.constellation = language[extra.AvatarConstellationAfterTextMapHash]; // Zhongli exception
data.title = language[extra.AvatarTitleTextMapHash];
data.association = extra.AvatarAssocType.slice(extra.AvatarAssocType.indexOf('TYPE_')+5);
data.cv = {
english: language[extra.CvEnglishTextMapHash],
chinese: language[extra.CvChineseTextMapHash],
japanese: language[extra.CvJapaneseTextMapHash],
korean: language[extra.CvKoreanTextMapHash]
};
const xsubstat = getExcel('AvatarPromoteExcelConfigData');
const xmanualtext = getExcel('ManualTextMapConfigData');
let substat = xsubstat.find(ele => ele.AvatarPromoteId === obj.AvatarPromoteId).AddProps[3].PropType;
data.substat = language[xmanualtext.find(ele => ele.TextMapId === substat).TextMapContentTextMapHash];
data.icon = obj.IconName;
data.sideicon = obj.SideIconName;
// get the promotion costs
let costs = {};
for(let i = 1; i <= 6; i++) {
let apromo = xsubstat.find(ele => ele.AvatarPromoteId === obj.AvatarPromoteId && ele.PromoteLevel === i);
costs['ascend'+i] = [{
name: language[moraNameTextMapHash],
count: apromo.ScoinCost
}];
for(let items of apromo.CostItems) {
if(items.Id === undefined) continue;
costs['ascend'+i].push({
name: language[xmat.find(ele => ele.Id === items.Id).NameTextMapHash],
count: items.Count
})
}
}
data.costs = costs;
// INFORMATION TO CALCULATE STATS AT EACH LEVEL
let stats = { base: {}, curve: {} };
stats.base.hp = obj.HpBase;
stats.base.attack = obj.AttackBase;
stats.base.defense = obj.DefenseBase;
stats.base.critrate = obj.Critical;
stats.base.critdmg = obj.CriticalHurt;
stats.curve.hp = obj.PropGrowCurves.find(ele => ele.Type === 'FIGHT_PROP_BASE_HP').GrowCurve;
stats.curve.attack = obj.PropGrowCurves.find(ele => ele.Type === 'FIGHT_PROP_BASE_ATTACK').GrowCurve;
stats.curve.defense = obj.PropGrowCurves.find(ele => ele.Type === 'FIGHT_PROP_BASE_DEFENSE').GrowCurve;
stats.specialized = substat;
stats.promotion = xsubstat.reduce((accum, ele) => {
if(ele.AvatarPromoteId !== obj.AvatarPromoteId) return accum;
let promotelevel = ele.PromoteLevel || 0;
accum[promotelevel] = {
maxlevel: ele.UnlockMaxLevel,
hp: ele.AddProps.find(ele => ele.PropType === 'FIGHT_PROP_BASE_HP').Value || 0,
attack: ele.AddProps.find(ele => ele.PropType === 'FIGHT_PROP_BASE_ATTACK').Value || 0,
defense: ele.AddProps.find(ele => ele.PropType === 'FIGHT_PROP_BASE_DEFENSE').Value || 0,
specialized: ele.AddProps.find(ele => ele.PropType === substat).Value || 0,
};
return accum;
}, []);
data.stats = stats;
accum[avatarIdToFileName[obj.Id]] = data;
return accum;
}, {})
return myavatar;
}
module.exports = collateCharacter;