feat: Implement BPC_PlatformServiceAbstraction for unified platform detection and SDK routing

- Added BPC_PlatformServiceAbstraction to centralize platform detection and SDK routing for achievements, cloud saves, and overlays.
- Updated dependencies across various systems to utilize the new platform service for consistent platform handling.
- Deprecated old platform enums in favor of a unified EPlatformFamily enum.
- Enhanced documentation for affected systems to reflect changes in platform handling and dependencies.
This commit is contained in:
Lefteris Notas
2026-05-22 18:22:42 +03:00
parent dc9c1a6b98
commit 15d6e88780
12 changed files with 439 additions and 25 deletions

View File

@@ -181,7 +181,7 @@ docs/
15. **Server-Authoritative Replication** — All state mutations gated by `HasAuthority()`. Clients request via `Server_` RPCs; servers validate and replicate via `RepNotify`. See [`multiplayer-networking.md`](docs/architecture/multiplayer-networking.md). 15. **Server-Authoritative Replication** — All state mutations gated by `HasAuthority()`. Clients request via `Server_` RPCs; servers validate and replicate via `RepNotify`. See [`multiplayer-networking.md`](docs/architecture/multiplayer-networking.md).
## Build Order (Dependency-Safe) ## Build Order (Dependency-Safe)
- **Phase 0:** Foundation + Input (01-core, 15-input — 8 systems) - **Phase 0:** Foundation + Input (01-core + 15-input — 9 systems — includes BPC_PlatformServiceAbstraction 150)
- **Phase 1:** Player Core (02-player, 8 systems) - **Phase 1:** Player Core (02-player, 8 systems)
- **Phase 2:** Interaction (03-interaction, 8 systems) - **Phase 2:** Interaction (03-interaction, 8 systems)
- **Phase 3:** Inventory (04-inventory, 11 systems) - **Phase 3:** Inventory (04-inventory, 11 systems)

View File

