"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 { MoCEvent, 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]) 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 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 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: 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, 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 */}
StageId: {moc_config?.stage_id}
{/* 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 && (
{floorSideList.map((side, i) => { const eventList = side.id === "firstNode" ? challengeSelected?.EventList1 : side.id === "secondNode" ? challengeSelected?.EventList2 : side.id === "thirdNode" ? eventSelected?.Tierce?.EventList : []; if (!eventList || eventList.length === 0) return null; const targetEvent = eventList[0]; return (

{side.wave}

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