Files
realms-in-ruin-dev/Documentation/Archaeology/03-ClassHierarchy.md
T
tedwardsandCursor 0d045d142f Document Batch 2–3 Phase 1 archaeology: shared player-base architecture and per-character ability inventories.
Captures Blueprint hierarchy, legacy ability/RPC paths, animation dependency seeds, and handoff state without modifying Unreal assets.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-16 20:29:10 -07:00

214 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 03 — Class Hierarchy
**Status: Draft**
- **Scope:** Native C++ hierarchy under `Source/REALMSINRUIN/` plus Blueprint parent chains, interfaces, and framework Blueprints inspected in Batch 2 Pass 3.
- **Inspection method:** Batch 1 native reads; Batch 2 read-only AssetTools tags/deps + BlueprintTools graphs/events/variables; ObjectTools CDO properties.
- **Evidence classifications used:** Observed Implementation, Documented Intent, Inferred, Unknown.
- **Tool or visibility limitations:** Inherited Blueprint variables require querying each parent; CustomEvent FunctionFlags not exposed via ObjectTools; Gunslinger FiB/IsDataOnly anomaly.
- **Last updated:** 2026-07-16
- **Current phase:** Phase 1 — Static Architecture
- **Last completed pass:** Pass 5 (Batch 2)
- **Next pass expected to contribute:** Batch 3 Pass 6 (per-character ability graphs)
## Draft tracking
### Completed sections
- Full native class inventory (Batch 1)
- Blueprint parent chains for players, enemies, PC/PS, GI/GM
- Interface inventory under `/Game/_Main/Blueprints/Interfaces`
- WBP_PlayerHUD asset-class resolution (AHUD, not UserWidget)
- BP_PlayerState DefaultAttributesGameplayEffect = None
### Pending sections
- Deep child ability graphs (Pass 6)
- Enemy AI graph deep dive (Pass 9)
- Frontend/session graphs (Pass 4)
### Evidence still required
- Exact CustomEvent reliable flags
- Who invokes `PlayerDeath` from damage
- CommonUI content usage
---
## Hierarchy overview
```mermaid
flowchart TD
ACharacter[ACharacter] --> ARIRBaseCharacter
IASI[IAbilitySystemInterface] --> ARIRBaseCharacter
ARIRBaseCharacter --> ARIRPlayerCharacter
ARIRBaseCharacter --> ARIRBaseEnemyCharacter
ITarget[ITargetInterface] --> ARIRBaseEnemyCharacter
ARIRPlayerCharacter --> BP_PlayerCharacterBase
BP_PlayerCharacterBase --> Player_Paladin
BP_PlayerCharacterBase --> Player_Amazonian
BP_PlayerCharacterBase --> Player_Cleric
BP_PlayerCharacterBase --> Player_Wizard
BP_PlayerCharacterBase --> Player_Gunslinger
ARIRBaseEnemyCharacter --> BP_EnemyCharacterBase
BP_EnemyCharacterBase --> BP_Enemy_Skeleton
APlayerState --> ARIRPlayerState
ARIRPlayerState --> BP_PlayerState
APlayerController --> ARIRPlayerController
ARIRPlayerController --> PC_Character
AHUD --> ARIRHUD
ARIRHUD --> WBP_PlayerHUD
AGameModeBase --> GM_Dungeoneer
AGameModeBase --> GM_MainMenu
UGameInstance --> GI_Dungeoneer
```
---
## 1. Characters (native — Batch 1 summary)
See Batch 1 sections for `ARIRBaseCharacter`, `ARIRPlayerCharacter`, `ARIRBaseEnemyCharacter` native details. Key contradictions unchanged: enemy ASC on self vs base `GetAbilitySystemComponent` from PlayerState; `DefaultAttributesGameplayEffect` unused in C++.
---
## 2. Player Blueprint hierarchy (Pass 3)
### 2.1 `BP_PlayerCharacterBase`
| Field | Value |
|-------|--------|
| Asset path | `/Game/_Main/Blueprints/Characters/PlayerCharacters/BP_PlayerCharacterBase` |
| Asset class | `BP_PlayerCharacterBase_C` |
| Parent | `/Script/REALMSINRUIN.RIRPlayerCharacter` |
| Native parent | `RIRPlayerCharacter` |
| Interfaces | `BPI_PlayerCharacter` (graphs: GetPlayer*REF, GetPlayerREF) |
| NumReplicatedProperties (tag) | 18 |
| Components | Native: CollisionCylinder, Arrow, CharacterMesh0, CharMoveComp; BP: ThirdPersonCamera, CameraPositionRef, TPSpringArm, BP_FootstepComponent_Left/Right |
**Graphs:** UserConstructionScript, EventGraph, GetPlayerPaladinREF, GetPlayerREF, GetPlayerWizardREF, GetPlayerAmazonREF, GetPlayerClericREF
**Variables (local):** PlayerController, PlayerPawn, CurrentlyAttacking, CharacterClass, ManaRegenTimer, CameraPanTriggerDown, CameraTurnRate, IsDead, InitialSpawnLocation, plus DEPRECATED_Current/Max Health/Mana/Stamina, DEPRECATED_ManaRegenOverTime, DEPRECATED_Ability001004 Damage/ManaCost
**Replication samples:** CurrentlyAttacking, IsDead, DEPRECATED_CurrentHealth/Mana = Replicated; PlayerController, CharacterClass = None
**Implemented custom events (selection):** Server_Ability_001004 Begin/End, Server_UpdateHUD, PlayerDeath, Client_PlayerDeath, Server_RespawnPlayer, RotateCamera, Multicast_PlayMontage, Multicast_PlaySFX, Multi_SpawnParticle, HandleDeath; plus Possessed, BeginPlay, SetIsAttacking, InitializeHUD, AddKill_PlayerCharacter
**Input Action refs (deps):** IA_Ability_001004, IA_CameraPan, IA_CameraPanTrigger, IA_CameraZoom
**Deep dive:** See `05-LegacyAbilityArchitecture.md` and `08-CharacterSystems.md`.
### 2.2 Playable children (structural)
| Character | Path | Parent | IsDataOnly | Local vars | Ability-related implemented events |
|-----------|------|--------|------------|------------|-------------------------------------|
| Paladin | `.../Paladin/Player_Paladin` | BP_PlayerCharacterBase_C | False | Ability001Montages, ChargeStartLoc, ChargeFinishLoc, IsCharging, IsBlocking | Server_001 Begin; 002 Begin+End; 003 Begin; 004 Begin; UseAbility001/004; Charge; Client_Charge |
| Amazonian | `.../Amazonian/Player_Amazonian` | BP_PlayerCharacterBase_C | False | DynamicMaterials, Ability001Montage, PerformingWhirlwind | Server_001 Begin; UseAbility001; ReceiveAnyDamage |
| Cleric | `.../Cleric/Player_Cleric` | BP_PlayerCharacterBase_C | False | Ability001Montages, DivineCircle*, IsBlocking, EnemyFound, ClosestEnemy | Server_001004 Begin; Server_003 End; UseAbility002/004; Concentrate* |
| Wizard | `.../Wizard/Player_Wizard` | BP_PlayerCharacterBase_C | False | EnemyFound, IsBlocking, ClosestEnemy | ReceiveBeginPlay/Tick/ActorBeginOverlap only |
| Gunslinger | `.../Gunslinger/Player_Gunslinger` | BP_PlayerCharacterBase_C | **True** | [] | ReceiveBeginPlay/Tick/ActorBeginOverlap; **deps only base** |
**AnimBP (Paladin sample):** Mesh AnimClass = `/Game/_Main/Animations/PlayerCharacters/Human/CharacterClasses/Paladin/ABP_Paladin`
**Naming:** Use `Player_Amazonian` (not Amazon). BPI_PlayerCharacter deps list Amazonian/Cleric/Paladin/Wizard — **not Gunslinger**.
---
## 3. Enemy Blueprint hierarchy (Pass 3 seed)
| Asset | Parent | Interface | Graphs | Vars | Implemented events |
|-------|--------|-----------|--------|------|--------------------|
| `/Game/_Main/Blueprints/Characters/Enemies/BP_EnemyCharacterBase` | RIRBaseEnemyCharacter | — | UCS, EventGraph | [] | BeginPlay, Tick, ActorBeginOverlap |
| `/Game/_Main/Blueprints/Characters/Enemies/Skeleton/BP_Enemy_Skeleton` | BP_EnemyCharacterBase_C | BPI_EnemyCharacter (GetEnemyREF) | UCS, EventGraph, GetEnemyREF | [] | BeginPlay, Tick, ActorBeginOverlap |
**Deps (Skeleton):** SKM_Skeleton_Guard_Body, BPI_EnemyCharacter, BP_EnemyCharacterBase, ABP_Skeleton, REALMSINRUIN
Deep AI graph analysis deferred to Pass 9.
---
## 4. Player framework Blueprints
### 4.1 `PC_Character`
| Field | Value |
|-------|--------|
| Path | `/Game/_Main/Blueprints/Player/PC_Character` |
| Parent | RIRPlayerController |
| Interface | BPI_PlayerController (GetPC_DungeoneerReference) |
| Variables | CharacterSelectHUD |
| Implemented events | ServerSpawnCharacter, ReceiveBeginPlay, PlayerFirstSpawn, PlayerSelectScreenChoice, PlayerRespawn |
| CDO IMC | `/Game/_Main/Blueprints/Player/Inputs/IMC_PlayerDefault` |
| CDO MovementInput | `/Game/_Main/Blueprints/Player/Inputs/Movement/IA_Movement` |
### 4.2 `BP_PlayerState`
| Field | Value |
|-------|--------|
| Path | `/Game/_Main/Blueprints/Player/BP_PlayerState` |
| Parent | RIRPlayerState |
| IsDataOnly | True |
| Variables | [] |
| Implemented events | BeginPlay, Tick |
| **DefaultAttributesGameplayEffect** | **None** (Observed Implementation on CDO) |
---
## 5. Game framework Blueprints
| Asset | Parent | Notes |
|-------|--------|-------|
| `/Game/_Main/Blueprints/Game/GameInstance/GI_Dungeoneer` | GameInstance | IsDataOnly; no implemented events; empty deps |
| `/Game/_Main/Blueprints/Game/GameMode/GM_Dungeoneer` | GameModeBase | BPI_GameMode; vars PlayerStartLocations, ConnectedPlayers, Player Stats; events PostLogin/Logout/BeginPlay/GetSelectedClass |
| `/Game/_Main/Blueprints/Game/GameMode/GM_MainMenu` | GameModeBase | IsDataOnly; deps PC_MainMenu, BP_MainMenuPawn |
**GM_Dungeoneer CDO (Observed Implementation):**
- HUDClass = `WBP_PlayerHUD_C`
- PlayerControllerClass = `PC_Character_C`
- PlayerStateClass = `BP_PlayerState_C`
- DefaultPawnClass = None (spawn via PC flow)
---
## 6. Interfaces discovered
| Interface | Path | Key graphs |
|-----------|------|------------|
| BPI_PlayerCharacter | `/Game/_Main/Blueprints/Interfaces/BPI_PlayerCharacter` | UseAbility001004, SetIsAttacking, InitializeHUD, GetPlayer*REF, DEPRECATED_Recover*, AddKill_PlayerCharacter |
| BPI_EnemyCharacter | `.../BPI_EnemyCharacter` | GetEnemyREF, AddPlayerTarget, EnemyMeleeAttack |
| BPI_PlayerController | `.../BPI_PlayerController` | SetPlayerCanMove, UpdatePlayerHUD, PlayerRespawn, PlayerSelectScreenChoice, PlayerFirstSpawn, AddGold, GetPC_DungeoneerReference, AddKill_PlayerController |
| BPI_GameMode | `.../BPI_GameMode` | GetPlayerStats (on GM_Dungeoneer) |
No separate ability/damage/targeting/session BPI assets under `/Game/_Main/Blueprints/Interfaces` beyond the four above.
---
## 7. WBP_PlayerHUD resolution
| Field | Value |
|-------|--------|
| Path | `/Game/_Main/UI/Widgets/HUD/WBP_PlayerHUD` |
| Asset class | `WBP_PlayerHUD_C` |
| Parent | `/Script/REALMSINRUIN.RIRHUD` (**AHUD**) |
| IsDataOnly | True |
| Verdict | **AHUD Blueprint**, not a Widget Blueprint. `WBP_` prefix is misleading. |
| Referencers | `GM_Dungeoneer` |
| Dependencies | REALMSINRUIN, `WBP_Overlay`, `BP_OverlayWidgetController` |
Resolves Batch 1 subclass-search anomaly: ObjectTools returned this asset under RIRHUD search because it **is** an RIRHUD child.
---
## 8. Native RPCs
**Observed Implementation:** Still no native Server/Client/Multicast UFUNCTIONs in `Source/REALMSINRUIN`. All ability networking is Blueprint-only (`05`).
---
## Contradictions
| Topic | Evidence A | Evidence B | Better supported |
|-------|------------|------------|------------------|
| Enemy ASC access | Enemy ASC on self | Base GetASC from PlayerState | Both Observed; interface path likely broken for enemies |
| Default attributes | GE assets exist; property on PS | BP_PlayerState CDO = None; never applied in C++ | Property unused; apply path still Unknown / missing |
| HUD naming | `WBP_PlayerHUD` name suggests widget | Parent is RIRHUD (AHUD) | AHUD — name is Documented Intent mismatch |
| Dual HUD systems | Native InitOverlay → WBP_Overlay + ASC | BP Server_UpdateHUD → DEPRECATED floats → UpdatePlayerHUD | Both Observed Implementation; incomplete GAS migration |
| Gameplay Abilities | URIRGameplayAbility Documented Intent | No GA assets; legacy Server_Ability_* | Legacy BP abilities active |