Add weapons and items from April and early May (#420)
* Chloe and Kolulu * Fire and Dark Omega Rebirth weapons * LuciZero pendulums --------- Co-authored-by: Justin Edmund <383021+jedmund@users.noreply.github.com>
This commit is contained in:
parent
4bc211c240
commit
4a30dbbf9f
6 changed files with 147 additions and 24 deletions
|
|
@ -7,6 +7,34 @@ const ContentUpdate2024 = () => {
|
|||
|
||||
return (
|
||||
<>
|
||||
<ContentUpdate
|
||||
version="2024-05U1"
|
||||
dateString="2024/05/02"
|
||||
event="events.content"
|
||||
newItems={{
|
||||
weapon: [
|
||||
'1040026100',
|
||||
'1040317400',
|
||||
'1040423100',
|
||||
'1040119500',
|
||||
'1040618800',
|
||||
'1040916300',
|
||||
],
|
||||
}}
|
||||
transcendedItems={{
|
||||
summon: ['2040034000', '2040046000'],
|
||||
}}
|
||||
numNotes={4}
|
||||
/>
|
||||
<ContentUpdate
|
||||
version="2024-04L"
|
||||
dateString="2024/04/30"
|
||||
event="events.legfest"
|
||||
newItems={{
|
||||
character: ['3040529000', '3040530000'],
|
||||
weapon: ['1040219200', '1040119400', '1040618700', '1030109000'],
|
||||
}}
|
||||
/>
|
||||
<ContentUpdate
|
||||
version="2024-04U2"
|
||||
dateString="2024/04/21"
|
||||
|
|
|
|||
|
|
@ -0,0 +1,9 @@
|
|||
.errors {
|
||||
color: $error;
|
||||
display: none;
|
||||
padding: $unit 0;
|
||||
|
||||
&.visible {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,4 +1,7 @@
|
|||
import React, { useEffect, useState } from 'react'
|
||||
import { useRouter } from 'next/router'
|
||||
import { useTranslation } from 'next-i18next'
|
||||
import classNames from 'classnames'
|
||||
|
||||
import Select from '~components/common/Select'
|
||||
import SelectGroup from '~components/common/SelectGroup'
|
||||
|
|
@ -11,12 +14,14 @@ import styles from './index.module.scss'
|
|||
// Props
|
||||
interface Props {
|
||||
open: boolean
|
||||
gridWeapon: GridWeapon
|
||||
weaponKey?: WeaponKey
|
||||
series: number
|
||||
slot: number
|
||||
onChange?: (value: WeaponKey, slot: number) => void
|
||||
onOpenChange: () => void
|
||||
onClose?: () => void
|
||||
sendValidity: (isValid: boolean) => void
|
||||
}
|
||||
|
||||
// Constants
|
||||
|
|
@ -47,10 +52,33 @@ const emptyWeaponKey: WeaponKey = {
|
|||
|
||||
const WeaponKeySelect = React.forwardRef<HTMLButtonElement, Props>(
|
||||
function useFieldSet(
|
||||
{ open, weaponKey, series, slot, onChange, onOpenChange, onClose },
|
||||
{
|
||||
open,
|
||||
gridWeapon,
|
||||
weaponKey,
|
||||
series,
|
||||
slot,
|
||||
onChange,
|
||||
onOpenChange,
|
||||
onClose,
|
||||
sendValidity,
|
||||
},
|
||||
ref
|
||||
) {
|
||||
const router = useRouter()
|
||||
const locale =
|
||||
router.locale && ['en', 'ja'].includes(router.locale)
|
||||
? router.locale
|
||||
: 'en'
|
||||
const { t } = useTranslation('common')
|
||||
|
||||
const [keys, setKeys] = useState<WeaponKey[][]>([])
|
||||
const [error, setError] = useState('')
|
||||
|
||||
const errorClasses = classNames({
|
||||
[styles.errors]: true,
|
||||
[styles.visible]: error !== '',
|
||||
})
|
||||
|
||||
useEffect(() => {
|
||||
const keys = flattenWeaponKeys()
|
||||
|
|
@ -134,7 +162,18 @@ const WeaponKeySelect = React.forwardRef<HTMLButtonElement, Props>(
|
|||
const keys = flattenWeaponKeys()
|
||||
const found = keys.find((key) => key.id == value)
|
||||
const weaponKey = found ? found : emptyWeaponKey
|
||||
if (onChange) onChange(weaponKey, slot)
|
||||
|
||||
if (
|
||||
['14005', '14006', '14007'].includes(`${weaponKey.granblue_id}`) &&
|
||||
gridWeapon.transcendence_step < 3
|
||||
) {
|
||||
setError(`${weaponKey.name[locale]} requires 3rd Transcendence`)
|
||||
sendValidity(false)
|
||||
} else if (onChange) {
|
||||
setError('')
|
||||
onChange(weaponKey, slot)
|
||||
sendValidity(true)
|
||||
}
|
||||
}
|
||||
|
||||
const emptyOption = () => {
|
||||
|
|
@ -148,6 +187,7 @@ const WeaponKeySelect = React.forwardRef<HTMLButtonElement, Props>(
|
|||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<Select
|
||||
key={`weapon-key-${slot}`}
|
||||
value={weaponKey ? weaponKey.id : emptyWeaponKey.id}
|
||||
|
|
@ -168,6 +208,8 @@ const WeaponKeySelect = React.forwardRef<HTMLButtonElement, Props>(
|
|||
return weaponKeyGroup(i)
|
||||
})}
|
||||
</Select>
|
||||
<p className={errorClasses}>{error}</p>
|
||||
</>
|
||||
)
|
||||
}
|
||||
)
|
||||
|
|
|
|||
|
|
@ -50,6 +50,12 @@ const WeaponModal = ({
|
|||
|
||||
// State: Component
|
||||
const [alertOpen, setAlertOpen] = useState(false)
|
||||
const [keysValid, setKeysValid] = useState<boolean[]>([
|
||||
true,
|
||||
true,
|
||||
true,
|
||||
true,
|
||||
])
|
||||
const [formValid, setFormValid] = useState(false)
|
||||
|
||||
// State: Selects
|
||||
|
|
@ -149,6 +155,12 @@ const WeaponModal = ({
|
|||
setFormValid(isValid)
|
||||
}
|
||||
|
||||
function receiveKeyValidity(isValid: boolean, slot: number) {
|
||||
const newKeysValid = keysValid
|
||||
newKeysValid[slot] = isValid
|
||||
setKeysValid(newKeysValid)
|
||||
}
|
||||
|
||||
// Methods: Data submission
|
||||
function prepareObject() {
|
||||
let object: GridWeaponObject = { weapon: {} }
|
||||
|
|
@ -159,9 +171,17 @@ const WeaponModal = ({
|
|||
object.weapon.weapon_key1_id = weaponKey1.id
|
||||
}
|
||||
|
||||
if ([2, 3, 17, 34].includes(gridWeapon.object.series) && weaponKey2)
|
||||
if ([2, 3, 17, 34].includes(gridWeapon.object.series) && weaponKey2) {
|
||||
object.weapon.weapon_key2_id = weaponKey2.id
|
||||
|
||||
if (
|
||||
['14005', '14006', '14007'].includes(weaponKey2.granblue_id) &&
|
||||
gridWeapon.transcendence_step < 3
|
||||
) {
|
||||
object.weapon.weapon_key2_id = undefined
|
||||
}
|
||||
}
|
||||
|
||||
if ([17].includes(gridWeapon.object.series) && weaponKey3)
|
||||
object.weapon.weapon_key3_id = weaponKey3.id
|
||||
|
||||
|
|
@ -356,12 +376,14 @@ const WeaponModal = ({
|
|||
{[2, 3, 17, 22, 34].includes(gridWeapon.object.series) ? (
|
||||
<WeaponKeySelect
|
||||
open={weaponKey1Open}
|
||||
gridWeapon={gridWeapon}
|
||||
weaponKey={weaponKey1}
|
||||
series={gridWeapon.object.series}
|
||||
slot={0}
|
||||
onOpenChange={() => openSelect(1)}
|
||||
onChange={receiveWeaponKey}
|
||||
onClose={() => setWeaponKey1Open(false)}
|
||||
sendValidity={(valid: boolean) => receiveKeyValidity(valid, 0)}
|
||||
/>
|
||||
) : (
|
||||
''
|
||||
|
|
@ -370,12 +392,14 @@ const WeaponModal = ({
|
|||
{[2, 3, 17, 34].includes(gridWeapon.object.series) ? (
|
||||
<WeaponKeySelect
|
||||
open={weaponKey2Open}
|
||||
gridWeapon={gridWeapon}
|
||||
weaponKey={weaponKey2}
|
||||
series={gridWeapon.object.series}
|
||||
slot={1}
|
||||
onOpenChange={() => openSelect(2)}
|
||||
onChange={receiveWeaponKey}
|
||||
onClose={() => setWeaponKey2Open(false)}
|
||||
sendValidity={(valid: boolean) => receiveKeyValidity(valid, 1)}
|
||||
/>
|
||||
) : (
|
||||
''
|
||||
|
|
@ -384,12 +408,14 @@ const WeaponModal = ({
|
|||
{[17].includes(gridWeapon.object.series) ? (
|
||||
<WeaponKeySelect
|
||||
open={weaponKey3Open}
|
||||
gridWeapon={gridWeapon}
|
||||
weaponKey={weaponKey3}
|
||||
series={gridWeapon.object.series}
|
||||
slot={2}
|
||||
onOpenChange={() => openSelect(3)}
|
||||
onChange={receiveWeaponKey}
|
||||
onClose={() => setWeaponKey3Open(false)}
|
||||
sendValidity={(valid: boolean) => receiveKeyValidity(valid, 2)}
|
||||
/>
|
||||
) : (
|
||||
''
|
||||
|
|
@ -398,12 +424,14 @@ const WeaponModal = ({
|
|||
{gridWeapon.object.series == 24 && gridWeapon.object.uncap.ulb ? (
|
||||
<WeaponKeySelect
|
||||
open={weaponKey4Open}
|
||||
gridWeapon={gridWeapon}
|
||||
weaponKey={weaponKey1}
|
||||
series={gridWeapon.object.series}
|
||||
slot={0}
|
||||
onOpenChange={() => openSelect(4)}
|
||||
onChange={receiveWeaponKey}
|
||||
onClose={() => setWeaponKey4Open(false)}
|
||||
sendValidity={(valid: boolean) => receiveKeyValidity(valid, 4)}
|
||||
/>
|
||||
) : (
|
||||
''
|
||||
|
|
@ -496,7 +524,7 @@ const WeaponModal = ({
|
|||
bound={true}
|
||||
onClick={handleUpdateWeapon}
|
||||
key="confirm"
|
||||
disabled={!formValid}
|
||||
disabled={!formValid || keysValid.includes(false)}
|
||||
text={t('modals.weapon.buttons.confirm')}
|
||||
/>,
|
||||
]}
|
||||
|
|
|
|||
|
|
@ -29,6 +29,14 @@
|
|||
"uncap": "Uncap"
|
||||
},
|
||||
"versions": {
|
||||
"2024-05U1": {
|
||||
"features": [
|
||||
"Added new raids: Colossus Ira Omega (Impossible) and Celeste Ater Omega (Impossible)",
|
||||
"Pendulum of Extremity, Pendulum of Sagacity, and Pendulum of Supremacy added (I kept forgetting about these)",
|
||||
"Only Dark Opus Weapons at Transcendence Lv3 or higher can equip the new Pendulums",
|
||||
"Fixed a bug where users could not set the awakening level on some Grand weapons"
|
||||
]
|
||||
},
|
||||
"2024-03U3": {
|
||||
"features": [
|
||||
"Added new raids: Tiamat Aura Omega (Impossible) and Luminiera Credo Omega (Impossible)",
|
||||
|
|
|
|||
|
|
@ -29,6 +29,14 @@
|
|||
"uncap": "上限解放"
|
||||
},
|
||||
"versions": {
|
||||
"2024-05U1": {
|
||||
"features": [
|
||||
"新マルチバトル追加「コロッサス・イラマグナHL」「セレスト・アーテルマグナHL」",
|
||||
"新ペンデュラム追加「絶涯のペンデュラム」「窮理のペンデュラム」「天髄のペンデュラム」(忘れてしまいました、申し訳ありません)",
|
||||
"限界超越レベル3以上の終末武器しか新ペンデュラムが装備することができません",
|
||||
"リミテッド武器の覚醒Lvが変更できない不具合を修正"
|
||||
]
|
||||
},
|
||||
"2024-03U3": {
|
||||
"features": [
|
||||
"新マルチバトル追加「ティアマト・アウラマグナHL」「シュヴァリエ・クレドマグナHL」",
|
||||
|
|
|
|||
Loading…
Reference in a new issue