Spaces:
Sleeping
Sleeping
'use client'; | |
import { createContext, useContext, useState, ReactNode } from 'react'; | |
type Scene = 'menu' | 'intro' | 'court' | 'defense' | 'lawyer' | 'end'; | |
interface GameState { | |
score: number; | |
timeLeft: number; | |
language: 'fr' | 'en' | 'es'; | |
round: number; | |
currentScene: Scene; | |
currentAnswer: string; | |
audioEnabled: boolean; | |
} | |
interface GameContextType { | |
gameState: GameState; | |
setLanguage: (lang: GameState['language']) => void; | |
setTimeLeft: (time: number | ((prev: number) => number)) => void; | |
setCurrentAnswer: (answer: string) => void; | |
goToNextScene: () => void; | |
resetGame: () => void; | |
} | |
const defaultGameState: GameState = { | |
score: 0, | |
timeLeft: 40, | |
language: 'fr', | |
round: 1, | |
currentScene: 'menu', | |
currentAnswer: '', | |
audioEnabled: false | |
}; | |
const sceneFlow: Scene[] = ['menu', 'intro', 'court', 'defense', 'lawyer']; | |
const GameContext = createContext<GameContextType | undefined>(undefined); | |
export function GameProvider({ children }: { children: ReactNode }) { | |
const [gameState, setGameState] = useState<GameState>(defaultGameState); | |
const setLanguage = (lang: GameState['language']) => { | |
setGameState(prev => ({ ...prev, language: lang })); | |
}; | |
const setTimeLeft = (time: number | ((prev: number) => number)) => { | |
setGameState(prev => ({ ...prev, timeLeft: typeof time === 'function' ? time(prev.timeLeft) : time })); | |
}; | |
const setCurrentAnswer = (answer: string) => { | |
setGameState(prev => ({ ...prev, currentAnswer: answer })); | |
}; | |
const goToNextScene = () => { | |
setGameState(prev => { | |
const currentIndex = sceneFlow.indexOf(prev.currentScene); | |
let nextScene = sceneFlow[currentIndex + 1]; | |
let nextRound = prev.round; | |
// Si on vient de finir le lawyer et qu'on n'est pas au dernier round | |
if (prev.currentScene === 'lawyer' && prev.round < 3) { | |
nextScene = 'court'; | |
nextRound = prev.round + 1; | |
} | |
// Si on a fini le dernier round | |
else if (prev.currentScene === 'lawyer' && prev.round >= 3) { | |
nextScene = 'end'; | |
} | |
return { | |
...prev, | |
currentScene: nextScene, | |
round: nextRound, | |
timeLeft: nextScene === 'defense' ? 40 : prev.timeLeft | |
}; | |
}); | |
}; | |
const resetGame = () => { | |
setGameState(defaultGameState); | |
}; | |
return ( | |
<GameContext.Provider | |
value={{ | |
gameState, | |
setLanguage, | |
setTimeLeft, | |
setCurrentAnswer, | |
goToNextScene, | |
resetGame | |
}} | |
> | |
{children} | |
</GameContext.Provider> | |
); | |
} | |
export function useGame() { | |
const context = useContext(GameContext); | |
if (!context) { | |
throw new Error('useGame must be used within a GameProvider'); | |
} | |
return context; | |
} |