Files
BreakEscape/planning_notes/npc/SOUND_EFFECTS_IMPLEMENTATION.md

6.9 KiB

NPC Sound Effects Implementation

Status: Complete (2024-10-31)

Overview

Added audio feedback to the NPC bark notification system. All bark notifications now play a sound effect when they appear, providing audio cues for player attention.

Implementation

Files Modified

  • js/core/game.js (+3 lines)
    • Added this.load.audio('message_received', ...) in preload function
    • Loads sound through Phaser's audio system
  • js/systems/npc-barks.js (+65 lines, modified)
    • Replaced HTML5 Audio with Phaser sound manager
    • Added lazy loading fallback
    • Integrated sound playback into showBark() method

Sound Asset Used

  • assets/sounds/message_received.mp3
    • Already existed in project
    • Used for phone message notifications
    • Now also used for NPC bark notifications
    • Loaded through Phaser's audio system (Web Audio API)

Features

1. Sound Preloading (Phaser)

// In game.js preload()
this.load.audio('message_received', 'assets/sounds/message_received.mp3');

// In npc-barks.js
loadBarkSound() {
  if (window.game && window.game.sound) {
    this.barkSound = window.game.sound.add('message_received');
    this.barkSound.setVolume(0.5); // 50% volume
  }
}
  • Sound loaded once during Phaser's preload phase
  • Managed by Phaser's Web Audio API system
  • Automatically pooled for efficient playback
  • Default volume: 50%

2. Sound Playback (Phaser)

playBarkSound() {
  if (!this.soundEnabled) return;
  
  // Lazy load if not available during init
  if (!this.barkSound && window.game && window.game.sound) {
    this.loadBarkSound();
  }
  
  if (!this.barkSound) return;
  
  this.barkSound.play(); // Phaser handles pooling
}
  • Uses Phaser's .play() method (cleaner than HTML5 Audio)
  • Phaser automatically handles sound pooling and memory management
  • Lazy loading fallback if sound manager not ready during init
  • No need to manually reset currentTime (Phaser handles this)

3. Sound Control

setSoundEnabled(enabled) {
  this.soundEnabled = enabled;
}
  • Allows disabling sounds globally
  • Useful for settings/preferences
  • Default: enabled

4. showBark() Integration

showBark(payload = {}) {
  const playSound = payload.playSound !== false; // Default true
  
  if (playSound) {
    this.playBarkSound();
  }
  // ... rest of bark creation
}
  • Sound enabled by default for all barks
  • Can be disabled per-bark via playSound: false in payload
  • Respects global soundEnabled setting

What Gets Sound?

All Bark Notifications

  1. Event-triggered barks

    • Door unlocks
    • Item pickups
    • Room discoveries
    • Lockpicking attempts
    • CEO office entry
    • Any other event-mapped reactions
  2. Timed messages

    • Scheduled NPC messages
    • Delivered at specific game times
    • Automatically trigger barks with sound
  3. Manual barks

    • Any npcManager.showBark() calls
    • Any barkSystem.showBark() calls

No Sound

  • Opening phone-chat minigame (no sound yet)
  • Closing phone-chat minigame (no sound yet)
  • Clicking barks (visual only)
  • Choice selections in conversations (visual only)

Usage Examples

Default (Sound Enabled)

// Sound plays automatically
npcManager.showBark({
  npcId: 'helper_npc',
  npcName: 'Tech Support',
  text: 'Found something interesting!'
});

Disable Sound for Specific Bark

// Silent bark (no sound)
npcManager.showBark({
  npcId: 'helper_npc',
  npcName: 'Tech Support',
  text: 'This is a quiet message...',
  playSound: false
});

Disable All Sounds

// Turn off bark sounds globally
window.npcManager.barkSystem.setSoundEnabled(false);

// Turn them back on
window.npcManager.barkSystem.setSoundEnabled(true);

Testing

In-Game Testing

  1. Refresh the game page to load updated code
  2. Start CEO Exfiltration scenario
  3. Test scenarios that trigger barks:
    • Pick up an item → Should hear sound
    • Walk through a door → Should hear sound
    • Unlock a door → Should hear sound
    • Enter CEO office → Should hear sound

Volume Testing

  • Default volume: 50% (0.5)
  • Can be adjusted by modifying this.barkSound.volume in loadBarkSound()
  • Recommended range: 0.3 - 0.7 (30% - 70%)

Browser Compatibility

Phaser Audio System

  • Chrome/Edge: Full Web Audio API support
  • Firefox: Full Web Audio API support
  • Safari: Full Web Audio API support
  • Mobile browsers: Good support (Phaser handles fallbacks)

Autoplay Policy

Modern browsers restrict autoplay. Phaser handles this automatically:

  • Works automatically: Phaser unlocks audio context on first user interaction
  • No console warnings: Phaser manages audio context lifecycle
  • Sounds triggered by user actions: Always work (clicking, walking)
  • Better than HTML5 Audio: Phaser's Web Audio API is more reliable

Advantages Over HTML5 Audio

  1. Unified audio management: All game audio through one system
  2. Better performance: Web Audio API vs Audio Tag
  3. Sound pooling: Multiple simultaneous sounds without creating new instances
  4. No autoplay issues: Phaser handles audio context unlocking
  5. Consistent volume control: Tied to game's master volume
  6. Future-ready: Can add spatial audio, filters, analyzers, etc.

Future Enhancements

Potential Additions

  1. Phone open/close sounds

    • Add phone_open.mp3 sound when opening phone-chat
    • Add phone_close.mp3 sound when closing phone-chat
  2. Choice selection sound

    • Subtle click sound when selecting dialogue choices
    • Could use existing GASP_UI_Clicks_*.mp3 sounds
  3. Typing indicator sound

    • Quiet keyboard sound during typing animation
    • Adds to realism of text messaging
  4. Volume slider in settings

    • UI control for adjusting bark volume
    • Persist preference to localStorage
  5. Different sounds per NPC type

    • Helper NPCs: friendly notification sound
    • Adversary NPCs: alert/warning sound
    • Neutral NPCs: standard notification
  6. Sound variations

    • Randomly pick from multiple notification sounds
    • Prevents repetition fatigue
    • Could use GASP_UI_Notification_1.mp3 through _6.mp3

Implementation Stats

  • Lines added: ~68 total
    • game.js: +3 lines (audio loading)
    • npc-barks.js: +65 lines (Phaser sound integration)
  • Files modified: 2 (game.js, npc-barks.js)
  • Breaking changes: None
  • Default behavior: Sound enabled
  • Asset used: Existing (message_received.mp3)
  • Audio system: Phaser Web Audio API (consolidated)

Next Steps

Priority 3: NPC Avatars

  • Create 3 default 32x32px pixel-art avatars
  • Add avatar support to scenarios
  • Display avatars in barks and conversations

Priority 2 Continued: More Events

  • Implement objective_completed event
  • Implement evidence_collected event
  • Implement player_detected event

Status: Implementation complete, ready for testing Date: 2024-10-31