Add support battlesuits page
This commit is contained in:
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"id": "ae",
|
||||||
|
"skillName": "Empyrean Sunder",
|
||||||
|
"cooldown": 50,
|
||||||
|
"description": "Summons Azure Empyrea, which gathers enemies and deals 1500% of ATK as Fire DMG to all enemies for 15s (this DMG decays below 85 difficulty), as well as increasing elemental DMG by 30% against all target enemies. Valkyries regain 1 SP every 1 second, have a large increase in Ignore Interrupt, and have a 16% increase in Elemental Breach."
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"id": "bke",
|
||||||
|
"skillName": "Knightly Bulwark",
|
||||||
|
"cooldown": 30,
|
||||||
|
"description": "Summons Bright Knight: Excelsis, who swings her lance and unleashes an Ultimate, dealing 930% of ATK as physical DMG (the DMG decays below 85 difficulty), and blocking all attacks against the Valkyrie for a short period."
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"id": "br",
|
||||||
|
"skillName": "Blood Boost",
|
||||||
|
"cooldown": 40,
|
||||||
|
"description": "The Blood Rose reduces the HP of the deployed Valkyrie by 30%, and increases the Total DMG dealt by the Valkyrie by 60% for 10s."
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"id": "dp",
|
||||||
|
"skillName": "Divine Retribution",
|
||||||
|
"cooldown": 40,
|
||||||
|
"description": "Triggers Time Fracture for 12s, during which, Falling Thunder is triggered every 2s, dealing 100% of ATK as Lightning DMG to all enemies and imparing them, and DEF is reduced by 80% for 5s."
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"id": "le",
|
||||||
|
"skillName": "Lightning Charge",
|
||||||
|
"cooldown": 40,
|
||||||
|
"description": "Lightning Empress restores 50 SP for the deployed Valkyrie."
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"id": "ss",
|
||||||
|
"skillName": "Arctic Snow",
|
||||||
|
"cooldown": 60,
|
||||||
|
"description": "Summons Snowy Sniper, freezing enemies across the battlefield and increasing their physical DMG taken by 35% for 12s. Deals 150% of ATK as Ice DMG after the freeze ends."
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"id": "vc",
|
||||||
|
"skillName": "Black Hole",
|
||||||
|
"cooldown": 30,
|
||||||
|
"description": "Summons Valkyrie Chariot, which unleashes a Black Hole that lasts 10s, sucking in enemies and causing Bleed. The ranged physical DMG taken by the sucked in enemies is increased by 27%, the total DMG dealt is reduced by 50%, the Ignore Interrupt is significantly reduced, and the enemies are Stunned for 6s after the Black Hole vanishes."
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"id": "vke",
|
||||||
|
"skillName": "Ravaging Flame",
|
||||||
|
"cooldown": 60,
|
||||||
|
"description": "Summons Vermilion Knight: Eclipse, with a devastating ATK that deals a total of 2650% of ATK as Fire DMG + 350% of ATK as Physical DMG. After that, Might of An-Utu is unleashed, dealing a total of 2600% of ATK as Fire DMG and inflicting a 20% Fire Vulnerability on the target enemies for 10s (this support skill's DMG decays below 85 difficulty)."
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# 분천지
|
||||||
|
|
||||||
|
단심의 먹구름을 소환해 적을 모아 모든 적에게 공격력 1500%의 화염 원소 대미지를 가하고(난이도 85 이하일 경우 대미지 감소), 15초간 적중한 적에게 가하는 모든 원소 대미지가 30% 증가한다. 전장의 캐릭터가 1초마다 SP를 1pt 회복하고, 경직 저항력이 대폭 증가하며, 16%의 원소 관통을 획득한다.
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# 기사의 수호
|
||||||
|
|
||||||
|
성휘의 기사 월백을 소환해 랜스를 휘두르고 필살기를 발동해 총 공격력 930%의 물리 대미지(난이도 85 이하일 경우 대미지 감소)를 가하고, 짧은 시간 출전 발키리가 받는 모든 공격을 막는다.
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# 선혈 폭발
|
||||||
|
|
||||||
|
핏빛 장미의 힘을 빌려 출전 발키리의 HP가 30% 감소하고, 10초간 출전 발키리가 가하는 모든 대미지가 60% 증가한다.
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# 신성한 빛의 심판
|
||||||
|
|
||||||
|
12초간 시공을 발동한다. 발동 기간 2초마다 낙뢰를 발동해 모든 적에게 공격력 100%의 뇌전 원소 대미지를 가하고, 적을 취약 상태로 만들어 방어력을 80% 감소시킨다. 지속 시간: 5초
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# 뇌전 충전
|
||||||
|
|
||||||
|
뇌전여왕의 귀신갑주의 힘을 빌려 즉시 출전 발키리의 SP를 50pt 회복한다.
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# 북극의 눈
|
||||||
|
|
||||||
|
설원 저격수를 소환해 모든 적을 빙결시키고, 적이 받는 물리 대미지를 12초간 35% 증가시킨다. 빙결 종료 후 공격력 150%의 빙결 대미지를 가한다.
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# 인력의 블랙홀
|
||||||
|
|
||||||
|
발키리 채리엇을 소환해 10초간 블랙홀을 발동하고 적을 끌어당기며, 출혈 효과를 부여한다. 끌어당겨진 적은 받는 원거리 물리 대미지가 27% 증가하고, 가하는 모든 대미지가 50% 감소하며, 경직 저항력이 대폭 감소한다. 블랙홀 종료 후 기절을 6초간 부여한다.
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# 영원한 불꽃
|
||||||
|
|
||||||
|
진홍의 기사·월식을 소환해 파멸 공격을 발동하고 총 공격력 2650%의 화염 원소 대미지+공격력 350%의 물리 대미지를 가한다. 그 후 겁멸을 발동해 총 공격력 2600%의 화염 원소 대미지를 가하고, 적중한 적에게 20%의 화염 피해 심화를 부여한다. 지속 시간: 10초(난이도 85 이하일 경우 해당 지원 스킬 대미지 감소).
|
||||||
@@ -150,3 +150,11 @@ export interface PopulatedSignetGroup {
|
|||||||
name: string
|
name: string
|
||||||
sets: SignetSet[]
|
sets: SignetSet[]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface SupportBattlesuit {
|
||||||
|
id: string
|
||||||
|
name: string
|
||||||
|
skillName: string
|
||||||
|
description: string
|
||||||
|
cooldown: number
|
||||||
|
}
|
||||||
|
|||||||
@@ -240,4 +240,12 @@ export const theme: Theme = {
|
|||||||
borderStyle: 'solid',
|
borderStyle: 'solid',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
badges: {
|
||||||
|
primary: {
|
||||||
|
backgroundColor: 'primary',
|
||||||
|
},
|
||||||
|
secondary: {
|
||||||
|
backgroundColor: 'secondary',
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,12 +13,12 @@ import Honkai3rdLayout from '../../../components/layouts/Honkai3rdLayout'
|
|||||||
import {
|
import {
|
||||||
erVersions,
|
erVersions,
|
||||||
rememberanceSigilIds,
|
rememberanceSigilIds,
|
||||||
supportBattlesuitIds,
|
|
||||||
} from '../../../lib/honkai3rd/elysianRealm'
|
} from '../../../lib/honkai3rd/elysianRealm'
|
||||||
import SquareImageBox from '../../../components/atoms/SquareImageBox'
|
import SquareImageBox from '../../../components/atoms/SquareImageBox'
|
||||||
import { assetsBucketBaseUrl } from '../../../lib/consts'
|
import { assetsBucketBaseUrl } from '../../../lib/consts'
|
||||||
import PageLink from '../../../components/atoms/PageLink'
|
import PageLink from '../../../components/atoms/PageLink'
|
||||||
import SignetGroupNavigator from '../../../components/organisms/SignetGroupNavigator'
|
import SignetGroupNavigator from '../../../components/organisms/SignetGroupNavigator'
|
||||||
|
import { getSupportBattlesuits } from '../../../server/data/honkai3rd/elysianRealm'
|
||||||
|
|
||||||
type BattlesuitListItemData = Pick<
|
type BattlesuitListItemData = Pick<
|
||||||
BattlesuitData,
|
BattlesuitData,
|
||||||
@@ -27,9 +27,13 @@ type BattlesuitListItemData = Pick<
|
|||||||
|
|
||||||
interface BattlesuitListPageProps {
|
interface BattlesuitListPageProps {
|
||||||
battlesuitMap: { [id: string]: BattlesuitListItemData }
|
battlesuitMap: { [id: string]: BattlesuitListItemData }
|
||||||
|
supportBattlesuits: { id: string; name: string }[]
|
||||||
}
|
}
|
||||||
|
|
||||||
const ElysianRealmIndexPage = ({ battlesuitMap }: BattlesuitListPageProps) => {
|
const ElysianRealmIndexPage = ({
|
||||||
|
battlesuitMap,
|
||||||
|
supportBattlesuits,
|
||||||
|
}: BattlesuitListPageProps) => {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -90,15 +94,16 @@ const ElysianRealmIndexPage = ({ battlesuitMap }: BattlesuitListPageProps) => {
|
|||||||
<Heading as='h2'>{t('elysian-realm.supports')}</Heading>
|
<Heading as='h2'>{t('elysian-realm.supports')}</Heading>
|
||||||
|
|
||||||
<Flex sx={{ flexWrap: 'wrap' }}>
|
<Flex sx={{ flexWrap: 'wrap' }}>
|
||||||
{supportBattlesuitIds.map((battlesuitId) => {
|
{supportBattlesuits.map(({ id, name }) => {
|
||||||
return (
|
return (
|
||||||
<Card key={battlesuitId} sx={{ p: 1, m: 1 }}>
|
<Card key={id} sx={{ p: 1, m: 1 }} title={name}>
|
||||||
<PageLink
|
<PageLink
|
||||||
href={`/honkai3rd/elysian-realm/support-battlesuits#${battlesuitId}`}
|
href={`/honkai3rd/elysian-realm/support-battlesuits#${id}`}
|
||||||
>
|
>
|
||||||
<SquareImageBox
|
<SquareImageBox
|
||||||
size={70}
|
size={70}
|
||||||
src={`${assetsBucketBaseUrl}/honkai3rd/battlesuits/portrait-${battlesuitId}.png`}
|
alt={name}
|
||||||
|
src={`${assetsBucketBaseUrl}/honkai3rd/battlesuits/portrait-${id}.png`}
|
||||||
/>
|
/>
|
||||||
</PageLink>
|
</PageLink>
|
||||||
</Card>
|
</Card>
|
||||||
@@ -139,9 +144,19 @@ export async function getStaticProps({ locale }: NextPageContext) {
|
|||||||
list.push(...version.battlesuits)
|
list.push(...version.battlesuits)
|
||||||
return list
|
return list
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
|
const supportBattlesuits = getSupportBattlesuits(locale).map(
|
||||||
|
({ id, name }) => {
|
||||||
|
return {
|
||||||
|
id,
|
||||||
|
name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
return {
|
return {
|
||||||
props: {
|
props: {
|
||||||
battlesuitMap: getBattlesuitMapByIds(erBattlesuitIds),
|
battlesuitMap: getBattlesuitMapByIds(erBattlesuitIds),
|
||||||
|
supportBattlesuits,
|
||||||
...(await getI18NProps(locale)),
|
...(await getI18NProps(locale)),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,101 @@
|
|||||||
|
/** @jsxImportSource theme-ui */
|
||||||
|
import {
|
||||||
|
Box,
|
||||||
|
Heading,
|
||||||
|
Flex,
|
||||||
|
Card,
|
||||||
|
Paragraph,
|
||||||
|
Badge,
|
||||||
|
} from '@theme-ui/components'
|
||||||
|
import Breadcrumb from '../../../components/organisms/Breadcrumb'
|
||||||
|
|
||||||
|
import { NextPageContext } from 'next'
|
||||||
|
import { getI18NProps } from '../../../server/i18n'
|
||||||
|
import { useTranslation } from '../../../lib/i18n'
|
||||||
|
import Head from '../../../components/atoms/Head'
|
||||||
|
import Honkai3rdLayout from '../../../components/layouts/Honkai3rdLayout'
|
||||||
|
import { SupportBattlesuit } from '../../../lib/honkai3rd/elysianRealm'
|
||||||
|
import SquareImageBox from '../../../components/atoms/SquareImageBox'
|
||||||
|
import { assetsBucketBaseUrl } from '../../../lib/consts'
|
||||||
|
import { getSupportBattlesuits } from '../../../server/data/honkai3rd/elysianRealm'
|
||||||
|
|
||||||
|
interface BattlesuitListPageProps {
|
||||||
|
supportBattlesuits: SupportBattlesuit[]
|
||||||
|
}
|
||||||
|
|
||||||
|
const ElysianRealmIndexPage = ({
|
||||||
|
supportBattlesuits,
|
||||||
|
}: BattlesuitListPageProps) => {
|
||||||
|
const { t } = useTranslation()
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Honkai3rdLayout>
|
||||||
|
<Head
|
||||||
|
title={`${t('common.honkai-3rd')}: ${t('common.elysian-realm')} ${t(
|
||||||
|
'elysian-realm.supports'
|
||||||
|
)} - ${t('common.abyss-lab')}`}
|
||||||
|
description={`${t('common.elysian-realm')} ${t(
|
||||||
|
'elysian-realm.supports'
|
||||||
|
)}`}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Box p={3}>
|
||||||
|
<Breadcrumb
|
||||||
|
items={[
|
||||||
|
{ href: '/honkai3rd', label: t('common.honkai-3rd') },
|
||||||
|
{
|
||||||
|
href: '/honkai3rd/elysian-realm',
|
||||||
|
label: t('common.elysian-realm'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: '/honkai3rd/elysian-realm/support-battlesuits',
|
||||||
|
label: t('elysian-realm.supports'),
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Heading as='h1'>{t('elysian-realm.supports')}</Heading>
|
||||||
|
|
||||||
|
<Box sx={{ mb: 3 }}>
|
||||||
|
{supportBattlesuits.map(
|
||||||
|
({ id, name, skillName, description, cooldown }) => {
|
||||||
|
return (
|
||||||
|
<Card key={id} sx={{ p: 2, mb: 2 }} id={id}>
|
||||||
|
<Flex>
|
||||||
|
<SquareImageBox
|
||||||
|
size={50}
|
||||||
|
alt={name}
|
||||||
|
src={`${assetsBucketBaseUrl}/honkai3rd/battlesuits/portrait-${id}.png`}
|
||||||
|
mr={2}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
<Heading as='h3' mb={0}>
|
||||||
|
{name} - {skillName}
|
||||||
|
</Heading>
|
||||||
|
<Badge variant='secondary'>Cooldown: {cooldown}s</Badge>
|
||||||
|
<Paragraph>{description}</Paragraph>
|
||||||
|
</Box>
|
||||||
|
</Flex>
|
||||||
|
</Card>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)}
|
||||||
|
</Box>
|
||||||
|
</Box>
|
||||||
|
</Honkai3rdLayout>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ElysianRealmIndexPage
|
||||||
|
|
||||||
|
export async function getStaticProps({ locale }: NextPageContext) {
|
||||||
|
const supportBattlesuits = getSupportBattlesuits(locale)
|
||||||
|
|
||||||
|
return {
|
||||||
|
props: {
|
||||||
|
supportBattlesuits,
|
||||||
|
...(await getI18NProps(locale)),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,9 +1,11 @@
|
|||||||
import { readFileSync } from '../fs'
|
import { readFileSync, readJsonFileSync } from '../fs'
|
||||||
import {
|
import {
|
||||||
PopulatedSignetGroup,
|
PopulatedSignetGroup,
|
||||||
SignetData,
|
SignetData,
|
||||||
signetGroups,
|
signetGroups,
|
||||||
SignetSet,
|
SignetSet,
|
||||||
|
SupportBattlesuit,
|
||||||
|
supportBattlesuitIds,
|
||||||
} from '../../../lib/honkai3rd/elysianRealm'
|
} from '../../../lib/honkai3rd/elysianRealm'
|
||||||
import { getBattlesuitById } from './battlesuits'
|
import { getBattlesuitById } from './battlesuits'
|
||||||
|
|
||||||
@@ -106,6 +108,46 @@ export function getSignetGroupById(id: string, locale = 'en-US') {
|
|||||||
return signetGroupMap[id]
|
return signetGroupMap[id]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getSupportBattlesuits(locale?: string) {
|
||||||
|
return supportBattlesuitIds.map<SupportBattlesuit>((battlesuitId) => {
|
||||||
|
const battlesuit = getBattlesuitById(battlesuitId)!
|
||||||
|
const {
|
||||||
|
skillName,
|
||||||
|
description,
|
||||||
|
cooldown,
|
||||||
|
}: { skillName: string; description: string; cooldown: number } =
|
||||||
|
readJsonFileSync(
|
||||||
|
`honkai3rd/elysianRealm/supportBattlesuits/${battlesuitId}.json`
|
||||||
|
)
|
||||||
|
|
||||||
|
let localizedName = battlesuit.name
|
||||||
|
let localizedSkillName = skillName
|
||||||
|
let localizedDescription = description
|
||||||
|
|
||||||
|
if (locale === 'ko-KR') {
|
||||||
|
const [krSkillName, ...krDescriptionLines] = readFileSync(
|
||||||
|
`honkai3rd/ko-KR/elysianRealm/supportBattlesuits/${battlesuitId}.md`
|
||||||
|
)
|
||||||
|
.toString()
|
||||||
|
.trim()
|
||||||
|
.slice(2)
|
||||||
|
.split('\n\n')
|
||||||
|
|
||||||
|
localizedName = battlesuit.krName!
|
||||||
|
localizedSkillName = krSkillName
|
||||||
|
localizedDescription = krDescriptionLines.join('\n').trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
id: battlesuitId,
|
||||||
|
name: localizedName,
|
||||||
|
skillName: localizedSkillName,
|
||||||
|
description: localizedDescription,
|
||||||
|
cooldown,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
function parseNormalSignetsRawData(setId: string, data: string) {
|
function parseNormalSignetsRawData(setId: string, data: string) {
|
||||||
const signetSections = data.replace(/\\\*/g, '*').slice(2).split('\n# ')
|
const signetSections = data.replace(/\\\*/g, '*').slice(2).split('\n# ')
|
||||||
const signets: SignetData[] = []
|
const signets: SignetData[] = []
|
||||||
|
|||||||
Reference in New Issue
Block a user