import { useMemo, useState } from "react"; import { classById, FACTIONS, raceById } from "../app/characterCatalog"; import { selectedCharacter, useShellStore } from "../app/shellStore"; import { DualDisplayFrame } from "../components/DualDisplayFrame"; import { useMenuController, type MenuAction } from "../input/useMenuController"; import { CharacterPreview } from "./CharacterPreview"; import { LazyLocalCompanionPanel } from "./LazyLocalCompanionPanel"; import { ControllerButton } from "./ControllerButton"; import { ContentManagerScreen } from "./ContentManagerScreen"; import { BrandMark, ControllerLegend, FrontSurface } from "./FrontSurface"; import { isGameMasterSession } from "../game/manastormAdminConfig"; import { OnlineGroupPanel } from "./OnlineGroupPanel"; const GAME_MODES = [ { id: "dungeons", number: "01", name: "Dungeons", description: "Choose an expedition and lead your party into the depths.", available: true, }, { id: "manastorms", number: "02", name: "Manastorms", description: "Chain random boss encounters as the storm grows stronger and more rewarding.", available: true, }, { id: "roguelike-rpg", number: "03", name: "Roguelike RPG", description: "A new mode is taking shape.", available: false, }, { id: "trials", number: "04", name: "Trials", description: "A new mode is taking shape.", available: false, }, { id: "downloads", number: "05", name: "Downloads", description: "Install, update, or remove adventures that remain playable offline.", available: true, }, { id: "options", number: "06", name: "Options", description: "Main-menu settings are coming soon.", available: false, }, { id: "player-profile", number: "07", name: "Player Profile", description: "Profile details are coming soon.", available: false, }, ] as const; export function MainMenuScreen() { const [contentManagerOpen, setContentManagerOpen] = useState(false); const activeCharacter = useShellStore((state) => state.activeCharacter); const rosterCharacter = useShellStore(selectedCharacter); const openDungeons = useShellStore((state) => state.openDungeons); const openManastorms = useShellStore((state) => state.openManastorms); const openClassHall = useShellStore((state) => state.openClassHall); const returnToCharacters = useShellStore((state) => state.returnToCharacters); const notice = useShellStore((state) => state.notice); const session = useShellStore((state) => state.session); const openGmAdmin = useShellStore((state) => state.openGmAdmin); const character = activeCharacter ?? rosterCharacter; const isRom = character?.categoryId === "rom"; const isGm = isGameMasterSession(session); const actions = useMemo(() => [ { id: "mode-dungeons", run: openDungeons, neighbors: { right: "mode-manastorms", down: "back-to-roster" }, }, { id: "mode-manastorms", run: openManastorms, neighbors: { left: "mode-dungeons", down: "back-to-roster" }, }, { id: "mode-downloads", run: () => setContentManagerOpen(true), neighbors: { left: "mode-manastorms", down: "back-to-roster" }, }, { id: "back-to-roster", run: returnToCharacters, neighbors: { up: "mode-dungeons", left: "mode-dungeons" }, }, ...(isRom ? [{ id: "mode-class-hall", run: openClassHall }] : []), ...(isGm ? [{ id: "mode-gm-tools", run: openGmAdmin }] : []), ], [isGm, isRom, openClassHall, openDungeons, openGmAdmin, openManastorms, returnToCharacters]); const controller = useMenuController(actions, { initialId: "mode-dungeons", onBack: returnToCharacters, }); const race = character ? raceById(character.raceId) : null; const characterClass = character ? classById(character.classId) : null; if (contentManagerOpen) return setContentManagerOpen(false)} />; return (
Adventurer selected Choose your next journey
Change character

Main menu

Ways to play

Select a destination. More adventures will unlock here as they are built.

{notice &&

{notice}

}
} bottom={} /> ); }