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>
This commit is contained in:
2026-07-16 20:29:10 -07:00
co-authored by Cursor
parent ff5640a020
commit 0d045d142f
11 changed files with 1106 additions and 463 deletions
+128 -237
View File
@@ -2,37 +2,33 @@
**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).
- **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:** Batch 1 forbids deep Blueprint graph analysis. Inherited Blueprint variables not inspected. No native RPCs found to verify runtime.
- **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 2 (Batch 1)
- **Next pass expected to contribute:** Batch 2 Passes 3 + 5 (Blueprint hierarchy and BP_PlayerCharacterBase)
- **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 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
- 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
- Blueprint parent chains, variables, graphs, interfaces on children
- GameMode / GameInstance Blueprint internals
- Whether DefaultAttributesGameplayEffect is assigned on BP_PlayerState
- Deep child ability graphs (Pass 6)
- Enemy AI graph deep dive (Pass 9)
- Frontend/session graphs (Pass 4)
### 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)
- Exact CustomEvent reliable flags
- Who invokes `PlayerDeath` from damage
- CommonUI content usage
---
@@ -45,269 +41,164 @@ flowchart TD
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
IASI --> ARIRPlayerState
ARIRPlayerState --> BP_PlayerState
APlayerController --> ARIRPlayerController
ARIRPlayerController --> PC_Character
AHUD --> ARIRHUD
UAbilitySystemComponent --> URIRAbilitySystemComponent
UAttributeSet --> URIRAttributeSet
UGameplayAbility --> URIRGameplayAbility
AActor --> ARIREffectActor
UUserWidget --> URIRUserWidget
UObject --> URIRWidgetController
URIRWidgetController --> UOverlayWidgetController
ARIRHUD --> WBP_PlayerHUD
AGameModeBase --> GM_Dungeoneer
AGameModeBase --> GM_MainMenu
UGameInstance --> GI_Dungeoneer
```
**Observed Implementation:** No native `AGameMode`, `UGameInstance`, or `AGameState` subclasses in the module.
---
## 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++.
---
## 1. Characters
## 2. Player Blueprint hierarchy (Pass 3)
### 1.1 `ARIRBaseCharacter` (ABSTRACT)
### 2.1 `BP_PlayerCharacterBase`
| | |
|--|--|
| 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` |
| 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 |
**Properties (Observed Implementation):**
**Graphs:** UserConstructionScript, EventGraph, GetPlayerPaladinREF, GetPlayerREF, GetPlayerWizardREF, GetPlayerAmazonREF, GetPlayerClericREF
- `TObjectPtr<UAbilitySystemComponent> AbilitySystemComponent` — VisibleAnywhere, BlueprintReadOnly, Category Abilities
- `TObjectPtr<UAttributeSet> AttributeSet` — same
**Variables (local):** PlayerController, PlayerPawn, CurrentlyAttacking, CharacterClass, ManaRegenTimer, CameraPanTriggerDown, CameraTurnRate, IsDead, InitialSpawnLocation, plus DEPRECATED_Current/Max Health/Mana/Stamina, DEPRECATED_ManaRegenOverTime, DEPRECATED_Ability001004 Damage/ManaCost
**Functions:**
**Replication samples:** CurrentlyAttacking, IsDead, DEPRECATED_CurrentHealth/Mana = Replicated; PlayerController, CharacterClass = None
- `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"
**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
**Documented Intent:** Comment on class: "Base Character class using GAS for RIR Project."
**Input Action refs (deps):** IA_Ability_001004, IA_CameraPan, IA_CameraPanTrigger, IA_CameraZoom
**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.
**Deep dive:** See `05-LegacyAbilityArchitecture.md` and `08-CharacterSystems.md`.
**RPCs / replication:** None declared on this class.
### 2.2 Playable children (structural)
**Blueprint children (seed):** See §1.2 / calibration — via `ARIRPlayerCharacter` and `ARIRBaseEnemyCharacter` lineages.
| 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**.
---
### 1.2 `ARIRPlayerCharacter`
## 3. Enemy Blueprint hierarchy (Pass 3 seed)
| | |
|--|--|
| Header | [`Public/Player/RIRPlayerCharacter.h`](Source/REALMSINRUIN/Public/Player/RIRPlayerCharacter.h) |
| Impl | [`Private/Player/RIRPlayerCharacter.cpp`](Source/REALMSINRUIN/Private/Player/RIRPlayerCharacter.cpp) |
| Parent | `ARIRBaseCharacter` |
| 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 |
**Observed Implementation:**
**Deps (Skeleton):** SKM_Skeleton_Guard_Body, BPI_EnemyCharacter, BP_EnemyCharacterBase, ABP_Skeleton, REALMSINRUIN
- 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`
Deep AI graph analysis deferred to Pass 9.
---
### 1.3 `ARIRBaseEnemyCharacter`
## 4. Player framework Blueprints
| | |
|--|--|
| 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` |
### 4.1 `PC_Character`
**Observed Implementation — constructor:**
| 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` |
- Mesh Visibility channel → Block
- Creates `URIRAbilitySystemComponent` on self; `SetIsReplicated(true)`; `SetReplicationMode(Minimal)`
- Creates `URIRAttributeSet` on self
### 4.2 `BP_PlayerState`
**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`.
| Field | Value |
|-------|--------|
| Path | `/Game/_Main/Blueprints/Player/BP_PlayerState` |
| Parent | RIRPlayerState |
| IsDataOnly | True |
| Variables | [] |
| Implemented events | BeginPlay, Tick |
| **DefaultAttributesGameplayEffect** | **None** (Observed Implementation on CDO) |
---
## 2. Player framework
## 5. Game framework Blueprints
### 2.1 `ARIRPlayerState`
| 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 |
| | |
|--|--|
| 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` |
**GM_Dungeoneer CDO (Observed Implementation):**
**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.
- HUDClass = `WBP_PlayerHUD_C`
- PlayerControllerClass = `PC_Character_C`
- PlayerStateClass = `BP_PlayerState_C`
- DefaultPawnClass = None (spawn via PC flow)
---
### 2.2 `ARIRPlayerController`
## 6. Interfaces discovered
| | |
|--|--|
| Header | [`Public/Player/RIRPlayerController.h`](Source/REALMSINRUIN/Public/Player/RIRPlayerController.h) |
| Impl | [`Private/Player/RIRPlayerController.cpp`](Source/REALMSINRUIN/Private/Player/RIRPlayerController.cpp) |
| Parent | `APlayerController` |
| 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) |
**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`
No separate ability/damage/targeting/session BPI assets under `/Game/_Main/Blueprints/Interfaces` beyond the four above.
---
### 2.3 `ARIRHUD`
## 7. WBP_PlayerHUD resolution
| | |
|--|--|
| 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` |
| 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` |
**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.
Resolves Batch 1 subclass-search anomaly: ObjectTools returned this asset under RIRHUD search because it **is** an RIRHUD child.
---
## 3. GAS scaffolding
## 8. Native RPCs
### 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).
**Observed Implementation:** Still no native Server/Client/Multicast UFUNCTIONs in `Source/REALMSINRUIN`. All ability networking is Blueprint-only (`05`).
---
@@ -315,8 +206,8 @@ Pure virtual `HighlightActor` / `UnHighlightActor`. Implemented by `ARIRBaseEnem
| 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`.
| 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 |