Add asset creation sheets for various systems and UI components

- Created Save/Load & Death Loop asset sheet detailing checkpoint, death handling, and respawn systems.
- Added UI widget creation sheets for pause menu, settings menu, inventory, journal viewer, objective display, notification toast, screen effect controller, accessibility UI, diegetic HUD frame, menu flow controller, and credits screen.
- Implemented HUD controller and interaction prompt display assets with detailed wiring instructions.
- Established narrative systems asset sheet including components for narrative state, objectives, dialogue playback, and branching consequences.
- Developed weapons, AI, and adaptive systems asset creation sheet outlining weapon base, enemy AI components, and adaptive gameplay mechanics.
- Compiled meta, settings, and polish asset creation sheet covering progress tracking, achievement systems, accessibility settings, and various polish components.
- Defined input actions and mapping contexts for enhanced input system, including gameplay actions and context priorities.
- Created state management assets including enums, structs, data asset, and state manager component for action gating and state transitions.
This commit is contained in:
Lefteris Notas
2026-05-20 15:34:06 +03:00
parent 4a7c871f29
commit 3ca87a7893
19 changed files with 1985 additions and 0 deletions

View File

@@ -0,0 +1,71 @@
# BP_CoreGameMode — Asset Implementation
> **UE5 Asset:** `/Game/Framework/Core/BP_CoreGameMode`
> **Parent Class:** `GM_CoreGameMode` (C++) or `GameModeBase`
> **Asset Type:** Blueprint Class (GameMode)
---
## Create This Asset
### Step 1: Create Blueprint
1. Content Browser → `Content/Framework/Core/`
2. Right-click → **Blueprint Class**
3. Parent: `GM_CoreGameMode` (C++) OR `GameModeBase`
4. Name: `BP_CoreGameMode`
### Step 2: Set as Default GameMode
**Project Settings → Maps & Modes → Default GameMode** → `BP_CoreGameMode`
### Step 3: Configure Class Defaults
| Variable | Type | Value |
|----------|------|-------|
| `GameState Class` | `AGS_CoreGameState` | `BP_CoreGameState` |
| `Player Controller Class` | `APlayerController` | Your `BP_CorePlayerController` |
| `Default Pawn Class` | `APawn` | Your GASP player pawn |
| `HUD Class` | `AHUD` | `WBP_HUDController` |
---
## What to Wire
### Function: TransitionToChapter
```
Input: ChapterTag (GameplayTag)
[BlueprintCallable]
├─ Branch: CurrentGamePhase == Loading?
│ True → Print Warning: "Already loading" → Return
├─ Set CurrentChapterTag = ChapterTag
├─ Switch HasAuthority → True:
│ ├─ Get GameInstance → Cast to GI_GameFramework
│ ├─ SetGamePhase(Loading)
│ ├─ Get GameState → Cast to GS_CoreGameState → SetChapter(ChapterTag)
│ ├─ Open Level (by ChapterTag mapping — use Data Asset lookup)
│ └─ On level loaded → SetGamePhase(InGame)
└─ Call OnChapterTransition(ChapterTag)
```
### Function: HandlePlayerDead
```
Input: DeadController (AController)
[BlueprintCallable]
├─ IsValid(DeadController)? → False: Return
├─ Set bPauseAllowed = false
├─ Get GameInstance → Cast to GI_GameFramework → SetGamePhase(DeathLoop)
└─ TODO: Route to respawn or AltDeathSpace
```
### Event Dispatchers to Create
| Dispatcher | Parameters |
|------------|-----------|
| `OnChapterTransition` | `NewChapter` (GameplayTag) |
| `OnGameOverTriggered` | `EndingTag` (GameplayTag) |
---
## Test It
- [ ] PIE: check output log for "GM_CoreGameMode::InitGame"
- [ ] Check that player spawns with correct pawn
- [ ] Call `TransitionToChapter` → phase changes to Loading → level loads

View File

