feat: 설정 화면 구현 (JSA-37)
- SettingsScreen 컴포넌트 추가 (언어선택, BGM 토글, 앱 버전, 게임 초기화) - 게임 데이터 초기화: 2단계 확인 다이얼로그 (localStorage 전체 삭제 후 리로드) - 언어 설정: 한국어/English 세그먼트 버튼 (language 상태 persist) - BGM 토글 스위치 (bgmEnabled 상태 persist) - 마지막 저장 시각 및 오프라인 보상 최대 24시간 안내 텍스트 - BottomTabBar에 ⚙️ 설정 탭 추가 - useGameStore에 TabName 'settings', Language 타입 및 관련 액션 추가 Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
@@ -41,7 +41,8 @@ const throttledStorage = createJSONStorage(() => ({
|
||||
removeItem: (name: string): void => localStorage.removeItem(name),
|
||||
}));
|
||||
|
||||
export type TabName = 'elements' | 'evolution' | 'fusion' | 'shop';
|
||||
export type TabName = 'elements' | 'evolution' | 'fusion' | 'shop' | 'settings';
|
||||
export type Language = 'ko' | 'en';
|
||||
|
||||
const INITIAL_ELEMENTS: Record<string, number> = {
|
||||
fire: 5,
|
||||
@@ -131,11 +132,26 @@ interface GameState {
|
||||
// 상점 버프 시스템 (boostId -> 만료 시각 ms)
|
||||
activeBoosts: Record<string, number>;
|
||||
activateBoost: (boostId: string, durationSec: number) => void;
|
||||
|
||||
// 설정
|
||||
language: Language;
|
||||
bgmEnabled: boolean;
|
||||
setLanguage: (lang: Language) => void;
|
||||
setBgmEnabled: (enabled: boolean) => void;
|
||||
resetGame: () => void;
|
||||
}
|
||||
|
||||
type PersistedState = Pick<
|
||||
GameState,
|
||||
'activeTab' | 'elements' | 'gold' | 'elementLevels' | 'lastTickAt' | 'activeBoosts' | 'spawnAccumulators'
|
||||
| 'activeTab'
|
||||
| 'elements'
|
||||
| 'gold'
|
||||
| 'elementLevels'
|
||||
| 'lastTickAt'
|
||||
| 'activeBoosts'
|
||||
| 'spawnAccumulators'
|
||||
| 'language'
|
||||
| 'bgmEnabled'
|
||||
>;
|
||||
|
||||
export const useGameStore = create<GameState>()(
|
||||
@@ -219,6 +235,17 @@ export const useGameStore = create<GameState>()(
|
||||
return { success: true, resultId: recipe.result, goldGained };
|
||||
},
|
||||
|
||||
// 설정
|
||||
language: 'ko',
|
||||
bgmEnabled: false,
|
||||
setLanguage: (lang) => set({ language: lang }),
|
||||
setBgmEnabled: (enabled) => set({ bgmEnabled: enabled }),
|
||||
resetGame: () => {
|
||||
flushGameState();
|
||||
localStorage.removeItem('archetype-game-state');
|
||||
window.location.reload();
|
||||
},
|
||||
|
||||
// 상점 버프 시스템
|
||||
activateBoost: (boostId, durationSec) => {
|
||||
set((state) => ({
|
||||
@@ -336,6 +363,8 @@ export const useGameStore = create<GameState>()(
|
||||
lastTickAt: state.lastTickAt,
|
||||
activeBoosts: state.activeBoosts,
|
||||
spawnAccumulators: state.spawnAccumulators,
|
||||
language: state.language,
|
||||
bgmEnabled: state.bgmEnabled,
|
||||
}),
|
||||
onRehydrateStorage: () => (state) => {
|
||||
// 앱 재시작 시 localStorage에서 복원된 만료 부스트를 자동 정리
|
||||
|
||||
Reference in New Issue
Block a user