cbt-game-engine
Version:
Platform-agnostic game engine for Interactive Autism Quiz Game
96 lines (92 loc) • 3.15 kB
TypeScript
interface GameSegment {
id: number;
question: string;
animationFile?: string;
expectedAnswer?: string;
timeLimit?: number;
completed: boolean;
}
interface GameConfig {
segments: GameSegment[];
defaultTimeLimit: number;
enableMicrophone: boolean;
enableTextToSpeech: boolean;
celebrationDuration: number;
}
type GameState = 'idle' | 'question' | 'listening' | 'celebrating' | 'completed';
interface GameProgress {
currentSegment: number;
totalSegments: number;
completedSegments: number;
score: number;
}
interface GameCallbacks {
onSegmentStart?: (segment: GameSegment, progress: GameProgress) => void;
onQuestionAsked?: (question: string, segment: GameSegment) => void;
onListeningStart?: (timeLeft: number, segment: GameSegment) => void;
onListeningTick?: (timeLeft: number, segment: GameSegment) => void;
onListeningEnd?: (segment: GameSegment) => void;
onCelebrationStart?: (segment: GameSegment) => void;
onCelebrationEnd?: (segment: GameSegment) => void;
onSegmentComplete?: (segment: GameSegment, progress: GameProgress) => void;
onGameComplete?: (finalProgress: GameProgress) => void;
onError?: (error: Error, context: string) => void;
}
interface PlatformServices {
textToSpeech: {
speak: (text: string, options?: any) => Promise<void>;
stop: () => void;
isSupported: () => boolean;
};
microphone: {
requestPermission: () => Promise<boolean>;
startListening: () => Promise<MediaStream | null>;
stopListening: (stream?: MediaStream) => void;
isSupported: () => boolean;
};
haptics?: {
light: () => void;
medium: () => void;
heavy: () => void;
};
analytics?: {
trackEvent: (event: string, properties?: Record<string, any>) => void;
};
}
interface GameEngineState {
gameState: GameState;
currentSegment: number;
timeLeft: number;
progress: GameProgress;
isAudioPlaying: boolean;
isMicrophoneActive: boolean;
error: string | null;
}
declare const useGameEngine: (config: GameConfig, callbacks: GameCallbacks, platformServices: PlatformServices) => {
getCurrentSegment: () => GameSegment;
startSegment: () => void;
nextSegment: () => void;
resetGame: () => void;
skipSegment: () => void;
canStartSegment: boolean;
canNextSegment: boolean;
isGameComplete: boolean;
hasError: boolean;
gameState: GameState;
currentSegment: number;
timeLeft: number;
progress: GameProgress;
isAudioPlaying: boolean;
isMicrophoneActive: boolean;
error: string | null;
};
declare const createDefaultConfig: () => GameConfig;
declare const createSegment: (id: number, question: string, animationFile?: string, timeLimit?: number) => {
id: number;
question: string;
animationFile: string | undefined;
completed: boolean;
timeLimit: number | undefined;
};
export { createDefaultConfig, createSegment, useGameEngine };
export type { GameCallbacks, GameConfig, GameEngineState, GameProgress, GameSegment, GameState, PlatformServices };