Files
Firefly_Srtools/src/helper/converterToAvatarStore.ts
AzenKain 5fd665f005
All checks were successful
Gitea Auto Deploy / Deploy-Container (push) Successful in 1m49s
fix bug
2025-08-14 21:14:22 +07:00

102 lines
4.1 KiB
TypeScript

import { AvatarEnkaDetail, AvatarProfileStore, AvatarStore, CharacterDetail, FreeSRJson, RelicStore } from "@/types";
function safeNumber(val: string | number | null, fallback = 0): number {
if (!val) return fallback;
const num = Number(val);
return Number.isFinite(num) && num !== 0 ? num : fallback;
}
export function converterToAvatarStore(data: Record<string, CharacterDetail>): { [key: string]: AvatarStore } {
return Object.fromEntries(
Object.entries(data).map(([key, value]) => [
key,
{
owner_uid: 0,
avatar_id: Number(key),
data: {
rank: 0,
skills: Object.values(value.SkillTrees).reduce((acc, dataPointEntry) => {
const firstEntry = Object.values(dataPointEntry)[0];
if (firstEntry) {
acc[firstEntry.PointID] = firstEntry.MaxLevel;
}
return acc;
}, {} as Record<string, number>)
},
level: 80,
promotion: 6,
techniques: [],
sp_max: safeNumber(value.SPNeed, 100),
can_change_sp: safeNumber(value.SPNeed) !== 0,
sp_value: Math.ceil(safeNumber(value.SPNeed) / 2),
profileSelect: 0,
enhanced: "",
profileList: [{
profile_name: "Default",
lightcone: null,
relics: {} as Record<string, RelicStore>
} as AvatarProfileStore]
}
])
) as { [key: string]: AvatarStore }
}
export function converterOneEnkaDataToAvatarStore(data: AvatarEnkaDetail, count: number): AvatarProfileStore | null {
if (!data.equipment && (!data.relicList || data.relicList.length === 0)) return null
const profile: AvatarProfileStore = {
profile_name: `Enka Profile ${count}`,
lightcone: (data.equipment && data.equipment.tid) ? {
level: data.equipment?.level ?? 0,
item_id: data.equipment?.tid ?? 0,
rank: data.equipment?.rank ?? 0,
promotion: data.equipment?.promotion ?? 0,
} : null,
relics: Object.fromEntries(data.relicList.map((relic) => [relic.tid.toString()[relic.tid.toString().length - 1], {
level: relic.level ?? 0,
relic_id: relic.tid,
relic_set_id: parseInt(relic.tid.toString().slice(1, -1), 10),
main_affix_id: relic.mainAffixId,
sub_affixes: relic.subAffixList.map((subAffix) => ({
sub_affix_id: subAffix.affixId,
count: subAffix.cnt,
step: subAffix.step ?? 0
}))
}]))
}
return profile
}
export function converterOneFreeSRDataToAvatarStore(data: FreeSRJson, count: number , avatar_id: number): AvatarProfileStore | null {
const lightcone = data.lightcones.find((lightcone) => lightcone.equip_avatar === avatar_id)
const relics = data.relics.filter((relic) => relic.equip_avatar === avatar_id)
if (!lightcone && (!relics || relics.length === 0)) return null
const relicsMap = {} as Record<string, RelicStore>
relics.forEach((relic) => {
relicsMap[relic.relic_id.toString()[relic.relic_id.toString().length - 1]] = {
level: relic.level,
relic_id: relic.relic_id,
relic_set_id: relic.relic_set_id,
main_affix_id: relic.main_affix_id,
sub_affixes: relic.sub_affixes.map((subAffix) => ({
sub_affix_id: subAffix.sub_affix_id,
count: subAffix.count,
step: subAffix.step ?? 0
}))
}
})
const profile: AvatarProfileStore = {
profile_name: `FreeSR Profile ${count}`,
lightcone: (lightcone && lightcone.item_id) ? {
level: lightcone?.level ?? 0,
item_id: lightcone?.item_id ?? 0,
rank: lightcone?.rank ?? 0,
promotion: lightcone?.promotion ?? 0,
} : null,
relics: relicsMap
}
return profile
}