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 && (
-
-
-
- )}
-
+ 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 && (
+
- ))}
+
+ )}
+
+
+
+
+
+ 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) => (
+
+ ))}
+
-
- )
- })}
+ )
+ })}
+
-
- ))}
-
-
- {/* 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 && (
-
-
-
- )}
-
-
-
-
-
- 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) => (
-
- ))}
-
-
-
-
- )
- })}
-
-
- ))}
-
+ ))}
+
+ )})}
)}
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 && (
-
-
-
- )}
-
+ 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 && (
+
+
+
+ )}
-
-
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) => (
+
+ ))}
+
+
-
-
-
- Weakness
-
-
- {mapMonster?.[waveValue.toString()]?.StanceWeakList?.map((icon, iconIndex) => (
-
- ))}
-
-
-
-
- )
- })}
-
+ )
+ })}
+
+
+ ))}
- ))}
-
-
- {/* 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 && (
-
-
-
- )}
-
-
-
-
-
- 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) => (
-
- ))}
-
-
-
-
- )
- })}
-
-
- ))}
-
+ )
+ })}
)}
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 && (
-
-
-
- )}
-
+ 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 && (
+
+
+
+ )}
-
-
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) => (
+
+ ))}
+
+
-
-
-
- Weakness
-
-
- {mapMonster?.[monsterId.toString()]?.StanceWeakList?.map((icon, iconIndex) => (
-
- ))}
-
-
-
-
- )
- })}
-
+ )
+ })}
+
+
+ ))}
- ))}
-
-
- {/* 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 && (
-
-
-
- )}
-
-
-
-
-
- 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) => (
-
- ))}
-
-
-
-
- )
- })}
-
-
- ))}
-
+ )
+ })}
)}
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;