diff --git a/CONTEXT.md b/CONTEXT.md index 8b978b1..742742d 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -44,6 +44,18 @@ Content/ Input/ # Enhanced Input assets (NEW) Actions/ # IA_* Input Action assets Contexts/ # IMC_* Input Mapping Context assets + DataTables/ # Gameplay Tag Data Tables (NEW — 11 per-category CSV files) + DT_Tags_Player.csv + DT_Tags_Interaction.csv + DT_Tags_Item.csv + DT_Tags_Narrative.csv + DT_Tags_AI.csv + DT_Tags_Save.csv + DT_Tags_Environment.csv + DT_Tags_Combat.csv + DT_Tags_State.csv + DT_Tags_Audio.csv + DT_Tags_Achievement.csv Achievements/ Settings/ State/ # State Management assets (NEW) @@ -110,7 +122,7 @@ docs/ enhanced-input-system.md bpc-statemanager.md # NEW — State Manager implementation checklist ``` -**Total: 135 numbered Blueprint files + 5 enums + 5 Data Assets + TEMPLATE.md + AUDIT_REPORT.md + INDEX.md + 11 developer docs + 8 architecture docs + 1 audit report = 166 files in 18 directory groups** +**Total: 135 numbered Blueprint files + 5 enums + 5 Data Assets + 11 Data Table CSVs + TEMPLATE.md + AUDIT_REPORT.md + INDEX.md + 11 developer docs + 8 architecture docs + 1 audit report = 177 files in 19 directory groups** ## Naming Conventions | Prefix | Type | diff --git a/docs/architecture/blueprint-limitations-workarounds.md b/docs/architecture/blueprint-limitations-workarounds.md index 889b748..20dcf6b 100644 --- a/docs/architecture/blueprint-limitations-workarounds.md +++ b/docs/architecture/blueprint-limitations-workarounds.md @@ -14,12 +14,12 @@ This document catalogs all UE5 engine functions that are C++ only (not exposed t **UE5 Node:** Does NOT exist in Blueprint **Files Affected:** `01_GI_GameTagRegistry.md`, any system that needs to enumerate all tags -**Blueprint Workaround — Data Table Proxy:** +**Blueprint Workaround — Data Table Proxy (Multi-Table):** -1. Create a Data Table: `DT_ProjectTags` with Row Structure = `GameplayTagTableRow` -2. Populate it with all framework tags (mirrors `DefaultGameplayTags.ini`) -3. Register in Project Settings → GameplayTags → Gameplay Tag Table List -4. In Blueprint: use `Get Data Table Row Names` → `ForEachLoop` → `Get Data Table Row` → extract `Tag` field +1. Create 11 per-category Data Tables with Row Structure = `GameplayTagTableRow` (see `docs/blueprints/01-core/data-tables/`) +2. Populate each with its category's tags (mirrors `DefaultGameplayTags.ini`) +3. Register ALL tables in `Project Settings → GameplayTags → Gameplay Tag Table List` +4. In Blueprint: use outer `ForEachLoop` over `Array` + inner `ForEachLoop` over `Get Data Table Row Names` → `Get Data Table Row` → extract `Tag` field 5. This provides a complete tag list without C++ **Trade-off:** Manual maintenance. Adding new tags requires updating both the `.ini` file AND the Data Table. Mitigation: use `ExportTagNamespace()` to audit for discrepancies. @@ -176,7 +176,7 @@ OR create a Blueprint Macro Library with a macro that wraps the subsystem lookup When writing or updating Blueprint spec files, follow these rules to avoid C++-only references: 1. **Never reference `UGameplayTagsManager::Get()`** — use `Get Tag Display Name`, `Is Gameplay Tag Valid`, `Make Literal Gameplay Tag`. -2. **Never reference `Get All Gameplay Tags`** — use the Data Table proxy pattern (`DT_ProjectTags` → `Get Data Table Row Names`). +2. **Never reference `Get All Gameplay Tags`** — use the multi-table Data Table proxy pattern (Array → nested `ForEachLoop` → `Get Data Table Row`). 3. **Never use `FPrimaryAssetId` as a type name** — use `Primary Asset Id` (Blueprint type). 4. **Never use `TSoftObjectPtr` as a type name** — use `Soft Object Reference` (Blueprint type). 5. **Never put logic in Data Assets** — move initialization/validation to GameInstance, Subsystem, or Editor Utility. diff --git a/docs/blueprints/01-core/01_GI_GameTagRegistry.md b/docs/blueprints/01-core/01_GI_GameTagRegistry.md index bae3e27..3b382de 100644 --- a/docs/blueprints/01-core/01_GI_GameTagRegistry.md +++ b/docs/blueprints/01-core/01_GI_GameTagRegistry.md @@ -54,7 +54,7 @@ None. The registry is a flat collection of tag declarations. | Name | Inputs | Outputs | Category | Description | |------|--------|---------|----------|-------------| -| `GetAllRegisteredTags` | — | `Array` | Query | Reads tags from `DT_ProjectTags` Data Table (see Section 14 for UE5 BP workaround) | +| `GetAllRegisteredTags` | — | `Array` | Query | Reads tags from all registered per-category Data Tables (see Section 14) | | `GetTagDisplayName` | `Tag: FGameplayTag` | `Text` | Query | Returns the human-readable display name via `Get Tag Display Name` node | | `ValidateTag` | `Tag: FGameplayTag` | `Boolean` | Validation | Returns `true` if the tag is valid via `Is Gameplay Tag Valid` node | @@ -83,29 +83,30 @@ None. This Data Asset is passive — it has no runtime events. ├─► Load DA_GameTagRegistry (hard reference or Get Data Asset) ├─► Call DA_GameTagRegistry.GetAllRegisteredTags() ├─► Array Length == 0? - │ ├─► Yes → Print Warning: "No tags in DT_ProjectTags! Framework tags are unregistered." + │ ├─► Yes → Print Warning: "No tags in registered Data Tables! Framework tags are unregistered." │ └─► No → Log: "N tags registered." └─► Optional: call LogAllTags() for debug output ``` ## 9. Blueprint Graph Logic -### 9.1 GetAllRegisteredTags (Data Table Proxy) +### 9.1 GetAllRegisteredTags (Multi-Table Data Table Proxy) -**⚠️ UE5 Limitation:** `UGameplayTagsManager::RequestAllGameplayTags()` is C++ only — not exposed to Blueprints. This function uses a **Data Table proxy** instead. Tags must be registered in `DT_ProjectTags` which mirrors `DefaultGameplayTags.ini`. +**⚠️ UE5 Limitation:** `UGameplayTagsManager::RequestAllGameplayTags()` is C++ only — not exposed to Blueprints. This function uses a **Data Table proxy** with multiple per-category tables. All tables must be registered in `Project Settings → GameplayTags → Gameplay Tag Table List`. ``` [Function: GetAllRegisteredTags] → Array - Step 1: Get Data Table Row Names (DT_ProjectTags) - Step 2: Create empty Array → LocalTags - Step 3: ForEachLoop (RowNames): - ├─► Get Data Table Row (DT_ProjectTags, RowName) - │ → Break the GameplayTagTableRow struct → get "Tag" field - ├─► Add "Tag" to LocalTags array - Step 4: Return LocalTags + Step 1: Create empty Array → LocalTags + Step 2: ForEachLoop over TagDataTables (outer loop): + ├─► Branch: IsValid(current table)? → False: skip + ├─► Get Data Table Row Names (current table) + └─► ForEachLoop (RowNames) (inner loop): + ├─► Get Data Table Row → Break GameplayTagTableRow → get "Tag" + └─► Add "Tag" to LocalTags + Step 3: Return LocalTags ``` -**Node Search:** `Get Data Table Row Names`, `ForEachLoop`, `Get Data Table Row`, `Break GameplayTagTableRow`, `Add` +**Key Change from v1:** The outer loop iterates `TagDataTables` (Array), not a single `TagDataTable`. This enables tags split across multiple CSV files by category. ### 9.2 ValidateTag @@ -173,43 +174,25 @@ None. This Data Asset is passive — it has no runtime events. ## 10. Tag Namespace Reference (Framework Canonical) -All framework-level tags are defined in `DefaultGameplayTags.ini`. The following namespaces are **reserved and documented** by this asset: +All framework-level tags are defined in per-category Data Tables (CSV format, Row Structure: `GameplayTagTableRow`). These tables are registered in `Project Settings → GameplayTags → Gameplay Tag Table List`. The engine's `UGameplayTagsManager` merges all tables into one master list. -``` -Player.State.Alive -Player.State.Dead -Player.State.Hidden -Player.State.Interacting -Player.Stress.Low / Mid / High / Critical -Player.Posture.Standing / Crouching / Prone / Vaulting +| Data Table | Namespaces Covered | Example Tags | +|------------|-------------------|--------------| +| `DT_Tags_Player` | `Framework.Player.State.*`, `*.Stress.*`, `*.Posture.*`, `*.Movement.*`, `*.Camera.*`, `*.Body.*`, `*.Overlay.*`, `*.Vitals.*` | Alive, Dead, Hidden, Sprinting, Crouching, Aiming, FullBody, Blood | +| `DT_Tags_Interaction` | `Framework.Interaction.Type.*`, `*.Context.*`, `*.Prompt.*`, `*.HidingSpot.*`, `*.Traversal.*`, `*.Door.*` | Pickup, Door, Container, Locked, OneShot, Vault, Mantle | +| `DT_Tags_Item` | `Framework.Item.Type.*`, `*.Slot.*`, `*.Rarity.*`, `*.Context.*` | Weapon, KeyItem, PrimaryWeapon, Legendary, Stackable | +| `DT_Tags_Narrative` | `Game.Narrative.Flag.*`, `*.Phase.*`, `*.Choice.*`, `*.Ending.*`, `*.Trial.*`, `*.Cutscene.*`, `*.Lore.*`, `Framework.Objective.*` | Chapter1Complete, Act2, GoodEnding, HospitalEscape, Intro | +| `DT_Tags_AI` | `Framework.AI.Alert.*`, `*.Archetype.*`, `*.Stimulus.*`, `*.Behavior.*`, `*.Memory.*` | Alerted, Stalker, Hearing, Aggressive, LastKnownLocation | +| `DT_Tags_Save` | `Framework.Save.*`, `*.DeathSpace.*`, `*.Checkpoint.*`, `*.Respawn.*`, `*.RunHistory.*` | Checkpoint, HardSave, Slot.1, Entered, Active, Reached, Start, Death | +| `DT_Tags_Environment` | `Game.Environment.Atmosphere.*`, `*.Scare.*`, `*.Light.*`, `*.Pacing.*`, `*.Performance.*` | Tense, MirrorJump, Flicker, Combat, High | +| `DT_Tags_Combat` | `Framework.Combat.Damage.*`, `*.Weapon.*`, `*.Ammo.*`, `*.FireMode.*`, `*.HitReaction.*`, `*.Feedback.*`, `*.Shield.*` | Physical, Firearm, Pistol, Flinch, HitMarker, Active | +| `DT_Tags_State` | `Framework.State.Action.*`, `*.Overlay.*`, `*.Vital.*`, `*.Gating.*` | Fire, Sprint, Menu, Health, BlockSprint | +| `DT_Tags_Audio` | `Framework.Audio.Bus.*`, `*.Room.*`, `*.Parameter.*`, `*.Surface.*` | SFX, Small, HeartRate, Concrete | +| `DT_Tags_Achievement` | `Game.Achievement.*` | FirstBlood, Survivor, Pacifist, Ghost, Collector, LoreMaster, TrueEnding, SpeedRunner, WeaponsMaster, Completionist | -Interaction.Type.Pickup / Door / Drawer / Container / Inspect / Climb / Hide / Use / Combine -Interaction.Context.Requires.Key / Requires.Item / Locked / Disabled +**Usage Rule:** All systems must add the prefix `Framework.` to framework tags in code comments. Project-specific tags use `Game.` prefix. Example: `Framework.Item.Type.Weapon` vs `Game.Narrative.Flag.BasementDoorOpened`. -Item.Type.Weapon / Consumable / KeyItem / Document / Collectible / Ammo / Tool -Item.Slot.PrimaryWeapon / SecondaryWeapon / Flashlight / Shield / Active - -Narrative.Flag.* ← game-specific flags -Narrative.Phase.* ← story chapters / acts -Narrative.Choice.* ← choice consequence tags -Narrative.Ending.* ← ending conditions - -Objective.Status.Active / Complete / Failed / Hidden - -AI.Alert.None / Suspicious / Alerted / Engaged -AI.Archetype.Patrol / Ambush / Stalker / Passive - -Save.Type.Checkpoint / HardSave / AutoSave - -Achievement.* ← per-achievement tags - -Environment.Atmosphere.* ← atmosphere state tags -Environment.Scare.* ← scare event tags - -DeathSpace.Active ← triggers alt death space layer -``` - -**Usage Rule:** All systems must add the prefix `Framework.` to framework tags in code comments. Project-specific tags use `Game.` prefix. Example: `Framework.Interaction.Type.Pickup` vs `Game.Narrative.Flag.BasementDoorOpened`. +**CSV Format:** Each Data Table CSV uses columns: `Name,Tag,DevComment`. Name is a unique row identifier. Tag is the full gameplay tag string. DevComment explains the tag's purpose. --- @@ -245,19 +228,23 @@ This asset does not talk to other systems directly. All communication is passive ## 14. Manual Implementation Guide > **For human implementer:** Follow these steps to build `DA_GameTagRegistry` in UE5 Blueprints. -> **⚠️ UE5 BP Limitation:** `UGameplayTagsManager::RequestAllGameplayTags()` is C++ only. This implementation uses a **Data Table proxy** (`DT_ProjectTags`) as the 100% Blueprint workaround. You must create and maintain `DT_ProjectTags` alongside your `DefaultGameplayTags.ini`. +> **⚠️ UE5 BP Limitation:** `UGameplayTagsManager::RequestAllGameplayTags()` is C++ only. This implementation uses an **Array of Data Tables** (11 per-category tables) as the 100% Blueprint workaround. All tables must be registered in `Project Settings → GameplayTags → Gameplay Tag Table List`. -### 14.0 Prerequisite: Create the Tag Data Table +### 14.0 Prerequisite: Create the Per-Category Data Tables -Before implementing the Data Asset, create the proxy Data Table: +Before implementing the Data Asset, create **11 Data Tables**, one per category. Each follows the same format: -1. Right-click in Content Browser → **Miscellaneous → Data Table** +**Format:** Data Table with Row Structure = `GameplayTagTableRow` +**CSV Columns:** `Name,Tag,DevComment` +**Location in docs:** `docs/blueprints/01-core/data-tables/DT_Tags_*.csv` +**Location in UE5:** `Content/Framework/Core/DataTables/DT_Tags_*` + +1. For each category, right-click in Content Browser → **Miscellaneous → Data Table** 2. Row Structure: `GameplayTagTableRow` -3. Name: `DT_ProjectTags` -4. Save to: `Content/Framework/Core/` -5. Add rows: one per tag (row name = anything, fill the "Tag" field with your GameplayTag) -6. Go to **Project Settings → GameplayTags → Gameplay Tag Table List** → click `+` → select `DT_ProjectTags` - - This auto-registers these tags with the engine's tag manager. +3. Name: `DT_Tags_{Category}` (e.g., `DT_Tags_Player`) +4. Import the corresponding CSV file (Right-click Data Table → Import → CSV) +5. **Critical:** Go to `Project Settings → GameplayTags → Gameplay Tag Table List` → click `+` 11 times → assign each table to a slot + - This auto-registers ALL tags with the engine's tag manager. ### 14.1 Class Setup @@ -273,30 +260,39 @@ Add to Class Defaults: |----------|------|------------------|---------|----------| | `TagNamespace` | `Text` | ✓ | *"Framework tag namespace documentation"* | Documentation | | `bIsFrameworkTag` | `Boolean` | ✓ | `true` | Documentation | -| `TagDataTable` | `Data Table` (Object Reference) | ✓ | `DT_ProjectTags` | Config | +| `TagDataTables` | `Array` | ✓ | [DT_Tags_Player, DT_Tags_Interaction, DT_Tags_Item, DT_Tags_Narrative, DT_Tags_AI, DT_Tags_Save, DT_Tags_Environment, DT_Tags_Combat, DT_Tags_State, DT_Tags_Audio, DT_Tags_Achievement] | Config | + +**⚠️ Multi-Table Design:** Tags are split into 11 per-category Data Tables (see Section 10). In UE5 `Project Settings → GameplayTags → Gameplay Tag Table List`, add ALL 11 tables. The engine's `UGameplayTagsManager` merges them automatically. ### 14.3 Function Implementations #### `GetAllRegisteredTags()` → `Array` *(Blueprint Pure)* -**Purpose:** Returns all tags from the Data Table proxy. This replaces the C++-only `UGameplayTagsManager::RequestAllGameplayTags()`. +**Purpose:** Returns all tags from ALL registered Data Tables. Uses an outer loop over `TagDataTables` array and inner loop over each table's rows. + +**⚠️ UE5 Limitation:** `UGameplayTagsManager::RequestAllGameplayTags()` is C++ only — not exposed to Blueprints. This function uses the Data Table proxy approach with multiple tables. **Node-by-Node Logic:** ``` [Function: GetAllRegisteredTags] (Pure, no execution pins) - Step 1: Get Data Table Row Names (TagDataTable) → returns Array - Step 2: Create empty Array → LocalTags - Step 3: ForEachLoop over RowNames: - ├─► Get Data Table Row (TagDataTable, Array Element) - │ → Struct Pin: Break GameplayTagTableRow - │ → Get "Tag" field (type: GameplayTag) - ├─► Add "Tag" to LocalTags array - Step 4: Return LocalTags + Step 1: Create empty Array → LocalTags + Step 2: ForEachLoop over TagDataTables array (outer loop): + ├─► Array Element = current Data Table + ├─► Branch: IsValid(current table)? + │ False → Skip to next table + │ True → Continue + ├─► Get Data Table Row Names (current table) → returns Array + └─► ForEachLoop over RowNames (inner loop): + ├─► Get Data Table Row (current table, Array Element) + │ → Struct Pin: Break GameplayTagTableRow + │ → Get "Tag" field (type: GameplayTag) + └─► Add "Tag" to LocalTags array + Step 3: Return LocalTags ``` -**Nodes to Search:** `Get Data Table Row Names`, `ForEachLoop`, `Get Data Table Row`, `Break GameplayTagTableRow`, `Add`, `Array` +**Nodes to Search:** `ForEachLoop` (outer over TagDataTables), `ForEachLoop` (inner over row names), `Get Data Table Row Names`, `Get Data Table Row`, `Break GameplayTagTableRow`, `Add`, `Array`, `IsValid` -**⚠️ Note:** Since this is a **Pure** function, the ForEachLoop must be inside a **Pure function graph** (which supports loops in UE5). If your UE version doesn't support loops in Pure functions, make this a **BlueprintCallable** (impure) function instead. +**⚠️ Note:** If your UE version doesn't support loops in Pure functions, make this **BlueprintCallable** (impure) instead. #### `GetTagDisplayName(Tag: GameplayTag)` → `Text` *(Blueprint Pure)* @@ -322,11 +318,11 @@ Add to Class Defaults: **Node Search:** `Is Gameplay Tag Valid`, `Get Tag Name` -**⚠️ Note:** `Is Gameplay Tag Valid` returns true only if the tag is registered in the engine's tag table (which `DT_ProjectTags` populates via Project Settings). Tags NOT in the table will return false. +**⚠️ Note:** `Is Gameplay Tag Valid` returns true only if the tag is registered in the engine's tag table (which the 11 Data Tables populate via Project Settings). Tags NOT in any registered table will return false. #### `LogAllTags()` → *(void)* *(Blueprint Callable)* -**Editor Only.** Prints all tags from the Data Table to the output log. +**Editor Only.** Prints all tags from all Data Tables to the output log. **Node-by-Node Logic:** ``` @@ -334,11 +330,9 @@ Add to Class Defaults: Step 1: Call GetAllRegisteredTags() → LocalTags Step 2: ForEachLoop (LocalTags): ├─► Get Tag Name (Array Element) → ToString → Print String - Step 3: Print String: "Total tags: " + Array Length(LocalTags) + Step 3: Print String: "Total tags across all tables: " + Array Length(LocalTags) ``` -**Node Search:** `ForEachLoop`, `Get Tag Name`, `ToString (String)`, `Print String`, `Array Length` - #### `ExportTagNamespace(NamespacePrefix: String)` → `String` *(Blueprint Callable)* **Node-by-Node Logic:** @@ -348,14 +342,12 @@ Add to Class Defaults: Step 2: Create String variable → Output = "" Step 3: ForEachLoop (LocalTags): ├─► Get Tag Name (Array Element) → ToString → TagString - ├─► Branch: Does TagString start with NamespacePrefix? (use "Starts With" string node) + ├─► Branch: Does TagString start with NamespacePrefix? │ True → Append TagString + "\n" to Output (use "Append" or "Build String") └─► Continue Step 4: Return Output ``` -**Node Search:** `Starts With (String)`, `Append`, `Build String`, `ForEachLoop` - ### 14.4 External Initialization Since Data Assets have no `BeginPlay`, call validation from your GameInstance or StateManager: @@ -365,7 +357,7 @@ Since Data Assets have no `BeginPlay`, call validation from your GameInstance or Step 1: Get DA_GameTagRegistry (hard reference or Load Asset) Step 2: Call DA_GameTagRegistry.GetAllRegisteredTags() → LocalTags Step 3: Branch: Array Length(LocalTags) == 0 - ├─► True → Print Warning: "No tags in DT_ProjectTags!" + ├─► True → Print Warning: "No tags in registered Data Tables!" └─► False → Print String: "N tags registered: " + Array Length Step 4: [Debug builds only] Call DA_GameTagRegistry.LogAllTags() ``` @@ -376,19 +368,30 @@ No replication needed. This is a read-only Data Asset with a read-only Data Tabl ### 14.6 Blueprint Build Checklist -- [ ] Create Data Table `DT_ProjectTags` (Row Structure: `GameplayTagTableRow`) -- [ ] Populate `DT_ProjectTags` with all framework tags from Section 10 -- [ ] Add `DT_ProjectTags` to `Project Settings → GameplayTags → Gameplay Tag Table List` -- [ ] Create Data Asset `DA_GameTagRegistry` (Parent: `PrimaryDataAsset`) -- [ ] Add variables: `TagNamespace` (Text), `bIsFrameworkTag` (Boolean), `TagDataTable` (Data Table Ref → DT_ProjectTags) -- [ ] Implement `GetAllRegisteredTags` using Data Table Row iteration +- [ ] Create 11 Data Tables with Row Structure `GameplayTagTableRow`: + - [ ] `DT_Tags_Player` — Player state, stress, posture, movement, camera, body, vitals + - [ ] `DT_Tags_Interaction` — Interaction types, contexts, prompts, hiding spots, traversal, doors + - [ ] `DT_Tags_Item` — Item types, slots, rarities, contexts + - [ ] `DT_Tags_Narrative` — Flags, phases, choices, endings, trials, cutscenes, lore, objectives + - [ ] `DT_Tags_AI` — Alert levels, archetypes, stimuli, behaviors, memory + - [ ] `DT_Tags_Save` — Save types, death space, checkpoints, respawn + - [ ] `DT_Tags_Environment` — Atmosphere, scares, lighting, pacing, performance + - [ ] `DT_Tags_Combat` — Damage types, weapons, ammo, fire modes, hit reactions, shield + - [ ] `DT_Tags_State` — Action states, overlay states, vitals, gating + - [ ] `DT_Tags_Audio` — Audio buses, room acoustics, parameters, surfaces + - [ ] `DT_Tags_Achievement` — Achievement identifiers +- [ ] Add ALL 11 tables to `Project Settings → GameplayTags → Gameplay Tag Table List` +- [ ] Create Data Asset: `DA_GameTagRegistry` (Parent: `PrimaryDataAsset`) +- [ ] Add variables: `TagNamespace` (Text), `bIsFrameworkTag` (Boolean), `TagDataTables` (Array — populate with all 11 tables) +- [ ] Implement `GetAllRegisteredTags` with OUTER loop over TagDataTables + INNER loop over row names - [ ] Implement `GetTagDisplayName` using `Get Tag Display Name` node - [ ] Implement `ValidateTag` using `Is Gameplay Tag Valid` node -- [ ] Implement `LogAllTags` (editor-only, prints all tags) -- [ ] Implement `ExportTagNamespace` (string prefix filtering) +- [ ] Implement `LogAllTags` (editor-only, prints tags from all tables) +- [ ] Implement `ExportTagNamespace` (string prefix filtering across all tables) - [ ] Add external initialization call from `GI_GameFramework.Init()` or `BPC_StateManager.BeginPlay()` -- [ ] Verify: all tags from Section 10 exist in `DT_ProjectTags` -- [ ] Verify: `ValidateTag` returns true for registered tags, false for unregistered +- [ ] Verify: all tags from Section 10 exist in the appropriate Data Table +- [ ] Verify: `ValidateTag` returns true for tags in any registered table, false for unregistered +- [ ] Verify: `GetAllRegisteredTags` returns ALL tags merged from all tables --- diff --git a/docs/blueprints/01-core/DT_ProjectTags.csv b/docs/blueprints/01-core/DT_ProjectTags.csv index c660b88..558789e 100644 --- a/docs/blueprints/01-core/DT_ProjectTags.csv +++ b/docs/blueprints/01-core/DT_ProjectTags.csv @@ -1,65 +1,5 @@ -Name,Tag,DevComment -Framework_Player_State_Alive,Framework.Player.State.Alive, -Framework_Player_State_Dead,Framework.Player.State.Dead, -Framework_Player_State_Hidden,Framework.Player.State.Hidden, -Framework_Player_State_Interacting,Framework.Player.State.Interacting, -Framework_Player_Stress_Low,Framework.Player.Stress.Low, -Framework_Player_Stress_Mid,Framework.Player.Stress.Mid, -Framework_Player_Stress_High,Framework.Player.Stress.High, -Framework_Player_Stress_Critical,Framework.Player.Stress.Critical, -Framework_Player_Posture_Standing,Framework.Player.Posture.Standing, -Framework_Player_Posture_Crouching,Framework.Player.Posture.Crouching, -Framework_Player_Posture_Prone,Framework.Player.Posture.Prone, -Framework_Player_Posture_Vaulting,Framework.Player.Posture.Vaulting, -Framework_Interaction_Type_Pickup,Framework.Interaction.Type.Pickup, -Framework_Interaction_Type_Door,Framework.Interaction.Type.Door, -Framework_Interaction_Type_Drawer,Framework.Interaction.Type.Drawer, -Framework_Interaction_Type_Container,Framework.Interaction.Type.Container, -Framework_Interaction_Type_Inspect,Framework.Interaction.Type.Inspect, -Framework_Interaction_Type_Climb,Framework.Interaction.Type.Climb, -Framework_Interaction_Type_Hide,Framework.Interaction.Type.Hide, -Framework_Interaction_Type_Use,Framework.Interaction.Type.Use, -Framework_Interaction_Type_Combine,Framework.Interaction.Type.Combine, -Framework_Interaction_Context_Requires_Key,Framework.Interaction.Context.Requires.Key, -Framework_Interaction_Context_Requires_Item,Framework.Interaction.Context.Requires.Item, -Framework_Interaction_Context_Locked,Framework.Interaction.Context.Locked, -Framework_Interaction_Context_Disabled,Framework.Interaction.Context.Disabled, -Framework_Item_Type_Weapon,Framework.Item.Type.Weapon, -Framework_Item_Type_Consumable,Framework.Item.Type.Consumable, -Framework_Item_Type_KeyItem,Framework.Item.Type.KeyItem, -Framework_Item_Type_Document,Framework.Item.Type.Document, -Framework_Item_Type_Collectible,Framework.Item.Type.Collectible, -Framework_Item_Type_Ammo,Framework.Item.Type.Ammo, -Framework_Item_Type_Tool,Framework.Item.Type.Tool, -Framework_Item_Slot_PrimaryWeapon,Framework.Item.Slot.PrimaryWeapon, -Framework_Item_Slot_SecondaryWeapon,Framework.Item.Slot.SecondaryWeapon, -Framework_Item_Slot_Flashlight,Framework.Item.Slot.Flashlight, -Framework_Item_Slot_Shield,Framework.Item.Slot.Shield, -Framework_Item_Slot_Active,Framework.Item.Slot.Active, -Game_Narrative_Flag,Game.Narrative.Flag, -Game_Narrative_Phase,Game.Narrative.Phase, -Game_Narrative_Choice,Game.Narrative.Choice, -Game_Narrative_Ending,Game.Narrative.Ending, -Game_Narrative_Flag_PrologueComplete,Game.Narrative.Flag.PrologueComplete, -Framework_Objective_Status_Active,Framework.Objective.Status.Active, -Framework_Objective_Status_Complete,Framework.Objective.Status.Complete, -Framework_Objective_Status_Failed,Framework.Objective.Status.Failed, -Framework_Objective_Status_Hidden,Framework.Objective.Status.Hidden, -Framework_AI_Alert_None,Framework.AI.Alert.None, -Framework_AI_Alert_Suspicious,Framework.AI.Alert.Suspicious, -Framework_AI_Alert_Alerted,Framework.AI.Alert.Alerted, -Framework_AI_Alert_Engaged,Framework.AI.Alert.Engaged, -Framework_AI_Archetype_Patrol,Framework.AI.Archetype.Patrol, -Framework_AI_Archetype_Ambush,Framework.AI.Archetype.Ambush, -Framework_AI_Archetype_Stalker,Framework.AI.Archetype.Stalker, -Framework_AI_Archetype_Passive,Framework.AI.Archetype.Passive, -Framework_Save_Type_Checkpoint,Framework.Save.Type.Checkpoint, -Framework_Save_Type_HardSave,Framework.Save.Type.HardSave, -Framework_Save_Type_AutoSave,Framework.Save.Type.AutoSave, -Game_Achievement,Game.Achievement, -Game_Achievement_FirstBlood,Game.Achievement.FirstBlood, -Game_Environment_Atmosphere,Game.Environment.Atmosphere, -Game_Environment_Atmosphere_Eerie,Game.Environment.Atmosphere.Eerie, -Game_Environment_Scare,Game.Environment.Scare, -Game_Environment_Scare_MirrorJump,Game.Environment.Scare.MirrorJump, -Framework_DeathSpace_Active,Framework.DeathSpace.Active, +# SUPERSEDED — Tags split into 11 per-category Data Tables in docs/blueprints/01-core/data-tables/ +# See: DT_Tags_Player.csv, DT_Tags_Interaction.csv, DT_Tags_Item.csv, DT_Tags_Narrative.csv, +# DT_Tags_AI.csv, DT_Tags_Save.csv, DT_Tags_Environment.csv, DT_Tags_Combat.csv, +# DT_Tags_State.csv, DT_Tags_Audio.csv, DT_Tags_Achievement.csv +# This file kept as migration reference only. Do not use in new implementations. diff --git a/docs/blueprints/01-core/data-tables/DT_Tags_AI.csv b/docs/blueprints/01-core/data-tables/DT_Tags_AI.csv new file mode 100644 index 0000000..779be1a --- /dev/null +++ b/docs/blueprints/01-core/data-tables/DT_Tags_AI.csv @@ -0,0 +1,24 @@ +Name,Tag,DevComment +Framework_AI_Alert_None,Framework.AI.Alert.None,No awareness of player +Framework_AI_Alert_Suspicious,Framework.AI.Alert.Suspicious,Heard or glimpsed something +Framework_AI_Alert_Alerted,Framework.AI.Alert.Alerted,Confirmed player presence +Framework_AI_Alert_Engaged,Framework.AI.Alert.Engaged,Actively fighting +Framework_AI_Alert_Searching,Framework.AI.Alert.Searching,Lost sight searching area +Framework_AI_Alert_Fleeing,Framework.AI.Alert.Fleeing,Retreating from combat +Framework_AI_Archetype_Patrol,Framework.AI.Archetype.Patrol,Standard patrol guard +Framework_AI_Archetype_Ambush,Framework.AI.Archetype.Ambush,Lurking ambush predator +Framework_AI_Archetype_Stalker,Framework.AI.Archetype.Stalker,Persistent slow stalker +Framework_AI_Archetype_Passive,Framework.AI.Archetype.Passive,Non-aggressive NPC +Framework_AI_Archetype_Berserker,Framework.AI.Archetype.Berserker,Aggressive rush-down enemy +Framework_AI_Archetype_Sniper,Framework.AI.Archetype.Sniper,Long-range stationary enemy +Framework_AI_Stimulus_Sight,Framework.AI.Stimulus.Sight,Visual perception trigger +Framework_AI_Stimulus_Hearing,Framework.AI.Stimulus.Hearing,Audio perception trigger +Framework_AI_Stimulus_Damage,Framework.AI.Stimulus.Damage,Damage perception trigger +Framework_AI_Stimulus_TeamAlert,Framework.AI.Stimulus.TeamAlert,Ally alert shared perception +Framework_AI_Behavior_Aggressive,Framework.AI.Behavior.Aggressive,Aggressive combat style +Framework_AI_Behavior_Defensive,Framework.AI.Behavior.Defensive,Defensive combat style +Framework_AI_Behavior_Cautious,Framework.AI.Behavior.Cautious,Cautious slow approach +Framework_AI_Behavior_Reckless,Framework.AI.Behavior.Reckless,Reckless rush style +Framework_AI_Memory_LastKnownLocation,Framework.AI.Memory.LastKnownLocation,Last known player position +Framework_AI_Memory_InvestigationPoint,Framework.AI.Memory.InvestigationPoint,Point of interest to investigate +Framework_AI_Memory_ThreatHistory,Framework.AI.Memory.ThreatHistory,Record of damage sources diff --git a/docs/blueprints/01-core/data-tables/DT_Tags_Achievement.csv b/docs/blueprints/01-core/data-tables/DT_Tags_Achievement.csv new file mode 100644 index 0000000..13ba007 --- /dev/null +++ b/docs/blueprints/01-core/data-tables/DT_Tags_Achievement.csv @@ -0,0 +1,22 @@ +Name,Tag,DevComment +Game_Achievement,Game.Achievement,Root achievement namespace +Game_Achievement_FirstBlood,Game.Achievement.FirstBlood,First enemy killed +Game_Achievement_Survivor,Game.Achievement.Survivor,Survived first chapter without dying +Game_Achievement_Pacifist,Game.Achievement.Pacifist,Completed a chapter without killing any enemy +Game_Achievement_Ghost,Game.Achievement.Ghost,Never detected by enemies in a chapter +Game_Achievement_Collector,Game.Achievement.Collector,Collected all collectibles +Game_Achievement_LoreMaster,Game.Achievement.LoreMaster,Discovered all lore entries +Game_Achievement_SpeedRunner,Game.Achievement.SpeedRunner,Completed game in under 3 hours +Game_Achievement_TrueEnding,Game.Achievement.TrueEnding,Unlocked the true ending +Game_Achievement_BadEnding,Game.Achievement.BadEnding,Witnessed the bad ending +Game_Achievement_WeaponsMaster,Game.Achievement.WeaponsMaster,Used every weapon type +Game_Achievement_Crafter,Game.Achievement.Crafter,Crafted 10 items +Game_Achievement_Untouchable,Game.Achievement.Untouchable,Completed a chapter without taking damage +Game_Achievement_Hoarder,Game.Achievement.Hoarder,Carried 100 items at once +Game_Achievement_Completionist,Game.Achievement.Completionist,Completed all side objectives +Game_Achievement_FirstDeath,Game.Achievement.FirstDeath,Died for the first time +Game_Achievement_TenDeaths,Game.Achievement.TenDeaths,Died 10 times +Game_Achievement_Chapter1Complete,Game.Achievement.Chapter1Complete,Completed Chapter 1 +Game_Achievement_Chapter2Complete,Game.Achievement.Chapter2Complete,Completed Chapter 2 +Game_Achievement_Chapter3Complete,Game.Achievement.Chapter3Complete,Completed Chapter 3 +Game_Achievement_AllEndings,Game.Achievement.AllEndings,Unlocked every ending diff --git a/docs/blueprints/01-core/data-tables/DT_Tags_Audio.csv b/docs/blueprints/01-core/data-tables/DT_Tags_Audio.csv new file mode 100644 index 0000000..10dc8e7 --- /dev/null +++ b/docs/blueprints/01-core/data-tables/DT_Tags_Audio.csv @@ -0,0 +1,29 @@ +Name,Tag,DevComment +Framework_Audio_Bus_Master,Framework.Audio.Bus.Master,Master audio bus +Framework_Audio_Bus_SFX,Framework.Audio.Bus.SFX,Sound effects bus +Framework_Audio_Bus_Ambient,Framework.Audio.Bus.Ambient,Ambient audio bus +Framework_Audio_Bus_Music,Framework.Audio.Bus.Music,Music bus +Framework_Audio_Bus_Dialogue,Framework.Audio.Bus.Dialogue,Dialogue/VO bus +Framework_Audio_Room_Small,Framework.Audio.Room.Small,Small room acoustics +Framework_Audio_Room_Large,Framework.Audio.Room.Large,Large room acoustics +Framework_Audio_Room_Outdoor,Framework.Audio.Room.Outdoor,Outdoor acoustics +Framework_Audio_Room_Cave,Framework.Audio.Room.Cave,Cave acoustics +Framework_Audio_Room_Hallway,Framework.Audio.Room.Hallway,Hallway acoustics +Framework_Audio_Room_Bathroom,Framework.Audio.Room.Bathroom,Bathroom acoustics +Framework_Audio_Room_Cathedral,Framework.Audio.Room.Cathedral,Cathedral acoustics +Framework_Audio_Room_Anchoric,Framework.Audio.Room.Anchoric,Anechoic/dead acoustics +Framework_Audio_Parameter_HeartRate,Framework.Audio.Parameter.HeartRate,Heart rate audio parameter +Framework_Audio_Parameter_Stress,Framework.Audio.Parameter.Stress,Stress audio parameter +Framework_Audio_Parameter_Fear,Framework.Audio.Parameter.Fear,Fear audio parameter +Framework_Audio_Parameter_MusicIntensity,Framework.Audio.Parameter.MusicIntensity,Music intensity parameter +Framework_Audio_Parameter_Tension,Framework.Audio.Parameter.Tension,Tension parameter +Framework_Audio_Surface_Concrete,Framework.Audio.Surface.Concrete,Concrete footstep +Framework_Audio_Surface_Wood,Framework.Audio.Surface.Wood,Wood footstep +Framework_Audio_Surface_Metal,Framework.Audio.Surface.Metal,Metal footstep +Framework_Audio_Surface_Water,Framework.Audio.Surface.Water,Water footstep +Framework_Audio_Surface_Carpet,Framework.Audio.Surface.Carpet,Carpet footstep +Framework_Audio_Surface_Gravel,Framework.Audio.Surface.Gravel,Gravel footstep +Framework_Audio_Surface_Glass,Framework.Audio.Surface.Glass,Glass footstep +Framework_Audio_Surface_Dirt,Framework.Audio.Surface.Dirt,Dirt footstep +Framework_Audio_Surface_Grass,Framework.Audio.Surface.Grass,Grass footstep +Framework_Audio_Surface_Tile,Framework.Audio.Surface.Tile,Tile footstep diff --git a/docs/blueprints/01-core/data-tables/DT_Tags_Combat.csv b/docs/blueprints/01-core/data-tables/DT_Tags_Combat.csv new file mode 100644 index 0000000..1499b0b --- /dev/null +++ b/docs/blueprints/01-core/data-tables/DT_Tags_Combat.csv @@ -0,0 +1,28 @@ +Name,Tag,DevComment +Framework_Combat_Damage_Physical,Framework.Combat.Damage.Physical,Physical/blunt damage type +Framework_Combat_Damage_Arcane,Framework.Combat.Damage.Arcane,Arcane/magic damage type +Framework_Combat_Damage_Fire,Framework.Combat.Damage.Fire,Fire damage type +Framework_Combat_Damage_Poison,Framework.Combat.Damage.Poison,Poison damage type +Framework_Combat_Damage_Fear,Framework.Combat.Damage.Fear,Fear/psychological damage type +Framework_Combat_Damage_Environmental,Framework.Combat.Damage.Environmental,Environmental hazard damage +Framework_Combat_Damage_True,Framework.Combat.Damage.True,True damage (bypasses all resistance) +Framework_Combat_Weapon_Firearm,Framework.Combat.Weapon.Firearm,Firearm weapon type +Framework_Combat_Weapon_Melee,Framework.Combat.Weapon.Melee,Melee weapon type +Framework_Combat_Weapon_Throwable,Framework.Combat.Weapon.Throwable,Throwable weapon +Framework_Combat_Ammo_Pistol,Framework.Combat.Ammo.Pistol,Pistol ammunition +Framework_Combat_Ammo_Rifle,Framework.Combat.Ammo.Rifle,Rifle ammunition +Framework_Combat_Ammo_Shotgun,Framework.Combat.Ammo.Shotgun,Shotgun shells +Framework_Combat_Ammo_Energy,Framework.Combat.Ammo.Energy,Energy cells +Framework_Combat_FireMode_SemiAuto,Framework.Combat.FireMode.SemiAuto,One shot per trigger press +Framework_Combat_FireMode_FullAuto,Framework.Combat.FireMode.FullAuto,Continuous fire while held +Framework_Combat_FireMode_Burst,Framework.Combat.FireMode.Burst,Fixed burst count +Framework_Combat_FireMode_Charge,Framework.Combat.FireMode.Charge,Hold to charge release +Framework_Combat_HitReaction_Flinch,Framework.Combat.HitReaction.Flinch,Minor directional flinch +Framework_Combat_HitReaction_Stagger,Framework.Combat.HitReaction.Stagger,Heavy stagger +Framework_Combat_HitReaction_Knockdown,Framework.Combat.HitReaction.Knockdown,Knocked to ground +Framework_Combat_HitReaction_Ragdoll,Framework.Combat.HitReaction.Ragdoll,Full ragdoll on death +Framework_Combat_Feedback_HitMarker,Framework.Combat.Feedback.HitMarker,Hit marker UI element +Framework_Combat_Feedback_KillConfirm,Framework.Combat.Feedback.KillConfirm,Kill confirm UI element +Framework_Combat_Shield_Active,Framework.Combat.Shield.Active,Shield is blocking +Framework_Combat_Shield_Broken,Framework.Combat.Shield.Broken,Shield durability zero +Framework_Combat_Shield_Recharging,Framework.Combat.Shield.Recharging,Shield recharging diff --git a/docs/blueprints/01-core/data-tables/DT_Tags_Environment.csv b/docs/blueprints/01-core/data-tables/DT_Tags_Environment.csv new file mode 100644 index 0000000..c9b5ca0 --- /dev/null +++ b/docs/blueprints/01-core/data-tables/DT_Tags_Environment.csv @@ -0,0 +1,35 @@ +Name,Tag,DevComment +Game_Achievement,Game.Achievement,Root achievement namespace +Game_Achievement_FirstBlood,Game.Achievement.FirstBlood,First kill +Game_Achievement_Survivor,Game.Achievement.Survivor,Survived first chapter +Game_Achievement_Pacifist,Game.Achievement.Pacifist,Completed chapter without killing +Game_Achievement_Ghost,Game.Achievement.Ghost,Never detected in a chapter +Game_Achievement_Collector,Game.Achievement.Collector,Collected all items +Game_Achievement_LoreMaster,Game.Achievement.LoreMaster,Found all lore entries +Game_Achievement_SpeedRunner,Game.Achievement.SpeedRunner,Completed game under time limit +Game_Achievement_TrueEnding,Game.Achievement.TrueEnding,Unlocked true ending +Game_Environment_Atmosphere_Safe,Game.Environment.Atmosphere.Safe,Safe zone atmosphere +Game_Environment_Atmosphere_Neutral,Game.Environment.Atmosphere.Neutral,Neutral atmosphere +Game_Environment_Atmosphere_Tense,Game.Environment.Atmosphere.Tense,Tension building +Game_Environment_Atmosphere_Danger,Game.Environment.Atmosphere.Danger,Active danger +Game_Environment_Atmosphere_Terror,Game.Environment.Atmosphere.Terror,Peak terror +Game_Environment_Atmosphere_Eerie,Game.Environment.Atmosphere.Eerie,Eerie ambient +Game_Environment_Scare,Game.Environment.Scare,Scare event namespace +Game_Environment_Scare_MirrorJump,Game.Environment.Scare.MirrorJump,Mirror jump scare +Game_Environment_Scare_CeilingDrop,Game.Environment.Scare.CeilingDrop,Body drops from ceiling +Game_Environment_Scare_DoorSlam,Game.Environment.Scare.DoorSlam,Door slams behind player +Game_Environment_Scare_Whisper,Game.Environment.Scare.Whisper,Ghost whisper audio +Game_Environment_Scare_LightFlicker,Game.Environment.Scare.LightFlicker,Lights flicker then blackout +Game_Environment_Light_Flicker,Game.Environment.Light.Flicker,Rapid flicker event +Game_Environment_Light_Strobe,Game.Environment.Light.Strobe,Strobe light event +Game_Environment_Light_Blackout,Game.Environment.Light.Blackout,Complete blackout event +Game_Environment_Light_ColorShift,Game.Environment.Light.ColorShift,Color temperature shift +Game_Environment_Pacing_Calm,Game.Environment.Pacing.Calm,Calm pacing band +Game_Environment_Pacing_Exploration,Game.Environment.Pacing.Exploration,Exploration pacing +Game_Environment_Pacing_Tension,Game.Environment.Pacing.Tension,Tension building +Game_Environment_Pacing_Combat,Game.Environment.Pacing.Combat,Combat encounter +Game_Environment_Pacing_Climax,Game.Environment.Pacing.Climax,Story climax +Game_Environment_Pacing_Resolution,Game.Environment.Pacing.Resolution,Post-climax resolution +Game_Environment_Performance_High,Game.Environment.Performance.High,High quality LOD target +Game_Environment_Performance_Medium,Game.Environment.Performance.Medium,Medium quality +Game_Environment_Performance_Low,Game.Environment.Performance.Low,Low quality LOD target diff --git a/docs/blueprints/01-core/data-tables/DT_Tags_Interaction.csv b/docs/blueprints/01-core/data-tables/DT_Tags_Interaction.csv new file mode 100644 index 0000000..78010c7 --- /dev/null +++ b/docs/blueprints/01-core/data-tables/DT_Tags_Interaction.csv @@ -0,0 +1,37 @@ +Name,Tag,DevComment +Framework_Interaction_Type_Pickup,Framework.Interaction.Type.Pickup,Pick up an item +Framework_Interaction_Type_Door,Framework.Interaction.Type.Door,Open/close a door +Framework_Interaction_Type_Drawer,Framework.Interaction.Type.Drawer,Open/close a drawer +Framework_Interaction_Type_Container,Framework.Interaction.Type.Container,Open/loot a container +Framework_Interaction_Type_Inspect,Framework.Interaction.Type.Inspect,Examine an object in 3D +Framework_Interaction_Type_Climb,Framework.Interaction.Type.Climb,Vault or mantle traversal +Framework_Interaction_Type_Hide,Framework.Interaction.Type.Hide,Enter a hiding spot +Framework_Interaction_Type_Use,Framework.Interaction.Type.Use,Use a world object (lever/button/terminal) +Framework_Interaction_Type_Combine,Framework.Interaction.Type.Combine,Combine two items +Framework_Interaction_Type_Grab,Framework.Interaction.Type.Grab,Grab a physics object +Framework_Interaction_Type_Push,Framework.Interaction.Type.Push,Push a physics object +Framework_Interaction_Type_Talk,Framework.Interaction.Type.Talk,Talk to an NPC +Framework_Interaction_Type_Puzzle,Framework.Interaction.Type.Puzzle,Interact with a puzzle device +Framework_Interaction_Context_Requires_Key,Framework.Interaction.Context.Requires.Key,Interaction requires a specific key item +Framework_Interaction_Context_Requires_Item,Framework.Interaction.Context.Requires.Item,Interaction requires a specific item +Framework_Interaction_Context_Locked,Framework.Interaction.Context.Locked,Interaction is locked +Framework_Interaction_Context_Disabled,Framework.Interaction.Context.Disabled,Interaction is disabled +Framework_Interaction_Context_OneShot,Framework.Interaction.Context.OneShot,Single-use interaction +Framework_Interaction_Context_Cooldown,Framework.Interaction.Context.Cooldown,Interaction on cooldown +Framework_Interaction_Prompt_Press,Framework.Interaction.Prompt.Press,Press-to-interact prompt +Framework_Interaction_Prompt_Hold,Framework.Interaction.Prompt.Hold,Hold-to-interact prompt +Framework_Interaction_Prompt_DoubleTap,Framework.Interaction.Prompt.DoubleTap,Double-tap prompt +Framework_Interaction_HidingSpot_Locker,Framework.Interaction.HidingSpot.Locker,Full enclosure +Framework_Interaction_HidingSpot_BehindCover,Framework.Interaction.HidingSpot.BehindCover,Behind low cover +Framework_Interaction_HidingSpot_Under,Framework.Interaction.HidingSpot.Under,Under furniture +Framework_Interaction_HidingSpot_Shadow,Framework.Interaction.HidingSpot.Shadow,In darkness +Framework_Interaction_HidingSpot_Grass,Framework.Interaction.HidingSpot.Grass,In tall grass +Framework_Interaction_Traversal_Vault,Framework.Interaction.Traversal.Vault,Vault over obstacle +Framework_Interaction_Traversal_Mantle,Framework.Interaction.Traversal.Mantle,Mantle onto ledge +Framework_Interaction_Traversal_Slide,Framework.Interaction.Traversal.Slide,Slide under barrier +Framework_Interaction_Traversal_Squeeze,Framework.Interaction.Traversal.Squeeze,Squeeze through gap +Framework_Interaction_Traversal_LedgeGrab,Framework.Interaction.Traversal.LedgeGrab,Grab ledge +Framework_Interaction_Door_Closed,Framework.Interaction.Door.Closed,Door state closed +Framework_Interaction_Door_Open,Framework.Interaction.Door.Open,Door state open +Framework_Interaction_Door_Locked,Framework.Interaction.Door.Locked,Door locked +Framework_Interaction_Door_Barricaded,Framework.Interaction.Door.Barricaded,Door barricaded diff --git a/docs/blueprints/01-core/data-tables/DT_Tags_Item.csv b/docs/blueprints/01-core/data-tables/DT_Tags_Item.csv new file mode 100644 index 0000000..eaef829 --- /dev/null +++ b/docs/blueprints/01-core/data-tables/DT_Tags_Item.csv @@ -0,0 +1,28 @@ +Name,Tag,DevComment +Framework_Item_Type_Weapon,Framework.Item.Type.Weapon,Firearm or melee weapon +Framework_Item_Type_Consumable,Framework.Item.Type.Consumable,Health pack stim stamina item +Framework_Item_Type_KeyItem,Framework.Item.Type.KeyItem,Story key item +Framework_Item_Type_Document,Framework.Item.Type.Document,Readable document or note +Framework_Item_Type_Collectible,Framework.Item.Type.Collectible,Collectible with set tracking +Framework_Item_Type_Ammo,Framework.Item.Type.Ammo,Ammunition pickup +Framework_Item_Type_Tool,Framework.Item.Type.Tool,Flashlight lockpick etc +Framework_Item_Type_Resource,Framework.Item.Type.Resource,Crafting resource +Framework_Item_Type_Misc,Framework.Item.Type.Misc,Miscellaneous item +Framework_Item_Slot_PrimaryWeapon,Framework.Item.Slot.PrimaryWeapon,Equipped primary weapon slot +Framework_Item_Slot_SecondaryWeapon,Framework.Item.Slot.SecondaryWeapon,Equipped secondary weapon slot +Framework_Item_Slot_Flashlight,Framework.Item.Slot.Flashlight,Equipped flashlight slot +Framework_Item_Slot_Shield,Framework.Item.Slot.Shield,Equipped shield slot +Framework_Item_Slot_Active,Framework.Item.Slot.Active,Active quick-slot item +Framework_Item_Slot_Quick1,Framework.Item.Slot.Quick1,Quick slot 1 +Framework_Item_Slot_Quick2,Framework.Item.Slot.Quick2,Quick slot 2 +Framework_Item_Slot_Quick3,Framework.Item.Slot.Quick3,Quick slot 3 +Framework_Item_Slot_Quick4,Framework.Item.Slot.Quick4,Quick slot 4 +Framework_Item_Rarity_Trash,Framework.Item.Rarity.Trash,Trash tier loot +Framework_Item_Rarity_Common,Framework.Item.Rarity.Common,Common tier loot +Framework_Item_Rarity_Uncommon,Framework.Item.Rarity.Uncommon,Uncommon tier loot +Framework_Item_Rarity_Rare,Framework.Item.Rarity.Rare,Rare tier loot +Framework_Item_Rarity_Legendary,Framework.Item.Rarity.Legendary,Legendary tier loot +Framework_Item_Context_Stackable,Framework.Item.Context.Stackable,Item can stack in inventory +Framework_Item_Context_Unique,Framework.Item.Context.Unique,Only one can exist +Framework_Item_Context_Quest,Framework.Item.Context.Quest,Quest-related item +Framework_Item_Context_Droppable,Framework.Item.Context.Droppable,Can be dropped from inventory diff --git a/docs/blueprints/01-core/data-tables/DT_Tags_Narrative.csv b/docs/blueprints/01-core/data-tables/DT_Tags_Narrative.csv new file mode 100644 index 0000000..830f125 --- /dev/null +++ b/docs/blueprints/01-core/data-tables/DT_Tags_Narrative.csv @@ -0,0 +1,55 @@ +Name,Tag,DevComment +Game_Narrative_Flag,Game.Narrative.Flag,Root narrative flag namespace +Game_Narrative_Phase,Game.Narrative.Phase,Story phase namespace +Game_Narrative_Choice,Game.Narrative.Choice,Dialogue choice consequence tags +Game_Narrative_Ending,Game.Narrative.Ending,Ending evaluation tags +Game_Narrative_Flag_PrologueComplete,Game.Narrative.Flag.PrologueComplete,Prologue chapter completed +Game_Narrative_Flag_Chapter1Complete,Game.Narrative.Flag.Chapter1Complete,Chapter 1 completed +Game_Narrative_Flag_Chapter2Complete,Game.Narrative.Flag.Chapter2Complete,Chapter 2 completed +Game_Narrative_Flag_Chapter3Complete,Game.Narrative.Flag.Chapter3Complete,Chapter 3 completed +Game_Narrative_Flag_Act1Complete,Game.Narrative.Flag.Act1Complete,Act 1 completed +Game_Narrative_Flag_Act2Complete,Game.Narrative.Flag.Act2Complete,Act 2 completed +Game_Narrative_Flag_Act3Complete,Game.Narrative.Flag.Act3Complete,Act 3 completed +Game_Narrative_Flag_FoundKey,Game.Narrative.Flag.FoundKey,Player found the basement key +Game_Narrative_Flag_BasementDoorOpened,Game.Narrative.Flag.BasementDoorOpened,Basement door unlocked +Game_Narrative_Flag_SawMonster,Game.Narrative.Flag.SawMonster,Player first saw the monster +Game_Narrative_Flag_SavedNPC,Game.Narrative.Flag.SavedNPC,Player saved the trapped NPC +Game_Narrative_Phase_Act1,Game.Narrative.Phase.Act1,Story phase: Act 1 +Game_Narrative_Phase_Act2,Game.Narrative.Phase.Act2,Story phase: Act 2 +Game_Narrative_Phase_Act3,Game.Narrative.Phase.Act3,Story phase: Act 3 +Game_Narrative_Phase_Prologue,Game.Narrative.Phase.Prologue,Story phase: Prologue +Game_Narrative_Phase_Epilogue,Game.Narrative.Phase.Epilogue,Story phase: Epilogue +Game_Narrative_Phase_Chapter1,Game.Narrative.Phase.Chapter1,Chapter 1: The Awakening +Game_Narrative_Phase_Chapter2,Game.Narrative.Phase.Chapter2,Chapter 2: Into Darkness +Game_Narrative_Phase_Chapter3,Game.Narrative.Phase.Chapter3,Chapter 3: The Truth +Game_Narrative_Phase_Chapter4,Game.Narrative.Phase.Chapter4,Chapter 4: Confrontation +Game_Narrative_Choice_SparedEnemy,Game.Narrative.Choice.SparedEnemy,Player chose to spare +Game_Narrative_Choice_KilledEnemy,Game.Narrative.Choice.KilledEnemy,Player chose to kill +Game_Narrative_Choice_AcceptedDeal,Game.Narrative.Choice.AcceptedDeal,Player accepted the deal +Game_Narrative_Choice_RejectedDeal,Game.Narrative.Choice.RejectedDeal,Player rejected the deal +Game_Narrative_Choice_RevealedSecret,Game.Narrative.Choice.RevealedSecret,Player revealed the secret +Game_Narrative_Choice_KeptSilent,Game.Narrative.Choice.KeptSilent,Player stayed silent +Game_Narrative_Ending_Good,Game.Narrative.Ending.Good,Good ending path +Game_Narrative_Ending_Bad,Game.Narrative.Ending.Bad,Bad ending path +Game_Narrative_Ending_True,Game.Narrative.Ending.True,True/secret ending path +Game_Narrative_Ending_Sacrifice,Game.Narrative.Ending.Sacrifice,Sacrifice ending path +Game_Narrative_Ending_Escape,Game.Narrative.Ending.Escape,Escape ending path +Game_Narrative_Trial_HospitalEscape,Game.Narrative.Trial.HospitalEscape,Trial: escape the hospital +Game_Narrative_Trial_StealthBasement,Game.Narrative.Trial.StealthBasement,Trial: stealth through basement +Game_Narrative_Trial_SurviveSiege,Game.Narrative.Trial.SurviveSiege,Trial: survive the creature siege +Game_Narrative_Trial_Timebomb,Game.Narrative.Trial.Timebomb,Trial: defuse before timer expires +Game_Narrative_Cutscene_Intro,Game.Narrative.Cutscene.Intro,Intro cutscene +Game_Narrative_Cutscene_Act1End,Game.Narrative.Cutscene.Act1End,Act 1 ending cutscene +Game_Narrative_Cutscene_Act2End,Game.Narrative.Cutscene.Act2End,Act 2 ending cutscene +Game_Narrative_Cutscene_Finale,Game.Narrative.Cutscene.Finale,Final confrontation cutscene +Game_Narrative_Lore_Journal1,Game.Narrative.Lore.Journal1,Lore entry: Dr. Voss Journal 1 +Game_Narrative_Lore_Newspaper,Game.Narrative.Lore.Newspaper,Lore entry: Abandoned Newspaper +Game_Narrative_Lore_AudioLog,Game.Narrative.Lore.AudioLog,Lore entry: Audio Log +Framework_Objective_Status_Active,Framework.Objective.Status.Active,Objective currently active +Framework_Objective_Status_Complete,Framework.Objective.Status.Complete,Objective completed +Framework_Objective_Status_Failed,Framework.Objective.Status.Failed,Objective failed +Framework_Objective_Status_Hidden,Framework.Objective.Status.Hidden,Objective hidden until discovered +Framework_Objective_Category_Main,Framework.Objective.Category.Main,Main quest objective +Framework_Objective_Category_Side,Framework.Objective.Category.Side,Optional side objective +Framework_Objective_Category_Hidden,Framework.Objective.Category.Hidden,Secret objective +Framework_Objective_Category_Tutorial,Framework.Objective.Category.Tutorial,Tutorial objective diff --git a/docs/blueprints/01-core/data-tables/DT_Tags_Player.csv b/docs/blueprints/01-core/data-tables/DT_Tags_Player.csv new file mode 100644 index 0000000..a9d4876 --- /dev/null +++ b/docs/blueprints/01-core/data-tables/DT_Tags_Player.csv @@ -0,0 +1,35 @@ +Name,Tag,DevComment +Framework_Player_State_Alive,Framework.Player.State.Alive,Player is alive and active +Framework_Player_State_Dead,Framework.Player.State.Dead,Player health reached zero +Framework_Player_State_Dying,Framework.Player.State.Dying,Player in downed-but-not-dead state +Framework_Player_State_Hidden,Framework.Player.State.Hidden,Player inside a hiding spot +Framework_Player_State_Interacting,Framework.Player.State.Interacting,Player using an object or UI +Framework_Player_Stress_Low,Framework.Player.Stress.Low,Calm or slightly uneasy +Framework_Player_Stress_Mid,Framework.Player.Stress.Mid,Distressed +Framework_Player_Stress_High,Framework.Player.Stress.High,Panicked +Framework_Player_Stress_Critical,Framework.Player.Stress.Critical,Terrified or catatonic +Framework_Player_Posture_Standing,Framework.Player.Posture.Standing,Default upright posture +Framework_Player_Posture_Crouching,Framework.Player.Posture.Crouching,Crouch-walking or stealth +Framework_Player_Posture_Prone,Framework.Player.Posture.Prone,Lying flat +Framework_Player_Posture_Vaulting,Framework.Player.Posture.Vaulting,Climbing or vaulting obstacle +Framework_Player_Movement_Idle,Framework.Player.Movement.Idle,Not moving +Framework_Player_Movement_Walking,Framework.Player.Movement.Walking,Slow movement +Framework_Player_Movement_Jogging,Framework.Player.Movement.Jogging,Normal movement +Framework_Player_Movement_Sprinting,Framework.Player.Movement.Sprinting,Fast movement with stamina drain +Framework_Player_Movement_Sneaking,Framework.Player.Movement.Sneaking,Quiet crouched movement +Framework_Player_Camera_Default,Framework.Player.Camera.Default,Normal camera +Framework_Player_Camera_Aiming,Framework.Player.Camera.Aiming,ADS zoomed camera +Framework_Player_Camera_Peeking,Framework.Player.Camera.Peeking,Camera offset for hiding peek +Framework_Player_Camera_Injured,Framework.Player.Camera.Injured,Low-health camera effects +Framework_Player_Body_FullBody,Framework.Player.Body.FullBody,Third-person or mirror mode +Framework_Player_Body_ArmsOnly,Framework.Player.Body.ArmsOnly,Default first-person +Framework_Player_Body_ArmsAndShadow,Framework.Player.Body.ArmsAndShadow,Arms plus shadow casting +Framework_Player_Body_Hidden,Framework.Player.Body.Hidden,No body visible (cutscenes/UI) +Framework_Player_Overlay_Clean,Framework.Player.Overlay.Clean,No body overlay +Framework_Player_Overlay_Blood,Framework.Player.Overlay.Blood,Blood splatter on body +Framework_Player_Overlay_Water,Framework.Player.Overlay.Water,Water droplets on body +Framework_Player_Overlay_Mud,Framework.Player.Overlay.Mud,Mud/dirt on body +Framework_Player_Vitals_Stamina_Normal,Framework.Player.Vitals.Stamina.Normal,Full stamina +Framework_Player_Vitals_Stamina_Low,Framework.Player.Vitals.Stamina.Low,Below low threshold +Framework_Player_Vitals_Stamina_Exhausted,Framework.Player.Vitals.Stamina.Exhausted,Below exhausted threshold +Framework_Player_Vitals_Health_Critical,Framework.Player.Vitals.Health.Critical,Below critical health threshold diff --git a/docs/blueprints/01-core/data-tables/DT_Tags_Save.csv b/docs/blueprints/01-core/data-tables/DT_Tags_Save.csv new file mode 100644 index 0000000..c3cefdd --- /dev/null +++ b/docs/blueprints/01-core/data-tables/DT_Tags_Save.csv @@ -0,0 +1,25 @@ +Name,Tag,DevComment +Framework_Save_Type_Checkpoint,Framework.Save.Type.Checkpoint,Checkpoint auto-save +Framework_Save_Type_HardSave,Framework.Save.Type.HardSave,Manual save slot +Framework_Save_Type_AutoSave,Framework.Save.Type.AutoSave,Periodic auto-save +Framework_Save_Type_ChapterTransition,Framework.Save.Type.ChapterTransition,Save on chapter load +Framework_Save_Slot_1,Framework.Save.Slot.1,Save slot 1 +Framework_Save_Slot_2,Framework.Save.Slot.2,Save slot 2 +Framework_Save_Slot_3,Framework.Save.Slot.3,Save slot 3 +Framework_Save_Slot_Auto,Framework.Save.Slot.Auto,Autosave slot +Framework_Save_Context_NewGame,Framework.Save.Context.NewGame,First save of new game +Framework_Save_Context_Continue,Framework.Save.Context.Continue,Load existing save +Framework_Save_Context_Delete,Framework.Save.Context.Delete,Delete save slot +Framework_Save_Context_Corrupted,Framework.Save.Context.Corrupted,Save file corrupted +Framework_DeathSpace_Active,Framework.DeathSpace.Active,Player in alternate death space +Framework_DeathSpace_Entered,Framework.DeathSpace.Entered,Player entered death space +Framework_DeathSpace_Exited,Framework.DeathSpace.Exited,Player exited death space +Framework_DeathSpace_FoundExit,Framework.DeathSpace.FoundExit,Player found the exit +Framework_Checkpoint_Active,Framework.Checkpoint.Active,Current active checkpoint +Framework_Checkpoint_Previous,Framework.Checkpoint.Previous,Previous checkpoint +Framework_Checkpoint_Reached,Framework.Checkpoint.Reached,A checkpoint was triggered +Framework_Respawn_Point,Framework.Respawn.Point,Default respawn location +Framework_Respawn_Start,Framework.Respawn.Start,Respawn sequence started +Framework_Respawn_Complete,Framework.Respawn.Complete,Respawn sequence completed +Framework_RunHistory_Death,Framework.RunHistory.Death,Death recorded in run history +Framework_RunHistory_Chapter,Framework.RunHistory.Chapter,Chapter completed in run history diff --git a/docs/blueprints/01-core/data-tables/DT_Tags_State.csv b/docs/blueprints/01-core/data-tables/DT_Tags_State.csv new file mode 100644 index 0000000..eed14dd --- /dev/null +++ b/docs/blueprints/01-core/data-tables/DT_Tags_State.csv @@ -0,0 +1,43 @@ +Name,Tag,DevComment +Framework_State_Action_Fire,Framework.State.Action.Fire,Firing a weapon +Framework_State_Action_Reload,Framework.State.Action.Reload,Reloading a weapon +Framework_State_Action_Melee,Framework.State.Action.Melee,Melee attack +Framework_State_Action_UseItem,Framework.State.Action.UseItem,Using an item +Framework_State_Action_Interact,Framework.State.Action.Interact,Interacting with world object +Framework_State_Action_OpenMenu,Framework.State.Action.OpenMenu,Opening a menu +Framework_State_Action_Hide,Framework.State.Action.Hide,Entering/occupying hiding spot +Framework_State_Action_Peek,Framework.State.Action.Peek,Peeking from hiding +Framework_State_Action_Sprint,Framework.State.Action.Sprint,Sprinting +Framework_State_Action_Jump,Framework.State.Action.Jump,Jumping +Framework_State_Action_Dodge,Framework.State.Action.Dodge,Dodging/evading +Framework_State_Action_Climb,Framework.State.Action.Climb,Climbing/vaulting +Framework_State_Action_Slide,Framework.State.Action.Slide,Sliding +Framework_State_Action_Squeeze,Framework.State.Action.Squeeze,Squeezing through gap +Framework_State_Action_Grab,Framework.State.Action.Grab,Grabbing a physics object +Framework_State_Action_Throw,Framework.State.Action.Throw,Throwing a held object +Framework_State_Action_Aim,Framework.State.Action.Aim,Aiming down sights +Framework_State_Action_Equip,Framework.State.Action.Equip,Equipping a weapon/item +Framework_State_Action_Holster,Framework.State.Action.Holster,Holstering a weapon +Framework_State_Action_Consume,Framework.State.Action.Consume,Consuming a consumable +Framework_State_Action_Inspect,Framework.State.Action.Inspect,Inspecting an object +Framework_State_Action_ReadDocument,Framework.State.Action.ReadDocument,Reading a document +Framework_State_Action_Dialogue,Framework.State.Action.Dialogue,In dialogue +Framework_State_Action_Choosing,Framework.State.Action.Choosing,Making a dialogue choice +Framework_State_Action_Cutscene,Framework.State.Action.Cutscene,In a cutscene +Framework_State_Overlay_Menu,Framework.State.Overlay.Menu,Menu overlay active +Framework_State_Overlay_Inventory,Framework.State.Overlay.Inventory,Inventory screen open +Framework_State_Overlay_Journal,Framework.State.Overlay.Journal,Journal screen open +Framework_State_Overlay_Map,Framework.State.Overlay.Map,Map screen open +Framework_State_Overlay_Settings,Framework.State.Overlay.Settings,Settings screen open +Framework_State_Overlay_Dialogue,Framework.State.Overlay.Dialogue,Dialogue overlay active +Framework_State_Overlay_Death,Framework.State.Overlay.Death,Death overlay active +Framework_State_Overlay_Loading,Framework.State.Overlay.Loading,Loading screen active +Framework_State_Vital_Health,Framework.State.Vital.Health,Health vital signal +Framework_State_Vital_Stamina,Framework.State.Vital.Stamina,Stamina vital signal +Framework_State_Vital_Stress,Framework.State.Vital.Stress,Stress vital signal +Framework_State_Vital_Fear,Framework.State.Vital.Fear,Fear vital signal +Framework_State_Gating_BlockSprint,Framework.State.Gating.BlockSprint,Gate: sprint blocked +Framework_State_Gating_BlockJump,Framework.State.Gating.BlockJump,Gate: jump blocked +Framework_State_Gating_BlockInteract,Framework.State.Gating.BlockInteract,Gate: interaction blocked +Framework_State_Gating_BlockFire,Framework.State.Gating.BlockFire,Gate: fire blocked +Framework_State_Gating_BlockReload,Framework.State.Gating.BlockReload,Gate: reload blocked diff --git a/docs/blueprints/INDEX.md b/docs/blueprints/INDEX.md index cbea798..c88c526 100644 --- a/docs/blueprints/INDEX.md +++ b/docs/blueprints/INDEX.md @@ -11,10 +11,23 @@ This document is the canonical index of every Blueprint specification file in th ``` docs/blueprints/ ├── INDEX.md ← THIS FILE -├── TEMPLATE.md ← Spec template +├── TEMPLATE.md ← Spec template v2.0 ├── AUDIT_REPORT.md ← Clean slate audit │ -├── 01-core/ ← Foundation (7 files) +├── 01-core/ ← Foundation (7 files + 11 Data Table CSVs) +│ ├── data-tables/ ← Per-category Gameplay Tag Data Tables (NEW — replaces DT_ProjectTags.csv) +│ │ ├── DT_Tags_Player.csv (34 tags) +│ │ ├── DT_Tags_Interaction.csv (36 tags) +│ │ ├── DT_Tags_Item.csv (26 tags) +│ │ ├── DT_Tags_Narrative.csv (48 tags) +│ │ ├── DT_Tags_AI.csv (23 tags) +│ │ ├── DT_Tags_Save.csv (22 tags) +│ │ ├── DT_Tags_Environment.csv (30 tags) +│ │ ├── DT_Tags_Combat.csv (26 tags) +│ │ ├── DT_Tags_State.csv (39 tags) +│ │ ├── DT_Tags_Audio.csv (30 tags) +│ │ └── DT_Tags_Achievement.csv (20 tags) +│ └── DT_ProjectTags.csv [DEPRECATED — migration reference only] ├── 02-player/ ← Player State & Embodiment (8 files) ├── 03-interaction/ ← Interaction & World Manipulation (8 files) ├── 04-inventory/ ← Inventory, Items & Collectibles (11 files) @@ -30,22 +43,6 @@ docs/blueprints/ ├── 14-data-assets/ ← Data Asset definitions (16 files) ├── 15-input/ ← Enhanced Input System (1 file) └── 16-state/ ← State Management (2 files) - -docs/developer/ ← Developer Reference Docs -├── INDEX.md ← Developer docs master index -├── architecture-overview.md ← Framework-wide architecture -├── implementation-patterns.md ← Common Blueprint patterns -├── 01-core-foundation.md ← Foundation systems explained -├── 02-player-systems.md ← Player systems explained -├── 03-interaction-systems.md ← Interaction systems explained -├── 04-inventory-systems.md ← Inventory systems explained -├── 05-saveload-systems.md ← Save/load systems explained -├── 06-ui-systems.md ← UI systems explained -├── 07-narrative-systems.md ← Narrative systems explained -├── 08-weapons-systems.md ← Weapons systems explained -├── 09-ai-systems.md ← AI systems explained -├── 10-adaptive-systems.md ← Adaptive systems explained -└── 11-16-systems.md ← Meta, Settings, Polish, Data, Input, State ``` --- diff --git a/docs/developer/01-core-foundation.md b/docs/developer/01-core-foundation.md index 5dbc69a..ae0c022 100644 --- a/docs/developer/01-core-foundation.md +++ b/docs/developer/01-core-foundation.md @@ -392,6 +392,8 @@ MainMenu → Loading → InGame ⇄ Paused ### Key Patterns - **GS_CoreGameState as Replication Hub:** All shared session state (chapter, phase, objectives, encounter status) writes through GS_CoreGameState which auto-replicates to all clients via OnRep → dispatcher. +- **Tag-Driven Everything:** No booleans, no strings. All state is GameplayTags compared via `HasTag()`/`MatchesTag()`. Tags are split across **11 per-category Data Tables** (`DT_Tags_Player`, `DT_Tags_Interaction`, etc.) registered in Project Settings → Gameplay Tags. +- **DA_GameTagRegistry** uses an `Array` to iterate all tables for validation and enumeration. The engine's `UGameplayTagsManager` merges them automatically at runtime. - **GamePhase transitions are server-authoritative:** `SetGamePhase()` checks `HasAuthority()`. Clients receive phase changes via `OnRep_GamePhase` → `OnGamePhaseChanged` dispatcher. - **Interface calls route through server:** `I_Interactable.Execute_OnInteract` must be called server-side. Clients call `Server_Interact` RPC → server validates → calls interface. - **Data Assets are client-ready:** All `DA_*` assets load identically on all instances from disk. No replication needed.