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:
Lefteris Notas
2026-05-21 22:27:57 +03:00
parent c515920eea
commit 040db37720
17 changed files with 6795 additions and 43 deletions

642
docs/game/levels.md Normal file
View File

@@ -0,0 +1,642 @@
# Level Design — All 11 Maps
**Game:** Project Void | **Build Phases:** 2 (splash/menu/test) + 21 (full levels)
**Framework Systems:** 05_GM_CoreGameMode, 19_BP_DoorActor, 37_BP_Checkpoint, 67_BP_NarrativeTriggerVolume, 92_BPC_ProceduralEncounter, 93_BPC_AdaptiveEnvironmentDirector, 133_BP_RoomAudioZone
---
## Purpose
Defines the layout, objectives, placed assets, and atmosphere for every `.umap` level in the game. Each level builds on the previous, introducing new systems incrementally.
---
## Level Index
| # | Map File | Chapter Tag | Type | Playtime (est.) |
|---|----------|-------------|------|:---:|
| 1 | `L_SplashScreen` | — | Boot | 0:08 |
| 2 | `L_MainMenu` | — | Menu | ∞ |
| 3 | `L_Asylum_Entry` | `Chapter.Entry` | Tutorial | 5 min |
| 4 | `L_Asylum_WardA` | `Chapter.WardA` | Exploration | 20 min |
| 5 | `L_Asylum_WardB` | `Chapter.WardB` | Horror Ramp | 25 min |
| 6 | `L_Asylum_Basement` | `Chapter.Basement` | Dark Horror | 20 min |
| 7 | `L_Asylum_WardensOffice` | `Chapter.WardensOffice` | Climax | 15 min |
| 8 | `L_Asylum_VoidSpace` | `Chapter.VoidSpace` | Alt Reality | 10 min |
| 9 | `L_Ending_Truth` | `Chapter.Ending` | Cinematic | 5 min |
| 10 | `L_Credits` | `Chapter.Credits` | Credits | 1 min |
| 11 | `L_Test_Sandbox` | — | Dev | ∞ |
---
## L1 — L_SplashScreen
**Duration:** ~8 seconds (skippable) | **Framework:** 114_WBP_SplashScreen
```
Setup:
1. New Level → Empty Level
2. Add PostProcessVolume:
- Set to Unbound: true
- Film → Saturation: 0.9
- Color Grading → cool desaturated look
3. Add WBP_SplashHorror widget to viewport on BeginPlay
4. Level Blueprint: OnBeginPlay → PlaySplashSequence
5. OnSequenceComplete: OpenLevel("L_MainMenu")
Placed Assets:
- (None — this is a UI-only level with no world geometry)
- Optional: add a CameraActor + black VoidPlane for background
Audio:
- SS_AudioManager.PlayMusic("splash_ambient", MS_MusicBus)
```
---
## L2 — L_MainMenu
**Framework:** 44_SS_UIManager, 51_WBP_MainMenu
```
Layout:
┌─────────────────────────────────────────────┐
│ │
│ 3D Environment: Asylum Hallway │
│ ├─ Static Mesh: Hallway section │
│ ├─ Dim point lights (3) │
│ ├─ ExponentialHeightFog (density 0.02) │
│ ├─ PostProcessVolume (horror color grade) │
│ └─ CameraActor: Slow left-right pan │
│ (animate rotation via Timeline │
│ in Level Blueprint) │
│ │
│ WBP_GameMainMenu overlaid on screen │
│ │
└─────────────────────────────────────────────┘
Placed Assets:
├─ StaticMesh: SM_AsylumHallway (whitebox)
├─ PointLight × 3 (flicker enabled via BP_LightEvent_Flicker)
├─ PostProcessVolume (horror color grade)
├─ ExponentialHeightFog
├─ CameraActor ("MenuCam")
└─ PlayerStart (hidden — used for spawn, camera overrides)
Level Blueprint:
OnBeginPlay
├─ SS_UIManager.ShowMenu(MainMenu)
├─ CameraActor → SetViewTargetWithBlend
└─ Play menu ambient music via SS_AudioManager
Audio:
├─ BP_RoomAudioZone → Lobby preset
└─ SS_AudioManager.PlayMusic("menu_theme", MS_MusicBus)
```
---
## L3 — L_Asylum_Entry (Tutorial)
**Duration:** ~5 minutes | **Player Start:** Padded Cell
```
Layout (linear):
┌─────────┐ ┌─────────┐ ┌──────────────┐ ┌─────────┐
│ PADDED │───→│ HALLWAY │───→│ NURSE STATION│───→│ EXIT │
│ CELL │ │ A (dark)│ │ (safe room) │ │ DOOR │
│ │ │ + vent │ │ │ │ │
│ [Wake] │ └────┬────┘ └──────────────┘ └────┬────┘
└─────────┘ │ │
│ (vent path) ▼
┌────┴────┐ L_Asylum_WardA
│ STORAGE │
│ CLOSET │
└─────────┘
Systems Demonstrated:
├─ BPC_InteractionDetector (pick up note, open door)
├─ BPC_MovementStateSystem (walk, crouch through vent)
├─ BPC_HidingSystem (hide in storage locker)
├─ BPC_InventorySystem (first item: "Note")
├─ BPC_ObjectiveSystem (first objective: "Find a way out")
├─ BPC_TutorialSystem (4 tutorial prompts)
├─ BPC_StateManager (hiding blocks interaction, walking allowed)
└─ BP_Checkpoint (first safe room checkpoint)
Placed Assets:
├─ [Cell]
│ ├─ PlayerStart ("WakeupSpawn")
│ ├─ BP_Door_Asylum (unlocked — exit cell)
│ ├─ BP_Pickup_JournalPage ("Wake Up Note" — ItemData: DA_Item_JournalPage)
│ └─ BP_NarrativeTrigger_Intro (starts opening cutscene)
├─ [Hallway A]
│ ├─ BP_Door_Asylum × 2 (unlocked)
│ ├─ Vent entrance (overlap → prompt crouch)
│ ├─ BP_Pickup_Battery × 2 (on floor)
│ └─ [SCRIPTED] First Patient sighting
│ └─ BP_Enemy_Patient walks past hallway window
│ (behind glass, cannot reach player)
│ Trigger: OnOverlap with hallway midpoint trigger
├─ [Storage Closet]
│ ├─ BP_HidingSpot_Locker × 3
│ ├─ BP_Pickup_MedKit (on shelf)
│ └─ BP_Door_Asylum (unlocked → back to hallway)
├─ [Nurse Station]
│ ├─ BP_Checkpoint_SafeRoom (first checkpoint)
│ ├─ BP_Desk_Drawer × 2 (contain: battery, journal page)
│ ├─ BP_Pickup_Flashlight (on desk — critical item)
│ └─ WBP_NotificationToast: "Objective Updated: Find the Warden's Key"
└─ [Exit Door]
└─ BP_Door_OmegaWing (UNLOCKED for tutorial — opens to WardA)
In full game: requires keycard; tutorial version is pre-unlocked
Tutorial Triggers:
├─ BP_TutorialTrigger_Controls → "Use WASD to move, Mouse to look"
├─ BP_TutorialTrigger_Interact → "Press E to interact with objects"
├─ BP_TutorialTrigger_Crouch → "Press C to crouch through vents"
└─ BP_TutorialTrigger_Hiding → "Press E on lockers to hide from threats"
Audio:
├─ BP_RoomAudioZone → SmallRoom preset (cell + hallway)
├─ At intro: SS_AudioManager.PlayDialogue("intro_voiceover") (whispered)
└─ First patient: scare sting + heartbeat rise
Atmosphere:
├─ DA_Atmosphere_WardA_Standard (light tension)
├─ BP_LightEvent_Flicker (in hallway — occasional flicker)
└─ BPC_AtmosphereStateController: Tension = Low
```
---
## L4 — L_Asylum_WardA (Main Exploration)
**Duration:** ~20 minutes | **Framework systems:** All interaction, inventory, weapons
```
Layout (hub-and-spoke):
┌──────────────┐
│ MAIN HALL │ ← Patient enemies patrol
└──┬───┬───┬──┘
│ │ │
┌────────────┘ │ └────────────┐
▼ ▼ ▼
┌────────────┐ ┌────────────┐ ┌────────────┐
│ TREATMENT │ │ SECURITY │ │ NURSES' │
│ ROOM │ │ OFFICE │ │ STATION │
│ (locked) │ │ (pistol) │ │ (keycard) │
└────────────┘ └────────────┘ └────────────┘
Systems Demonstrated:
├─ BP_DoorActor (locked/unlocked/barricaded states)
├─ BP_PuzzleDeviceActor (fusebox — restore power)
├─ BPC_ContainerInventory (desk drawers, filing cabinets)
├─ BP_WeaponBase → BP_Pistol_Held (first weapon)
├─ BPC_FirearmSystem (hitscan fire)
├─ BPC_AmmoComponent (9mm ammo pickup)
├─ BPC_RecoilSystem (pistol recoil)
├─ BPC_ReloadSystem (pistol reload)
├─ BPC_CombatFeedbackComponent (hit markers)
├─ BP_EnemyBase → BP_Enemy_Patient (first real enemy)
├─ BPC_AlertSystem (suspicious → alerted → combat)
├─ BPC_AIPerceptionSystem (sight + hearing detection)
├─ BPC_DamageReceptionSystem (enemy takes damage)
└─ BPC_HitReactionSystem (enemy flinches when shot)
Placed Assets:
├─ [Main Hall]
│ ├─ PlayerStart (from Entry transition)
│ ├─ BP_PatrolPath_Asylum × 2 (for Patient enemies)
│ ├─ BP_Enemy_Patient × 2 (patrolling)
│ ├─ BP_Pickup_Ammo_9mm × 3 (scattered on floor/tables)
│ ├─ BP_Pickup_MedKit × 2
│ ├─ BP_Pickup_Battery × 2
│ └─ BP_HidingSpot_Locker × 3
├─ [Treatment Room] (locked initially)
│ ├─ BP_Door_Asylum (locked — unlocks after fusebox puzzle)
│ ├─ BP_Pickup_OldPhoto × 1 (on bed)
│ └─ BP_Pickup_PatientFile × 1 (on desk)
├─ [Security Office]
│ ├─ BP_Pickup_Pistol (on desk — first weapon)
│ ├─ BP_Pickup_Ammo_9mm × 2
│ ├─ BP_Desk_Drawer × 2
│ └─ BP_DiegeticScreen_Monitor (shows hallway camera feed)
├─ [Nurses' Station]
│ ├─ BP_Pickup_KeycardAlpha (on counter — key item)
│ ├─ BP_Pickup_MedKit × 2
│ ├─ BP_FilingCabinet × 2 (contain: patient files, journal pages)
│ └─ BP_Checkpoint_Mirror (checkpoint)
└─ [Puzzles]
└─ BP_Puzzle_Fusebox (in utility closet off main hall)
├─ Solution: Flip 3 switches in correct order (diagram nearby)
├─ Reward: Treatment room unlocks
└─ BPC_TrialScenarioSystem: no timer, just puzzle
Encounter Data:
├─ DA_Encounter_WardA_Patrol
│ ├─ Enemy: Patient
│ ├─ Count: 2 (spawned at start)
│ └─ Respawn: OFF (once killed, stays dead — check persistence)
└─ BP_EncounterSpawner_WardA (procedural)
├─ Spawns additional Patient if player lingers > 5 min in one spot
└─ Difficulty: Easy
Audio:
├─ BP_RoomAudioZone_WardA × 4 (one per room)
│ └─ DA_RoomAcoustic_WardA (medium reverb, echo)
├─ SS_AudioManager.SetFloatParameter("TensionLevel", 0.3)
└─ Scare sting on first patient sighting
Atmosphere:
├─ DA_Atmosphere_WardA_Standard
│ ├─ Lighting: Dim overheads with occasional flicker
│ ├─ Fog: Light volumetric
│ ├─ PostProcess: Desaturated, cool blue tint
│ └─ Music: Low drone, no beat
├─ Scares:
│ ├─ DA_Scare_LockerJumpscare → locker rattles when player nearby
│ └─ DA_Scare_WindowFace → shadow passes window
Adaptive Environment:
├─ BPC_DifficultyManager: starts at 1.0
│ └─ If player dies: decrease to 0.8 (fewer enemies, more ammo)
└─ BPC_PacingDirector: Exploration→Tension→Encounter→Recovery bands
```
---
## L5 — L_Asylum_WardB (Horror Ramp)
**Duration:** ~25 minutes
```
Layout (corridor maze with central courtyard):
┌──────────────────────────────────┐
│ CENTRAL COURTYARD │
│ (overgrown, rain effect, │
│ Shade first appearance) │
└────────┬──────────┬──────────────┘
│ │
┌─────────────┘ └─────────────┐
▼ ▼
┌──────────┐ ┌──────────────┐
│ MORGUE │ │ CHAPEL │
│ (shotgun) │ │ (pipe organ │
│ + void │ │ puzzle) │
│ trigger │ │ │
└──────────┘ └──────────────┘
Key systems introduced:
├─ BP_Enemy_Orderly (fast melee, flashlight-weak)
├─ BP_Enemy_Shade (teleporting, rare, terrifying)
├─ BPC_AltDeathSpaceSystem → Void shift trigger
├─ BP_Puzzle_PipeOrgan (music puzzle)
├─ BPC_MemoryDriftSystem (first hallucinations)
├─ BPC_FearSystem (enemy fears flashlight on Orderly)
└─ DA_ScareEvent × 3 (mirror face, window slam, breathing)
Placed Key Assets:
├─ BP_Shotgun_Held (in morgue, drawer 7)
├─ BP_Pickup_Ammo_Shells × 5
├─ BP_Pickup_AdrenalineSyringe × 2
├─ BP_Pickup_SanityPill × 2
├─ BP_Pickup_KeycardBeta (behind organ puzzle)
├─ BP_Pickup_VoidShard × 1 (hidden in courtyard statue)
├─ BP_Pickup_PatientFile × 3
└─ BP_Pickup_OldPhoto × 1
Enemies:
├─ BP_Enemy_Orderly × 2 (fast, patrol chapel and courtyard)
├─ BP_Enemy_Patient × 1 (morgue hallway)
└─ BP_Enemy_Shade × 1 (scripted courtyard appearance + random morgue)
Void Shift Trigger (in Morgue):
On overlap with morgue center trigger:
├─ BPC_AdaptiveEnvironmentDirector → TriggerRoomMutation("VoidShift")
├─ Effects:
│ ├─ BPC_LightEventController → All lights flicker red
│ ├─ BP_Door_Void → Appears/disappears
│ ├─ BPC_MemoryDriftSystem → SetIntensity(0.5)
│ │ └─ Walls appear to breathe, text on wall shifts
│ └─ SS_AudioManager → Crossfade to void ambience
├─ Duration: 30 seconds
└─ Exit: Find mirror in morgue, interact → shift ends
Audio:
├─ BP_RoomAudioZone_WardB (darker reverb, echo chamber feel)
├─ BP_RoomAudioZone_Courtyard (outdoor preset + rain)
└─ Organ puzzle: each key press plays a pipe note
```
---
## L6 — L_Asylum_Basement (Dark Horror)
**Duration:** ~20 minutes | **Special Rule:** No ambient light
```
Layout (dark maze):
┌─────────────────────────────────────────┐
│ BASEMENT CORRIDORS │
│ (zero ambient light — flashlight only) │
│ │
│ ┌─────┐ ┌──────┐ ┌──────┐ │
│ │BOILER│ │MORGUE│ │CREMAT│ │
│ │ ROOM │ │ #4 │ │ORIUM │ │
│ └──┬───┘ └──┬───┘ └──┬───┘ │
│ │ │ │ │
│ └──────────┼──────────┘ │
│ │ │
│ ┌──────┴──────┐ │
│ │ ELEVATOR │ → WardensOffice │
│ │ (requires │ │
│ │ WardKey) │ │
│ └─────────────┘ │
└─────────────────────────────────────────┘
Key systems demonstrated:
├─ BPC_StressSystem (max stress from constant darkness)
├─ BPC_EndingAccumulator (morgue puzzle reveals ending-lore)
├─ BPC_ScareEventSystem (4+ jump scares)
├─ BPC_AdaptiveEnvironmentDirector (maze shifts rooms)
├─ BPC_AIMemorySystem (Shade remembers last known location)
└─ BPC_PersistentCorpseSystem (enemy corpses remain)
Placed Assets:
├─ BP_Pickup_Key_Wardens (in morgue drawer #4 — behind puzzle)
├─ BP_Pickup_Battery × 4 (critical — scattered in dark)
├─ BP_Pickup_Ammo_9mm × 3
├─ BP_Pickup_Ammo_Shells × 3
├─ BP_Pickup_MedKit × 2
├─ BP_Pickup_AdrenalineSyringe × 1
├─ BP_Pickup_SanityPill × 1
├─ BP_Pickup_VoidShard × 1 (hidden in crematorium)
└─ BP_Pickup_OldPhoto × 1
Puzzle: BP_Puzzle_MorgueDrawers
├─ 12 morgue drawers in cold storage room
├─ Solution: Open drawers in order matching patient death dates
│ └─ Clue found in patient files from WardA + WardB
├─ Wrong drawer: Shade appears behind player briefly
└─ Correct sequence: Drawer #4 opens → contains Warden's Key
Enemies:
└─ BP_Enemy_Shade × 1 (persistent pursuer)
├─ Teleports between dark corners
├─ Flashlight delays its approach (slows to 50% speed)
├─ Cannot be killed — only avoided
└─ If caught → instant death → Void Space
Stress Mechanics:
├─ Player stress rises constantly (+2/sec) in total darkness
├─ Using flashlight: stress rise slows to +0.5/sec
├─ Battery depletes: stress rise doubles
├─ At Breaking (75+): screen distortion, false enemy sounds
└─ At Catatonic (100): player collapses, Shade appears
Audio:
├─ BP_RoomAudioZone_Basement (heavy reverb, dripping water, distant screams)
├─ SS_AudioManager.SetFloatParameter("HeartRate", player heart rate)
└─ 4 scare sting cues placed at specific trigger volumes
Atmosphere:
├─ NO PostProcess volume "auto-exposure" — pure darkness without flashlight
├─ BP_LightEvent_Flicker × 6 (throughout basement — random flickers)
└─ DA_Atmosphere_Basement_Dark → maximum horror preset
```
---
## L7 — L_Asylum_WardensOffice (Climax)
**Duration:** ~15 minutes
```
Layout (single large room + connecting office):
┌───────────────────────────────────────┐
│ WARDEN'S OFFICE │
│ ├─ Large desk (Warden's Journal) │
│ ├─ Bookshelves (cover positions) │
│ ├─ Window overlooking Void (reality │
│ │ breaking through glass) │
│ │ │
│ ├─ [DIALOGUE CHOICE TRIGGER] │
│ │ └─ Entity speaks through mirror │
│ │ 3 choices: │
│ │ A) Resist → fight │
│ │ B) Accept → merge │
│ │ C) Sacrifice → seal void │
│ │ │
│ └─ Ending Accumulator evaluates │
│ └─ TriggerEnding(result) │
└───────────────────────────────────────┘
Key systems:
├─ BPC_DialogueChoiceSystem (3-way choice)
├─ BPC_BranchingConsequenceSystem (choice → ending path)
├─ BPC_EndingAccumulator (evaluate all conditions)
└─ BPC_CutsceneBridge (play ending cinematic)
Placed Assets:
├─ BP_Pickup_JournalPage ("Warden's Confession") on desk
├─ BP_Pickup_VoidShard × 1 (final — on bookshelf)
├─ BP_DiegeticScreen_Monitor (shows player's own reflection → void)
└─ BP_NarrativeTrigger_Ending (triggers final confrontation)
```
---
## L8 — L_Asylum_VoidSpace (Alt Reality)
**Duration:** ~10 minutes | **Access:** Death by Shade OR void portal in Basement
```
Layout (non-Euclidean, floating geometry):
A series of disconnected rooms floating in black void.
Corridors shift — walking forward may loop back.
┌──────┐ ┌──────┐ ┌──────┐
│MEMORY│ ──→ │MEMORY│ ──→ │MEMORY│
│SHRINE│ │SHRINE│ │SHRINE│
│ 1 │ │ 2 │ │ 3 │
└──────┘ └──────┘ └──────┘
│ │ │
└───────────┼───────────┘
┌────┴────┐
│ EXIT │ → Return to asylum
│ PORTAL │
└─────────┘
Systems:
├─ BPC_AltDeathSpaceSystem (enter/exit void)
├─ BPC_TrialScenarioSystem (timed escape — 5 minutes)
└─ BPC_AdaptiveEnvironmentDirector (dynamic room shifting)
Placed Assets:
├─ BP_PuzzleDeviceActor × 3 (memory shrines — interact to "remember")
├─ BP_Pickup_VoidShard × 1 (if not already collected)
├─ BP_Enemy_Shade × 1 (pursues in void — cannot be killed)
└─ BP_Checkpoint_VoidThreshold (one-time checkpoint)
Shrine Solution:
├─ Shrine 1: Player's reflection shows a key moment from earlier
├─ Shrine 2: Voice whispers a memory fragment
├─ Shrine 3: Touch the light → all shrines activate → exit opens
└─ Timer: 5 minutes. If exceeded → Shade catches → respawn at shrine 1
```
---
## L9 — L_Ending_Truth (Cinematic)
**Duration:** ~5 minutes | **Access:** Auto-transition from WardensOffice
```
Setup:
├─ Empty dark room with single point of light
├─ Camera sequence (Sequencer):
│ ├─ Ending A (Resist): Player runs through collapsing asylum halls
│ │ └─ Bursts through front doors → daylight → freedom
│ ├─ Ending B (Merge): Entity possesses player
│ │ └─ Asylum calms. Patient enemies bow. Player's eyes glow.
│ └─ Ending C (Sacrifice): Player walks into void
│ └─ Light fades to black. Credits music begins.
└─ On cutscene end: TransitionToChapter(Credits)
```
---
## L10 — L_Credits
**Duration:** ~1-2 minutes or skip
```
Setup:
├─ WBP_CreditsScreen with scroll animation
├─ Background: black with void particles
├─ Audio: Credits music (ending-specific variant)
├─ Post-credit: WBP_DeathScreen overlay
│ └─ Shows:
│ ├─ "Ending Achieved: [Name]"
│ ├─ Total Deaths: X
│ ├─ Total Playtime: HH:MM:SS
│ ├─ Collectibles: Y/15
│ ├─ Enemies Defeated: Z
│ └─ Playstyle: Aggressive/Stealthy/Explorer/Balanced
└─ Buttons:
├─ "Return to Main Menu" → L_MainMenu
└─ "New Game+" → Set NG+ flag → restart with harder difficulty
```
---
## L11 — L_Test_Sandbox (Development)
**Purpose:** Quick testing of all systems. NOT included in shipping build.
```
Layout (open test area):
┌──────────────────────────────────────────┐
│ SPAWN ZONE │
│ ├─ PlayerStart │
│ ├─ BP_Checkpoint_SafeRoom (reset) │
│ └─ WBP_DebugMenu accessible │
│ │
│ ITEM ZONE │
│ ├─ All 18 BP_Pickup_* actors │
│ └─ Labelled with floating text │
│ │
│ WEAPON ZONE │
│ ├─ All 4 held weapon actors on racks │
│ └─ Infinite ammo crates │
│ │
│ ENEMY ZONE │
│ ├─ BP_Enemy_Patient (idle) │
│ ├─ BP_Enemy_Orderly (idle) │
│ ├─ BP_Enemy_Shade (idle) │
│ └─ Buttons: "Alert All", "Reset All" │
│ │
│ DOOR ZONE │
│ ├─ All 4 door types │
│ └─ Keys placed nearby │
│ │
│ CONTAINER ZONE │
│ ├─ BP_Chest_Supply, Desk_Drawer, │
│ │ FilingCabinet │
│ └─ Pre-populated with test items │
│ │
│ PUZZLE ZONE │
│ ├─ Fusebox, Pipe Organ, Morgue Drawers │
│ └─ Solution hints on wall │
│ │
│ ATMOSPHERE ZONE │
│ ├─ Room audio zone test trigger │
│ ├─ Light event test panel │
│ ├─ Scare event buttons │
│ └─ Stress manipulation slider │
│ │
│ UI ZONE │
│ ├─ All WBP_ widgets testable │
│ └─ Notification toast test panel │
└──────────────────────────────────────────┘
Setup:
├─ In World Settings: GameMode = GM_HorrorGameMode
├─ Auto-enable BPC_DevCheatManager on spawn
├─ WBP_DebugMenu toggled via F1 key
└─ Exclude from shipping build via "Never Cook" directory flag
```
---
## Level Creation Checklist (per level)
For each level, ensure:
- [ ] **World Settings** → GameMode Override = `GM_HorrorGameMode`
- [ ] **PlayerStart** actor placed (at least one)
- [ ] **Lighting**: DirectionalLight + SkyLight + PostProcessVolume (horror grade)
- [ ] **Audio**: At least one `BP_RoomAudioZone` covering the playable area
- [ ] **Navigation Mesh**: Build → Build Paths (NavMeshBoundsVolume covering all walkable areas)
- [ ] **Collision**: All walls/floors have collision; doors have interaction collision
- [ ] **Loading**: Level name registered in `GM_HorrorGameMode.HorrorLevelNames` map
- [ ] **Save Support**: All `I_Persistable` actors present (doors, pickups, enemies)
- [ ] **Checkpoint**: At least one `BP_Checkpoint` placed
- [ ] **Level Blueprint** → OnBeginPlay:
- Set chapter tag on `GS_HorrorGameState`
- Load atmosphere profile via `BPC_AtmosphereStateController`
- Start music via `SS_AudioManager`
- Fire `BPC_NarrativeStateSystem.OnChapterStart`
---
## Notes for Expansion
- Each level should have a **paper map** (diegetic) that player can find — shows layout
- Consider **streaming sub-levels** for large areas (basement corridors) to manage memory
- Add **environmental storytelling**: blood trails, scratch marks, patient drawings on walls
- The void space could be **procedurally generated** using `BPC_AdaptiveEnvironmentDirector`
- Add **New Game+ variations**: enemy placements shift, doors start locked differently
- Test sandbox should include a **stress/sanity debug overlay** (F1 toggle)
- Each level exit door should glow faintly (diegetic guidance, not quest marker)
- Use **data layers** for adaptive environment: rooms that shift should be in a separate data layer
---
*Level Design for Project Void. See [GAMEINDEX.md](GAMEINDEX.md) for full game structure. See [scene-flow.md](scene-flow.md) for transition wiring.*