feedbackDirector.ts 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import { DEFAULT_GAME_AUDIO_CONFIG, type AudioCueKey, type GameAudioConfig } from '../audio/audioConfig'
  2. import { SoundDirector } from '../audio/soundDirector'
  3. import { type GameEffect } from '../core/gameResult'
  4. import { type AnimationLevel } from '../../utils/animationLevel'
  5. import {
  6. DEFAULT_GAME_HAPTICS_CONFIG,
  7. DEFAULT_GAME_UI_EFFECTS_CONFIG,
  8. type FeedbackCueKey,
  9. type GameHapticsConfig,
  10. type GameUiEffectsConfig,
  11. } from './feedbackConfig'
  12. import { HapticsDirector } from './hapticsDirector'
  13. import { UiEffectDirector, type UiEffectHost } from './uiEffectDirector'
  14. export interface FeedbackHost extends UiEffectHost {
  15. stopLocationTracking: () => void
  16. }
  17. export interface FeedbackConfigBundle {
  18. audioConfig?: GameAudioConfig
  19. hapticsConfig?: GameHapticsConfig
  20. uiEffectsConfig?: GameUiEffectsConfig
  21. }
  22. export class FeedbackDirector {
  23. soundDirector: SoundDirector
  24. hapticsDirector: HapticsDirector
  25. uiEffectDirector: UiEffectDirector
  26. host: FeedbackHost
  27. constructor(host: FeedbackHost, config?: FeedbackConfigBundle) {
  28. this.host = host
  29. this.soundDirector = new SoundDirector(config && config.audioConfig ? config.audioConfig : DEFAULT_GAME_AUDIO_CONFIG)
  30. this.hapticsDirector = new HapticsDirector(config && config.hapticsConfig ? config.hapticsConfig : DEFAULT_GAME_HAPTICS_CONFIG)
  31. this.uiEffectDirector = new UiEffectDirector(host, config && config.uiEffectsConfig ? config.uiEffectsConfig : DEFAULT_GAME_UI_EFFECTS_CONFIG)
  32. }
  33. configure(config: FeedbackConfigBundle): void {
  34. this.soundDirector.configure(config.audioConfig || DEFAULT_GAME_AUDIO_CONFIG)
  35. this.hapticsDirector.configure(config.hapticsConfig || DEFAULT_GAME_HAPTICS_CONFIG)
  36. this.uiEffectDirector.configure(config.uiEffectsConfig || DEFAULT_GAME_UI_EFFECTS_CONFIG)
  37. }
  38. reset(): void {
  39. this.soundDirector.resetContexts()
  40. this.uiEffectDirector.clearPunchButtonMotion()
  41. this.uiEffectDirector.clearHudProgressMotion()
  42. this.uiEffectDirector.clearHudDistanceMotion()
  43. }
  44. destroy(): void {
  45. this.soundDirector.destroy()
  46. this.hapticsDirector.destroy()
  47. this.uiEffectDirector.destroy()
  48. }
  49. setAnimationLevel(level: AnimationLevel): void {
  50. this.uiEffectDirector.setAnimationLevel(level)
  51. }
  52. setAppAudioMode(mode: 'foreground' | 'background'): void {
  53. this.soundDirector.setAppAudioMode(mode)
  54. }
  55. playAudioCue(key: AudioCueKey): void {
  56. this.soundDirector.play(key)
  57. }
  58. playHapticCue(key: FeedbackCueKey): void {
  59. this.hapticsDirector.trigger(key)
  60. }
  61. handleEffects(effects: GameEffect[]): void {
  62. this.soundDirector.handleEffects(effects)
  63. this.hapticsDirector.handleEffects(effects)
  64. this.uiEffectDirector.handleEffects(effects)
  65. if (effects.some((effect) => effect.type === 'session_finished' || effect.type === 'session_timed_out')) {
  66. this.host.stopLocationTracking()
  67. }
  68. }
  69. }