@@ -0,0 +1,88 @@
# BP_CoreGameState — Asset Implementation
> **UE5 Asset:** `/Game/Framework/Core/BP_CoreGameState`
> **Parent Class:** `GS_CoreGameState` (C++) or `GameStateBase`
> **Asset Type:** Blueprint Class (GameState)
---
## Create This Asset
### Step 1: Create Blueprint
1. Content Browser → `Content/Framework/Core/`
2. Right-click → **Blueprint Class**
3. Parent: `GS_CoreGameState` (C++) OR `GameStateBase`
4. Name: `BP_CoreGameState`
### Step 2: Assign in GameMode
Open `BP_CoreGameMode` → Class Defaults → `GameState Class``BP_CoreGameState`
---
## What to Wire
### Variables (if BP-only GameStateBase)
| Variable | Type | Replication | Default |
|----------|------|-------------|---------|
| `ElapsedPlayTime` | `Float` | Replicated | `0.0` |
| `ActiveChapterTag` | `GameplayTag` | Replicated | Empty |
| `ActiveNarrativePhase` | `GameplayTag` | Replicated | Empty |
| `bEncounterActive` | `Boolean` | Replicated | `false` |
| `ActiveObjectiveTags` | `Array<GameplayTag>` | Replicated | Empty |
### Override: BeginPlay
```
[Event BeginPlay]
├─ Parent: BeginPlay
├─ Get GameInstance → Cast to GI_GameFramework → Store as CachedFramework
└─ Enable Tick
```
### Override: Tick
```
[Event Tick]
├─ IsValid(CachedFramework)? AND CurrentGamePhase == InGame?
│ True → ElapsedPlayTime += DeltaSeconds
│ ├─ TimeUpdateAccumulator += DeltaSeconds
│ └─ Accumulator >= 1.0?
│ ├─ Reset accumulator
│ └─ Call OnElapsedPlayTimeUpdated(ElapsedPlayTime)
```
### Function: SetChapter
```
Input: ChapterTag (GameplayTag)
[Server-only]
├─ If ChapterTag == ActiveChapterTag → Return
├─ Set ActiveChapterTag = ChapterTag
└─ Call OnChapterChanged(ChapterTag)
```
### Function: AddObjective / RemoveObjective
```
AddObjective(ObjectiveTag):
├─ If already in array → Return
├─ Add to ActiveObjectiveTags
└─ Call OnObjectiveTagsChanged
RemoveObjective(ObjectiveTag):
├─ Remove from array
└─ Call OnObjectiveTagsChanged
```
### Event Dispatchers to Create
| Dispatcher | Parameters |
|------------|-----------|
| `OnElapsedPlayTimeUpdated` | `ElapsedSeconds` (Float) |
| `OnChapterChanged` | `NewChapter` (GameplayTag) |
| `OnNarrativePhaseChanged` | `NewPhase` (GameplayTag) |
| `OnEncounterActiveStateChanged` | `bActive` (Boolean) |
| `OnObjectiveTagsChanged` | (none) |
---
## Test It
- [ ] PIE: check that GS_CoreGameState spawns
- [ ] Call SetChapter → OnChapterChanged fires → HUD updates
- [ ] Call AddObjective → OnObjectiveTagsChanged fires → objective list refreshes

View File

