Add UI Overrides and Weapons Index documentation for Project Void
- Created ui-overrides.md detailing game-specific Widget Blueprint overrides, including purpose, widget index, visual styling, and accessibility requirements. - Established weapons-index.md outlining all held weapon actors, including their components, logic, and comparisons for gameplay mechanics.
This commit is contained in:
367
docs/game/atmosphere-audio.md
Normal file
367
docs/game/atmosphere-audio.md
Normal file
@@ -0,0 +1,367 @@
|
||||
# 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<BusTag, Float>)
|
||||
└─ ScareEventPool (Array<DA_ScareEvent*>)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 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.*
|
||||
Reference in New Issue
Block a user