diff --git a/data/as.json.br b/data/as.json.br index b5105e4..29cb6b8 100644 Binary files a/data/as.json.br and b/data/as.json.br differ diff --git a/data/avatar.json.br b/data/avatar.json.br index 1249ca2..b85188d 100644 Binary files a/data/avatar.json.br and b/data/avatar.json.br differ diff --git a/data/lightcone.json.br b/data/lightcone.json.br index a283c2e..24595db 100644 Binary files a/data/lightcone.json.br and b/data/lightcone.json.br differ diff --git a/data/metadata.json.br b/data/metadata.json.br index f1adbd7..59144b2 100644 Binary files a/data/metadata.json.br and b/data/metadata.json.br differ diff --git a/data/moc.json.br b/data/moc.json.br index f7c08c7..4ce9019 100644 Binary files a/data/moc.json.br and b/data/moc.json.br differ diff --git a/data/monster.json.br b/data/monster.json.br index 9f0ccc7..9f75b4c 100644 Binary files a/data/monster.json.br and b/data/monster.json.br differ diff --git a/data/peak.json.br b/data/peak.json.br index 5d587db..4d75db0 100644 Binary files a/data/peak.json.br and b/data/peak.json.br differ diff --git a/data/pf.json.br b/data/pf.json.br index be248bb..ed04ab1 100644 Binary files a/data/pf.json.br and b/data/pf.json.br differ diff --git a/data/relic.json.br b/data/relic.json.br index dd4f102..51f0bab 100644 Binary files a/data/relic.json.br and b/data/relic.json.br differ diff --git a/messages/de.json b/messages/de.json index 871d1aa..d857abb 100644 --- a/messages/de.json +++ b/messages/de.json @@ -189,6 +189,12 @@ "useTurbulenceBuff": "Turbulenz-Buff verwenden?", "firstHalfEnemies": "Gegner erste Hälfte", "secondHalfEnemies": "Gegner zweite Hälfte", + "firstNodeEnemies": "Gegner Knoten 1", + "secondNodeEnemies": "Gegner Knoten 2", + "thirdNodeEnemies": "Gegner Knoten 3", + "firstNode": "Knoten 1", + "secondNode": "Knoten 2", + "thirdNode": "Knoten 3", "listEnemies": "Gegnerliste", "turbulenceBuff": "Turbulenz-Buff", "noEventSelected": "Kein Ereignis ausgewählt", diff --git a/messages/en.json b/messages/en.json index bba291a..59cecb8 100644 --- a/messages/en.json +++ b/messages/en.json @@ -189,6 +189,12 @@ "useTurbulenceBuff": "Use turbulence buff?", "firstHalfEnemies": "First half enemies", "secondHalfEnemies": "Second half enemies", + "firstNodeEnemies": "First node enemies", + "secondNodeEnemies": "Second node enemies", + "thirdNodeEnemies": "Third node enemies", + "firstNode": "First Node", + "secondNode": "Second Node", + "thirdNode": "Third Node", "listEnemies": "List enemies", "turbulenceBuff": "Turbulence Buff", "noEventSelected": "No event selected", diff --git a/messages/es.json b/messages/es.json index 5157145..4d1560e 100644 --- a/messages/es.json +++ b/messages/es.json @@ -189,6 +189,12 @@ "useTurbulenceBuff": "¿Usar buff de turbulencia?", "firstHalfEnemies": "Enemigos primera mitad", "secondHalfEnemies": "Enemigos segunda mitad", + "firstNodeEnemies": "Enemigos del nodo 1", + "secondNodeEnemies": "Enemigos del nodo 2", + "thirdNodeEnemies": "Enemigos del nodo 3", + "firstNode": "Nodo 1", + "secondNode": "Nodo 2", + "thirdNode": "Nodo 3", "listEnemies": "Lista de enemigos", "turbulenceBuff": "Buff de Turbulencia", "noEventSelected": "Ningún evento seleccionado", diff --git a/messages/fr.json b/messages/fr.json index d71e356..cbb21ae 100644 --- a/messages/fr.json +++ b/messages/fr.json @@ -189,6 +189,12 @@ "useTurbulenceBuff": "Utiliser le buff de turbulence ?", "firstHalfEnemies": "Ennemis première moitié", "secondHalfEnemies": "Ennemis deuxième moitié", + "firstNodeEnemies": "Ennemis du nœud 1", + "secondNodeEnemies": "Ennemis du nœud 2", + "thirdNodeEnemies": "Ennemis du nœud 3", + "firstNode": "Nœud 1", + "secondNode": "Nœud 2", + "thirdNode": "Nœud 3", "listEnemies": "Liste des ennemis", "turbulenceBuff": "Buff de Turbulence", "noEventSelected": "Aucun événement sélectionné", diff --git a/messages/id.json b/messages/id.json index 13b56d8..a1d3949 100644 --- a/messages/id.json +++ b/messages/id.json @@ -189,6 +189,12 @@ "useTurbulenceBuff": "Gunakan buff turbulence?", "firstHalfEnemies": "Musuh paruh pertama", "secondHalfEnemies": "Musuh paruh kedua", + "firstNodeEnemies": "Musuh Node 1", + "secondNodeEnemies": "Musuh Node 2", + "thirdNodeEnemies": "Musuh Node 3", + "firstNode": "Node 1", + "secondNode": "Node 2", + "thirdNode": "Node 3", "listEnemies": "Daftar musuh", "turbulenceBuff": "Turbulence Buff", "noEventSelected": "Tidak ada event dipilih", diff --git a/messages/ja.json b/messages/ja.json index de6ef5c..8f0e6e0 100644 --- a/messages/ja.json +++ b/messages/ja.json @@ -189,6 +189,12 @@ "useTurbulenceBuff": "乱気流バフを使用しますか?", "firstHalfEnemies": "前半の敵", "secondHalfEnemies": "後半の敵", + "firstNodeEnemies": "ノード 1 の敵", + "secondNodeEnemies": "ノード 2 の敵", + "thirdNodeEnemies": "ノード 3 の敵", + "firstNode": "ノード 1", + "secondNode": "ノード 2", + "thirdNode": "ノード 3", "turbulenceBuff": "乱気流バフ", "noEventSelected": "イベントが選択されていません", "noTurbulenceBuff": "乱気流バフがありません", diff --git a/messages/ko.json b/messages/ko.json index 5868708..dad78ae 100644 --- a/messages/ko.json +++ b/messages/ko.json @@ -189,6 +189,12 @@ "useTurbulenceBuff": "난류 버프 사용?", "firstHalfEnemies": "전반 적", "secondHalfEnemies": "후반 적", + "firstNodeEnemies": "노드 1 적", + "secondNodeEnemies": "노드 2 적", + "thirdNodeEnemies": "노드 3 적", + "firstNode": "노드 1", + "secondNode": "노드 2", + "thirdNode": "노드 3", "turbulenceBuff": "난류 버프", "noEventSelected": "이벤트가 선택되지 않음", "noTurbulenceBuff": "난류 버프가 없음", diff --git a/messages/pt.json b/messages/pt.json index a333a4a..d925603 100644 --- a/messages/pt.json +++ b/messages/pt.json @@ -189,6 +189,12 @@ "useTurbulenceBuff": "Usar buff de turbulência?", "firstHalfEnemies": "Inimigos da primeira metade", "secondHalfEnemies": "Inimigos da segunda metade", + "firstNodeEnemies": "Inimigos do nodo 1", + "secondNodeEnemies": "Inimigos do nodo 2", + "thirdNodeEnemies": "Inimigos do nodo 3", + "firstNode": "Nodo 1", + "secondNode": "Nodo 2", + "thirdNode": "Nodo 3", "listEnemies": "Lista de inimigos", "turbulenceBuff": "Buff de Turbulência", "noEventSelected": "Nenhum evento selecionado", diff --git a/messages/ru.json b/messages/ru.json index d0f9603..5dd699b 100644 --- a/messages/ru.json +++ b/messages/ru.json @@ -189,6 +189,12 @@ "useTurbulenceBuff": "Использовать бафф турбулентности?", "firstHalfEnemies": "Враги первой половины", "secondHalfEnemies": "Враги второй половины", + "firstNodeEnemies": "Враги узла 1", + "secondNodeEnemies": "Враги узла 2", + "thirdNodeEnemies": "Враги узла 3", + "firstNode": "Узел 1", + "secondNode": "Узел 2", + "thirdNode": "Узел 3", "listEnemies": "Список врагов", "turbulenceBuff": "Бафф турбулентности", "noEventSelected": "Событие не выбрано", diff --git a/messages/th.json b/messages/th.json index 96aca71..b59f57b 100644 --- a/messages/th.json +++ b/messages/th.json @@ -189,6 +189,12 @@ "useTurbulenceBuff": "ใช้บัฟบรรยากาศหรือไม่?", "firstHalfEnemies": "ศัตรูครึ่งแรก", "secondHalfEnemies": "ศัตรูครึ่งหลัง", + "firstNodeEnemies": "ศัตรูโหนด 1", + "secondNodeEnemies": "ศัตรูโหนด 2", + "thirdNodeEnemies": "ศัตรูโหนด 3", + "firstNode": "โหนด 1", + "secondNode": "โหนด 2", + "thirdNode": "โหนด 3", "listEnemies": "รายการศัตรู", "turbulenceBuff": "บัฟบรรยากาศ", "noEventSelected": "ไม่ได้เลือกอีเวนต์", diff --git a/messages/vi.json b/messages/vi.json index 42f0ddf..073e6d2 100644 --- a/messages/vi.json +++ b/messages/vi.json @@ -189,6 +189,12 @@ "useTurbulenceBuff": "Dùng buff hỗn loạn?", "firstHalfEnemies": "Địch nửa đầu", "secondHalfEnemies": "Địch nửa sau", + "firstNodeEnemies": "Địch Node 1", + "secondNodeEnemies": "Địch Node 2", + "thirdNodeEnemies": "Địch Node 3", + "firstNode": "Node 1", + "secondNode": "Node 2", + "thirdNode": "Node 3", "turbulenceBuff": "Buff hỗn loạn", "noEventSelected": "Không có sự kiện", "noTurbulenceBuff": "Không có buff hỗn loạn", diff --git a/messages/zh.json b/messages/zh.json index 6cbbacf..c399868 100644 --- a/messages/zh.json +++ b/messages/zh.json @@ -189,6 +189,12 @@ "useTurbulenceBuff": "使用记忆紊流?", "firstHalfEnemies": "上半场敌人", "secondHalfEnemies": "下半场敌人", + "firstNodeEnemies": "节点 1 敌人", + "secondNodeEnemies": "节点 2 敌人", + "thirdNodeEnemies": "节点 3 敌人", + "firstNode": "节点 1", + "secondNode": "节点 2", + "thirdNode": "节点 3", "turbulenceBuff": "增益效果", "noEventSelected": "未选择事件", "noTurbulenceBuff": "未选择增益效果", diff --git a/src/components/monsterBar/as.tsx b/src/components/monsterBar/as.tsx index 4551d98..6d799c0 100644 --- a/src/components/monsterBar/as.tsx +++ b/src/components/monsterBar/as.tsx @@ -5,7 +5,7 @@ import { calcMonsterStats, getLocaleName, replaceByParam } from "@/helper"; import useLocaleStore from "@/stores/localeStore"; import useUserDataStore from "@/stores/userDataStore"; import Image from "next/image"; -import { MonsterStore } from "@/types"; +import { ASEvent, MonsterStore } from "@/types"; import { useTranslations } from "next-intl"; import useDetailDataStore from "@/stores/detailDataStore"; @@ -16,7 +16,6 @@ export default function AsBar() { setAsConfig } = useUserDataStore() const { mapMonster, mapAS, damageType, hardLevelConfig, eliteConfig } = useDetailDataStore() - const transI18n = useTranslations("DataPage") const challengeSelected = useMemo(() => { @@ -27,20 +26,52 @@ export default function AsBar() { return mapAS[as_config.event_id.toString()] }, [as_config, mapAS]) + + const floorSideList = useMemo(() => { + if (!eventSelected) return []; + + const floorList = [ + { + id: "firstNode", + name: transI18n("firstNode"), + wave: transI18n("firstNodeEnemies") + }, + { + id: "secondNode", + name: transI18n("secondNode"), + wave: transI18n("secondNodeEnemies") + }, + + ] + + if (eventSelected?.Tierce && eventSelected.Tierce.PreChallenge === as_config.challenge_id) { + floorList.push({ + id: "thirdNode", + name: transI18n("thirdNode"), + wave: transI18n("thirdNodeEnemies") + }) + } + return floorList + }, [as_config.challenge_id, eventSelected, transI18n]) + const buffList = useMemo(() => { if (!eventSelected) return []; - if (as_config.floor_side === "Upper" || as_config.floor_side === "Upper -> Lower") { + if (as_config.floor_side === "firstNode") { return eventSelected?.BuffList1 ?? []; } - if (as_config.floor_side === "Lower" || as_config.floor_side === "Lower -> Upper") { + if (as_config.floor_side === "secondNode") { return eventSelected?.BuffList2 ?? []; } + + if (as_config.floor_side === "thirdNode" && eventSelected?.BuffList3) { + return eventSelected?.BuffList3 ?? []; + } + return []; }, [as_config.floor_side, eventSelected]); - useEffect(() => { if (!challengeSelected || as_config.event_id === 0 || as_config.challenge_id === 0) return const newBattleConfig = structuredClone(as_config) @@ -65,67 +96,36 @@ export default function AsBar() { newBattleConfig.monsters = [] newBattleConfig.stage_id = 0 - if ((as_config.floor_side === "Upper" || as_config.floor_side === "Upper -> Lower") - && challengeSelected.EventList1.length > 0) { - newBattleConfig.stage_id = challengeSelected.EventList1[0].ID - for (const wave of challengeSelected.EventList1[0].MonsterList) { + + let targetEventList: ASEvent[] = [] + if (as_config.floor_side === "firstNode" && challengeSelected.EventList1.length > 0) { + targetEventList = challengeSelected.EventList1 + } else if (as_config.floor_side === "secondNode" && challengeSelected.EventList2.length > 0) { + targetEventList = challengeSelected.EventList2 + } else if (as_config.floor_side === "thirdNode" && eventSelected?.Tierce && eventSelected.Tierce.EventList.length > 0) { + targetEventList = eventSelected.Tierce.EventList + } + + if (targetEventList.length > 0) { + newBattleConfig.stage_id = targetEventList[0].ID + for (const wave of targetEventList[0].MonsterList) { const newWave: MonsterStore[] = [] for (const value of Object.values(wave)) { newWave.push({ monster_id: value, - level: challengeSelected.EventList1[0].Level, - amount: 1, - }) - } - newBattleConfig.monsters.push(newWave) - } - } - if ((as_config.floor_side === "Lower" || as_config.floor_side === "Lower -> Upper") - && challengeSelected.EventList2.length > 0) { - newBattleConfig.stage_id = challengeSelected.EventList2[0].ID - for (const wave of challengeSelected.EventList2[0].MonsterList) { - const newWave: MonsterStore[] = [] - for (const value of Object.values(wave)) { - newWave.push({ - monster_id: value, - level: challengeSelected.EventList2[0].Level, - amount: 1, - }) - } - newBattleConfig.monsters.push(newWave) - } - } - if (as_config.floor_side === "Lower -> Upper" - && challengeSelected.EventList1.length > 0) { - for (const wave of challengeSelected.EventList1[0].MonsterList) { - const newWave: MonsterStore[] = [] - for (const value of Object.values(wave)) { - newWave.push({ - monster_id: value, - level: challengeSelected.EventList1[0].Level, - amount: 1, - }) - } - newBattleConfig.monsters.push(newWave) - } - } else if (as_config.floor_side === "Upper -> Lower" - && challengeSelected.EventList2.length > 0) { - for (const wave of challengeSelected.EventList2[0].MonsterList) { - const newWave: MonsterStore[] = [] - for (const value of Object.values(wave)) { - newWave.push({ - monster_id: value, - level: challengeSelected.EventList2[0].Level, + level: targetEventList[0].Level, amount: 1, }) } newBattleConfig.monsters.push(newWave) } } + setAsConfig(newBattleConfig) // eslint-disable-next-line react-hooks/exhaustive-deps }, [ challengeSelected, + eventSelected, mapAS, as_config.event_id, as_config.challenge_id, @@ -186,10 +186,9 @@ export default function AsBar() { onChange={(e) => setAsConfig({ ...as_config, floor_side: e.target.value })} > - - - - + {floorSideList.map((side) => { + return + })} @@ -233,182 +232,107 @@ export default function AsBar() { {/* Enemy Waves */} {(as_config?.challenge_id ?? 0) !== 0 && ( -
- {/* First Half */} -
-

{transI18n("firstHalfEnemies")}

+
+ {floorSideList.map((side, i) => { + const eventList = side.id === "firstNode" + ? challengeSelected?.EventList1 + : side.id === "secondNode" + ? challengeSelected?.EventList2 + : side.id === "thirdNode" + ? eventSelected?.Tierce?.EventList + : []; - {challengeSelected && challengeSelected?.EventList1?.length > 0 && challengeSelected?.EventList1?.[0]?.MonsterList?.map((wave, waveIndex) => ( -
-

{transI18n("wave")} {waveIndex + 1}

-
- {Object.values(wave).map((waveValue, enemyIndex) => { - const monsterStats = calcMonsterStats( - mapMonster?.[waveValue.toString()], - challengeSelected?.EventList1?.[0]?.EliteGroup, - challengeSelected?.EventList1?.[0]?.HardLevelGroup, - challengeSelected?.EventList1?.[0]?.Level, - hardLevelConfig, - eliteConfig - ); - return ( -
-
- Lv. {challengeSelected?.EventList1[0].Level} -
+ if (!eventList || eventList.length === 0) return null; + const targetEvent = eventList[0]; -
- {mapMonster?.[waveValue.toString()]?.Image?.IconPath && ( -
- Enemy Icon -
- )} -
+ return ( +
+

{side.wave}

-
-
-
- HP - {monsterStats.hp.toLocaleString(undefined, { maximumFractionDigits: 0 })} -
- -
- Speed - {monsterStats.spd.toLocaleString(undefined, { maximumFractionDigits: 0 })} -
- -
- Toughness - {monsterStats.stance.toLocaleString(undefined, { maximumFractionDigits: 0 })} -
+ {targetEvent?.MonsterList?.map((wave, waveIndex) => ( +
+

{transI18n("wave")} {waveIndex + 1}

+
+ {Object.values(wave).map((waveValue, enemyIndex) => { + const monsterStats = calcMonsterStats( + mapMonster?.[waveValue.toString()], + targetEvent?.EliteGroup, + targetEvent?.HardLevelGroup, + targetEvent?.Level, + hardLevelConfig, + eliteConfig + ); + return ( +
+
+ Lv. {targetEvent.Level}
-
- - Weakness - -
- {mapMonster?.[waveValue.toString()]?.StanceWeakList?.map((icon, iconIndex) => ( +
+ {mapMonster?.[waveValue.toString()]?.Image?.IconPath && ( +
{icon} - ))} +
+ )} +
+ +
+
+
+ HP + {monsterStats.hp.toLocaleString(undefined, { maximumFractionDigits: 0 })} +
+ +
+ Speed + {monsterStats.spd.toLocaleString(undefined, { maximumFractionDigits: 0 })} +
+ +
+ Toughness + {monsterStats.stance.toLocaleString(undefined, { maximumFractionDigits: 0 })} +
+
+ +
+ + Weakness + +
+ {mapMonster?.[waveValue.toString()]?.StanceWeakList?.map((icon, iconIndex) => ( + {icon} + ))} +
-
- ) - })} + ) + })} +
-
- ))} -
- - {/* Second Half */} -
-

{transI18n("secondHalfEnemies")}

- - {challengeSelected && challengeSelected?.EventList2?.length > 0 && challengeSelected?.EventList2?.[0]?.MonsterList?.map((wave, waveIndex) => ( -
-

{transI18n("wave")} {waveIndex + 1}

-
- {Object.values(wave).map((waveValue, enemyIndex) => { - const monsterStats = calcMonsterStats( - mapMonster?.[waveValue.toString()], - challengeSelected?.EventList2?.[0]?.EliteGroup, - challengeSelected?.EventList2?.[0]?.HardLevelGroup, - challengeSelected?.EventList2?.[0]?.Level, - hardLevelConfig, - eliteConfig - ); - return ( -
-
- Lv. {challengeSelected?.EventList2[0].Level} -
- -
- {mapMonster?.[waveValue.toString()]?.Image?.IconPath && ( -
- Enemy Icon -
- )} -
- -
-
-
- HP - {monsterStats.hp.toLocaleString(undefined, { maximumFractionDigits: 0 })} -
- -
- Speed - {monsterStats.spd.toLocaleString(undefined, { maximumFractionDigits: 0 })} -
- -
- Toughness - {monsterStats.stance.toLocaleString(undefined, { maximumFractionDigits: 0 })} -
-
- -
- - Weakness - -
- {mapMonster?.[waveValue.toString()]?.StanceWeakList?.map((icon, iconIndex) => ( - {icon} - ))} -
-
-
-
- ) - })} -
-
- ))} -
+ ))} +
+ )})}
)} diff --git a/src/components/monsterBar/moc.tsx b/src/components/monsterBar/moc.tsx index 8901555..6cfac7f 100644 --- a/src/components/monsterBar/moc.tsx +++ b/src/components/monsterBar/moc.tsx @@ -7,7 +7,7 @@ import useLocaleStore from "@/stores/localeStore"; import useUserDataStore from "@/stores/userDataStore"; import Image from "next/image"; import { useTranslations } from "next-intl"; -import { MonsterStore } from "@/types"; +import { MoCEvent, MonsterStore } from "@/types"; import useDetailDataStore from "@/stores/detailDataStore"; export default function MocBar() { @@ -28,6 +28,33 @@ export default function MocBar() { return mapMoc[moc_config.event_id.toString()] }, [moc_config, mapMoc]) + const floorSideList = useMemo(() => { + if (!eventSelected) return []; + + const floorList = [ + { + id: "firstNode", + name: transI18n("firstNode"), + wave: transI18n("firstNodeEnemies") + }, + { + id: "secondNode", + name: transI18n("secondNode"), + wave: transI18n("secondNodeEnemies") + }, + + ] + + if (eventSelected?.Tierce && eventSelected.Tierce.PreChallenge === moc_config.challenge_id) { + floorList.push({ + id: "thirdNode", + name: transI18n("thirdNode"), + wave: transI18n("thirdNodeEnemies") + }) + } + return floorList + }, [moc_config.challenge_id, eventSelected, transI18n]) + useEffect(() => { if (!challengeSelected || moc_config.event_id === 0 || moc_config.challenge_id === 0) return @@ -47,62 +74,36 @@ export default function MocBar() { } newBattleConfig.monsters = [] newBattleConfig.stage_id = 0 - if ((moc_config.floor_side === "Upper" || moc_config.floor_side === "Upper -> Lower") && challengeSelected.EventList1.length > 0) { - newBattleConfig.stage_id = challengeSelected.EventList1[0].ID - for (const wave of challengeSelected.EventList1[0].MonsterList) { + + let targetEventList: MoCEvent[] = [] + if (moc_config.floor_side === "firstNode" && challengeSelected.EventList1.length > 0) { + targetEventList = challengeSelected.EventList1 + } else if (moc_config.floor_side === "secondNode" && challengeSelected.EventList2.length > 0) { + targetEventList = challengeSelected.EventList2 + } else if (moc_config.floor_side === "thirdNode" && eventSelected?.Tierce && eventSelected.Tierce.EventList.length > 0) { + targetEventList = eventSelected.Tierce.EventList + } + + if (targetEventList.length > 0) { + newBattleConfig.stage_id = targetEventList[0].ID + for (const wave of targetEventList[0].MonsterList) { const newWave: MonsterStore[] = [] for (const value of Object.values(wave)) { newWave.push({ monster_id: value, - level: challengeSelected.EventList1[0].Level, - amount: 1, - }) - } - newBattleConfig.monsters.push(newWave) - } - } - if ((moc_config.floor_side === "Lower" || moc_config.floor_side === "Lower -> Upper") && challengeSelected.EventList2.length > 0) { - newBattleConfig.stage_id = challengeSelected.EventList2[0].ID - for (const wave of challengeSelected.EventList2[0].MonsterList) { - const newWave: MonsterStore[] = [] - for (const value of Object.values(wave)) { - newWave.push({ - monster_id: value, - level: challengeSelected.EventList2[0].Level, - amount: 1, - }) - } - newBattleConfig.monsters.push(newWave) - } - } - if (moc_config.floor_side === "Lower -> Upper" && challengeSelected.EventList1.length > 0) { - for (const wave of challengeSelected.EventList1[0].MonsterList) { - const newWave: MonsterStore[] = [] - for (const value of Object.values(wave)) { - newWave.push({ - monster_id: value, - level: challengeSelected.EventList1[0].Level, - amount: 1, - }) - } - newBattleConfig.monsters.push(newWave) - } - } else if (moc_config.floor_side === "Upper -> Lower" && challengeSelected.EventList2.length > 0) { - for (const wave of challengeSelected.EventList2[0].MonsterList) { - const newWave: MonsterStore[] = [] - for (const value of Object.values(wave)) { - newWave.push({ - monster_id: value, - level: challengeSelected.EventList2[0].Level, + level: targetEventList[0].Level, amount: 1, }) } newBattleConfig.monsters.push(newWave) } } + setMocConfig(newBattleConfig) // eslint-disable-next-line react-hooks/exhaustive-deps }, [ + challengeSelected, + eventSelected, moc_config.event_id, moc_config.challenge_id, moc_config.floor_side, @@ -168,10 +169,9 @@ export default function MocBar() { onChange={(e) => setMocConfig({ ...moc_config, floor_side: e.target.value })} > - - - - + {floorSideList.map((side) => ( + + ))}
@@ -232,182 +232,108 @@ export default function MocBar() { {/* Enemy Waves */} {(moc_config?.challenge_id ?? 0) !== 0 && ( -
- {/* First Half */} -
-

{transI18n("firstHalfEnemies")}

+
+ {floorSideList.map((side, i) => { + const eventList = side.id === "firstNode" + ? challengeSelected?.EventList1 + : side.id === "secondNode" + ? challengeSelected?.EventList2 + : side.id === "thirdNode" + ? eventSelected?.Tierce?.EventList + : []; - {challengeSelected && challengeSelected?.EventList1?.length > 0 && challengeSelected?.EventList1?.[0]?.MonsterList?.map((wave, waveIndex) => ( -
-

{transI18n("wave")} {waveIndex + 1}

-
- {Object.values(wave).map((waveValue, enemyIndex) => { - const monsterStats = calcMonsterStats( - mapMonster?.[waveValue.toString()], - challengeSelected?.EventList1?.[0]?.EliteGroup, - challengeSelected?.EventList1?.[0]?.HardLevelGroup, - challengeSelected?.EventList1?.[0]?.Level, - hardLevelConfig, - eliteConfig - ); - return ( -
-
- Lv. {challengeSelected?.EventList1[0].Level} -
+ if (!eventList || eventList.length === 0) return null; + const targetEvent = eventList[0]; -
- {mapMonster?.[waveValue.toString()]?.Image?.IconPath && ( -
- Enemy Icon -
- )} -
+ return ( +
+

{side.wave}

-
-
-
- HP - {monsterStats.hp.toLocaleString(undefined, { maximumFractionDigits: 0 })} + {targetEvent?.MonsterList?.map((wave, waveIndex) => ( +
+

{transI18n("wave")} {waveIndex + 1}

+
+ {Object.values(wave).map((waveValue, enemyIndex) => { + const monsterStats = calcMonsterStats( + mapMonster?.[waveValue.toString()], + targetEvent?.EliteGroup, + targetEvent?.HardLevelGroup, + targetEvent?.Level, + hardLevelConfig, + eliteConfig + ); + return ( +
+
+ Lv. {targetEvent.Level}
-
- Speed - {monsterStats.spd.toLocaleString(undefined, { maximumFractionDigits: 0 })} +
+ {mapMonster?.[waveValue.toString()]?.Image?.IconPath && ( +
+ Enemy Icon +
+ )}
-
- Toughness - {monsterStats.stance.toLocaleString(undefined, { maximumFractionDigits: 0 })} +
+
+
+ HP + {monsterStats.hp.toLocaleString(undefined, { maximumFractionDigits: 0 })} +
+ +
+ Speed + {monsterStats.spd.toLocaleString(undefined, { maximumFractionDigits: 0 })} +
+ +
+ Toughness + {monsterStats.stance.toLocaleString(undefined, { maximumFractionDigits: 0 })} +
+
+ +
+ + Weakness + +
+ {mapMonster?.[waveValue.toString()]?.StanceWeakList?.map((icon, iconIndex) => ( + {icon} + ))} +
+
- -
- - Weakness - -
- {mapMonster?.[waveValue.toString()]?.StanceWeakList?.map((icon, iconIndex) => ( - {icon} - ))} -
-
-
-
- ) - })} -
+ ) + })} +
+
+ ))}
- ))} -
- - {/* Second Half */} -
-

{transI18n("secondHalfEnemies")}

- - {challengeSelected && challengeSelected?.EventList2?.length > 0 && challengeSelected?.EventList2?.[0]?.MonsterList?.map((wave, waveIndex) => ( -
-

{transI18n("wave")} {waveIndex + 1}

-
- {Object.values(wave).map((waveValue, enemyIndex) => { - const monsterStats = calcMonsterStats( - mapMonster?.[waveValue.toString()], - challengeSelected?.EventList2?.[0]?.EliteGroup, - challengeSelected?.EventList2?.[0]?.HardLevelGroup, - challengeSelected?.EventList2?.[0]?.Level, - hardLevelConfig, - eliteConfig - ); - return ( -
-
- Lv. {challengeSelected?.EventList2[0].Level} -
- -
- {mapMonster?.[waveValue.toString()]?.Image?.IconPath && ( -
- Enemy Icon -
- )} -
- -
-
-
- HP - {monsterStats.hp.toLocaleString(undefined, { maximumFractionDigits: 0 })} -
- -
- Speed - {monsterStats.spd.toLocaleString(undefined, { maximumFractionDigits: 0 })} -
- -
- Toughness - {monsterStats.stance.toLocaleString(undefined, { maximumFractionDigits: 0 })} -
-
- -
- - Weakness - -
- {mapMonster?.[waveValue.toString()]?.StanceWeakList?.map((icon, iconIndex) => ( - {icon} - ))} -
-
-
-
- ) - })} -
-
- ))} -
+ ) + })}
)} diff --git a/src/components/monsterBar/pf.tsx b/src/components/monsterBar/pf.tsx index 63317a3..d0bd1ef 100644 --- a/src/components/monsterBar/pf.tsx +++ b/src/components/monsterBar/pf.tsx @@ -5,7 +5,7 @@ import { calcMonsterStats, getLocaleName, replaceByParam } from "@/helper"; import useLocaleStore from "@/stores/localeStore"; import useUserDataStore from "@/stores/userDataStore"; import Image from "next/image"; -import { MonsterStore } from "@/types"; +import { MonsterStore, PFEvent } from "@/types"; import { useTranslations } from "next-intl"; import useDetailDataStore from "@/stores/detailDataStore"; @@ -26,6 +26,33 @@ export default function PfBar() { return mapPF[pf_config.event_id.toString()] }, [pf_config, mapPF]) + const floorSideList = useMemo(() => { + if (!eventSelected) return []; + + const floorList = [ + { + id: "firstNode", + name: transI18n("firstNode"), + wave: transI18n("firstNodeEnemies") + }, + { + id: "secondNode", + name: transI18n("secondNode"), + wave: transI18n("secondNodeEnemies") + }, + + ] + + if (eventSelected?.Tierce && eventSelected.Tierce.PreChallenge === pf_config.challenge_id) { + floorList.push({ + id: "thirdNode", + name: transI18n("thirdNode"), + wave: transI18n("thirdNodeEnemies") + }) + } + return floorList + }, [pf_config.challenge_id, eventSelected, transI18n]) + useEffect(() => { if (!challengeSelected || pf_config.event_id === 0 || pf_config.challenge_id === 0) { @@ -50,63 +77,36 @@ export default function PfBar() { } newBattleConfig.monsters = [] newBattleConfig.stage_id = 0 - if ((pf_config.floor_side === "Upper" || pf_config.floor_side === "Upper -> Lower") && challengeSelected.EventList1.length > 0) { - newBattleConfig.stage_id = challengeSelected.EventList1[0].ID - for (const wave of challengeSelected.EventList1[0].MonsterList) { + + let targetEventList: PFEvent[] = [] + if (pf_config.floor_side === "firstNode" && challengeSelected.EventList1.length > 0) { + targetEventList = challengeSelected.EventList1 + } else if (pf_config.floor_side === "secondNode" && challengeSelected.EventList2.length > 0) { + targetEventList = challengeSelected.EventList2 + } else if (pf_config.floor_side === "thirdNode" && eventSelected?.Tierce && eventSelected.Tierce.EventList.length > 0) { + targetEventList = eventSelected.Tierce.EventList + } + + if (targetEventList.length > 0) { + newBattleConfig.stage_id = targetEventList[0].ID + for (const wave of targetEventList[0].MonsterList) { const newWave: MonsterStore[] = [] for (const value of Object.values(wave)) { newWave.push({ - monster_id: value, - level: challengeSelected.EventList1[0].Level, - amount: 1, - }) - } - newBattleConfig.monsters.push(newWave) - } - } - if ((pf_config.floor_side === "Lower" || pf_config.floor_side === "Lower -> Upper") && challengeSelected.EventList2.length > 0) { - newBattleConfig.stage_id = challengeSelected.EventList2[0].ID - for (const wave of challengeSelected.EventList2[0].MonsterList) { - const newWave: MonsterStore[] = [] - for (const value of Object.values(wave)) { - newWave.push({ - monster_id: value, - level: challengeSelected.EventList2[0].Level, - amount: 1, - }) - } - newBattleConfig.monsters.push(newWave) - } - } - if (pf_config.floor_side === "Lower -> Upper" && challengeSelected.EventList1.length > 0) { - for (const wave of challengeSelected.EventList1[0].MonsterList) { - const newWave: MonsterStore[] = [] - for (const value of Object.values(wave)) { - newWave.push({ - monster_id: value, - level: challengeSelected.EventList1[0].Level, - amount: 1, - }) - } - newBattleConfig.monsters.push(newWave) - } - } else if (pf_config.floor_side === "Upper -> Lower" && challengeSelected.EventList2.length > 0) { - for (const wave of challengeSelected.EventList2[0].MonsterList) { - const newWave: MonsterStore[] = [] - for (const value of Object.values(wave)) { - newWave.push({ - monster_id: value, - level: challengeSelected.EventList2[0].Level, + monster_id: value as number, + level: targetEventList[0].Level, amount: 1, }) } newBattleConfig.monsters.push(newWave) } } + setPfConfig(newBattleConfig) // eslint-disable-next-line react-hooks/exhaustive-deps }, [ challengeSelected, + eventSelected, pf_config.event_id, pf_config.challenge_id, pf_config.floor_side, @@ -167,10 +167,9 @@ export default function PfBar() { onChange={(e) => setPfConfig({ ...pf_config, floor_side: e.target.value })} > - - - - + {floorSideList.map((side) => ( + + ))}
@@ -232,182 +231,108 @@ export default function PfBar() { {/* Enemy Waves */} {(pf_config?.challenge_id ?? 0) !== 0 && ( -
- {/* First Half */} -
-

{transI18n("firstHalfEnemies")}

- - {challengeSelected && Object.values(challengeSelected.EventList1?.[0]?.Infinite || []).map((waveValue, waveIndex) => ( -
-

{transI18n("wave")} {waveIndex + 1}

-
- {Array.from(new Set(waveValue.MonsterList)).map((monsterId, enemyIndex) => { - const monsterStats = calcMonsterStats( - mapMonster?.[monsterId.toString()], - waveValue.EliteGroup, - challengeSelected?.EventList1?.[0]?.HardLevelGroup, - challengeSelected?.EventList1?.[0]?.Level, - hardLevelConfig, - eliteConfig - ); - return ( -
-
- Lv. {challengeSelected?.EventList1[0].Level} -
+
+ {floorSideList.map((side, i) => { + const eventList = side.id === "firstNode" + ? challengeSelected?.EventList1 + : side.id === "secondNode" + ? challengeSelected?.EventList2 + : side.id === "thirdNode" + ? eventSelected?.Tierce?.EventList + : []; -
- {mapMonster?.[monsterId.toString()]?.Image?.IconPath && ( -
- Enemy Icon -
- )} -
+ if (!eventList || eventList.length === 0) return null; + const targetEvent = eventList[0]; -
-
-
- HP - {monsterStats.hp.toLocaleString(undefined, { maximumFractionDigits: 0 })} + return ( +
+

{side.wave}

+ + {targetEvent && Object.values(targetEvent.Infinite || []).map((waveValue, waveIndex) => ( +
+

{transI18n("wave")} {waveIndex + 1}

+
+ {Array.from(new Set(waveValue.MonsterList)).map((monsterId, enemyIndex) => { + const monsterStats = calcMonsterStats( + mapMonster?.[monsterId.toString()], + waveValue.EliteGroup, + targetEvent?.HardLevelGroup, + targetEvent?.Level, + hardLevelConfig, + eliteConfig + ); + return ( +
+
+ Lv. {targetEvent.Level}
-
- Speed - {monsterStats.spd.toLocaleString(undefined, { maximumFractionDigits: 0 })} +
+ {mapMonster?.[monsterId.toString()]?.Image?.IconPath && ( +
+ Enemy Icon +
+ )}
-
- Toughness - {monsterStats.stance.toLocaleString(undefined, { maximumFractionDigits: 0 })} +
+
+
+ HP + {monsterStats.hp.toLocaleString(undefined, { maximumFractionDigits: 0 })} +
+ +
+ Speed + {monsterStats.spd.toLocaleString(undefined, { maximumFractionDigits: 0 })} +
+ +
+ Toughness + {monsterStats.stance.toLocaleString(undefined, { maximumFractionDigits: 0 })} +
+
+ +
+ + Weakness + +
+ {mapMonster?.[monsterId.toString()]?.StanceWeakList?.map((icon, iconIndex) => ( + {icon} + ))} +
+
- -
- - Weakness - -
- {mapMonster?.[monsterId.toString()]?.StanceWeakList?.map((icon, iconIndex) => ( - {icon} - ))} -
-
-
-
- ) - })} -
+ ) + })} +
+
+ ))}
- ))} -
- - {/* Second Half */} -
-

{transI18n("secondHalfEnemies")}

- - {challengeSelected && Object.values(challengeSelected?.EventList2[0]?.Infinite || []).map((waveValue, waveIndex) => ( -
-

{transI18n("wave")} {waveIndex + 1}

-
- {Array.from(new Set(waveValue.MonsterList)).map((monsterId, enemyIndex) => { - const monsterStats = calcMonsterStats( - mapMonster?.[monsterId.toString()], - waveValue.EliteGroup, - challengeSelected?.EventList2?.[0]?.HardLevelGroup, - challengeSelected?.EventList2?.[0]?.Level, - hardLevelConfig, - eliteConfig - ); - return ( -
-
- Lv. {challengeSelected?.EventList2[0].Level} -
- -
- {mapMonster?.[monsterId.toString()]?.Image?.IconPath && ( -
- Enemy Icon -
- )} -
- -
-
-
- HP - {monsterStats.hp.toLocaleString(undefined, { maximumFractionDigits: 0 })} -
- -
- Speed - {monsterStats.spd.toLocaleString(undefined, { maximumFractionDigits: 0 })} -
- -
- Toughness - {monsterStats.stance.toLocaleString(undefined, { maximumFractionDigits: 0 })} -
-
- -
- - Weakness - -
- {mapMonster?.[monsterId.toString()]?.StanceWeakList?.map((icon, iconIndex) => ( - {icon} - ))} -
-
-
-
- ) - })} -
-
- ))} -
+ ) + })}
)} diff --git a/src/types/asDetail.ts b/src/types/asDetail.ts index 5c21b07..989dc19 100644 --- a/src/types/asDetail.ts +++ b/src/types/asDetail.ts @@ -9,7 +9,9 @@ export interface ASGroupDetail { EndTime: string; BuffList1: ASBuff[]; BuffList2: ASBuff[]; + BuffList3: ASBuff[] | null; Level: ASLevel[]; + Tierce: ASTierceLevel | null; } export interface ASBuff { @@ -21,6 +23,16 @@ export interface ASBuff { ExtraList?: ExtraEffect[]; } +export interface ASTierceLevel { + ID: number; + PreChallenge: number; + Name: Record; + Target: ASTarget[]; + DamageType: string[]; + TurnLimit: number; + EventList: ASEvent[]; +} + export interface ASLevel { Floor: number; ID: number; @@ -35,6 +47,7 @@ export interface ASLevel { EventList2: ASEvent[]; Monster1: ASMonster; Monster2: ASMonster; + Monster3: ASMonster | null; } export interface ASTarget { diff --git a/src/types/mocDetail.ts b/src/types/mocDetail.ts index f7b1863..12e0b76 100644 --- a/src/types/mocDetail.ts +++ b/src/types/mocDetail.ts @@ -7,6 +7,17 @@ export interface MOCGroupDetail { BeginTime: string; EndTime: string; Level: MoCLevel[]; + Tierce: MoCTierceLevel | null; +} + +export interface MoCTierceLevel { + ID: number; + PreChallenge: number; + Name: Record; + Target: MoCTarget[]; + DamageType: string[]; + TurnLimit: number; + EventList: MoCEvent[]; } export interface MoCLevel { diff --git a/src/types/pfDetail.ts b/src/types/pfDetail.ts index b18639d..3866c8b 100644 --- a/src/types/pfDetail.ts +++ b/src/types/pfDetail.ts @@ -6,7 +6,8 @@ export interface PFGroupDetail { EndTime: string; SubOption: MazeBuff[]; Option: MazeBuff[]; - Level: LevelData[]; + Level: PFLevel[]; + Tierce: PFTierceLevel | null; } export interface MazeBuff { @@ -17,7 +18,17 @@ export interface MazeBuff { Desc: Record; } -export interface LevelData { +export interface PFTierceLevel { + ID: number; + PreChallenge: number; + Name: Record; + Target: StoryTarget[]; + DamageType: string[]; + TurnLimit: number; + EventList: PFEvent[]; +} + +export interface PFLevel { Floor: number; ID: number; StageNum: number; @@ -26,8 +37,8 @@ export interface LevelData { DamageType1: string[]; DamageType2: string[]; MazeBuff: MazeBuff[]; - EventList1: StageConfig[]; - EventList2: StageConfig[]; + EventList1: PFEvent[]; + EventList2: PFEvent[]; TurnLimit: number; BattleTarget: BattleTarget[]; ClearScore: number; @@ -45,7 +56,7 @@ export interface BattleTarget { Name: Record; } -export interface StageConfig { +export interface PFEvent { ID: number; Name: Record; HardLevelGroup: number;