@@ -0,0 +1,78 @@
# BP_GameFramework — Asset Implementation
> **UE5 Asset:** `/Game/Framework/Core/BP_GameFramework`
> **Parent Class:** `GI_GameFramework` (C++) or `GameInstance` (BP-only)
> **Asset Type:** Blueprint Class (GameInstance)
---
## Create This Asset
### Step 1: Create Blueprint
1. Content Browser → `Content/Framework/Core/`
2. Right-click → **Blueprint Class**
3. Parent: `GI_GameFramework` (C++) OR `GameInstance`
4. Name: `BP_GameFramework`
### Step 2: Set as Game Instance Class
**Project Settings → Maps & Modes → Game Instance Class** → `BP_GameFramework`
### Step 3: Configure Class Defaults
| Variable | Type | Value |
|----------|------|-------|
| `TagRegistry` | `DA_GameTagRegistry` | Assign `DA_GameTagRegistry` asset |
| `bValidateTagsOnInit` | `Boolean` | `true` |
| `bLogTagsOnInit` | `Boolean` | `true` (dev) / `false` (ship) |
---
## What to Wire
### Override: Event Init
```
[Event Init]
├─ Parent: Event Init
├─ Print String: "BP_GameFramework: Init started"
├─ Branch: bValidateTagsOnInit?
│ True → Call ValidateFrameworkTags (see below)
├─ IsValid(TagRegistry)? → Branch
│ False → Print Error → Call OnFrameworkInitFailed("TagRegistry not assigned")
│ True →
│ ├─ Set bFrameworkInitialized = true
│ ├─ Call OnFrameworkReady
│ └─ Print String: "Framework ready"
```
### Function: ValidateFrameworkTags
```
[BlueprintCallable, Private]
├─ IsValid(TagRegistry)? → Branch
│ False → Print Error → Return
├─ TagRegistry → GetAllRegisteredTags → AllTags
├─ Array Length(AllTags) → TagCount
├─ Branch: TagCount == 0?
│ True → Print Warning: "No Gameplay Tags registered!"
│ False → Print: "{TagCount} tags registered"
├─ Branch: bLogTagsOnInit?
│ True → TagRegistry → LogAllTags
└─ Return
```
### Function: IsFrameworkReady
```
[BlueprintPure, Public] → Boolean
└─ Return bFrameworkInitialized
```
### Event Dispatchers to Create
| Dispatcher | Parameters |
|------------|-----------|
| `OnFrameworkReady` | (none) |
| `OnFrameworkInitFailed` | `ErrorReason` (String) |
---
## Test It
- [ ] PIE: output log shows "Framework ready" and tag count
- [ ] Clear TagRegistry variable → PIE → `OnFrameworkInitFailed` fires
- [ ] Set `bLogTagsOnInit = true` → all tag names printed to log

View File

@@ -0,0 +1,68 @@
# DA_GameTagRegistry — Asset Implementation
> **UE5 Asset:** `/Game/Framework/Core/DA_GameTagRegistry`
> **Parent Class:** `DA_GameTagRegistry` (C++) or `PrimaryDataAsset` (BP-only)
> **Asset Type:** Data Asset
---
## Create This Asset
### Step 1: Create Data Asset
1. Content Browser → `Content/Framework/Core/`
2. Right-click → **Miscellaneous → Data Asset**
3. Class: `DA_GameTagRegistry` (if C++ compiled) OR `PrimaryDataAsset`
4. Name: `DA_GameTagRegistry`
### Step 2: Configure Class Defaults (if BP-only PrimaryDataAsset)
| Variable | Type | Value |
|----------|------|-------|
| `TagNamespace` | `Text` | `"Framework tag namespace documentation"` |
| `bIsFrameworkTag` | `Boolean` | `true` |
| `TagDataTables` | `Array<Data Table>` | Add all 11 DT_Tags_* tables |
### Step 3: Assign to GameInstance
Open `BP_GameFramework` → Class Defaults → `TagRegistry` → assign `DA_GameTagRegistry`
---
## What to Wire (BP-Only Version)
### Function: GetAllRegisteredTags
```
Inputs: none → Output: Array<GameplayTag>
[Pure Function Graph]
├─ Make Array<GameplayTag> → LocalTags
├─ ForEachLoop (TagDataTables)
│ ├─ Branch: IsValid(Array Element)?
│ │ True → Get Data Table Row Names
│ │ └─ ForEachLoop (RowNames)
│ │ └─ Get Data Table Row → Break GameplayTagTableRow → Tag
│ │ └─ ADD to LocalTags
└─ Return LocalTags
```
### Function: ValidateTag
```
Input: Tag (GameplayTag) → Output: Boolean
[Pure Function Graph]
└─ Is Gameplay Tag Valid(Tag) → Return
```
### Function: GetTagDisplayName
```
Input: Tag (GameplayTag) → Output: Text
[Pure Function Graph]
└─ Get Tag Display Name(Tag) → Return
```
---
## Test It
- [ ] Open `DA_GameTagRegistry` → verify `TagDataTables` has 11 entries
- [ ] PIE: output log shows `"N tags registered across 11 Data Tables"`
- [ ] Call `ValidateTag(Framework.Player.State.Alive)` → returns `true`
- [ ] Call `ValidateTag(Unregistered.Tag)` → returns `false`

