diff --git a/src/lib/honkai3rd/battlesuits.ts b/src/lib/honkai3rd/battlesuits.ts index b6087f38..f52fc5d8 100644 --- a/src/lib/honkai3rd/battlesuits.ts +++ b/src/lib/honkai3rd/battlesuits.ts @@ -2,7 +2,7 @@ export interface BattlesuitSkill { name: string krName?: string description: string - krDescription: string + krDescription?: string requiredRank?: string } diff --git a/src/pages/honkai3rd/battlesuits/[battlesuitId].tsx b/src/pages/honkai3rd/battlesuits/[battlesuitId].tsx index f867310a..46d9f6f1 100644 --- a/src/pages/honkai3rd/battlesuits/[battlesuitId].tsx +++ b/src/pages/honkai3rd/battlesuits/[battlesuitId].tsx @@ -124,37 +124,44 @@ const BattlesuitShowPage = ({ battlesuit }: BattlesuitShowPageProps) => { {battlesuit.sp != null && ( )} @@ -191,11 +198,13 @@ export async function getStaticPaths() { interface BattlesuitSkillGroupCardProps { heading: string skillGroup: BattlesuitSkillGroup + locale?: string } const BattlesuitSkillGroupCard = ({ heading, skillGroup, + locale, }: BattlesuitSkillGroupCardProps) => { return ( @@ -206,21 +215,39 @@ const BattlesuitSkillGroupCard = ({ }} > - {skillGroup.core.name} + {translate( + locale, + { 'ko-KR': skillGroup.core.krName }, + skillGroup.core.name + )} {heading} - {skillGroup.core.description} + {translate( + locale, + { 'ko-KR': skillGroup.core.krDescription }, + skillGroup.core.description + )} {skillGroup.subskills.map((subskill) => { + const skillName = translate( + locale, + { 'ko-KR': subskill.krName }, + subskill.name + ) + const skillDescription = translate( + locale, + { 'ko-KR': subskill.krDescription }, + subskill.description + ) return ( - {subskill.name} + {skillName} {subskill.requiredRank != null ? ( /^[0-9]/.test(subskill.requiredRank) ? ( - {subskill.description} + {skillDescription} ) diff --git a/src/server/data/honkai3rd/battlesuits.ts b/src/server/data/honkai3rd/battlesuits.ts index 36e570bb..2a4395fc 100644 --- a/src/server/data/honkai3rd/battlesuits.ts +++ b/src/server/data/honkai3rd/battlesuits.ts @@ -1,6 +1,9 @@ -import { readdirSync, readJsonFileSync } from '../fs' +import { readdirSync, readFileSync, readJsonFileSync } from '../fs' import { compareVersion } from '../../../lib/string' -import { BattlesuitData } from '../../../lib/honkai3rd/battlesuits' +import { + BattlesuitData, + BattlesuitSkillGroup, +} from '../../../lib/honkai3rd/battlesuits' const battlesuitsFileNameList = readdirSync('honkai3rd/battlesuits') const battlesuitDataList = battlesuitsFileNameList @@ -8,6 +11,21 @@ const battlesuitDataList = battlesuitsFileNameList const filePathname = 'honkai3rd/battlesuits/' + fileName const data = readJsonFileSync(filePathname) as BattlesuitData + const krDataFilePath = `honkai3rd/battlesuits-kr/${data.id}.md` + try { + const krData = parseSkillData(readFileSync(krDataFilePath).toString()) + + data.krName = krData.name + assignKrDataToSkill(data.leader, krData.leader) + assignKrDataToSkill(data.passive, krData.passive) + assignKrDataToSkill(data.evasion, krData.evasion) + assignKrDataToSkill(data.special, krData.special) + assignKrDataToSkill(data.ultimate, krData.ultimate) + assignKrDataToSkill(data.basic, krData.basic) + } catch (error) { + // console.warn('Failed to read', krDataFilePath) + // console.warn(error) + } return data }) .sort((a, b) => { @@ -33,3 +51,62 @@ export function listBattlesuits() { export function getBattlesuitById(id: string) { return battlesuitMap.get(id) } + +function parseSkillData(rawData: string) { + const [ + nameSection, + leaderSection, + passiveSection, + evasionSection, + specialSection, + ultimateSection, + basicSection, + ] = rawData.split('\n## ') + + const name = nameSection.replace('#', '').trim() + + return { + name, + leader: parseSkillSection(leaderSection), + passive: parseSkillSection(passiveSection), + evasion: parseSkillSection(evasionSection), + special: parseSkillSection(specialSection), + ultimate: parseSkillSection(ultimateSection), + basic: parseSkillSection(basicSection), + } +} + +function parseSkillSection(rawData: string) { + const [coreSection, ...subskillSections] = rawData.split('\n### ') + + const [coreName, ...descriptionLines] = coreSection.trim().split('\n') + + return { + core: { + name: coreName, + description: descriptionLines.join('\n').trim(), + }, + subskills: subskillSections.map((subskillSection) => { + const [subskillName, ...subskillDescriptionLines] = subskillSection + .trim() + .split('\n') + + return { + name: subskillName, + description: subskillDescriptionLines.join('\n').trim(), + } + }), + } +} + +function assignKrDataToSkill( + skillGroup: BattlesuitSkillGroup, + krDataSkillGroup: BattlesuitSkillGroup +) { + skillGroup.core.krName = krDataSkillGroup.core.name + skillGroup.core.krDescription = krDataSkillGroup.core.description + skillGroup.subskills.forEach((subskill, index) => { + subskill.krName = krDataSkillGroup.subskills[index].name + subskill.krDescription = krDataSkillGroup.subskills[index].description + }) +}