@@ -4125,5 +4125,5 @@ Build these first. Everything else depends on them.
*End of Reusable UE5 Modular Game Framework v2.0* *End of Reusable UE5 Modular Game Framework v2.0*
*Framework designed for generic use. All system names are project-agnostic.* *Framework designed for generic use. All system names are project-agnostic.*
*Override in /Game/ folder. Never modify /Framework/ core assets.* *Override in /Game/ folder. Never modify /Framework/ core assets.*
*C++ source: 22 classes in Source/PG_Framework/ | BP specs: 149 numbered files + 2 supplementary in docs/blueprints/* *C++ source: 22 classes in Source/PG_Framework/ | BP specs: 150 numbered files + 2 supplementary in docs/blueprints/*
*Companion docs: docs/checklists/ (build order, status), docs/developer/ (per-category references), docs/architecture/ (state management, audio, networking, animation, sound)* *Companion docs: docs/checklists/ (build order, status), docs/developer/ (per-category references), docs/architecture/ (state management, audio, networking, animation, sound)*

View File

@@ -0,0 +1,406 @@
# 150 — Platform Service Abstraction (`BPC_PlatformServiceAbstraction`)
> **Blueprint-Only Implementation** — UE 5.55.7 supports all platform detection and SDK routing from Blueprints via `UGameplayStatics::GetPlatformName()`, conditional compilation checks, and plugin API calls. This component is the **single source of truth** for platform identity, replacing the three fragmented detection systems that currently exist across the framework.
---
## Purpose
Central platform authority attached to the Game Instance. Detects the platform once at startup and provides a unified `EPlatformFamily` enum that ALL subsystems query instead of detecting platform independently. Routes platform-specific SDK calls (achievement submission to Steam/PSN/Xbox Live/Nintendo, cloud saves, overlays, input device profiles). Returns stub/no-op implementations on unsupported platforms so game code never needs `#if PLATFORM_PS5` checks.
## The Problem Being Solved
Currently the framework has **three independent platform detection systems**, each calling `GetPlatformName()` separately:
| System | Enum | Platform Families |
|--------|------|-------------------|
| `BPC_RenderPipelineManager` (149) | `EPlatformFamily` | PS5, PS4, Xbox_Series, Xbox_One, Switch, PC_High, PC_Low, SteamDeck |
| `SS_EnhancedInputManager` (128) | `E_InputPlatform` | PC_KeyboardMouse, Xbox, PS5_DualSense |
| `BPC_HapticsController` (148) | `EControllerPlatform` | PC_Generic, Xbox, PS5_DualSense, PS4_DualShock |
These are **different enums with different values** and don't talk to each other. If you change platform in one system, nothing cascades.
**After this component is integrated, all three systems query `BPC_PlatformServiceAbstraction.GetPlatformFamily()` instead of detecting platform themselves. The old enums are deprecated and mapped to `EPlatformFamily`.**
## Dependencies
- **Requires:** [`GI_GameFramework`](../01-core/04_GI_GameFramework.md) (attached as component), [`DA_GameTagRegistry`](../01-core/01_DA_GameTagRegistry.md) (platform tag validation)
- **Required By:** [`BPC_RenderPipelineManager`](../12-settings/149_BPC_RenderPipelineManager.md) (GFX quality profile selection), [`SS_EnhancedInputManager`](../15-input/128_SS_EnhancedInputManager.md) (input device profile selection), [`BPC_HapticsController`](../12-settings/148_BPC_HapticsController.md) (controller platform detection), [`SS_AchievementSystem`](../11-meta/103_SS_AchievementSystem.md) (SDK routing), [`SS_SettingsSystem`](105_SS_SettingsSystem.md) (platform-aware defaults)
- **Engine/Plugin Requirements:** GameplayTags, `UGameplayStatics`, Platform SDK plugins (Steamworks, PSN, Xbox GDK, Nintendo SDK — all optional)
## Class Info
| Property | Value |
|----------|-------|
| **Parent Class** | `ActorComponent` |
| **Class Type** | Blueprint Component |
| **Asset Path** | `Content/Framework/Core/BPC_PlatformServiceAbstraction` |
| **Implements Interfaces** | None |
| **Attachment** | Game Instance (`GI_GameFramework`) |
---
## 1. Enums
### `EPlatformFamily` (UNIFIED — all systems use this)
| Value | Description | Input Device | Render Pipeline | Achievements SDK | Store |
|-------|-------------|-------------|-----------------|-----------------|-------|
| `Unknown = 0` | Not yet detected | — | — | — | — |
| `PC_Win64 = 1` | Windows PC (any GPU) | KB+M / Xbox / PS5 gamepad | Detected per GPU capability | Steam / EGS | Steam / EGS |
| `PC_Linux = 2` | Linux / SteamOS | Same as PC | Vulkan | Steam | Steam |
| `PS5 = 3` | PlayStation 5 | DualSense | Lumen + Nanite | PSN Trophies | PS Store |
| `PS5_Pro = 4` | PlayStation 5 Pro | DualSense | Lumen + PSSR | PSN Trophies | PS Store |
| `PS4 = 5` | PlayStation 4 / 4 Pro | DualShock 4 | Baked only | PSN Trophies | PS Store |
| `Xbox_Series = 6` | Xbox Series X\|S | Xbox Wireless | Lumen + Nanite | Xbox Live | MS Store |
| `Xbox_One = 7` | Xbox One / One X | Xbox Wireless | Baked only | Xbox Live | MS Store |
| `Switch = 8` | Nintendo Switch | Joy-Con / Pro | Baked + Proxy | Nintendo | eShop |
| `Switch_2 = 9` | Nintendo Switch 2 | Joy-Con 2 / Pro 2 | Baked + CSM + FSR | Nintendo | eShop |
| `SteamDeck = 10` | Steam Deck | Built-in / external | Baked/SSGI + CSM | Steam | Steam |
| `Mac = 11` | macOS | KB+M / gamepad | Metal / Baked | Steam | Steam / App Store |
### `EPlatformSDK`
| Value | Description |
|-------|-------------|
| `None = 0` | No SDK available (editor, generic build) |
| `Steam = 1` | Steamworks SDK (achievements, cloud, overlay, stats) |
| `PSN = 2` | PlayStation Network SDK (trophies, cloud, overlay, invites) |
| `XboxLive = 3` | Xbox Live / GDK (achievements, cloud, overlay, invites) |
| `Nintendo = 4` | Nintendo SDK (achievements, cloud, overlay) |
| `EGS = 5` | Epic Games Store SDK |
### `EPlatformOverlayType`
| Value | Description |
|-------|-------------|
| `Achievements = 0` | Show platform achievements/trophies page |
| `Friends = 1` | Open friends list |
| `Invite = 2` | Send game invite |
| `Store = 3` | Open store page (DLC, etc.) |
| `SocialFeed = 4` | Community / social feed |
---
## 2. Structs
### `SPlatformCapabilities`
| Field | Type | Description |
|-------|------|-------------|
| `Platform` | `EPlatformFamily` | Current platform |
| `SDK` | `EPlatformSDK` | Available platform SDK |
| `bSupportsLumen` | `bool` | Platform GPU supports Lumen GI |
| `bSupportsNanite` | `bool` | Platform GPU supports Nanite |
| `bSupportsHWRT` | `bool` | Platform supports hardware ray tracing |
| `bSupportsCloudSaves` | `bool` | Platform has cloud save API |
| `bSupportsAchievements` | `bool` | Platform has achievement/trophy system |
| `bSupportsOverlay` | `bool` | Platform has in-game overlay |
| `bSupportsRichPresence` | `bool` | Platform supports rich presence / "now playing" |
| `bSupportsUserGeneratedContent` | `bool` | Platform supports UGC/mod sharing |
| `bIsConsole` | `bool` | Is this a console platform (certification required)? |
| `bIsHandheld` | `bool` | Is this a handheld device? |
| `DefaultInputType` | `FName` | Default input device for this platform ("Gamepad", "Keyboard", "Touch") |
| `MaxLocalPlayers` | `int32` | Maximum local split-screen players |
| `StoreID` | `FString` | Platform store ID for DLC checks |
---
## 3. Variables
### Configuration (Instance Editable)
| Variable | Type | Default | Category | Description |
|----------|------|---------|----------|-------------|
| `bAutoDetectPlatform` | `bool` | `true` | `Config` | Auto-detect on Initialize |
| `OverridePlatform` | `EPlatformFamily` | `Unknown` | `Config` | Force a platform (for testing in editor) |
| `bEnableSDKIntegration` | `bool` | `true` | `Config` | Enable platform SDK calls |
### Internal (Private)
| Variable | Type | Default | Category | Description |
|----------|------|---------|----------|-------------|
| `CurrentPlatform` | `EPlatformFamily` | `Unknown` | `State` | Detected or overridden platform |
| `CurrentSDK` | `EPlatformSDK` | `None` | `State` | Active platform SDK |
| `PlatformCapabilities` | `SPlatformCapabilities` | — | `State` | Full capabilities snapshot |
| `bIsInitialized` | `bool` | `false` | `State` | Whether Initialize completed |
| `CachedGameInstance` | `GI_GameFramework` | `None` | `Cache` | Owner Game Instance reference |
---
## 4. Functions
### Public Functions
#### `Initialize` → `void`
- **Description:** Detect platform, resolve SDK, build capabilities, broadcast ready signal. Called once at Game Instance startup.
- **Flow:**
1. Get Owner → Cast to `GI_GameFramework` → cache
2. If `OverridePlatform != Unknown`: use override
3. Else if `bAutoDetectPlatform`: call `DetectPlatform()`
4. Resolve which SDK is available: check plugin state, build configuration
5. Build `SPlatformCapabilities` for detected platform
6. Register platform in `DA_GameTagRegistry` as `Framework.Platform.{Name}`
7. Set `bIsInitialized = true`
8. Broadcast `OnPlatformReady(CurrentPlatform)`
9. Broadcast `OnPlatformCapabilitiesReady(PlatformCapabilities)`
#### `DetectPlatform` → `EPlatformFamily`
- **Description:** Detects the current platform using UE5 APIs.
- **Flow:**
1. `UGameplayStatics::GetPlatformName()` → switch:
- "PS5" → check if Pro model available → `PS5_Pro` or `PS5`
- "PS4" → `PS4`
- "XboxOne" → `Xbox_One`
- "XSX" or "XboxAnaconda" → `Xbox_Series` (check if S model → adjust capabilities)
- "Switch" → check model revision → `Switch_2` or `Switch`
- "Win64" → check if running on Steam Deck (`IsSteamDeck()`) → `SteamDeck`
- "Win64" → `PC_Win64`
- "Linux" → `PC_Linux`
- "Mac" → `Mac`
2. Store in `CurrentPlatform`
3. Return `CurrentPlatform`
#### `GetPlatformFamily` → `EPlatformFamily`
- **Description:** Returns the current platform. **This is the function ALL other systems call.** Read-only, always available after initialization.
#### `GetSDK` → `EPlatformSDK`
- **Description:** Returns the available platform SDK. Used by achievement and save systems for routing.
#### `GetPlatformCapabilities` → `SPlatformCapabilities`
- **Description:** Returns the full capabilities struct. Read-only.
#### `SubmitAchievementToPlatform` → `bool`
- **Description:** Route an achievement unlock to the correct platform SDK.
- **Parameters:**
| Param | Type | Description |
|-------|------|-------------|
| `AchievementID` | `FString` | Platform-specific achievement ID |
- **Flow:**
1. Switch on `CurrentSDK`:
- `Steam` → call Steamworks `ISteamUserStats::SetAchievement(AchievementID)` + `StoreStats()`
- `PSN` → call PSN Trophy API `UnlockTrophy(AchievementID)`
- `XboxLive` → call Xbox Live `AchievementsService::UpdateAchievement(AchievementID, 100)`
- `Nintendo` → call Nintendo achievement API
- `None` → log "Achievement submitted (editor mode)" → return true (no-op stub)
2. Return true if successful, false on SDK error
#### `SyncCloudSave` → `bool`
- **Description:** Upload or sync save data to platform cloud.
- **Parameters:**
| Param | Type | Description |
|-------|------|-------------|
| `SlotIndex` | `int32` | Which save slot |
| `SaveData` | `TArray<uint8>` | Serialized save data |
- **Flow:** Route to Steam Cloud / PSN Cloud / Xbox Cloud / Nintendo Cloud based on `CurrentSDK`.
#### `ShowPlatformOverlay` → `void`
- **Description:** Open a platform-specific overlay.
- **Parameters:**
| Param | Type | Description |
|-------|------|-------------|
| `OverlayType` | `EPlatformOverlayType` | Which overlay to show |
- **Flow:**
1. Switch on `CurrentSDK`:
- `Steam``ISteamFriends::ActivateGameOverlay(URL)`
- `PSN` → System software overlay API
- Others → nop (not supported)
#### `GetDefaultInputProfile` → `FName`
- **Description:** Returns the default input profile for this platform. Used by `SS_EnhancedInputManager` to select the correct `DA_InputMappingProfile`.
- **Returns:** "PC_KeyboardMouse", "Xbox", "PS5_DualSense", "PS4_DualShock", "Switch_JoyCon"
#### `IsConsole` → `bool`, `IsHandheld` → `bool`, `IsPS5` → `bool`, `IsXbox` → `bool`, `IsSwitch` → `bool`, `IsPC` → `bool`, `IsSteamDeck` → `bool`
- **Description:** Convenience boolean checks for common platform queries. All return from `PlatformCapabilities` struct.
#### `GetConsoleCertificationRequirements` → `TArray<FText>`
- **Description:** Returns a list of TRC (Technical Requirement Checklist) items for the current console platform. Empty on PC.
- **Flow:**
1. Switch on `CurrentPlatform`:
- `PS5` → return Sony TRC items (60 FPS perf mode, HDR support, controller speaker, activity cards, etc.)
- `PS4` → return Sony PS4 TRC items
- `Xbox_Series` → return Microsoft XR items (Quick Resume, Smart Delivery, VRR, etc.)
- `Xbox_One` → return Microsoft XR items
- `Switch` → return Nintendo guidelines (dynamic resolution, Handheld/Docked parity, etc.)
- `PC_*` → return empty (no console cert needed)
#### `GetStoreID` → `FString`
- **Description:** Returns the platform store app ID for DLC entitlement checks.
---
## 5. Event Dispatchers
| Dispatcher | Parameters | Bind Access | Description |
|------------|-----------|-------------|-------------|
| `OnPlatformReady` | `EPlatformFamily Platform` | `Public` | Fired after platform detection completes — all other systems bind to this for deferred init |
| `OnPlatformCapabilitiesReady` | `SPlatformCapabilities Capabilities` | `Public` | Fired alongside OnPlatformReady with full capability info |
| `OnPlatformSDKReady` | `EPlatformSDK SDK` | `Public` | Fired when platform SDK is ready for API calls |
| `OnPlatformOverlayOpened` | `EPlatformOverlayType Type` | `Public` | Fired when platform overlay opens (game should pause) |
| `OnPlatformOverlayClosed` | — | `Public` | Fired when platform overlay closes (game resumes) |
| `OnCloudSaveCompleted` | `bool bSuccess`, `int32 SlotIndex` | `Public` | Fired when cloud save upload completes |
| `OnAchievementSubmitted` | `FString AchievementID`, `bool bSuccess` | `Public` | Fired after platform API achievement call |
---
## 6. Overridden Events
### Event: On Component Created (attached to GI_GameFramework via BeginPlay)
- **Description:** Auto-initializes at game start.
- **Flow:**
1. Call `Initialize()`
2. All dependent subsystems that bound to `OnPlatformReady` receive the event and complete their initialization
---
## 7. Blueprint Graph Logic Flow
```mermaid
flowchart TD
A[GI_GameFramework: BeginPlay] --> B[BPC_PlatformServiceAbstraction: Initialize]
B --> C{OverridePlatform?}
C -->|Yes| D[Use Override]
C -->|No| E[DetectPlatform]
E --> F[Switch on GetPlatformName]
F --> G[Set CurrentPlatform]
D --> G
G --> H[Resolve available SDK]
H --> I[Build SPlatformCapabilities]
I --> J[Register Platform Tag in DA_GameTagRegistry]
J --> K[Broadcast OnPlatformReady]
K --> L[ALL BOUND SYSTEMS RECEIVE]
L --> M[RenderPipelineManager: load DA_RPP for platform]
L --> N[EnhancedInputManager: load DA_InputMapping for platform]
L --> O[HapticsController: set EControllerPlatform from platform]
L --> P[AchievementSystem: route SDK via GetSDK]
L --> Q[SettingsSystem: load platform defaults]
```
---
## 8. Communication Matrix
| Who Talks | How | What Is Sent |
|-----------|-----|-------------|
| `GI_GameFramework` | `Owner` | Hosts this component |
| `BPC_PlatformServiceAbstraction` | `Dispatcher` → ALL systems | `OnPlatformReady(Platform)` — every system's deferred init trigger |
| `BPC_RenderPipelineManager` (149) | `Function Call` | `GetPlatformFamily()` → selects correct `DA_RenderPipelineProfile` |
| `SS_EnhancedInputManager` (128) | `Function Call` | `GetDefaultInputProfile()` → selects correct `DA_InputMappingProfile` |
| `BPC_HapticsController` (148) | `Function Call` | `GetPlatformFamily()` → maps to `EControllerPlatform` |
| `SS_AchievementSystem` (103) | `Function Call` | `SubmitAchievementToPlatform(ID)` → routes to Steam/PSN/Xbox/Nintendo |
| `SS_SaveManager` (35) | `Function Call` | `SyncCloudSave(Slot, Data)` → routes to platform cloud API |
| `SS_SettingsSystem` (105) | `Function Call` | `GetPlatformFamily()` → sets platform-appropriate defaults |
| `SS_UIManager` (44) | `Dispatcher` | `OnPlatformOverlayOpened/Closed` → pause/resume game |
| `DA_GameTagRegistry` (01) | `Function Call` | Register `Framework.Platform.{Name}` tag |
---
## 9. Platform Enum Mapping (Deprecation of old enums)
The old scattered platform enums are mapped to `EPlatformFamily` as follows:
| Deprecated Enum | Old Value | EPlatformFamily |
|----------------|-----------|-----------------|
| `E_InputPlatform::PC_KeyboardMouse` | 0 | `PC_Win64` (or `PC_Linux`, `Mac`) |
| `E_InputPlatform::Xbox` | 1 | `Xbox_Series` or `Xbox_One` (detected) |
| `E_InputPlatform::PS5_DualSense` | 2 | `PS5` or `PS5_Pro` |
| `EControllerPlatform::PC_Generic` | 1 | `PC_Win64` |
| `EControllerPlatform::Xbox` | 2 | `Xbox_Series` or `Xbox_One` |
| `EControllerPlatform::PS5_DualSense` | 3 | `PS5` |
| `EControllerPlatform::PS4_DualShock` | 4 | `PS4` |
All systems that previously used their own platform enum now call:
```
BPC_PlatformServiceAbstraction → GetPlatformFamily() → map to local enum internally
```
---
## 10. Validation / Testing Checklist
- [ ] `DetectPlatform` correctly identifies all 12 platform families
- [ ] `OverridePlatform = PS4` → all systems use PS4 profiles (baked lighting, DualShock, PSN SDK)
- [ ] `OverridePlatform = Switch` → all systems use Switch profiles (baked, NIS, Joy-Con, Nintendo SDK)
- [ ] `OverridePlatform = PS5_Pro` → RenderPipelineManager enables PSSR upscaler
- [ ] `GetDefaultInputProfile` returns correct input profile for each platform
- [ ] `SubmitAchievementToPlatform` on Steam build successfully calls Steam API
- [ ] `SubmitAchievementToPlatform` in Editor returns true (no-op stub, no crash)
- [ ] `SyncCloudSave` routes to correct platform cloud API
- [ ] `ShowPlatformOverlay(Achievements)` opens correct platform overlay
- [ ] `OnPlatformReady` fires before any dependent system queries `GetPlatformFamily()`
- [ ] Changing `OverridePlatform` at runtime (dev cheat) cascades to all bound systems
- [ ] Edge case: No SDK available (editor, generic build) → all SDK calls return no-op stubs
- [ ] Edge case: Platform SDK initialization fails → `CurrentSDK = None`, systems fallback gracefully
- [ ] Edge case: Steam Deck detection in Desktop Mode → reported as `PC_Linux`, not `SteamDeck`
- [ ] Edge case: Xbox Series S (Lockhart) vs Series X (Anaconda) → different capabilities for GPU
---
## 11. Manual Implementation Guide
### 11.1 Class Setup
1. Create Blueprint Class: parent `ActorComponent`, name `BPC_PlatformServiceAbstraction`
2. Path: `Content/Framework/Core/`
3. Attach to `GI_GameFramework` (or BP child of it)
### 11.2 Key UE5 Nodes
| Node | Where to Find | Used For |
|------|---------------|----------|
| `Get Platform Name` | Right-click → "Get Platform Name" | Primary detection API |
| `Switch on String` | Right-click → "Switch" | Platform name branching |
| `Is Steam Deck` | Custom node / check for "SteamDeck" in device name | Steam Deck detection |
| `Is In Editor` | Right-click → "Is In Editor" | SDK substitution in editor |
| `Switch on EPlatformFamily` | Right-click → "Switch" | Platform-specific logic |
### 11.3 Node-by-Node: DetectPlatform
```
[Function: DetectPlatform]
Step 1: Get Platform Name → Store as PlatformStr
Step 2: Switch on String (PlatformStr):
"PS5" →
Step 2a: Get device model info → if "Pro" → PS5_Pro, else PS5
"PS4" → PS4
"XboxOne" → Xbox_One
"XSX" → Xbox_Series (check if "Lockhart" variant for Series S)
"XboxAnaconda" → Xbox_Series
"Switch" → Switch (check model revision for Switch_2)
"Win64" →
Step 2b: Check if running on Steam Deck → if yes → SteamDeck
Step 2c: Else → PC_Win64
"Linux" → PC_Linux
"Mac" → Mac
Default → PC_Win64 (fallback)
Step 3: Store result in CurrentPlatform
Step 4: Return CurrentPlatform
```
### 11.4 Networking
- **Platform is per-client.** Each client may be on a different platform (PC host + PS5 client).
- `BPC_PlatformServiceAbstraction` runs on ALL instances (server + each client).
- Platform SDK calls are local-to-client.
- For listen server: host's platform SDK is used for host's achievements; clients use their own.
### 11.5 Multiplayer Note
- In a multiplayer session, each player's platform is detected independently
- Cross-platform play: a PC host may have Steam SDK active while a PS5 client has PSN SDK
- The Game Instance's PlatformServiceAbstraction only represents the LOCAL player's platform
- For dedicated servers: `CurrentPlatform = PC_Linux` or `PC_Win64`, `CurrentSDK = None` (no achievements on dedicated server)
---
## 12. Blueprint Build Checklist
- [ ] Create Blueprint class: `BPC_PlatformServiceAbstraction` (parent: `ActorComponent`)
- [ ] Add enums: `EPlatformFamily` (12 values), `EPlatformSDK` (6 values), `EPlatformOverlayType` (5 values)
- [ ] Add struct: `SPlatformCapabilities`
- [ ] Add all variables from Section 3
- [ ] Build `Initialize``DetectPlatform``BuildCapabilities` → broadcast chain
- [ ] Implement `DetectPlatform` with Switch on GetPlatformName
- [ ] Implement `SubmitAchievementToPlatform` with Switch on CurrentSDK
- [ ] Implement `SyncCloudSave`, `ShowPlatformOverlay`
- [ ] Implement all boolean convenience functions (`IsConsole`, `IsPS5`, etc.)
- [ ] Create all 7 event dispatchers
- [ ] Wire OnPlatformReady as deferred init trigger for all dependent subsystems
- [ ] Test: OverridePlatform = PS5 → OnPlatformReady fires with PS5
- [ ] Test: Editor mode → SDK calls return no-op stubs
- [ ] Test: Steam build → SubmitAchievement calls Steam API
- [ ] Test: Platform hot-swap (dev cheat) cascades to all bound systems
---
*Blueprint Spec: Platform Service Abstraction. Conforms to TEMPLATE.md v2.0 — part of the UE5 Modular Game Framework, CORE layer.*

View File

@@ -12,8 +12,8 @@
- **Requires:** [`BPC_PlayerMetricsTracker`](../02-player/15_BPC_PlayerMetricsTracker.md) — Player stats source - **Requires:** [`BPC_PlayerMetricsTracker`](../02-player/15_BPC_PlayerMetricsTracker.md) — Player stats source
- **Requires:** [`BPC_NarrativeStateSystem`](../07-narrative/38_BPC_NarrativeStateSystem.md) — Story progression - **Requires:** [`BPC_NarrativeStateSystem`](../07-narrative/38_BPC_NarrativeStateSystem.md) — Story progression
- **Required By:** [`WBP_NotificationToast`](../06-ui/WBP_NotificationToast.md) — UI notification - **Required By:** [`WBP_NotificationToast`](../06-ui/WBP_NotificationToast.md) — UI notification
- **Required By:** [`BPC_PlatformServiceAbstraction`](../12-settings/BPC_PlatformServiceAbstraction.md) — Platform API submission - **Required By:** [`BPC_PlatformServiceAbstraction`](../01-core/150_BPC_PlatformServiceAbstraction.md) — Platform API routing (Steam/PSN/Xbox/Nintendo)
- **Engine/Plugin Requirements:** GameplayTags - **Engine/Plugin Requirements:** GameplayTags, Platform SDK plugins (Steamworks, PSN, Xbox GDK, Nintendo SDK — all optional)
### Purpose ### Purpose
Platform-agnostic achievement and trophy tracking system. Manages achievement definitions, progress tracking, unlock logic, and platform API submission. Supports hidden achievements, progress-based achievements, and cross-save achievement state persistence. Platform-agnostic achievement and trophy tracking system. Manages achievement definitions, progress tracking, unlock logic, and platform API submission. Supports hidden achievements, progress-based achievements, and cross-save achievement state persistence.
@@ -118,7 +118,7 @@ Platform-agnostic achievement and trophy tracking system. Manages achievement de
| [`BPC_PlayerMetricsTracker`](../02-player/15_BPC_PlayerMetricsTracker.md) | Direct read | Stats for achievements | | [`BPC_PlayerMetricsTracker`](../02-player/15_BPC_PlayerMetricsTracker.md) | Direct read | Stats for achievements |
| [`BPC_NarrativeStateSystem`](../07-narrative/38_BPC_NarrativeStateSystem.md) | Direct read | Story achievements | | [`BPC_NarrativeStateSystem`](../07-narrative/38_BPC_NarrativeStateSystem.md) | Direct read | Story achievements |
| [`WBP_NotificationToast`](../06-ui/WBP_NotificationToast.md) | Create widget | Toast display | | [`WBP_NotificationToast`](../06-ui/WBP_NotificationToast.md) | Create widget | Toast display |
| [`BPC_PlatformServiceAbstraction`](../12-settings/BPC_PlatformServiceAbstraction.md) | Direct call | Platform submission | | [`BPC_PlatformServiceAbstraction`](../01-core/150_BPC_PlatformServiceAbstraction.md) | Direct call | Platform SDK routing (Steam/PSN/Xbox/Nintendo) |
--- ---

View File

@@ -8,7 +8,7 @@
Abstraction layer for all controller haptic feedback and force feedback effects. Gameplay systems trigger haptics by GameplayTag (e.g., `Haptic.Damage.Heavy`) rather than calling raw UE5 haptic APIs. This component handles platform detection (Xbox rumble vs PS5 DualSense adaptive triggers vs generic PC gamepad), respects accessibility settings (`BPC_AccessibilitySettings.bHapticsEnabled`), and manages effect priority/conflict resolution. Abstraction layer for all controller haptic feedback and force feedback effects. Gameplay systems trigger haptics by GameplayTag (e.g., `Haptic.Damage.Heavy`) rather than calling raw UE5 haptic APIs. This component handles platform detection (Xbox rumble vs PS5 DualSense adaptive triggers vs generic PC gamepad), respects accessibility settings (`BPC_AccessibilitySettings.bHapticsEnabled`), and manages effect priority/conflict resolution.
## Dependencies ## Dependencies
- **Requires:** [`DA_HapticProfile`](docs/blueprints/14-data-assets/121_DA_HapticProfile.md) (effect definitions), [`BPC_AccessibilitySettings`](docs/blueprints/12-settings/104_BPC_AccessibilitySettings.md) (master toggle), [`BPC_StateManager`](docs/blueprints/16-state/130_BPC_StateManager.md) (heart rate for heartbeat haptic) - **Requires:** [`DA_HapticProfile`](docs/blueprints/14-data-assets/121_DA_HapticProfile.md) (effect definitions), [`BPC_AccessibilitySettings`](docs/blueprints/12-settings/104_BPC_AccessibilitySettings.md) (master toggle), [`BPC_StateManager`](docs/blueprints/16-state/130_BPC_StateManager.md) (heart rate for heartbeat haptic), [`BPC_PlatformServiceAbstraction`](docs/blueprints/01-core/150_BPC_PlatformServiceAbstraction.md) (platform detection — replaces own platform enum)
- **Required By:** `BPC_HealthSystem` (damage haptics), `BPC_FirearmSystem` (weapon fire kick), `BPC_MeleeSystem` (melee impact), `BPC_PhysicsDragSystem` (grab/release), `BPC_ScareEventSystem` (tension rumble), `BP_ItemPickup` (pickup pulse), `BPC_MovementStateSystem` (footstep rumble via GASP notifies) - **Required By:** `BPC_HealthSystem` (damage haptics), `BPC_FirearmSystem` (weapon fire kick), `BPC_MeleeSystem` (melee impact), `BPC_PhysicsDragSystem` (grab/release), `BPC_ScareEventSystem` (tension rumble), `BP_ItemPickup` (pickup pulse), `BPC_MovementStateSystem` (footstep rumble via GASP notifies)
- **Engine/Plugin Requirements:** Enhanced Input Plugin (controller detection), PlayStation 5 Controller Plugin (DualSense adaptive triggers — optional, graceful fallback) - **Engine/Plugin Requirements:** Enhanced Input Plugin (controller detection), PlayStation 5 Controller Plugin (DualSense adaptive triggers — optional, graceful fallback)
@@ -56,7 +56,7 @@ Abstraction layer for all controller haptic feedback and force feedback effects.
| `Right = 1` | Right (high-frequency) motor only | | `Right = 1` | Right (high-frequency) motor only |
| `Both = 2` | Both motors simultaneously | | `Both = 2` | Both motors simultaneously |
### `EControllerPlatform` ### `EControllerPlatform` *(deprecated — use EPlatformFamily from BPC_PlatformServiceAbstraction. This enum is mapped internally from the unified platform enum.)*
| Value | Description | | Value | Description |
|-------|-------------| |-------|-------------|
| `Unknown = 0` | Platform not yet detected | | `Unknown = 0` | Platform not yet detected |

View File

@@ -8,7 +8,7 @@
Central authority for render pipeline configuration. Reads `DA_RenderPipelineProfile` Data Assets to determine the appropriate rendering method (Lumen vs Baked Lightmass), shadow system (VSM vs CSM), upscaler (DLSS/FSR/TSR/PSSR), and mesh strategy (Nanite vs LOD) for the current platform and quality preset. Applies settings via UE5 console variables, coordinates with `BPC_PerformanceScaler` for runtime quality tier adjustments, and broadcasts pipeline changes so dependent systems (Planar Capture, Audio, UI) can adapt. Central authority for render pipeline configuration. Reads `DA_RenderPipelineProfile` Data Assets to determine the appropriate rendering method (Lumen vs Baked Lightmass), shadow system (VSM vs CSM), upscaler (DLSS/FSR/TSR/PSSR), and mesh strategy (Nanite vs LOD) for the current platform and quality preset. Applies settings via UE5 console variables, coordinates with `BPC_PerformanceScaler` for runtime quality tier adjustments, and broadcasts pipeline changes so dependent systems (Planar Capture, Audio, UI) can adapt.
## Dependencies ## Dependencies
- **Requires:** [`DA_RenderPipelineProfile`](../14-data-assets/DA_RenderPipelineProfile.md) (render configs), [`SS_SettingsSystem`](105_SS_SettingsSystem.md) (saved quality preferences), [`GI_GameFramework`](../01-core/04_GI_GameFramework.md) (game phase for pre-load apply) - **Requires:** [`DA_RenderPipelineProfile`](../14-data-assets/DA_RenderPipelineProfile.md) (render configs), [`BPC_PlatformServiceAbstraction`](../01-core/150_BPC_PlatformServiceAbstraction.md) (central platform detection), [`SS_SettingsSystem`](105_SS_SettingsSystem.md) (saved quality preferences), [`GI_GameFramework`](../01-core/04_GI_GameFramework.md) (game phase for pre-load apply)
- **Required By:** [`BPC_PerformanceScaler`](../10-adaptive/91_BPC_PerformanceScaler.md) (delegates CVar application), [`SS_PlanarCaptureManager`](../17-capture/138_SS_PlanarCaptureManager.md) (capture quality cap on pipeline change), [`WBP_SettingsMenu`](../06-ui/57_WBP_SettingsMenu.md) (Video tab quality controls) - **Required By:** [`BPC_PerformanceScaler`](../10-adaptive/91_BPC_PerformanceScaler.md) (delegates CVar application), [`SS_PlanarCaptureManager`](../17-capture/138_SS_PlanarCaptureManager.md) (capture quality cap on pipeline change), [`WBP_SettingsMenu`](../06-ui/57_WBP_SettingsMenu.md) (Video tab quality controls)
- **Engine/Plugin Requirements:** DLSS Plugin (optional), FSR Plugin (optional), XeSS Plugin (optional), GameplayTags, Enhanced Input - **Engine/Plugin Requirements:** DLSS Plugin (optional), FSR Plugin (optional), XeSS Plugin (optional), GameplayTags, Enhanced Input
@@ -25,7 +25,8 @@ Central authority for render pipeline configuration. Reads `DA_RenderPipelinePro
## 1. Enums ## 1. Enums
*See [`DA_RenderPipelineProfile`](../14-data-assets/DA_RenderPipelineProfile.md) for: `ERenderPipelineMethod`, `EShadowMethod`, `EReflectionMethod`, `EUpscalerMethod`, `EMeshStrategy`, `EPlatformFamily`.* *See [`DA_RenderPipelineProfile`](../14-data-assets/DA_RenderPipelineProfile.md) for: `ERenderPipelineMethod`, `EShadowMethod`, `EReflectionMethod`, `EUpscalerMethod`, `EMeshStrategy`.*
*See [`BPC_PlatformServiceAbstraction`](../01-core/150_BPC_PlatformServiceAbstraction.md) for: `EPlatformFamily` (unified — all systems use this).*
### `ERenderPipelineChangeType` ### `ERenderPipelineChangeType`
| Value | Description | | Value | Description |
@@ -41,7 +42,7 @@ Central authority for render pipeline configuration. Reads `DA_RenderPipelinePro
### `SActivePipelineState` ### `SActivePipelineState`
| Field | Type | Description | | Field | Type | Description |
|-------|------|-------------| |-------|------|-------------|
| `Platform` | `EPlatformFamily` | Detected platform | | `Platform` | `EPlatformFamily` | Detected platform (from BPC_PlatformServiceAbstraction) |
| `ActivePreset` | `FName` | Currently applied quality preset name | | `ActivePreset` | `FName` | Currently applied quality preset name |
| `PendingPreset` | `FName` | Queued preset awaiting reload | | `PendingPreset` | `FName` | Queued preset awaiting reload |
| `ActivePipelineProfile` | `DA_RenderPipelineProfile` | Currently loaded profile Data Asset | | `ActivePipelineProfile` | `DA_RenderPipelineProfile` | Currently loaded profile Data Asset |
@@ -81,7 +82,8 @@ Central authority for render pipeline configuration. Reads `DA_RenderPipelinePro
- **Description:** Detects platform, loads the appropriate `DA_RenderPipelineProfile`, reads saved quality from `SS_SettingsSystem`, and applies initial pipeline settings. - **Description:** Detects platform, loads the appropriate `DA_RenderPipelineProfile`, reads saved quality from `SS_SettingsSystem`, and applies initial pipeline settings.
- **Flow:** - **Flow:**
1. Get Owner → Cast to PlayerController → cache 1. Get Owner → Cast to PlayerController → cache
2. If `bAutoDetectPlatform`: call `DetectPlatform()` → set `DetectedPlatform` 2. Bind to `GI_GameFramework.GetSubsystem(BPC_PlatformServiceAbstraction).OnPlatformReady`
3. In handler: read `PlatformService.GetPlatformFamily()` → set `DetectedPlatform`
3. Lookup `DA_RenderPipelineProfile` from `PlatformProfileMap` by `DetectedPlatform` 3. Lookup `DA_RenderPipelineProfile` from `PlatformProfileMap` by `DetectedPlatform`
4. If not found: log error, fallback to `PC_High` profile 4. If not found: log error, fallback to `PC_High` profile
5. Read `SS_SettingsSystem.GetSettingFloat("QualityPreset")` → resolve preset name 5. Read `SS_SettingsSystem.GetSettingFloat("QualityPreset")` → resolve preset name
@@ -173,7 +175,7 @@ Central authority for render pipeline configuration. Reads `DA_RenderPipelinePro
3. Call `ApplyRenderConfig(PendingPreset, Config)` 3. Call `ApplyRenderConfig(PendingPreset, Config)`
4. Broadcast `OnRenderPipelineChanged(PendingPreset, RequiresLevelReload)` 4. Broadcast `OnRenderPipelineChanged(PendingPreset, RequiresLevelReload)`
#### `DetectPlatform` → `EPlatformFamily` #### `DetectPlatform` → `EPlatformFamily` *(deprecated — use BPC_PlatformServiceAbstraction.GetPlatformFamily() instead)*
- **Description:** Auto-detect the current platform and GPU capability. - **Description:** Auto-detect the current platform and GPU capability.
- **Flow:** - **Flow:**
1. Check `UGameplayStatics::GetPlatformName()`: 1. Check `UGameplayStatics::GetPlatformName()`:

View File

@@ -8,7 +8,7 @@
Centralized Game Instance Subsystem that manages all UE5 Enhanced Input operations: Input Mapping Context push/pop with priority stack, platform-specific binding profiles, key rebinding, input mode coordination with [`SS_UIManager`](docs/blueprints/06-ui/44_SS_UIManager.md), and read-only input state queries for gameplay systems. Centralized Game Instance Subsystem that manages all UE5 Enhanced Input operations: Input Mapping Context push/pop with priority stack, platform-specific binding profiles, key rebinding, input mode coordination with [`SS_UIManager`](docs/blueprints/06-ui/44_SS_UIManager.md), and read-only input state queries for gameplay systems.
## Dependencies ## Dependencies
- **Requires:** [`DA_InputMappingProfile`](docs/blueprints/14-data-assets/129_DA_InputMappingProfile.md) (platform profiles), [`GI_GameFramework`](docs/blueprints/01-core/04_GI_GameFramework.md) (subsystem access) - **Requires:** [`DA_InputMappingProfile`](docs/blueprints/14-data-assets/129_DA_InputMappingProfile.md) (platform profiles), [`GI_GameFramework`](docs/blueprints/01-core/04_GI_GameFramework.md) (subsystem access), [`BPC_PlatformServiceAbstraction`](docs/blueprints/01-core/150_BPC_PlatformServiceAbstraction.md) (central platform detection — replaces own platform enum)
- **Required By:** All gameplay systems that read input (`BPC_InteractionDetector`, `BPC_FirearmSystem`, `BPC_MovementStateSystem`, `BPC_CutsceneBridge`, `BPC_HidingSystem`, `BPC_ActiveItemSystem`, etc.) - **Required By:** All gameplay systems that read input (`BPC_InteractionDetector`, `BPC_FirearmSystem`, `BPC_MovementStateSystem`, `BPC_CutsceneBridge`, `BPC_HidingSystem`, `BPC_ActiveItemSystem`, etc.)
- **Engine/Plugin Requirements:** Enhanced Input Plugin (UE5 built-in), `UEnhancedInputLocalPlayerSubsystem` - **Engine/Plugin Requirements:** Enhanced Input Plugin (UE5 built-in), `UEnhancedInputLocalPlayerSubsystem`
@@ -33,12 +33,12 @@ Centralized Game Instance Subsystem that manages all UE5 Enhanced Input operatio
| `Inspection = 3` | 3D item inspection (IMC_Inspection, Priority 20) | | `Inspection = 3` | 3D item inspection (IMC_Inspection, Priority 20) |
| `UI = 4` | Full-screen menus/pause (IMC_UI, Priority 100) | | `UI = 4` | Full-screen menus/pause (IMC_UI, Priority 100) |
### `E_InputPlatform` ### `E_InputPlatform` *(deprecated — use EPlatformFamily from BPC_PlatformServiceAbstraction. This enum is kept for DA_InputMappingProfile compatibility but all runtime selection uses the unified enum)*
| Value | Description | | Value | Description |
|-------|-------------| |-------|-------------|
| `PC_KeyboardMouse = 0` | Keyboard + Mouse | | `PC_KeyboardMouse = 0` | Keyboard + Mouse (maps to `PC_Win64`, `PC_Linux`, `Mac`) |
| `Xbox = 1` | Xbox Series X\|S / Xbox One | | `Xbox = 1` | Xbox Series X\|S / Xbox One (maps to `Xbox_Series` or `Xbox_One`) |
| `PS5_DualSense = 2` | PlayStation 5 DualSense | | `PS5_DualSense = 2` | PlayStation 5 DualSense (maps to `PS5` or `PS5_Pro`) |
--- ---
@@ -290,6 +290,7 @@ flowchart TD
| `BPC_HidingSystem` | `Function Call` | `SS_EnhancedInputManager::PushContext(Hiding) / PopContext(Hiding)` | | `BPC_HidingSystem` | `Function Call` | `SS_EnhancedInputManager::PushContext(Hiding) / PopContext(Hiding)` |
| `BPC_ActiveItemSystem` | `Function Call` | `SS_EnhancedInputManager::IsActionPressed("IA_QuickSlot1")` | | `BPC_ActiveItemSystem` | `Function Call` | `SS_EnhancedInputManager::IsActionPressed("IA_QuickSlot1")` |
| `BPC_HapticsController` (148) | `Function Call` | `SS_EnhancedInputManager::GetControllerPlatform()` — for platform detection | | `BPC_HapticsController` (148) | `Function Call` | `SS_EnhancedInputManager::GetControllerPlatform()` — for platform detection |
| `BPC_PlatformServiceAbstraction` (150) | `Function Call / Bind OnPlatformReady` | `GetDefaultInputProfile()` — selects correct DA_InputMappingProfile for detected platform |
| `WBP_PauseMenu` | `Function Call` | `SS_EnhancedInputManager::PushContext(UI) / PopContext(UI)` | | `WBP_PauseMenu` | `Function Call` | `SS_EnhancedInputManager::PushContext(UI) / PopContext(UI)` |
| `WBP_InventoryMenu` | `Function Call` | `SS_EnhancedInputManager::PushContext(WristwatchUI)` | | `WBP_InventoryMenu` | `Function Call` | `SS_EnhancedInputManager::PushContext(WristwatchUI)` |
| `BP_PuzzleDeviceActor` | `Function Call` | `SS_EnhancedInputManager::PushContext(Inspection)` | | `BP_PuzzleDeviceActor` | `Function Call` | `SS_EnhancedInputManager::PushContext(Inspection)` |

View File

@@ -117,7 +117,7 @@ These systems appear in the Plan but may need explicit spec files or are covered
- `BPC_HapticsController` — ✅ Created (system 148); `docs/blueprints/12-settings/148_BPC_HapticsController.md` - `BPC_HapticsController` — ✅ Created (system 148); `docs/blueprints/12-settings/148_BPC_HapticsController.md`
- `BPC_RenderPipelineManager` — ✅ Created (system 149); `docs/blueprints/12-settings/149_BPC_RenderPipelineManager.md` - `BPC_RenderPipelineManager` — ✅ Created (system 149); `docs/blueprints/12-settings/149_BPC_RenderPipelineManager.md`
- `DA_RenderPipelineProfile` — ✅ Created (supplementary); `docs/blueprints/14-data-assets/DA_RenderPipelineProfile.md` - `DA_RenderPipelineProfile` — ✅ Created (supplementary); `docs/blueprints/14-data-assets/DA_RenderPipelineProfile.md`
- `BPC_PlatformServiceAbstraction`Not yet created; Master Section 12.3 - `BPC_PlatformServiceAbstraction`✅ Created (system 150); `docs/blueprints/01-core/150_BPC_PlatformServiceAbstraction.md`
--- ---

View File

@@ -1,6 +1,6 @@
# Master Blueprint Index — UE5 Modular Game Framework # Master Blueprint Index — UE5 Modular Game Framework
**Version:** 3.6 | **Generated:** 2026-05-22 | **Total Files:** 149 numbered + 1 starter + 2 supplementary (152 total specs) | **C++:** 27 source files (15 full + 10 stubs + 2 utility) **Version:** 3.7 | **Generated:** 2026-05-22 | **Total Files:** 150 numbered + 1 starter + 2 supplementary (153 total specs) | **C++:** 27 source files (15 full + 10 stubs + 2 utility)
This document is the canonical index of every Blueprint specification file in the framework. Each entry links to its full spec document and includes: file name, asset type, parent class, purpose summary, and key dependencies. This document is the canonical index of every Blueprint specification file in the framework. Each entry links to its full spec document and includes: file name, asset type, parent class, purpose summary, and key dependencies.
@@ -25,7 +25,7 @@ docs/blueprints/
├── 00-project-setup/ ← Project Setup & Starter Assets (1 file) ├── 00-project-setup/ ← Project Setup & Starter Assets (1 file)
│ └── GI_StarterGameInstance.md ← Minimal GameInstance; tag validation entry point │ └── GI_StarterGameInstance.md ← Minimal GameInstance; tag validation entry point
├── 01-core/ ← Foundation (7 files + 11 Data Table CSVs + 1 Macro Library) ├── 01-core/ ← Foundation (8 files + 11 Data Table CSVs + 1 Macro Library)
│ ├── data-tables/ ← Per-category Gameplay Tag Data Tables (NEW — replaces DT_ProjectTags.csv) │ ├── data-tables/ ← Per-category Gameplay Tag Data Tables (NEW — replaces DT_ProjectTags.csv)
│ │ ├── DT_Tags_Player.csv (34 tags) │ │ ├── DT_Tags_Player.csv (34 tags)
│ │ ├── DT_Tags_Interaction.csv (36 tags) │ │ ├── DT_Tags_Interaction.csv (36 tags)
@@ -72,6 +72,7 @@ docs/blueprints/
| 05 | [`05_GM_CoreGameMode`](01-core/05_GM_CoreGameMode.md) | `GM_` Game Mode | `GameModeBase` | Core game mode; spawns player, sets default classes, pause control | 01-core | | 05 | [`05_GM_CoreGameMode`](01-core/05_GM_CoreGameMode.md) | `GM_` Game Mode | `GameModeBase` | Core game mode; spawns player, sets default classes, pause control | 01-core |
| 06 | [`06_GS_CoreGameState`](01-core/06_GS_CoreGameState.md) | `GS_` Game State | `GameStateBase` | Shared game state; tracks global flags, phase, timer | 01-core | | 06 | [`06_GS_CoreGameState`](01-core/06_GS_CoreGameState.md) | `GS_` Game State | `GameStateBase` | Shared game state; tracks global flags, phase, timer | 01-core |
| 07 | [`07_DA_ItemData`](01-core/07_DA_ItemData.md) | `DA_` Data Asset | `PrimaryDataAsset` | Base item data asset; inherited by all item types | 01-core | | 07 | [`07_DA_ItemData`](01-core/07_DA_ItemData.md) | `DA_` Data Asset | `PrimaryDataAsset` | Base item data asset; inherited by all item types | 01-core |
| 150 | [`150_BPC_PlatformServiceAbstraction`](01-core/150_BPC_PlatformServiceAbstraction.md) | `BPC_` Component | `ActorComponent` | Central platform authority; unified platform detection, SDK routing, achievement/cloud/overlay | 01-core |
| — | — | — | — | — | — | | — | — | — | — | — | — |
| 08 | [`08_BPC_HealthSystem`](02-player/08_BPC_HealthSystem.md) | `BPC_` Component | `ActorComponent` | Player health, damage resistance, death trigger, healing | 02-player | | 08 | [`08_BPC_HealthSystem`](02-player/08_BPC_HealthSystem.md) | `BPC_` Component | `ActorComponent` | Player health, damage resistance, death trigger, healing | 02-player |
| 09 | [`09_BPC_StaminaSystem`](02-player/09_BPC_StaminaSystem.md) | `BPC_` Component | `ActorComponent` | Stamina pool, sprint/action drain, exhaustion states, regen | 02-player | | 09 | [`09_BPC_StaminaSystem`](02-player/09_BPC_StaminaSystem.md) | `BPC_` Component | `ActorComponent` | Stamina pool, sprint/action drain, exhaustion states, regen | 02-player |
@@ -237,7 +238,7 @@ docs/blueprints/
| Prefix | Type | Count | | Prefix | Type | Count |
|--------|------|-------| |--------|------|-------|
| `BPC_` | Blueprint Component | 82 | | `BPC_` | Blueprint Component | 83 |
| `BP_` | Blueprint Actor | 11 | | `BP_` | Blueprint Actor | 11 |
| `WBP_` | Widget Blueprint | 14 | | `WBP_` | Widget Blueprint | 14 |
| `DA_` | Data Asset | 20 | | `DA_` | Data Asset | 20 |
@@ -250,7 +251,7 @@ docs/blueprints/
| `AI_` | AI Controller | 1 | | `AI_` | AI Controller | 1 |
| `BB_` | Blackboard | 1 | | `BB_` | Blackboard | 1 |
| `E_` | Enum | 5 | | `E_` | Enum | 5 |
| **Total** | | **161** | | **Total** | | **162** |
--- ---
@@ -268,7 +269,8 @@ Below are the most cross-referenced systems — these are the ones the State Man
| `BPC_StateManager` (130) | EVERY system (central query point) | | `BPC_StateManager` (130) | EVERY system (central query point) |
| `SS_AudioManager` (132) | ALL systems that play audio, BP_RoomAudioZone, WBP_SettingsMenu, BPC_StateManager (heart rate → audio) | | `SS_AudioManager` (132) | ALL systems that play audio, BP_RoomAudioZone, WBP_SettingsMenu, BPC_StateManager (heart rate → audio) |
| `BPC_HapticsController` (148) | HealthSystem, FirearmSystem, MeleeSystem, ScareEventSystem, PhysicsDrag, MovementState, ReloadSystem, DeathHandling, Staminasystem, StateManager → heartbeat, AccessibilitySettings | | `BPC_HapticsController` (148) | HealthSystem, FirearmSystem, MeleeSystem, ScareEventSystem, PhysicsDrag, MovementState, ReloadSystem, DeathHandling, Staminasystem, StateManager → heartbeat, AccessibilitySettings |
| `BPC_RenderPipelineManager` (149) | PerformanceScaler (delegates CVars), SettingsSystem (quality persistence), PlanarCaptureManager (budget adjustment), SettingsMenu (upscaler query), AtmosphereController | | `BPC_RenderPipelineManager` (149) | PerformanceScaler (delegates CVars), SettingsSystem (quality persistence), PlanarCaptureManager (budget adjustment), SettingsMenu (upscaler query), PlatformServiceAbstraction (platform detection) |
| `BPC_PlatformServiceAbstraction` (150) | ALL systems (central platform query), RenderPipelineManager, EnhancedInputManager, HapticsController, AchievementSystem, SaveManager, SettingsSystem, UIManager |
| `ABP_GASP` (external) | StateManager (overlay + action intensity), MovementState, Hiding, Stamina, Embodiment | | `ABP_GASP` (external) | StateManager (overlay + action intensity), MovementState, Hiding, Stamina, Embodiment |
--- ---
@@ -331,7 +333,7 @@ Below are the most cross-referenced systems — these are the ones the State Man
--- ---
*Master Blueprint Index v3.6 — The single reference document for every file in the framework. Now 149 files + 2 supplementary with State Management, MetaSounds Audio, Multiplayer Networking, Planar Capture System, Haptics Controller, and Render Pipeline Manager support.* *Master Blueprint Index v3.7 — The single reference document for every file in the framework. Now 150 files + 2 supplementary with unified platform authority (PlatformServiceAbstraction), State Management, MetaSounds Audio, Multiplayer Networking, Planar Capture System, Haptics Controller, and Render Pipeline Manager support.*
--- ---

View File

@@ -183,6 +183,7 @@ Abbreviations:
| 102-114 | All 13 systems | 🔵 | ✅ | BP children + widget BPs | | 102-114 | All 13 systems | 🔵 | ✅ | BP children + widget BPs |
| 148 | `BPC_HapticsController` | 🔵 (Blueprint-only) | ✅ | ⬜ BP child attach to PlayerController | | 148 | `BPC_HapticsController` | 🔵 (Blueprint-only) | ✅ | ⬜ BP child attach to PlayerController |
| 149 | `BPC_RenderPipelineManager` | 🔵 (Blueprint-only) | ✅ | ⬜ BP child attach to PlayerController | | 149 | `BPC_RenderPipelineManager` | 🔵 (Blueprint-only) | ✅ | ⬜ BP child attach to PlayerController |
| 150 | `BPC_PlatformServiceAbstraction` | 🔵 (Blueprint-only) | ✅ | ⬜ BP child attach to GI_GameFramework |
### Data Assets (14-data-assets — 16 systems) ### Data Assets (14-data-assets — 16 systems)

View File

@@ -726,6 +726,7 @@ All 16 are Data Asset definitions. No code — create Data Asset instances per c
| 105 | `SS_SettingsSystem` | BP child of GameInstanceSubsystem | Settings persistence: save/load config to disk, apply on boot | | 105 | `SS_SettingsSystem` | BP child of GameInstanceSubsystem | Settings persistence: save/load config to disk, apply on boot |
| 148 | `BPC_HapticsController` | BP child of ActorComponent | Haptics: GameplayTag-driven force feedback, DualSense triggers, heartbeat pulse | | 148 | `BPC_HapticsController` | BP child of ActorComponent | Haptics: GameplayTag-driven force feedback, DualSense triggers, heartbeat pulse |
| 149 | `BPC_RenderPipelineManager` | BP child of ActorComponent | Render pipeline: quality presets, GI/shadows/upscaling per platform, PlanarCapture aware | | 149 | `BPC_RenderPipelineManager` | BP child of ActorComponent | Render pipeline: quality presets, GI/shadows/upscaling per platform, PlanarCapture aware |
| 150 | `BPC_PlatformServiceAbstraction` | BP child of ActorComponent | Central platform authority: detection, SDK routing (Steam/PSN/Xbox/Nintendo), input/GFX/achievement coordination |
--- ---

View File

@@ -1,6 +1,6 @@
# Developer Reference — UE5 Modular Game Framework # Developer Reference — UE5 Modular Game Framework
**Version:** 1.8 | **Generated:** 2026-05-22 | **Files:** 21 (1 index + 3 overview + 1 migration + 1 integration + 1 prototype + 1 starter + 10 category docs + 1 combined + 1 capture + 1 render) | **C++:** 15 full + 10 stubs = 25 systems **Version:** 1.9 | **Generated:** 2026-05-22 | **Files:** 21 | **Systems:** 150 numbered + 2 supplementary
This directory contains developer-facing reference documentation for every system in the framework. Unlike the blueprint spec files (which define *what* to build), these documents explain *how each system works internally* — the data flow, state machines, integration points, and design rationale. Use these when you need to understand a system's behavior to implement, debug, or extend it. This directory contains developer-facing reference documentation for every system in the framework. Unlike the blueprint spec files (which define *what* to build), these documents explain *how each system works internally* — the data flow, state machines, integration points, and design rationale. Use these when you need to understand a system's behavior to implement, debug, or extend it.
@@ -52,6 +52,7 @@ docs/developer/
| 05 | `GM_CoreGameMode` | Foundation | Spawns player, manages game rules | | 05 | `GM_CoreGameMode` | Foundation | Spawns player, manages game rules |
| 06 | `GS_CoreGameState` | Foundation | Shared game state, phase tracker | | 06 | `GS_CoreGameState` | Foundation | Shared game state, phase tracker |
| 07 | `DA_ItemData` | Foundation | Base item data asset | | 07 | `DA_ItemData` | Foundation | Base item data asset |
| 150 | `BPC_PlatformServiceAbstraction` | Foundation | Central platform authority — detection, SDK routing, input/GFX/achievement coordination (NEW) |
| 08 | `BPC_HealthSystem` | Player | Health, damage, death trigger | | 08 | `BPC_HealthSystem` | Player | Health, damage, death trigger |
| 09 | `BPC_StaminaSystem` | Player | Stamina pool, sprint drain, exhaustion | | 09 | `BPC_StaminaSystem` | Player | Stamina pool, sprint drain, exhaustion |
| 10 | `BPC_StressSystem` | Player | Psychological stress tiers, hallucinations | | 10 | `BPC_StressSystem` | Player | Psychological stress tiers, hallucinations |