View File

@@ -0,0 +1,59 @@
# DT_Tags_* — Data Tables (11 assets)
> **UE5 Assets:** `Content/Framework/Core/DataTables/DT_Tags_{Category}`
> **Row Structure:** `GameplayTagTableRow`
> **Count:** 11 tables
---
## Create These Assets
### Step 1: Create All 11 Data Tables
For each category below, repeat this process:
1. Content Browser → `Content/Framework/Core/DataTables/`
2. Right-click → **Miscellaneous → Data Table**
3. Row Structure: `GameplayTagTableRow`
4. Name: `DT_Tags_{Category}`
5. Right-click the Data Table → **Import** → select the CSV file from `docs/blueprints/01-core/data-tables/DT_Tags_{Category}.csv`
### The 11 Tables
| # | Data Table | CSV Source | Namespaces |
|---|-----------|------------|------------|
| 1 | `DT_Tags_Player` | `DT_Tags_Player.csv` | Player.State, Stress, Posture, Movement, Camera, Body, Overlay, Vitals |
| 2 | `DT_Tags_Interaction` | `DT_Tags_Interaction.csv` | Interaction.Type, Context, Prompt, HidingSpot, Traversal, Door |
| 3 | `DT_Tags_Item` | `DT_Tags_Item.csv` | Item.Type, Slot, Rarity, Context |
| 4 | `DT_Tags_Narrative` | `DT_Tags_Narrative.csv` | Narrative.Flag, Phase, Choice, Ending, Trial, Cutscene, Lore, Objective |
| 5 | `DT_Tags_AI` | `DT_Tags_AI.csv` | AI.Alert, Archetype, Stimulus, Behavior, Memory |
| 6 | `DT_Tags_Save` | `DT_Tags_Save.csv` | Save, DeathSpace, Checkpoint, Respawn, RunHistory |
| 7 | `DT_Tags_Environment` | `DT_Tags_Environment.csv` | Environment.Atmosphere, Scare, Light, Pacing, Performance |
| 8 | `DT_Tags_Combat` | `DT_Tags_Combat.csv` | Combat.Damage, Weapon, Ammo, FireMode, HitReaction, Feedback, Shield |
| 9 | `DT_Tags_State` | `DT_Tags_State.csv` | State.Action, Overlay, Vital, Gating |
| 10 | `DT_Tags_Audio` | `DT_Tags_Audio.csv` | Audio.Bus, Room, Parameter, Surface |
| 11 | `DT_Tags_Achievement` | `DT_Tags_Achievement.csv` | Achievement |
### Step 2: Register All Tables with Engine
**⚠️ CRITICAL — Without this, NO tags are recognized!**
1. **Project Settings → GameplayTags → Gameplay Tag Table List**
2. Click `+` 11 times
3. Assign each `DT_Tags_*` Data Table to a slot
4. Restart editor (or recompile Blueprints) to refresh tag cache
### CSV Format
Each CSV has 3 columns:
```
Name,Tag,DevComment
Alive,"Framework.Player.State.Alive","Player is alive"
Dead,"Framework.Player.State.Dead","Player is dead"
...
```
---
## Test It
- [ ] Open `DA_GameTagRegistry` → call `GetAllRegisteredTags()` → returns ~334 tags
- [ ] Make Literal Gameplay Tag → type `Framework.Player.State.Alive` → recognized (not red)
- [ ] `Is Gameplay Tag Valid(Framework.Player.State.Alive)``true`
- [ ] `Is Gameplay Tag Valid(Fake.Tag)``false`