Establish UE 5.8 known-good baseline with Batch 1 archaeology docs.

Initialize Git with LFS for binary assets and add standard Unreal Engine .gitignore/.gitattributes.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-16 19:40:19 -07:00
co-authored by Cursor
commit ff5640a020
17216 changed files with 62362 additions and 0 deletions
@@ -0,0 +1,322 @@
# 03 — Class Hierarchy
**Status: Draft**
- **Scope:** Native C++ class hierarchy under `Source/REALMSINRUIN/`, including parents, components, properties, replication, RPCs, GAS hooks, Blueprint extension points, and discovered Blueprint subclass paths (seeds only).
- **Inspection method:** Full read of every `.h`/`.cpp` under `Source/REALMSINRUIN/`; MCP `ObjectTools.search_subclasses` for child discovery (paths only — no Blueprint graph inspection).
- **Evidence classifications used:** Observed Implementation, Documented Intent, Inferred, Unknown.
- **Tool or visibility limitations:** Batch 1 forbids deep Blueprint graph analysis. Inherited Blueprint variables not inspected. No native RPCs found to verify runtime.
- **Last updated:** 2026-07-16
- **Current phase:** Phase 1 — Static Architecture
- **Last completed pass:** Pass 2 (Batch 1)
- **Next pass expected to contribute:** Batch 2 Passes 3 + 5 (Blueprint hierarchy and BP_PlayerCharacterBase)
## Draft tracking
### Completed sections
- Full native class inventory for characters, player framework, GAS, UI, interfaces
- ASC ownership split (player vs enemy)
- AttributeSet replication and constructor defaults
- EffectActor GE application path
- HUD / OverlayWidgetController attribute delegate wiring
- Blueprint subclass path seeds
### Pending sections
- Blueprint parent chains, variables, graphs, interfaces on children
- GameMode / GameInstance Blueprint internals
- Whether DefaultAttributesGameplayEffect is assigned on BP_PlayerState
### Evidence still required
- Connected ability/RPC graphs on BP_PlayerCharacterBase and Player_* classes
- Whether enemy BP overrides GetAbilitySystemComponent behavior (native override is PlayerState-based)
### Unknowns requiring later verification
- Runtime behavior of `IAbilitySystemInterface` on enemies given base `GetAbilitySystemComponent` implementation
- Application of `DefaultAttributesGameplayEffect` (declared, never called in native)
---
## Hierarchy overview
```mermaid
flowchart TD
ACharacter[ACharacter] --> ARIRBaseCharacter
IASI[IAbilitySystemInterface] --> ARIRBaseCharacter
ARIRBaseCharacter --> ARIRPlayerCharacter
ARIRBaseCharacter --> ARIRBaseEnemyCharacter
ITarget[ITargetInterface] --> ARIRBaseEnemyCharacter
APlayerState --> ARIRPlayerState
IASI --> ARIRPlayerState
APlayerController --> ARIRPlayerController
AHUD --> ARIRHUD
UAbilitySystemComponent --> URIRAbilitySystemComponent
UAttributeSet --> URIRAttributeSet
UGameplayAbility --> URIRGameplayAbility
AActor --> ARIREffectActor
UUserWidget --> URIRUserWidget
UObject --> URIRWidgetController
URIRWidgetController --> UOverlayWidgetController
```
**Observed Implementation:** No native `AGameMode`, `UGameInstance`, or `AGameState` subclasses in the module.
---
## 1. Characters
### 1.1 `ARIRBaseCharacter` (ABSTRACT)
| | |
|--|--|
| Header | [`Public/Characters/RIRBaseCharacter.h`](Source/REALMSINRUIN/Public/Characters/RIRBaseCharacter.h) |
| Impl | [`Private/Characters/RIRBaseCharacter.cpp`](Source/REALMSINRUIN/Private/Characters/RIRBaseCharacter.cpp) |
| Parent | `ACharacter` |
| Interfaces | `IAbilitySystemInterface` |
**Properties (Observed Implementation):**
- `TObjectPtr<UAbilitySystemComponent> AbilitySystemComponent` — VisibleAnywhere, BlueprintReadOnly, Category Abilities
- `TObjectPtr<UAttributeSet> AttributeSet` — same
**Functions:**
- `GetAbilitySystemComponent()` override — **returns `GetPlayerState<ARIRPlayerState>()->GetAbilitySystemComponent()`**, else nullptr. Does **not** return the local `AbilitySystemComponent` member.
- `GetAttributeSet()` — returns local `AttributeSet` member
- Constructor empty; `BeginPlay` comment: "GAS Initialization moved to PossessedBy / OnRep_PlayerState"
**Documented Intent:** Comment on class: "Base Character class using GAS for RIR Project."
**Contradiction (Observed Implementation vs Documented Intent):** Header comment claims GAS-based character; `GetAbilitySystemComponent` assumes a player PlayerState. Enemies inherit this override but own ASC on the character — see §1.3 and §Contradictions.
**RPCs / replication:** None declared on this class.
**Blueprint children (seed):** See §1.2 / calibration — via `ARIRPlayerCharacter` and `ARIRBaseEnemyCharacter` lineages.
---
### 1.2 `ARIRPlayerCharacter`
| | |
|--|--|
| Header | [`Public/Player/RIRPlayerCharacter.h`](Source/REALMSINRUIN/Public/Player/RIRPlayerCharacter.h) |
| Impl | [`Private/Player/RIRPlayerCharacter.cpp`](Source/REALMSINRUIN/Private/Player/RIRPlayerCharacter.cpp) |
| Parent | `ARIRBaseCharacter` |
**Observed Implementation:**
- Constructor comment: "Removed GAS component creation — now handled by PlayerState"
- `PossessedBy``InitAbilityActorInfo()` (server)
- `OnRep_PlayerState``InitAbilityActorInfo()` (client)
- `InitAbilityActorInfo()`:
1. `check(GetPlayerState<ARIRPlayerState>())`
2. `ASC->InitAbilityActorInfo(PlayerState, this)` — Owner = PlayerState, Avatar = Character
3. Copies ASC and AttributeSet pointers from PlayerState onto character members
4. If controller is `ARIRPlayerController` and HUD is `ARIRHUD`, calls `RIRHUD->InitOverlay(...)`
**No RPCs. No ability granting. No DefaultAttributes application.**
**Known Blueprint subclasses (seed — Observed Implementation via search_subclasses):**
- `/Game/_Main/Blueprints/Characters/PlayerCharacters/BP_PlayerCharacterBase`
- `/Game/_Main/Blueprints/Characters/PlayerCharacters/PlayerCharacterClasses/Amazonian/Player_Amazonian`
- `.../Cleric/Player_Cleric`
- `.../Paladin/Player_Paladin`
- `.../Wizard/Player_Wizard`
- `.../Gunslinger/Player_Gunslinger`
---
### 1.3 `ARIRBaseEnemyCharacter`
| | |
|--|--|
| Header | [`Public/Characters/RIRBaseEnemyCharacter.h`](Source/REALMSINRUIN/Public/Characters/RIRBaseEnemyCharacter.h) |
| Impl | [`Private/Characters/RIRBaseEnemyCharacter.cpp`](Source/REALMSINRUIN/Private/Characters/RIRBaseEnemyCharacter.cpp) |
| Parent | `ARIRBaseCharacter` |
| Interfaces | `ITargetInterface` |
**Observed Implementation — constructor:**
- Mesh Visibility channel → Block
- Creates `URIRAbilitySystemComponent` on self; `SetIsReplicated(true)`; `SetReplicationMode(Minimal)`
- Creates `URIRAttributeSet` on self
**BeginPlay:** `AbilitySystemComponent->InitAbilityActorInfo(this, this)` — Owner and Avatar both the enemy.
**ITargetInterface:** `HighlightActor` / `UnHighlightActor` toggle custom depth stencil `CUSTOM_DEPTH_RED` (250).
**No AI movement, targeting, attack, Behavior Tree, or Perception code in native.**
**Known Blueprint subclasses (seed):**
- `/Game/_Main/Blueprints/Characters/Enemies/BP_EnemyCharacterBase`
- `/Game/_Main/Blueprints/Characters/Enemies/Skeleton/BP_Enemy_Skeleton`
**Issue classification:** Incomplete Refactor / Partially Implemented (ASC on enemy vs base GetASC from PlayerState). **Requires Runtime Inspection** for GE application to enemies via `UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent`.
---
## 2. Player framework
### 2.1 `ARIRPlayerState`
| | |
|--|--|
| Header | [`Public/Player/RIRPlayerState.h`](Source/REALMSINRUIN/Public/Player/RIRPlayerState.h) |
| Impl | [`Private/Player/RIRPlayerState.cpp`](Source/REALMSINRUIN/Private/Player/RIRPlayerState.cpp) |
| Parent | `APlayerState` |
| Interfaces | `IAbilitySystemInterface` |
**Observed Implementation:**
- Owns `URIRAbilitySystemComponent` — replicated, `EGameplayEffectReplicationMode::Mixed`
- Owns `URIRAttributeSet`
- `NetUpdateFrequency = 100.f`
- `TSubclassOf<UGameplayEffect> DefaultAttributesGameplayEffect` (EditDefaultsOnly) — **never referenced in .cpp**
**Blueprint subclass seed:** `/Game/_Main/Blueprints/Player/BP_PlayerState`
**Issue:** Partially Implemented — default attributes GE property without native apply path.
---
### 2.2 `ARIRPlayerController`
| | |
|--|--|
| Header | [`Public/Player/RIRPlayerController.h`](Source/REALMSINRUIN/Public/Player/RIRPlayerController.h) |
| Impl | [`Private/Player/RIRPlayerController.cpp`](Source/REALMSINRUIN/Private/Player/RIRPlayerController.cpp) |
| Parent | `APlayerController` |
**Observed Implementation:**
- `bReplicates = true`
- Enhanced Input: `PlayerMappingContext`, `MovementInput` (EditAnywhere — must be assigned in editor/BP)
- `BeginPlay`: `check(PlayerMappingContext)`; add IMC; show mouse; GameAndUI input mode
- `SetupInputComponent`: bind MovementInput → `HandleMovementInput`
- `PlayerTick``CursorTrace` for `ITargetInterface` highlight
- `BindCallbacksToDependencies()` empty stub
- TODO comment: controller-compatible cursor / Gauntlet-style targeting
**No ability input bindings in native. No RPCs.**
**Blueprint subclass seed:** `/Game/_Main/Blueprints/Player/PC_Character`
---
### 2.3 `ARIRHUD`
| | |
|--|--|
| Header | [`Public/UI/HUD/RIRHUD.h`](Source/REALMSINRUIN/Public/UI/HUD/RIRHUD.h) |
| Impl | [`Private/UI/HUD/RIRHUD.cpp`](Source/REALMSINRUIN/Private/UI/HUD/RIRHUD.cpp) |
| Parent | `AHUD` |
**Observed Implementation:**
- `OverlayWidgetClass`, `OverlayWidgetControllerClass` (EditAnywhere — editor/BP assigned)
- `InitOverlay`: checkf messages reference filling `WBP_PlayerHUD`; creates widget; builds `FWidgetControllerParams`; `BroadcastInitialInitialValues`; `AddToViewport`
- `GetOverlayWidgetController`: creates controller, `SetWidgetControllerParams`, `BindCallbacksToDependencies`
**Subclass search seed:** returned `/Game/_Main/UI/Widgets/HUD/WBP_PlayerHUD`**Requires Manual Editor Inspection** to confirm whether this asset is a HUD Blueprint or mis-tagged; name suggests Widget Blueprint.
---
## 3. GAS scaffolding
### 3.1 `URIRAbilitySystemComponent`
Thin subclass of `UAbilitySystemComponent`. Empty constructor. No custom granting, input binding, or tag logic.
Header: [`Public/Abilities/RIRAbilitySystemComponent.h`](Source/REALMSINRUIN/Public/Abilities/RIRAbilitySystemComponent.h)
### 3.2 `URIRAttributeSet`
| Attributes | Replication |
|------------|-------------|
| Health, MaxHealth, Mana, MaxMana, Stamina, MaxStamina | `DOREPLIFETIME_CONDITION_NOTIFY` + OnRep_* → `GAMEPLAYATTRIBUTE_REPNOTIFY` |
Constructor inits: Health=75, MaxHealth=100, Mana=25, MaxMana=50. **Does not call InitStamina / InitMaxStamina** (remain default 0.f unless set by GE).
No `PostGameplayEffectExecute` / clamping logic in .cpp.
### 3.3 `URIRGameplayAbility`
**Documented Intent:** "Base class for all Gameplay Abilities in RIR Project"
**Observed Implementation:** Sets `InstancingPolicy = InstancedPerActor` only. No ActivateAbility, tags, costs, or cooldowns.
**search_subclasses:** **only** `/Script/REALMSINRUIN.RIRGameplayAbility`**no derived project ability classes**.
**Classification:** GAS infrastructure only / Partially Implemented. Do **not** conclude abilities migrated to GAS.
### 3.4 `ARIREffectActor`
- Root: `USceneComponent`
- `ApplyEffectToTarget` (BlueprintCallable): gets ASC via `UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent`; MakeOutgoingSpec level 1; ApplyGameplayEffectSpecToSelf
- Properties: `InstantGameplayEffectClass`, `DurationGameplayEffectClass` (not auto-applied in native BeginPlay)
**Blueprint subclass seeds:**
- `/Game/_Main/Blueprints/Items/Food/BP_OrangeSlice`
- `/Game/_Main/Blueprints/Items/Potion/BP_HealthPotion`
- `/Game/_Main/Blueprints/Items/Potion/BP_ManaPotion`
- `/Game/_Main/Blueprints/Items/Potion/BP_ManaCrystal`
---
## 4. UI
### 4.1 `URIRUserWidget`
- `SetWidgetController` BlueprintCallable → fires `WidgetControllerSet` BlueprintImplementableEvent
**Subclasses seed:** `WBP_ProgressBarBase`, `WBP_ManaProgressBar`, `WBP_HealthProgressBar`, `WBP_Overlay`
### 4.2 `URIRWidgetController` / `FWidgetControllerParams`
Holds PC, PS, ASC, AS. Base `BroadcastInitialInitialValues` / `BindCallbacksToDependencies` empty.
### 4.3 `UOverlayWidgetController`
**Observed Implementation:** Broadcasts and binds Health/MaxHealth/Mana/MaxMana/Stamina/MaxStamina via ASC attribute change delegates.
**Observed Implementation quirk:** `OnStaminaChanged` typed as `FOnManaChangedSignature`; `OnMaxStaminaChanged` typed as `FOnMaxManaChangedSignature` — likely copy-paste. **Technical Debt** (delegate type names wrong; broadcast still float).
**Subclass seed:** `/Game/_Main/UI/Widgets/WidgetController/BP_OverlayWidgetController`
---
## 5. Interfaces
### `ITargetInterface`
Pure virtual `HighlightActor` / `UnHighlightActor`. Implemented by `ARIRBaseEnemyCharacter`. Used by `ARIRPlayerController::CursorTrace`.
---
## 6. Framework Blueprints discovered (seeds — no native parents in module)
| Class | Path |
|-------|------|
| GameInstance | `/Game/_Main/Blueprints/Game/GameInstance/GI_Dungeoneer` |
| GameMode | `/Game/_Main/Blueprints/Game/GameMode/GM_Dungeoneer` |
| GameMode | `/Game/_Main/Blueprints/Game/GameMode/GM_MainMenu` |
---
## 7. Native RPCs
**Observed Implementation:** Grep of `Source/REALMSINRUIN` found **no** `Server_`, `Client_`, or `Multicast_` UFUNCTIONs. Ability networking, if present, is Blueprint-only (Batch 2/3).
---
## Contradictions
| Topic | Evidence A | Evidence B | Better supported |
|-------|------------|------------|------------------|
| Enemy ASC access | Enemy creates ASC on self; InitAbilityActorInfo(this,this) | Base `GetAbilitySystemComponent` reads PlayerState only | Both Observed Implementation; interface path likely broken for enemies |
| Default attributes | `DefaultAttributesGameplayEffect` on PlayerState; GE assets exist (calibration) | Never applied in native .cpp | Property is scaffolding; apply path Unknown (Blueprint?) |
| Gameplay Abilities | `URIRGameplayAbility` + Documented Intent "all abilities" | No subclasses; calibration found no GA assets | Infrastructure only — abilities not GAS-converted |
Log also in `15-HandoffStatus.md`.