"use client" import { useEffect, useMemo } from "react"; import SelectCustomText from "../select/customSelectText"; import { calcMonsterStats, getLocaleName, replaceByParam } from "@/helper"; 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 useDetailDataStore from "@/stores/detailDataStore"; export default function MocBar() { const { locale } = useLocaleStore() const { moc_config, setMocConfig } = useUserDataStore() const { mapMonster, mapMoc, damageType, hardLevelConfig, eliteConfig } = useDetailDataStore() const transI18n = useTranslations("DataPage") const challengeSelected = useMemo(() => { return mapMoc[moc_config.event_id.toString()]?.Level.find((moc) => moc.ID === moc_config.challenge_id) }, [moc_config, mapMoc]) const eventSelected = useMemo(() => { return mapMoc[moc_config.event_id.toString()] }, [moc_config, mapMoc]) useEffect(() => { if (!challengeSelected || moc_config.event_id === 0 || moc_config.challenge_id === 0) return const newBattleConfig = structuredClone(moc_config) newBattleConfig.cycle_count = 0 if (moc_config.use_cycle_count) { newBattleConfig.cycle_count = challengeSelected.TurnLimit } newBattleConfig.blessings = [] if (moc_config.use_turbulence_buff && challengeSelected) { challengeSelected.MazeBuff.map((item) => { newBattleConfig.blessings.push({ id: item.ID, level: 1 }) }) } 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) { 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, amount: 1, }) } newBattleConfig.monsters.push(newWave) } } setMocConfig(newBattleConfig) // eslint-disable-next-line react-hooks/exhaustive-deps }, [ moc_config.event_id, moc_config.challenge_id, moc_config.floor_side, moc_config.use_cycle_count, moc_config.use_turbulence_buff, mapMoc, ]) if (!mapMoc) return null return (
{/* Title Card */}
b.ID - a.ID).map((moc) => ({ id: moc.ID.toString(), name: getLocaleName(locale, moc.Name), time: `${moc.BeginTime} - ${moc.EndTime}`, }))} excludeSet={[]} selectedCustomSet={moc_config.event_id.toString()} placeholder={transI18n("selectMOCEvent")} setSelectedCustomSet={(id) => setMocConfig({ ...moc_config, event_id: Number(id), challenge_id: mapMoc[Number(id)]?.Level.at(-1)?.ID || 0, })} />
{/* Settings */}
{/* Turbulence Buff */}
setMocConfig({ ...moc_config, use_turbulence_buff: e.target.checked })} className="checkbox checkbox-primary" /> setMocConfig({ ...moc_config, use_turbulence_buff: !moc_config.use_turbulence_buff })} className="font-bold text-success cursor-pointer"> {transI18n("useTurbulenceBuff")}
{challengeSelected ? ( challengeSelected.MazeBuff.map((buff, i) => (
)) ) : (
{transI18n("noTurbulenceBuff")}
)}
{/* Enemy Waves */} {(moc_config?.challenge_id ?? 0) !== 0 && (
{/* First Half */}

{transI18n("firstHalfEnemies")}

{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}
{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} ))}
) })}
))}
{/* 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} ))}
) })}
))}
)}
) }