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],
)
}