import { DEFAULT_GAME_AUDIO_CONFIG, type GameAudioConfig } from '../audio/audioConfig' import { SoundDirector } from '../audio/soundDirector' import { type GameEffect } from '../core/gameResult' import { DEFAULT_GAME_HAPTICS_CONFIG, DEFAULT_GAME_UI_EFFECTS_CONFIG, type GameHapticsConfig, type GameUiEffectsConfig, } from './feedbackConfig' import { HapticsDirector } from './hapticsDirector' import { UiEffectDirector, type UiEffectHost } from './uiEffectDirector' export interface FeedbackHost extends UiEffectHost { stopLocationTracking: () => void } export interface FeedbackConfigBundle { audioConfig?: GameAudioConfig hapticsConfig?: GameHapticsConfig uiEffectsConfig?: GameUiEffectsConfig } export class FeedbackDirector { soundDirector: SoundDirector hapticsDirector: HapticsDirector uiEffectDirector: UiEffectDirector host: FeedbackHost constructor(host: FeedbackHost, config?: FeedbackConfigBundle) { this.host = host this.soundDirector = new SoundDirector(config && config.audioConfig ? config.audioConfig : DEFAULT_GAME_AUDIO_CONFIG) this.hapticsDirector = new HapticsDirector(config && config.hapticsConfig ? config.hapticsConfig : DEFAULT_GAME_HAPTICS_CONFIG) this.uiEffectDirector = new UiEffectDirector(host, config && config.uiEffectsConfig ? config.uiEffectsConfig : DEFAULT_GAME_UI_EFFECTS_CONFIG) } configure(config: FeedbackConfigBundle): void { this.soundDirector.configure(config.audioConfig || DEFAULT_GAME_AUDIO_CONFIG) this.hapticsDirector.configure(config.hapticsConfig || DEFAULT_GAME_HAPTICS_CONFIG) this.uiEffectDirector.configure(config.uiEffectsConfig || DEFAULT_GAME_UI_EFFECTS_CONFIG) } reset(): void { this.soundDirector.resetContexts() } destroy(): void { this.soundDirector.destroy() this.hapticsDirector.destroy() this.uiEffectDirector.destroy() } setAppAudioMode(mode: 'foreground' | 'background'): void { this.soundDirector.setAppAudioMode(mode) } handleEffects(effects: GameEffect[]): void { this.soundDirector.handleEffects(effects) this.hapticsDirector.handleEffects(effects) this.uiEffectDirector.handleEffects(effects) if (effects.some((effect) => effect.type === 'session_finished')) { this.host.stopLocationTracking() } } }