Files
realms-in-ruin-dev/Documentation/Archaeology/03-ClassHierarchy.md
T
tedwardsandCursor 53315574a4 Document Batch 4C Pass 9 enemy AI archaeology: missing chase and attack implementation.
Records empty enemy EventGraphs, stock AIController possession, orphan attack montage, and separates GetASC defect from chase/attack failure.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-16 21:46:08 -07:00

215 lines
11 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 9 (Batch 4C) — enemy hierarchy/control expanded
- **Next pass expected to contribute:** Pass 4 / Pass 10 when authorized
## 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
- **Pass 9:** Enemy EventGraphs empty; stock AIController; BPI partial; no BT/BB
### Pending sections
- Frontend/session graphs (Pass 4)
### Evidence still required
- Exact CustomEvent reliable flags
- PIE possession of placed skeletons
- 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 + Pass 9)
| Asset | Parent | Interface | Graphs | Vars | Implemented events | Pass 9 body |
|-------|--------|-----------|--------|------|--------------------|-------------|
| `/Game/_Main/Blueprints/Characters/Enemies/BP_EnemyCharacterBase` | RIRBaseEnemyCharacter | — | UCS, EventGraph | [] | BeginPlay, Tick, ActorBeginOverlap | **Empty** (unconnected) |
| `/Game/_Main/Blueprints/Characters/Enemies/Skeleton/BP_Enemy_Skeleton` | BP_EnemyCharacterBase_C | BPI_EnemyCharacter (GetEnemyREF only) | UCS, EventGraph, GetEnemyREF | [] | BeginPlay, Tick, ActorBeginOverlap | **Empty**; GetEnemyREF→self |
**Control (CDO + C_1 instance):** `AIControllerClass=/Script/AIModule.AIController`; `AutoPossessAI=PlacedInWorld`.
**Deps (Skeleton):** SKM_Skeleton_Guard_Body, BPI_EnemyCharacter, BP_EnemyCharacterBase, ABP_Skeleton, REALMSINRUIN.
**Pass 9:** No BehaviorTree/Blackboard/custom AIController in project. Chase/attack **Implementation Missing**. Full analysis: `09-EnemyAI-StaticAnalysis.md`.
---
## 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 |