# Atmosphere & Audio — Horror Environment Systems **Game:** Project Void | **Build Phases:** 14, 16, 17, 18 **Framework Systems:** 89-101 (adaptive) + 132-135 (MetaSounds audio), 96_BPC_LightEventController, 97_BPC_MemoryDriftSystem, 98_BPC_PacingDirector, 101_BPC_ScareEventSystem --- ## Purpose Defines every atmosphere profile, scare event, light event, room audio zone, and adaptive environment system used to create the horror experience. This is where the game's "feel" comes from. --- ## Atmosphere Profiles (DA_AtmosphereProfile) Each area has a Data Asset that defines its default audio, lighting, fog, and post-process settings: | Profile | Area | Tension | Lighting | Audio Bus | Fog | |---------|------|:---:|----------|-----------|-----| | `DA_Atmosphere_WardA_Standard` | WardA | 0.3 | Dim overheads, cool blue | WardA reverb | Light volumetric | | `DA_Atmosphere_WardB_Dark` | WardB | 0.6 | Flickering, warm amber | WardB echo | Medium volumetric | | `DA_Atmosphere_Basement_Dark` | Basement | 0.9 | NONE (player-provided) | Heavy reverb, drips | Heavy fog | | `DA_Atmosphere_VoidSpace` | Void | 1.0 | Inverted (dark fog, white shadows) | Reversed whispers | Black fog | | `DA_Atmosphere_WardensOffice` | WardensOffice | 0.7 | Single desk lamp, moonlight | Quiet, ticking clock | None | | `DA_Atmosphere_SafeRoom` | Safe Rooms | 0.0 | Warm, steady lamp light | Soft hum, safe | None | ### Profile Properties ``` DA_AtmosphereProfile Structure: ├─ ProfileTag (GameplayTag) ├─ TensionLevel (Float 0.0-1.0) ├─ LightingSettings (struct) │ ├─ bOverrideLights (Bool) │ ├─ LightColorTint (LinearColor) │ ├─ LightIntensityMultiplier (Float) │ └─ bEnableFlicker (Bool) ├─ FogSettings (struct) │ ├─ FogDensity (Float) │ ├─ FogColor (LinearColor) │ └─ bVolumetricFogEnabled (Bool) ├─ PostProcessSettings │ ├─ ColorGradingIntensity (Float) │ ├─ Saturation (Float 0.0-2.0) │ ├─ Contrast (Float 0.0-2.0) │ └─ VignetteIntensity (Float) ├─ AudioSettings │ ├─ RoomAcousticPreset (DA_RoomAcousticPreset*) │ ├─ AmbientLoop (SoundBase*) │ ├─ MusicTrack (SoundBase*) │ └─ BusVolumeOverrides (Map) └─ ScareEventPool (Array) ``` --- ## Audio Architecture (MetaSounds) ### Mix Bus Hierarchy ``` ┌─────────────┐ │ MS_MasterBus │ └──────┬──────┘ ┌─────────┬───────┼───────┬─────────┐ ▼ ▼ ▼ ▼ ▼ ┌────────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌────────┐ │MS_SFXBus│ │MS_Amb│ │MS_Mus│ │MS_Dia│ │(Future)│ │ │ │Bus │ │Bus │ │Bus │ │ │ └────────┘ └──────┘ └──────┘ └──────┘ └────────┘ SFX Ambience Music Dialogue ``` ### Bus Configuration (DA_AudioSettings_Horror) | Bus | Default Volume | Ducking Target | Ducking Amount | Purpose | |-----|:---:|---|---|---| | `MS_SFXBus` | 1.0 | MS_DialogueBus | -6dB | Gunshots, footsteps, scares, UI | | `MS_AmbientBus` | 0.8 | MS_DialogueBus | -3dB | Wind, creaks, drips, whispers | | `MS_MusicBus` | 0.7 | MS_DialogueBus | -8dB | Tension drones, combat music, theme | | `MS_DialogueBus` | 1.0 | None | — | VO, subtitles, entity speech | ### Gameplay Parameters (Pushed via SS_AudioManager) ``` SS_AudioManager.SetFloatParameter(ParamName, Value): "PlayerHealthPercent" → 0.0–1.0 (BPC_HealthSystem) └─ MS_SFXBus: heartbeat loudness, breathing intensity "StressTier" → 0–4 (BPC_StressSystem) └─ MS_AmbientBus: whisper density, drone intensity └─ MS_MusicBus: tension layer volume "HeartRate" → 60–180 (BPC_StateManager) └─ MS_SFXBus: heartbeat speed, pulse intensity "FearIntensity" → 0.0–1.0 (GI_HorrorGame) └─ MS_MusicBus: orchestral intensity, dissonance level "TensionLevel" → 0.0–1.0 (BPC_AtmosphereStateController) └─ MS_AmbientBus: ambient layer crossfade └─ MS_MusicBus: music layer selection "PlayerSpeed" → 0–600 (BPC_MovementStateSystem) └─ MS_SFXBus: footstep volume and frequency "IsHiding" → 0/1 (BPC_HidingSystem) └─ MS_AmbientBus: muffled external sounds └─ MS_SFXBus: heartbeat + breath prominence increase "VoidActive" → 0/1 (GS_HorrorGameState) └─ ALL buses: spectral reverb, reversed samples, pitch shift ``` --- ## Room Audio Zones (BP_RoomAudioZone) Each zone is a TriggerVolume that switches acoustic preset on overlap: | Zone | Preset | Location | |------|--------|----------| | `BP_RoomAudioZone_WardA` | `DA_RoomAcoustic_WardA` | All WardA rooms | | `BP_RoomAudioZone_WardB` | `DA_RoomAcoustic_WardB` | All WardB rooms | | `BP_RoomAudioZone_Basement` | `DA_RoomAcoustic_Basement` | Basement corridors | | `BP_RoomAudioZone_Void` | `DA_RoomAcoustic_Void` | Void space | | `BP_RoomAudioZone_Courtyard` | `DA_RoomAcoustic_Outdoor` | WardB courtyard | | `BP_RoomAudioZone_SafeRoom` | `DA_RoomAcoustic_SmallRoom` | All safe rooms | ### Acoustic Presets | Preset | Reverb Time | Early Reflections | Occlusion | EQ | |--------|:---:|------|------|-----| | `DA_RoomAcoustic_WardA` | 1.2s (medium hall) | Moderate | Low | Flat | | `DA_RoomAcoustic_WardB` | 2.0s (large echo) | Heavy | Medium | Boost 200Hz | | `DA_RoomAcoustic_Basement` | 3.5s (cathedral) | Heavy wet | High | Cut highs above 4kHz | | `DA_RoomAcoustic_Void` | 8.0s (infinite) | Spectral | Full | Reverse delay | | `DA_RoomAcoustic_Outdoor` | 0.3s (open) | None | None | Wind filter | | `DA_RoomAcoustic_SmallRoom` | 0.5s (office) | Light | Low | Warm boost | --- ## Scare Event System (BPC_ScareEventSystem) ### Scare Event Data Assets | DA_ScareEvent | Type | Trigger | Anticipation | Payoff | |--------------|------|---------|-------------|--------| | `DA_Scare_LockerJumpscare` | Proximity | Player within 200u of locker | 3s (rattling sound) | Locker door BANG open | | `DA_Scare_MirrorApparition` | Look-at | Player looks at mirror > 2s | 5s (reflection distorts) | Face appears behind player | | `DA_Scare_WindowFace` | Proximity | Player walks past window | 2s (breath fog on glass) | Hand SLAMS from outside | | `DA_Scare_VoidWhisper` | Random timer | 5-15 min intervals | None (sudden) | Loud whisper in player's ear | | `DA_Scare_CeilingThump` | Proximity | Player in basement corridor | 4s (distant footsteps above) | Loud THUMP directly above | | `DA_Scare_BreathingBehind` | Stress trigger | Stress > 70 | 6s (breathing fades in behind) | Nothing there — just audio | ### Scare Event Flow ``` BPC_ScareEventSystem.TriggerScare(DA_ScareEvent) │ ├─ [Cooldown Check] │ └─ Was a scare triggered in last 15 seconds? → Return (no spam) │ ├─ [Eligibility Check] │ ├─ Player state allows scare? (Not dead, not cutscene) │ ├─ Accessibility: "reduce_jumpscares" setting? → use soft variant │ └─ Difficulty: scale intensity by difficulty scalar │ ├─ [Anticipation Phase] (duration from DA_ScareEvent.AnticipationTime) │ ├─ Audio: fade in tension sound (creaking, breathing, footsteps) │ ├─ BPC_StressSystem.AddStress(+5) during anticipation │ ├─ WBP_ScreenEffectController: subtle vignette darkening │ └─ (Player is tense — they know something is coming) │ ├─ [Payoff Phase] (instant) │ ├─ Audio: scare sting (loud sound per scare type) │ ├─ Visual: screen shake, flash, or particle burst │ ├─ BPC_StressSystem.AddStress(+15) — spike │ ├─ SS_AudioManager.PlaySFX(ScareSting) │ └─ BPC_PlayerMetricsTracker.RecordScare(ScareType) │ ├─ [Recovery Phase] (3-5 seconds) │ ├─ Audio: fade scare sting, return to ambient │ ├─ Visual: vignette fades back │ ├─ BPC_StressSystem.StartDecay() (5 seconds of rapid decay) │ └─ WBP_HUDController: subtle "heartbeat" indicator pulse │ └─ Record scare in PS_HorrorPlayerState.FearHistory ``` --- ## Light Events (BPC_LightEventController) | Light Event | Trigger | Effect | Duration | |------------|---------|--------|:---:| | `Flicker` | Random (5-15 min intervals) | All lights flicker 3-5 times | 1-2s | | `BulbExplosion` | Scripted (basement morgue) | Light bulb bursts → sparks → darkness | Permanent | | `EmergencyRed` | Void shift active | All lights tint red, strobe effect | 30s | | `ShadowPass` | Random (3-8 min intervals) | Shadow passes across lights (like something walked past) | 0.5s | | `TotalBlackout` | Scripted (basement entry) | All lights off. Flashlight-only. | Until generator puzzle solved | | `GhostLight` | Rare event | Blue-white orb floats down hallway → vanishes | 5s | ### Light Event Flow ``` BPC_LightEventController.TriggerLightEvent(LightEventTag) │ ├─ [Flicker] │ ├─ For each PointLight in tagged group: │ │ └─ Random Delay(0.1-0.4s) → ToggleVisibility × 4 iterations │ └─ SS_AudioManager.PlaySFX("light_flicker") │ ├─ [BulbExplosion] │ ├─ Target Light → SetIntensity(0) + Play spark particle │ ├─ SS_AudioManager.PlaySFX("glass_shatter") │ └─ Room now darker → update atmosphere profile │ ├─ [TotalBlackout] │ ├─ All lights → SetIntensity(0) over 1s (smooth dim) │ ├─ SS_AudioManager.CrossfadeAmbient("basement_dark") │ └─ BPC_StressSystem.StartContinuousStress(+2/sec, "Darkness") │ └─ [ShadowPass] ├─ Spawn invisible actor moving across lights └─ Light shafts briefly occluded ``` --- ## Memory Drift System (BPC_MemoryDriftSystem) Hallucinations triggered by high stress. Intensity scaled by stress tier: ``` BPC_MemoryDriftSystem.SetIntensity(Tier: 0-4) │ ├─ Tier 0 (Calm): No effects │ ├─ Tier 1 (Uneasy): Very rare whisper audio cues │ ├─ Tier 2 (Disturbed): Peripheral vision flickers │ Occasional false sound cues │ Text in journal shifts subtly │ ├─ Tier 3 (Breaking): Tunnel vision + desaturation │ False enemy movement (corner of eye) │ Dialogue lines sometimes echo/repeat │ Environment "breathes" (wall textures warp) │ └─ Tier 4 (Catatonic): Near-black peripheral vision False enemies appear (visual only) Player name whispered in audio Doors appear where none exist (can't walk through) Text unreadable (shifts rapidly) ``` --- ## Pacing Director (BPC_PacingDirector) Manages the rhythm of horror: exploration → tension → encounter → recovery. ``` Intensity Bands: ├─ Band 0: RECOVERY (Safe rooms, after encounter ends) │ └─ Atmosphere: Calm, music: soft, enemies: none │ ├─ Band 1: EXPLORATION (Default, new areas) │ └─ Atmosphere: Light tension, music: low drone, enemies: patrol only │ ├─ Band 2: TENSION (Near objectives, dark areas) │ └─ Atmosphere: Moderate tension, music: building, enemies: searching │ ├─ Band 3: ENCOUNTER (Enemy sighted, combat) │ └─ Atmosphere: High tension, music: combat layer, enemies: hostile │ └─ Band 4: CLIMAX (Void shift, Shade pursuit, ending) └─ Atmosphere: Maximum, music: full orchestral, enemies: relentless Transition Triggers: ├─ Recovery → Exploration: Player leaves safe room ├─ Exploration → Tension: Player enters dark area OR finds key item ├─ Tension → Encounter: Enemy spots player ├─ Encounter → Recovery: Enemy killed/evaded + 10 seconds passed └─ Recovery → Climax: Entering void space or ending sequence ``` --- ## Adaptive Environment Director (BPC_AdaptiveEnvironmentDirector) Handles room mutations and dynamic level changes: ``` TriggerRoomMutation(MutationTag) │ ├─ "VoidShift" → WardB Morgue │ ├─ Walls: temporary overlay material (bleeding concrete) │ ├─ Corridors: loop — walking forward returns to same room │ ├─ Doors: random open/close cycle │ ├─ Audio: crossfade to void ambience │ └─ Duration: 30 seconds, then revert │ ├─ "BasementMaze" → Basement │ ├─ Doors randomize their locked/unlocked state every 60s │ └─ Player must navigate changing maze │ └─ "VoidSpaces" → Void level ├─ Rooms rearrange via data layers (swap layout presets) ├─ Triggered on player entering new room └─ Creates non-Euclidean navigation ``` --- ## Blueprint Wiring Checklist ### Atmosphere - [ ] Create all 6 `DA_AtmosphereProfile` Data Assets - [ ] Wire `BPC_AtmosphereStateController.LoadProfile()` to apply on level load - [ ] Add `BP_AtmosphereController_WardA` actor to WardA level ### Audio - [ ] Create `DA_AudioSettings_Horror` — bus volumes, ducking rules - [ ] Create all 6 `DA_RoomAcousticPreset` Data Assets - [ ] Create `BP_RoomAudioZone_*` TriggerVolumes for each area - [ ] Wire gameplay parameters: BPC_HealthSystem → "PlayerHealthPercent", etc. - [ ] Set up `SS_AudioManager` with 4 MetaSound buses ### Scares - [ ] Create 6 `DA_ScareEvent` Data Assets - [ ] Wire `BPC_ScareEventSystem.TriggerScare()` with cooldown + eligibility checks - [ ] Create `BP_ScareEvent_LockerBang` and `BP_ScareEvent_Mirror` actors ### Lights - [ ] Wire `BPC_LightEventController` with 6 light event types - [ ] Create `BP_LightEvent_Flicker` actor for placed flicker points ### Memory Drift - [ ] Wire `BPC_MemoryDriftSystem.SetIntensity()` to stress tier changes - [ ] Add visual effects for each tier (vignette, texture warp, false actors) ### Pacing - [ ] Wire `BPC_PacingDirector` with 5 intensity bands - [ ] Add transitions: area entry/exit, enemy detection, safe room entry ### Adaptive Environment - [ ] Wire `BPC_AdaptiveEnvironmentDirector` for void shift + basement maze - [ ] Create data layers for swappable room layouts in void space --- ## Notes for Expansion - Add **dynamic music system**: adaptive music that layers stems based on tension/pacing band - Add **environmental storytelling through audio**: ghostly voices re-enacting past events - Add **weather system**: external rain sounds through windows (only in courtyard-facing rooms) - Add **binaural audio** (3D sound) support for headphones — whispers sound like they're behind you - Add **haptic profile** (DA_HapticProfile) for DualSense: heartbeat pulse, gunshot kick, floor rumble - Add **room mutation presets** as `DA_RoomMutation` Data Assets for designers to configure - Consider **performance scaling** of audio: fewer simultaneous voices on lower-end hardware --- *Atmosphere & Audio for Project Void. See [GAMEINDEX.md](GAMEINDEX.md) for full game structure. See [metasounds-audio-system.md](../architecture/metasounds-audio-system.md) for audio architecture. See [sound-catalog.md](../architecture/sound-catalog.md) for full sound trigger list.*