diff --git a/apps/web/src/Game.tsx b/apps/web/src/Game.tsx index d466401..c1922aa 100644 --- a/apps/web/src/Game.tsx +++ b/apps/web/src/Game.tsx @@ -1,7 +1,9 @@ import { useEffect } from 'react' import { useInit, useSaver } from '@/hooks/storage' -import { useStep, Step } from '@remake/hooks' +import { useStep } from '@remake/hooks' import Home from '@/containers/Home' +import Mode from '@/containers/Mode' +import Chara from '@/containers/Chara' import Pick from '@/containers/TalentPick' import Alloc from '@/containers/Alloc' import Play from '@/containers/Play' @@ -12,7 +14,7 @@ import './Game.css' export function Game() { const [inited, init] = useInit() const saver = useSaver() - const step = useStep() + const [step, Step] = useStep() useEffect(() => { if (!inited) init() }, [inited]) @@ -24,6 +26,9 @@ export function Game() { case Step.Idle: return case Step.Mode: + return + case Step.Chara: + return case Step.Pick: return case Step.Alloc: diff --git a/apps/web/src/containers/Chara.css b/apps/web/src/containers/Chara.css new file mode 100644 index 0000000..d3ed08d --- /dev/null +++ b/apps/web/src/containers/Chara.css @@ -0,0 +1 @@ +.screen.chara {} \ No newline at end of file diff --git a/apps/web/src/containers/Chara.tsx b/apps/web/src/containers/Chara.tsx new file mode 100644 index 0000000..a702bb3 --- /dev/null +++ b/apps/web/src/containers/Chara.tsx @@ -0,0 +1,7 @@ +import './Chara.css' + +export function Chara() { + return
+} + +export default Chara diff --git a/apps/web/src/containers/Mode.css b/apps/web/src/containers/Mode.css new file mode 100644 index 0000000..b515ab7 --- /dev/null +++ b/apps/web/src/containers/Mode.css @@ -0,0 +1,23 @@ +.screen.mode { + gap: 1rem; + button { + display: flex; + flex-direction: column; + height: 10rem; + gap: 0.5rem; + .name { + font-size: 3.5rem; + font-weight: bold; + } + .description { + display: flex; + flex-direction: row; + gap: 1rem; + span { + font-size: 1rem; + &::before { content: '['; } + &::after { content: ']'; } + } + } + } +} \ No newline at end of file diff --git a/apps/web/src/containers/Mode.tsx b/apps/web/src/containers/Mode.tsx new file mode 100644 index 0000000..5421f6c --- /dev/null +++ b/apps/web/src/containers/Mode.tsx @@ -0,0 +1,26 @@ +import { PullCount } from '@/config' +import { useModeChoose } from '@remake/hooks' +import './Mode.css' + +export function Mode() { + const [Mode, choose] = useModeChoose() + return ( +
+ + +
+ ) +} + +export default Mode diff --git a/packages/hooks/src/play.ts b/packages/hooks/src/play.ts index cf59119..b42f377 100644 --- a/packages/hooks/src/play.ts +++ b/packages/hooks/src/play.ts @@ -11,12 +11,18 @@ import type { Talent } from '@remake/data/talent' export enum Step { Idle = 'idle', Mode = 'mode', + Chara = 'chara', Pick = 'pick', Alloc = 'alloc', Play = 'play', Summary = 'summary', } +export enum Mode { + Classic = 'classic', + Celebrity = 'celebrity', +} + export type Log = Omit & { props: Omit } @@ -47,8 +53,8 @@ export const useGameReset = () => { }, [resetTalent, resetAlloc, resetState, resetLogs]) } -export const useStep = () => useAtomValue(stepAtom) -export const useSetStep = () => useSetAtom(stepAtom) +export const useStep = () => [useAtomValue(stepAtom), Step] as const +export const useSetStep = () => [useSetAtom(stepAtom), Step] as const export const useGameState = () => useAtomValue(gameStateAtom) export const useSummary = () => useAtomValue(summaryAtom) export const useLogs = () => useAtomValue(logsAtom) @@ -64,6 +70,24 @@ export const useRemake = () => { }, [mode, times, setStep, reset]) } +export const useModeChoose = () => { + const setStep = useSetAtom(stepAtom) + const choose = useCallback( + (mode: Mode) => { + switch (mode) { + case Mode.Classic: + setStep(Step.Pick) + break + case Mode.Celebrity: + setStep(Step.Chara) + break + } + }, + [setStep], + ) + return [Mode, choose] as const +} + export const useStart = () => { const { spirit } = useConfig() const [profile] = useProfile() diff --git a/packages/hooks/src/talent.ts b/packages/hooks/src/talent.ts index 11f3c85..698a080 100644 --- a/packages/hooks/src/talent.ts +++ b/packages/hooks/src/talent.ts @@ -2,7 +2,7 @@ import { useState, useCallback } from 'react' import { atom, useAtom, useAtomValue, useSetAtom } from 'jotai' import { useConfig } from './config' import { useProfile } from './profile' -import { useSetStep, Step } from './play' +import { useSetStep } from './play' import { pull, exclude, talentsPicked } from '@remake/core' import type { TalentsPickedResult, RNG } from '@remake/core' import type { Talent } from '@remake/data/talent' @@ -93,13 +93,13 @@ export const useTalentSubmit = () => { const picked = useAtomValue(pickedAtom) const setReplaced = useSetAtom(replacedAtom) const { enabled } = useSubmitIsEnable() - const next = useSetStep() + const [setStep, Step] = useSetStep() return useCallback( (rng?: RNG) => { if (!enabled) throw new Error('Not enough talents picked') setReplaced(talentsPicked(picked, rng)) - next(Step.Alloc) + setStep(Step.Alloc) }, - [enabled, picked, setReplaced, next], + [enabled, picked, setReplaced, setStep], ) }