# Game Core — GM_HorrorGameMode (Game Mode) **Game:** Project Void | **Asset:** `GM_HorrorGameMode` | **Parent:** `GM_CoreGameMode` **Asset Path:** `Content/Game/Core/GM_HorrorGameMode.uasset` **Build Phase:** 1 | **Framework System:** 05_GM_CoreGameMode --- ## Purpose The game-specific Game Mode. Inherits all core rules from `GM_CoreGameMode` (player spawn, chapter transitions, death handling, pause control). This BP child configures the horror-specific pawn, controller, state classes, and adds game-over routing, void-space transitions, and ending triggers. --- ## Dependencies | System | Type | Why | |--------|------|-----| | `GM_CoreGameMode` (05) | Parent class | Inherits TransitionToChapter, HandlePlayerDead, etc. | | `BP_HorrorPlayerCharacter` | Spawned | Default pawn class | | `PC_HorrorController` | Spawned | Default player controller | | `PS_HorrorPlayerState` | Managed | Default player state | | `GS_HorrorGameState` | Managed | Default game state | | `WBP_GameHUDController` | Created | Default HUD class | | `BPC_DeathHandlingSystem` (39) | Dispatcher | Receive death events | | `BPC_EndingAccumulator` (68) | Dispatcher | Trigger ending evaluation | | `BPC_NarrativeStateSystem` (58) | Interface | Chapter flag coordination | | `SS_SaveManager` (35) | Direct | Checkpoint data on level transitions | --- ## Creation Steps ### Step 1 — Create Blueprint Child ``` Content Browser → Game/Core/ Right-click → Blueprint Class Parent Class: GM_CoreGameMode (from Framework/Core/) Name: GM_HorrorGameMode ``` ### Step 2 — Configure Class Defaults Open `GM_HorrorGameMode` → Class Defaults → **Classes** section: | Property | Value | Notes | |----------|-------|-------| | `Default Pawn Class` | `BP_HorrorPlayerCharacter` | GASP-based horror player | | `Player Controller Class` | `PC_HorrorController` | Custom input routing | | `Player State Class` | `PS_HorrorPlayerState` | Player data | | `Game State Class` | `GS_HorrorGameState` | Shared session data | | `HUD Class` | `WBP_GameHUDController` | Horror-themed HUD | | `Default Player Name` | "Dr. Eliza Vance" | In-game display name | | `bPauseAllowed` | `true` (default) | Set false during scripted sequences | ### Step 3 — Add Game-Specific Variables | Variable | Type | Default | Category | Purpose | |----------|------|---------|----------|---------| | `bVoidSpaceActive` | Boolean | `false` | `Game` | True when player is in void/alt-death space | | `bEndingTriggered` | Boolean | `false` | `Game` | Prevents multiple ending triggers | | `GameDifficulty` | Float | `1.0` | `Game` | 0.5–2.0 scalar for all difficulty systems | | `HorrorLevelNames` | Map (GameplayTag → Name) | — | `Levels` | ChapterTag → Level name for transitions | ### Step 4 — Populate HorrorLevelNames Map | Key (GameplayTag) | Value (Level Name) | Description | |-------------------|-------------------|-------------| | `Chapter.Entry` | `L_Asylum_Entry` | Tutorial zone | | `Chapter.WardA` | `L_Asylum_WardA` | First major area | | `Chapter.WardB` | `L_Asylum_WardB` | Second major area | | `Chapter.Basement` | `L_Asylum_Basement` | Dark horror area | | `Chapter.VoidSpace` | `L_Asylum_VoidSpace` | Reality-shift zone | | `Chapter.WardensOffice` | `L_Asylum_WardensOffice` | Climax | | `Chapter.Ending` | `L_Ending_Truth` | Final cutscene | | `Chapter.Credits` | `L_Credits` | Credits roll | ### Step 5 — Wire Event Graph #### Override: Event OnPostLogin ``` Event OnPostLogin (NewPlayer: PlayerController*) │ ├─ Parent: Event OnPostLogin (call parent first) │ ├─ Get GI_HorrorGame → GetSessionFlag("HasSeenIntro")? │ ├─ False → (first time in level) │ │ ├─ Set bPauseAllowed = false │ │ ├─ BPC_CutsceneBridge → PlayCutscene("Opening") │ │ │ └─ Player wakes in padded cell (3-5 second sequence) │ │ ├─ GI_HorrorGame → SetSessionFlag("HasSeenIntro", true) │ │ ├─ BPC_TutorialSystem → StartTutorial("Controls") │ │ └─ Set bPauseAllowed = true (after cutscene) │ │ │ └─ True → (returning from death, reload, or later visit) │ └─ BPC_PlayerRespawnSystem → RestoreState() │ └─ Restore health, inventory, position from last checkpoint │ ├─ BPC_NarrativeStateSystem → SetChapterFlag("Entry") └─ GI_GameFramework → SetGamePhase(InGame) ``` #### Override: HandlePlayerDead ``` HandlePlayerDead (CalledBy: BPC_DeathHandlingSystem dispatcher) │ Player: Pawn, DeathCause: E_DeathCause, KillerLocation: Vector │ ├─ Set bPauseAllowed = false ├─ Increment GI_HorrorGame.TotalDeaths │ ├─ [Check Void Space Conditions] │ ├─ GI_HorrorGame → GetSessionFlag("VoidSpaceVisited")? → Branch │ │ ├─ False AND DeathCause == "Void"? │ │ │ └─ True: │ │ │ ├─ Set bVoidSpaceActive = true │ │ │ ├─ BPC_AltDeathSpaceSystem → EnterVoidSpace() │ │ │ ├─ Transition To Chapter (Chapter.VoidSpace) │ │ │ └─ Return (void space handles own exit) │ │ │ │ │ └─ False → [Normal Death — Respawn] │ │ │ └─ [Normal Death Flow] │ │ │ ├─ BPC_PersistentCorpseSystem → Leave Corpse (Pawn, DeathCause) │ ├─ BPC_RunHistoryTracker → Log Death (DeathCause, CurrentChapterTag) │ │ │ ├─ BPC_PlayerRespawnSystem → Get Respawn Chapter │ │ └─ Returns last checkpoint's chapter tag │ │ │ ├─ BPC_PersistentWorldStateRecorder → Save World State │ │ └─ Capture door states, item pickup flags, enemy states │ │ │ ├─ SS_SaveManager → Create Auto Save ("DeathRespawn") │ │ │ ├─ Transition To Chapter (RespawnChapterTag) │ │ └─ Parent function loads the level │ │ │ └─ (On level loaded) BPC_PlayerRespawnSystem → RestoreState() │ ├─ Restore inventory (minus items lost on death) │ ├─ Restore health to checkpoint value │ └─ Restore world state (doors, items, enemies) │ └─ Set bPauseAllowed = true ``` #### Override: TriggerEnding ``` TriggerEnding (EndingTag: GameplayTag) │ ├─ bEndingTriggered? → True → Return (already triggered) │ ├─ Set bEndingTriggered = true ├─ Set bPauseAllowed = false │ ├─ GI_HorrorGame → ActiveEndingTag = EndingTag │ ├─ BPC_EndingAccumulator → Evaluate Ending (EndingTag) │ └─ Returns: EndingResult (which final cinematic to play) │ ├─ BPC_CutsceneBridge → Play Final Cutscene (EndingResult) │ └─ Cutscene duration: 30-60 seconds │ ├─ (After cutscene completes): │ ├─ SS_AchievementSystem → Unlock ("CompletedGame") │ ├─ SS_AchievementSystem → Unlock (EndingTag-specific achievement) │ └─ BPC_ProgressStatTracker → Log Completion (EndingTag, playtime, deaths) │ ├─ Transition To Chapter (Chapter.Credits) └─ (After credits) OpenLevel → "L_MainMenu" ``` #### Custom Function: GetDifficultyScalar ``` GetDifficultyScalar() → Float │ ├─ Return GameDifficulty × GI_HorrorGame → FearIntensityMultiplier └─ Clamp result between 0.5 and 2.0 ``` #### Custom Function: IsChapterUnlocked ``` IsChapterUnlocked (ChapterTag: GameplayTag) → Boolean │ ├─ BPC_NarrativeStateSystem → GetChapterFlag (ChapterTag) → Check "IsCompleted" └─ Return result ``` --- ## Key Differences from `GM_CoreGameMode` Parent | Aspect | GM_CoreGameMode (Framework) | GM_HorrorGameMode (Game) | |--------|---------------------------|-------------------------| | Default Pawn | Not set (abstract) | `BP_HorrorPlayerCharacter` | | Player Controller | `PC_CoreController` | `PC_HorrorController` | | Player State | `PS_CorePlayerState` | `PS_HorrorPlayerState` | | Game State | `GS_CoreGameState` | `GS_HorrorGameState` | | HUD | `WBP_HUDController` | `WBP_GameHUDController` | | Death Handling | Generic respawn | Void space branching, corpse persistence | | Level Map | Abstract | `HorrorLevelNames` map (tag → level name) | | Post-login | Generic setup | Opening cutscene + tutorial trigger | --- ## Level Override Configuration When creating each `.umap` level, open **World Settings**: ``` Window → World Settings Game Mode Override: GM_HorrorGameMode (This ensures all levels use the horror game mode) ``` Optionally, set chapter-specific settings per level in World Settings: | Level | World Settings Override | |-------|----------------------| | `L_Asylum_Entry` | `bPauseAllowed: true` (after cutscene) | | `L_Asylum_VoidSpace` | `bPauseAllowed: false` (pressing ESC shows "No escape from the void") | | `L_MainMenu` | `bPauseAllowed: false` (main menu has its own pause equivalent via UI) | | `L_Ending_Truth` | `bPauseAllowed: false` (cutscene lock) | --- ## Blueprint Wiring Checklist - [ ] Create BP child of `GM_CoreGameMode` named `GM_HorrorGameMode` in `Game/Core/` - [ ] Set all 5 Default Classes in Class Defaults - [ ] Add 4 game-specific variables (bVoidSpaceActive, bEndingTriggered, GameDifficulty, HorrorLevelNames) - [ ] Populate `HorrorLevelNames` map with all 8 chapter → level mappings - [ ] Override `Event OnPostLogin` → opener cutscene + tutorial - [ ] Override `HandlePlayerDead` → void space branch + corpse + respawn - [ ] Override `TriggerEnding` → cutscene → credits → menu - [ ] Add `GetDifficultyScalar` function - [ ] Add `IsChapterUnlocked` function - [ ] Set `GM_HorrorGameMode` as GameMode Override in each level's World Settings --- ## Communications With | Target System | Method | Why | |--------------|--------|-----| | `GI_HorrorGame` | GetGameInstance → Cast to GI_HorrorGame | Session data, fear intensity, ending tag | | `BP_HorrorPlayerCharacter` | Spawned by engine | Player pawn | | `PC_HorrorController` | Spawned by engine | Input routing | | `BPC_DeathHandlingSystem` | Dispatcher (receives) | Death events | | `BPC_AltDeathSpaceSystem` | Direct | Void space entry | | `BPC_PlayerRespawnSystem` | Direct | Respawn restore | | `BPC_CutsceneBridge` | Direct | Play/end cutscenes | | `BPC_EndingAccumulator` | Direct | Evaluate ending | | `BPC_TutorialSystem` | Direct | Start tutorials | | `SS_SaveManager` | GetSubsystem | Auto-save on death/respawn | | `SS_AchievementSystem` | GetSubsystem | Unlock achievements on completion | --- ## Notes for Expansion - To add **permadeath mode**: override `HandlePlayerDead` → skip void space → wipe save → restart - To add **co-op support**: the horror game mode would need to handle multiple player spawns and sync void space - To add **New Game+**: in `Event OnPostLogin`, check `bIsNewGamePlus` flag → increase `GameDifficulty` → spawn harder enemies - The `HorrorLevelNames` map approach allows designers to reorder chapters without touching blueprint logic - Consider adding `OnPreDeath` and `OnPostRespawn` event dispatchers for other systems to bind --- *GM_HorrorGameMode — Core game mode for Project Void. See [GAMEINDEX.md](GAMEINDEX.md) for full game structure. See [05_GM_CoreGameMode.md](../blueprints/01-core/05_GM_CoreGameMode.md) for parent class spec.*