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
@@ -0,0 +1,161 @@
---
name: Phase 1 Archaeology
overview: Execute Phase 1 archaeology in user-authorized batches (Batch 15). Create docs only with substantive evidence; mark Draft/Complete correctly; run repository integrity before/after; never auto-continue to the next batch.
todos:
- id: batch1-foundation
content: "Batch 1 (authorized): Passes 02 — continuity, modules/config, native C++ → 02+03+14+15 (+seeds)"
status: completed
- id: batch2-bp-foundation
content: "Batch 2 (completed): Passes 3+5 — BP hierarchy + BP_PlayerCharacterBase deep dive → 03/05/08 (+seeds)"
status: completed
- id: batch3-abilities
content: "Batch 3 (completed): Pass 6 — per-character ability/RPC/anim inventory → 05/08/10 (+seeds)"
status: completed
- id: batch4-supporting
content: "Batch 4 (when authorized): Passes 4+7+8+9+10 — frontend, GAS, anim, enemy, UI/pickups/maps"
status: pending
- id: batch5-synthesis
content: "Batch 5 (when authorized): Pass 11 — matrix, unknowns, summary, final handoff"
status: pending
isProject: false
---
# Phase 1 Static Archaeology Execution Plan
## Execution control (mandatory)
Do **not** execute Phase 1 in one uninterrupted agent run.
Execute **only** the batch explicitly authorized by the user. Do **not** auto-continue to the next batch.
### Phase 1 execution batches
| Batch | Passes | Focus |
|-------|--------|-------|
| **Batch 1 — Foundation** | 0, 1, 2 | Continuity gate; modules/plugins/config; native C++ hierarchy |
| **Batch 2 — Blueprint foundation** | 3, 5 | Blueprint hierarchy; `BP_PlayerCharacterBase` deep dive |
| **Batch 3 — Character abilities** | 6 | Per-character ability, RPC, networking, animation inventory |
| **Batch 4 — Supporting systems** | 4, 7, 8, 9, 10 | Frontend/sessions; partial GAS; animation; enemy AI; UI/HUD/pickups/maps |
| **Batch 5 — Synthesis** | 11 (+ final 13/14/01/15) | Migration matrix; unknowns; evidence index; executive summary; final handoff |
Do not begin Batch 5 until Batches 14 are complete and their documents have been reviewed for sufficient evidence.
### End of every authorized batch
1. Stop all further investigation.
2. Update `14-EvidenceIndex.md`.
3. Update `15-HandoffStatus.md` with exact current state.
4. Mark every touched archaeology document Draft or Complete.
5. List all files created or modified.
6. Report failed MCP calls and incomplete inspections.
7. Report tool, visibility, or context limitations.
8. Record exact recommended starting points for the next batch.
9. Confirm no unauthorized project content or editor state was modified (repository integrity gate).
10. Wait for explicit user authorization before beginning another batch.
## Document creation and status (mandatory)
- Do **not** create empty Markdown shells for every planned archaeology document.
- Create a document only when its first **substantive evidence** is recorded.
- Near the top of every archaeology document: `Status: Draft` or `Status: Complete`.
- Mark **Complete** only when all investigation areas assigned to that document for Phase 1 have been inspected as far as approved tools allow.
- Do **not** mark Complete merely because the current batch ended.
- Every **Draft** document must clearly include: Completed sections; Pending sections; Evidence still required; Tool/visibility limitations; Unknowns requiring later verification; Last completed pass; Next pass expected to contribute.
- Do not leave blank, placeholder-only, or minimally populated shells that could be mistaken for completed archaeology.
- Do **not** modify `00-MCP-Capability-Calibration.md`.
## Repository integrity gate (mandatory)
**Before** beginning an authorized batch:
1. Record repository status (`git status --short`, `git diff --name-only`, `git diff --cached --name-only` if Git available).
2. Record pre-existing modified/untracked files.
3. Do not alter, stage, commit, revert, delete, or clean pre-existing changes.
**After** completing the batch:
1. Re-run read-only status checks; compare to start snapshot.
2. Confirm every newly created/modified file is Markdown under `Documentation/Archaeology/`.
3. If any other file changed: stop immediately; report exact path(s); do not revert/repair without user authorization.
4. Record integrity result in `15-HandoffStatus.md` and the batch completion report.
## Current baseline (do not contradict without evidence)
- Only [Documentation/Archaeology/00-MCP-Capability-Calibration.md](Documentation/Archaeology/00-MCP-Capability-Calibration.md) existed before Batch 1.
- Calibration: no project BT/Blackboard/custom AIController; no discrete GA assets found; `Player_Amazonian` (not `Player_Amazon`); stock `AIController` on skeleton; DEPRECATED Paladin graphs inspectable.
- Native GAS ownership split: player ASC on `ARIRPlayerState`; enemy ASC on `ARIRBaseEnemyCharacter`; empty `URIRGameplayAbility` scaffolding.
- Playable BPs: Paladin, Amazonian, Cleric, Wizard, Gunslinger.
- Framework BPs: `GI_Dungeoneer`, `GM_Dungeoneer`, `GM_MainMenu`; default-attribute GEs for Paladin/Amazon/Cleric/Wizard (Gunslinger GE absence unconfirmed until inspected).
## Hard constraints (session-wide)
- **Writes:** only Markdown under `Documentation/Archaeology/`.
- **MCP:** approved read-only toolsets only; never PIE, load_level, compile, save, mutate, SemanticSearch, ProgrammaticToolset, Slate automation.
- Evidence labels: Observed Implementation / Documented Intent / Observed Runtime Behavior / Inferred / Unknown.
- Issue labels as specified; baseline defects ≠ migration regressions.
- Exact names; no implementation recommendations during investigation batches.
- Batch 1 may record Blueprint child paths as seeds only — no deep BP graph/ability/UI/anim/enemy BP analysis.
## Batch status
| Batch | Status |
|-------|--------|
| Batch 1 — Foundation (Passes 02) | **Completed** |
| Batch 2 — Blueprint foundation (Passes 3 + 5) | **Completed** |
| Batch 3 — Character abilities (Pass 6) | **Completed** |
| Batch 4 — Supporting systems | Waiting for authorization |
| Batch 5 — Synthesis | Waiting for authorization |
## Batch 1 — Foundation (COMPLETED)
### Pass 0 — Continuity gate
- Read all existing Archaeology Markdown; confirm PIE off, level/selection unchanged via read-only EditorApp/Scene tools.
- Repository integrity pre-snapshot.
- Do not mutate editor or repo.
### Pass 1 — Modules, plugins, configuration → `02-ProjectArchitecture.md`
- Inspect `.uproject`, Build.cs, Targets, module startup, AdvancedSessions/AdvancedSteamSessions descriptors, DefaultEngine/Game/GameplayTags/Input.ini, PluginToolset read-only.
- Seed `13`/`14`/`15` as warranted.
### Pass 2 — Native C++ hierarchy → `03-ClassHierarchy.md`
- Inspect every file under `Source/REALMSINRUIN/`.
- Document all native classes listed in the brief; record Blueprint subclass paths as Batch 2 seeds only.
- Seed `02`, `06`, `08`, `09`, `11`, `12`, `13`, `14`, `15` only when substantive evidence exists.
## Batch 2 — Blueprint foundation (COMPLETED)
### Pass 3 — Blueprint hierarchy
- Structural inventory of player/enemy/framework/interface Blueprints; resolve `WBP_PlayerHUD` as AHUD (`RIRHUD` child).
- Primary writes: `03`/`08`/`09`/`11`; seeds into `06`/`13`/`14`/`15`.
### Pass 5 — `BP_PlayerCharacterBase` deep dive
- Connected path tracing of shared input/RPC/death/HUD/multicast architecture.
- Created `05-LegacyAbilityArchitecture.md`; updated `03`/`06`/`08`.
**Batch 2 outcomes (do not contradict without evidence):** abilities are legacy `IA_Ability_*``Server_Ability_*` (not GAS GAs); `BP_PlayerState.DefaultAttributesGameplayEffect=None`; dual HUD (ASC Overlay + DEPRECATED floats); Gunslinger data-only / Wizard no ability events.
## Batch 3 — Character abilities (COMPLETED)
### Pass 6 — Per-character ability archaeology
- Connected-path reconstruction for Paladin → Amazonian → Cleric → Wizard → Gunslinger.
- Ability 001004 Begin/End, UseAbility*, resources, damage, RPCs, parent-call inventory, Montage seeds.
- Primary writes: `05`/`08`/`10`; seeds into `06`/`13`/`14`/`15`.
- Did **not** create `07-AbilityMigrationMatrix.md` (Pass 11).
**Batch 3 outcomes (do not contradict without evidence):** Paladin 001/003/004 and Amazonian 001 Implemented; Cleric 003 Implemented / 004 broken; Wizard + Gunslinger inherit PrintString stubs; no GA activate/grant in ability graphs; most Ends missing; Reliability flags Unknown (MCP).
## Later batches (not authorized yet)
### Batch 4 — Passes 4, 7, 8, 9, 10
Frontend/sessions; partial GAS; animation; enemy AI; UI/HUD/pickups/maps → `04`/`06`/`09`/`10`/`11`/`12`.
### Batch 5 — Pass 11 + synthesis
Migration matrix; unknowns; evidence index; executive summary; final handoff → `01`/`07`/`13`/`14`/`15`.
## Contradiction protocol
If new evidence conflicts with calibration or an earlier doc: cite both, state which is better supported, update analysis, log in `15-HandoffStatus.md`.
## Completion gate
Phase 1 complete only when all required docs exist with sufficient evidence, Batch 5 synthesis is done, and no non-Markdown project content was modified.
+128 -237
View File
@@ -2,37 +2,33 @@
**Status: Draft** **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). - **Scope:** Native C++ hierarchy under `Source/REALMSINRUIN/` plus Blueprint parent chains, interfaces, and framework Blueprints inspected in Batch 2 Pass 3.
- **Inspection method:** Full read of every `.h`/`.cpp` under `Source/REALMSINRUIN/`; MCP `ObjectTools.search_subclasses` for child discovery (paths only — no Blueprint graph inspection). - **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. - **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 - **Last updated:** 2026-07-16
- **Current phase:** Phase 1 — Static Architecture - **Current phase:** Phase 1 — Static Architecture
- **Last completed pass:** Pass 2 (Batch 1) - **Last completed pass:** Pass 5 (Batch 2)
- **Next pass expected to contribute:** Batch 2 Passes 3 + 5 (Blueprint hierarchy and BP_PlayerCharacterBase) - **Next pass expected to contribute:** Batch 3 Pass 6 (per-character ability graphs)
## Draft tracking ## Draft tracking
### Completed sections ### Completed sections
- Full native class inventory for characters, player framework, GAS, UI, interfaces - Full native class inventory (Batch 1)
- ASC ownership split (player vs enemy) - Blueprint parent chains for players, enemies, PC/PS, GI/GM
- AttributeSet replication and constructor defaults - Interface inventory under `/Game/_Main/Blueprints/Interfaces`
- EffectActor GE application path - WBP_PlayerHUD asset-class resolution (AHUD, not UserWidget)
- HUD / OverlayWidgetController attribute delegate wiring - BP_PlayerState DefaultAttributesGameplayEffect = None
- Blueprint subclass path seeds
### Pending sections ### Pending sections
- Blueprint parent chains, variables, graphs, interfaces on children - Deep child ability graphs (Pass 6)
- GameMode / GameInstance Blueprint internals - Enemy AI graph deep dive (Pass 9)
- Whether DefaultAttributesGameplayEffect is assigned on BP_PlayerState - Frontend/session graphs (Pass 4)
### Evidence still required ### Evidence still required
- Connected ability/RPC graphs on BP_PlayerCharacterBase and Player_* classes - Exact CustomEvent reliable flags
- Whether enemy BP overrides GetAbilitySystemComponent behavior (native override is PlayerState-based) - Who invokes `PlayerDeath` from damage
- CommonUI content usage
### Unknowns requiring later verification
- Runtime behavior of `IAbilitySystemInterface` on enemies given base `GetAbilitySystemComponent` implementation
- Application of `DefaultAttributesGameplayEffect` (declared, never called in native)
--- ---
@@ -45,269 +41,164 @@ flowchart TD
ARIRBaseCharacter --> ARIRPlayerCharacter ARIRBaseCharacter --> ARIRPlayerCharacter
ARIRBaseCharacter --> ARIRBaseEnemyCharacter ARIRBaseCharacter --> ARIRBaseEnemyCharacter
ITarget[ITargetInterface] --> 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 APlayerState --> ARIRPlayerState
IASI --> ARIRPlayerState ARIRPlayerState --> BP_PlayerState
APlayerController --> ARIRPlayerController APlayerController --> ARIRPlayerController
ARIRPlayerController --> PC_Character
AHUD --> ARIRHUD AHUD --> ARIRHUD
UAbilitySystemComponent --> URIRAbilitySystemComponent ARIRHUD --> WBP_PlayerHUD
UAttributeSet --> URIRAttributeSet AGameModeBase --> GM_Dungeoneer
UGameplayAbility --> URIRGameplayAbility AGameModeBase --> GM_MainMenu
AActor --> ARIREffectActor UGameInstance --> GI_Dungeoneer
UUserWidget --> URIRUserWidget
UObject --> URIRWidgetController
URIRWidgetController --> UOverlayWidgetController
``` ```
**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`
| | | | Field | Value |
|--|--| |-------|--------|
| Header | [`Public/Characters/RIRBaseCharacter.h`](Source/REALMSINRUIN/Public/Characters/RIRBaseCharacter.h) | | Asset path | `/Game/_Main/Blueprints/Characters/PlayerCharacters/BP_PlayerCharacterBase` |
| Impl | [`Private/Characters/RIRBaseCharacter.cpp`](Source/REALMSINRUIN/Private/Characters/RIRBaseCharacter.cpp) | | Asset class | `BP_PlayerCharacterBase_C` |
| Parent | `ACharacter` | | Parent | `/Script/REALMSINRUIN.RIRPlayerCharacter` |
| Interfaces | `IAbilitySystemInterface` | | 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 **Variables (local):** PlayerController, PlayerPawn, CurrentlyAttacking, CharacterClass, ManaRegenTimer, CameraPanTriggerDown, CameraTurnRate, IsDead, InitialSpawnLocation, plus DEPRECATED_Current/Max Health/Mana/Stamina, DEPRECATED_ManaRegenOverTime, DEPRECATED_Ability001004 Damage/ManaCost
- `TObjectPtr<UAttributeSet> AttributeSet` — same
**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. **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
- `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." **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)
| | | | Asset | Parent | Interface | Graphs | Vars | Implemented events |
|--|--| |-------|--------|-----------|--------|------|--------------------|
| Header | [`Public/Player/RIRPlayerCharacter.h`](Source/REALMSINRUIN/Public/Player/RIRPlayerCharacter.h) | | `/Game/_Main/Blueprints/Characters/Enemies/BP_EnemyCharacterBase` | RIRBaseEnemyCharacter | — | UCS, EventGraph | [] | BeginPlay, Tick, ActorBeginOverlap |
| Impl | [`Private/Player/RIRPlayerCharacter.cpp`](Source/REALMSINRUIN/Private/Player/RIRPlayerCharacter.cpp) | | `/Game/_Main/Blueprints/Characters/Enemies/Skeleton/BP_Enemy_Skeleton` | BP_EnemyCharacterBase_C | BPI_EnemyCharacter (GetEnemyREF) | UCS, EventGraph, GetEnemyREF | [] | BeginPlay, Tick, ActorBeginOverlap |
| Parent | `ARIRBaseCharacter` |
**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" Deep AI graph analysis deferred to Pass 9.
- `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` ## 4. Player framework Blueprints
| | | ### 4.1 `PC_Character`
|--|--|
| 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:** | 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 ### 4.2 `BP_PlayerState`
- Creates `URIRAbilitySystemComponent` on self; `SetIsReplicated(true)`; `SetReplicationMode(Minimal)`
- Creates `URIRAttributeSet` on self
**BeginPlay:** `AbilitySystemComponent->InitAbilityActorInfo(this, this)` — Owner and Avatar both the enemy. | Field | Value |
|-------|--------|
**ITargetInterface:** `HighlightActor` / `UnHighlightActor` toggle custom depth stencil `CUSTOM_DEPTH_RED` (250). | Path | `/Game/_Main/Blueprints/Player/BP_PlayerState` |
| Parent | RIRPlayerState |
**No AI movement, targeting, attack, Behavior Tree, or Perception code in native.** | IsDataOnly | True |
| Variables | [] |
**Known Blueprint subclasses (seed):** | Implemented events | BeginPlay, Tick |
| **DefaultAttributesGameplayEffect** | **None** (Observed Implementation on CDO) |
- `/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 ## 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 |
| | | **GM_Dungeoneer CDO (Observed Implementation):**
|--|--|
| 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:** - HUDClass = `WBP_PlayerHUD_C`
- PlayerControllerClass = `PC_Character_C`
- Owns `URIRAbilitySystemComponent` — replicated, `EGameplayEffectReplicationMode::Mixed` - PlayerStateClass = `BP_PlayerState_C`
- Owns `URIRAttributeSet` - DefaultPawnClass = None (spawn via PC flow)
- `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` ## 6. Interfaces discovered
| | | | Interface | Path | Key graphs |
|--|--| |-----------|------|------------|
| Header | [`Public/Player/RIRPlayerController.h`](Source/REALMSINRUIN/Public/Player/RIRPlayerController.h) | | BPI_PlayerCharacter | `/Game/_Main/Blueprints/Interfaces/BPI_PlayerCharacter` | UseAbility001004, SetIsAttacking, InitializeHUD, GetPlayer*REF, DEPRECATED_Recover*, AddKill_PlayerCharacter |
| Impl | [`Private/Player/RIRPlayerController.cpp`](Source/REALMSINRUIN/Private/Player/RIRPlayerController.cpp) | | BPI_EnemyCharacter | `.../BPI_EnemyCharacter` | GetEnemyREF, AddPlayerTarget, EnemyMeleeAttack |
| Parent | `APlayerController` | | BPI_PlayerController | `.../BPI_PlayerController` | SetPlayerCanMove, UpdatePlayerHUD, PlayerRespawn, PlayerSelectScreenChoice, PlayerFirstSpawn, AddGold, GetPC_DungeoneerReference, AddKill_PlayerController |
| BPI_GameMode | `.../BPI_GameMode` | GetPlayerStats (on GM_Dungeoneer) |
**Observed Implementation:** No separate ability/damage/targeting/session BPI assets under `/Game/_Main/Blueprints/Interfaces` beyond the four above.
- `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` ## 7. WBP_PlayerHUD resolution
| | | | Field | Value |
|--|--| |-------|--------|
| Header | [`Public/UI/HUD/RIRHUD.h`](Source/REALMSINRUIN/Public/UI/HUD/RIRHUD.h) | | Path | `/Game/_Main/UI/Widgets/HUD/WBP_PlayerHUD` |
| Impl | [`Private/UI/HUD/RIRHUD.cpp`](Source/REALMSINRUIN/Private/UI/HUD/RIRHUD.cpp) | | Asset class | `WBP_PlayerHUD_C` |
| Parent | `AHUD` | | 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:** Resolves Batch 1 subclass-search anomaly: ObjectTools returned this asset under RIRHUD search because it **is** an RIRHUD child.
- `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 ## 8. Native RPCs
### 3.1 `URIRAbilitySystemComponent` **Observed Implementation:** Still no native Server/Client/Multicast UFUNCTIONs in `Source/REALMSINRUIN`. All ability networking is Blueprint-only (`05`).
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).
--- ---
@@ -315,8 +206,8 @@ Pure virtual `HighlightActor` / `UnHighlightActor`. Implemented by `ARIRBaseEnem
| Topic | Evidence A | Evidence B | Better supported | | 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 | | Enemy ASC access | Enemy ASC on self | Base GetASC from PlayerState | Both Observed; 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?) | | Default attributes | GE assets exist; property on PS | BP_PlayerState CDO = None; never applied in C++ | Property unused; apply path still Unknown / missing |
| Gameplay Abilities | `URIRGameplayAbility` + Documented Intent "all abilities" | No subclasses; calibration found no GA assets | Infrastructure only — abilities not GAS-converted | | 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 |
Log also in `15-HandoffStatus.md`. | Gameplay Abilities | URIRGameplayAbility Documented Intent | No GA assets; legacy Server_Ability_* | Legacy BP abilities active |
@@ -0,0 +1,235 @@
# 05 — Legacy Ability Architecture
**Status: Draft**
- **Scope:** Shared `BP_PlayerCharacterBase` ability architecture (Batch 2) plus per-character Ability 001004 connected-path reconstruction (Batch 3 Pass 6).
- **Inspection method:** Read-only BlueprintTools `find_nodes` / `get_node_infos` / `get_connected_subgraph` / `read_graph_dsl`; AssetTools deps; ObjectTools CDO samples.
- **Evidence classifications used:** Observed Implementation, Documented Intent, Observed Runtime Behavior, Inferred, Unknown.
- **Tool or visibility limitations:** CustomEvent Reliable/Unreliable flags not exposed; comment-box regions not found via `find_nodes(title=Comment)`; Montage notify tracks not deep-inspected (Pass 8).
- **Last updated:** 2026-07-16
- **Current phase:** Phase 1 — Static Architecture
- **Last completed pass:** Pass 6 (Batch 3)
- **Next pass expected to contribute:** Batch 4 Pass 7 (GAS systemwide) / Pass 8 (AnimBP/Montage notifies)
## Draft tracking
### Completed sections
- Shared input → Server RPC routing on base
- Base Server_Ability_* stubs
- Multicast FX helpers
- Death / respawn / HUD (DEPRECATED floats)
- **Per-character Ability 001004 connected paths for all five playables**
- Parent-call inventory
- Resource / damage / projectile inventories
- Montage dependency seeds
### Pending sections
- Cross-character migration matrix (Pass 11 → doc 07)
- Montage notify → UseAbility exact wiring (Pass 8)
- Runtime verification of CDO damage/mana values (PIE)
### Evidence still required
- Who fires UseAbility* (anim notifies vs other) — Requires Manual Editor Inspection / Pass 8
- FCanUseMana implementation body (function on base — not re-walked this batch beyond call sites)
- Client_Charge timeline details beyond ChargeTimeline / LineTrace / SetActorLocation
---
## Shared architecture (Batch 2 baseline — verified)
```mermaid
flowchart TD
IA[IA_Ability_001to004] -->|Started| SBegin[Server_Ability_N_Begin]
IA -->|Completed_or_Canceled| SEnd[Server_Ability_N_End]
SBegin -->|base| Print[PrintString Override]
SBegin -->|child override| Child[Character body]
Child --> MC[Multicast_PlayMontage]
Child --> Use[UseAbilityN Authority]
Use --> Dmg[ApplyDamage or RecoverHealth]
```
**Observed Implementation:** No `UGameplayAbility` activation. Reliability: **Unknown — MCP property visibility limitation**.
| Base event | Body |
|---|---|
| Server_Ability_*_Begin | PrintString `"Override Ability N"` |
| Server_Ability_*_End | then unconnected |
| Multicast_PlayMontage / PlaySFX / Multi_SpawnParticle | Active helpers |
---
## Parent-call inventory (Pass 6)
| Character | Ability overrides call Parent? | Other Parent calls |
|---|---|---|
| Paladin | **No** on Ability Begin/UseAbility | Tick/Overlap call Parent; BeginPlay does **not** (leader-pose style local) |
| Amazonian | **No** | — |
| Cleric | **No** on any ability override | BeginPlay no Parent (leader pose) |
| Wizard | N/A (no ability overrides) | BeginPlay **no Parent**; Tick/Overlap **call Parent** |
| Gunslinger | N/A | BeginPlay/Tick/Overlap **call Parent** |
---
## Player_Paladin
**Path:** `/Game/_Main/Blueprints/Characters/PlayerCharacters/PlayerCharacterClasses/Paladin/Player_Paladin`
| Slot/System | Entry point | Parent called | Server path | Multicast/client path | Validation | Resource | Damage/effect | Animation | End/cleanup | Status | Evidence |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Ability 001 | Server_Ability_001_Begin; UseAbility001 | No | Gate !attacking && !dead → CurrentlyAttacking → SetPlayerCanMove(true) → Multicast_PlayMontage(random Ability001Montages) | Multicast_PlayMontage | Gate only | None | UseAbility001 Authority: BoxOverlap(90,50,100) forward×150 → ApplyDamage(DEPRECATED_Ability001Damage) | Attack_A/B/C/D_Fast_Montage | Server_Ability_001_End not implemented locally | **Implemented** (End Partial) | get_connected_subgraph |
| Ability 002 | Server_Ability_002_Begin; Server_Ability_002_End | No | Begin: gate → CurrentlyAttacking → CanMove false → IsBlocking true | None in Begin | Gate | None | Block state only (no ApplyDamage in Begin) | None in Begin (IsBlocking likely AnimBP) | End: CurrentlyAttacking=false → CanMove true → IsBlocking false | **Partial** (block state; no hit absorb path traced) | subgraph Event_5 / Event_7 |
| Ability 003 | Server_Ability_003_Begin; Charge; Client_Charge; ChargeBox overlap | No | Gate → FCanUseMana(DEPRECATED_Ability003ManaCost) → CurrentlyAttacking → CanMove false → ChargeBox QueryOnly → Charge + Client_Charge | Client_Charge | Gate + mana | DEPRECATED_Ability003ManaCost via FCanUseMana | ChargeBox Authority: NOT tag Player → ApplyDamage(DEPRECATED_Ability003Damage) | ChargeTimeline + LineTrace + SetActorLocation lerp | Ends not locally implemented for 003 | **Implemented** (charge + overlap damage) | subgraph Event_6 / Charge / ChargeBox |
| Ability 004 | Server_Ability_004_Begin; UseAbility004 | No | Gate → FCanUseMana(DEPRECATED_Ability004ManaCost) → CurrentlyAttacking → CanMove false → Multicast_PlayMontage(Paladin_Ability004_Montage) | Multicast_PlayMontage; UseAbility004: Multi_SpawnParticle (EmitterTemplate empty) + Multicast_PlaySFX(MagicSpell_01_Cue) | Gate + mana | DEPRECATED_Ability004ManaCost | UseAbility004 Authority: SphereOverlap radius 300 → ApplyDamage(DEPRECATED_Ability004Damage) | Paladin_Ability004_Montage | End not local | **Implemented** (FX particle template empty) | subgraph Event_8 / Event_11 |
| Basic attack | Same as Ability 001 | No | Same | Same | Same | Same | Same | Attack_* montages | Same | **Implemented** (=001) | — |
| Passive | — | — | — | — | — | — | — | — | — | **Missing** | — |
| Death | Inherited PlayerDeath | — | Base | Base | — | DEPRECATED health (if damaged via AnyDamage — Paladin has no local AnyDamage) | Base | Base | Base | **Inherited** | list_events |
| Legacy HUD | Inherited Server_UpdateHUD | — | Base DEPRECATED floats | — | — | Reads DEPRECATED health/mana | — | — | — | **Inherited** | Batch 2 |
**Paladin montages:**
`/Game/_Main/Animations/PlayerCharacters/Human/CharacterClasses/Paladin/AnimMontages/Attack_{A,B,C,D}_Fast_Montage`
`/Game/_Main/Animations/PlayerCharacters/Human/CharacterClasses/Paladin/AnimMontages/Abilities/Paladin_Ability004_Montage`
---
## Player_Amazonian
**Path:** `/Game/_Main/Blueprints/Characters/PlayerCharacters/PlayerCharacterClasses/Amazonian/Player_Amazonian`
| Slot/System | Entry point | Parent called | Server path | Multicast/client path | Validation | Resource | Damage/effect | Animation | End/cleanup | Status | Evidence |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Ability 001 | Server_Ability_001_Begin; UseAbility001 | No | Gate → CurrentlyAttacking → CanMove true → Multicast_PlayMontage(random Ability001Montage) | Multicast_PlayMontage | Gate | None | UseAbility001 Authority: BoxOverlap → ApplyDamage(DEPRECATED_Ability001Damage) | A_Hu_F_Combat_2H_Attack* montages | End not local; CurrentlyAttacking cleared via base SetIsAttacking (Inferred) | **Implemented** | subgraph |
| Ability 002004 | Inherited only | N/A | Base PrintString | — | — | — | — | — | Base empty End | **Stub** (inherited) | list_events |
| Basic attack | Ability 001 | No | Same | Same | Same | Same | Same | Attack montages | Same | **Implemented** (=001); **Observed Runtime Behavior:** known working melee | parity brief + subgraph |
| Passive | — | — | — | — | — | — | — | — | — | **Missing** | — |
| Whirlwind | PerformingWhirlwind Get only | — | — | — | Gates AnyDamage | — | — | — | Never Set | **Partial / Present but Unconnected setter** | find_nodes |
| Death | ReceiveAnyDamage → PlayerDeath | — | Local health subtract DEPRECATED_CurrentHealth → Server_UpdateHUD → PlayerDeath if ≤0 | Base death | PlayerHitCheck when whirlwind | Writes DEPRECATED_CurrentHealth | ApplyDamage inbound | — | Base | **Partial** (legacy health) | subgraph |
| Legacy HUD | Server_UpdateHUD after damage | — | Base | — | — | DEPRECATED health | — | — | — | **Active** | subgraph |
**Amazonian montages:**
`/Game/_Main/Animations/PlayerCharacters/Human/CharacterClasses/Amazon/AnimMontages/A_Hu_F_Combat_2H_Attack01_Montage` (+ Attack02, Attack_Base, Attack)
---
## Player_Cleric
**Path:** `/Game/_Main/Blueprints/Characters/PlayerCharacters/PlayerCharacterClasses/Cleric/Player_Cleric`
| Slot/System | Entry point | Parent called | Server path | Multicast/client path | Validation | Resource | Damage/effect | Animation | End/cleanup | Status | Evidence |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Ability 001 | Server_Ability_001_Begin | No | Gate → CurrentlyAttacking → CanMove false → Multicast_PlayMontage(random Ability001Montages) | Multicast_PlayMontage | Gate | None | **No UseAbility001** — no hit path | Cleric_PrimaryAttack_* | End not local | **Partial** (montage only) | subgraph |
| Ability 002 | Server_Ability_002_Begin; UseAbility002 | No | Gate → FCanUseMana(Ability002ManaCost) → CurrentlyAttacking → CanMove true → Multicast_PlayMontage(Cleric_Ability002_Montage) | Multi_SpawnParticle (EmitterTemplate **empty**); UseAbility002 Authority heal | Gate + mana | DEPRECATED_Ability002ManaCost | SphereOverlap 400 tag Player → DEPRECATED_RecoverPlayerHealth(Ability002Damage); self heal | Cleric_Ability002_Montage | End not local | **Partial** (heal works; particle empty) | subgraph |
| Ability 003 | Server_Ability_003_Begin; Server_Ability_003_End; ConcentrateHandle; EndConcentrate | No | Mana≥cost → DivineCircleActive + SetTimer 0.25 ConcentrateHandle | ConcentrateHandle: Multicast_PlayMontage(Cleric_Ability003) + ApplyDamage(Ability003Damage) on non-Player | Gate + mana | DEPRECATED_Ability003ManaCost | ApplyDamage DoT | Cleric_Ability003_Montage (in timer) | End → EndConcentrate clears timer/state | **Implemented** | subgraph + DSL |
| Ability 004 | Server_Ability_004_Begin; UseAbility004 | No | Gate → FCanUseMana called but Branch Condition=**literal true** (CanUse unwired) → montage | UseAbility004: find ClosestEnemy tag Enemy → SpawnActor **Class empty** | Gate; mana bypassed | DEPRECATED_Ability004ManaCost (unused result) | Spawn params Damage=20 HealPerHit=10 (unwired class) | Cleric_Ability004_Montage | End not local | **Partial / Existing Baseline Defect** | subgraph |
| Basic attack | Ability 001 montage | No | Same | Same | Same | — | Missing hit | PrimaryAttack montages | — | **Partial** | — |
| Passive | — | — | — | — | — | — | — | — | — | **Missing** | — |
| Death / HUD | Inherited | — | Base | Base | — | — | — | — | — | **Inherited** | — |
**Cleric GE** `GE_Cleric_DefaultAttributes` exists but **0 referencers**; not in ability graphs.
---
## Player_Wizard
**Path:** `/Game/_Main/Blueprints/Characters/PlayerCharacters/PlayerCharacterClasses/Wizard/Player_Wizard`
| Slot/System | Entry point | Parent called | Server path | Multicast/client path | Validation | Resource | Damage/effect | Animation | End/cleanup | Status | Evidence |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Ability 001004 | Inherited Server_Ability_* only | N/A | Base PrintString | — | — | — | — | — | Base empty End | **Stub** (inherited PrintString) | list_events + EventGraph walk |
| Basic attack | Same | N/A | Stub | — | — | — | — | — | — | **Stub** | — |
| Passive | — | — | — | — | — | — | — | — | — | **Missing** | — |
| Death / HUD | Inherited | Tick/Overlap Parent yes; BeginPlay **no Parent** | Base | Base | — | — | — | — | — | **Inherited** | subgraph |
| Alternate paths | UseAbility* false; no Input/Montage/spell nodes | — | — | — | — | — | — | — | — | **Missing** | find_nodes |
| Unwired assets | NS_Wizard_Ability001; GE_Wizard_DefaultAttributes; BP_PlayerProjectile | — | — | — | — | — | — | — | — | **Present but Unconnected** | deps/referencers |
Local vars `EnemyFound`, `IsBlocking`, `ClosestEnemy`: **declared, zero EventGraph uses**.
---
## Player_Gunslinger
**Path:** `/Game/_Main/Blueprints/Characters/PlayerCharacters/PlayerCharacterClasses/Gunslinger/Player_Gunslinger`
| Slot/System | Entry point | Parent called | Server path | Multicast/client path | Validation | Resource | Damage/effect | Animation | End/cleanup | Status | Evidence |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Ability 001004 | Inherited only | N/A | Base PrintString | — | — | — | — | — | Base empty End | **Stub** (inherited) | IsDataOnly + deps |
| Basic attack | Inherited stub | N/A | Stub | — | — | — | — | — | — | **Stub** | — |
| Passive | — | — | — | — | — | — | — | — | — | **Missing** | — |
| Death / HUD | Inherited; BeginPlay Parent | Yes | Base | Base | — | — | — | — | — | **Inherited** | subgraph |
| Weapon/projectile | None | — | — | — | — | — | — | — | — | **Missing** | deps only base |
**IsDataOnly=True.** No GE_Gunslinger. Referencers registry [].
---
## Cross-character RPC inventory (ability-related)
| Event | Paladin | Amazonian | Cleric | Wizard | Gunslinger |
|---|---|---|---|---|---|
| Server_Ability_001_Begin | Local override | Local | Local | Inherit stub | Inherit stub |
| Server_Ability_001_End | Inherit empty | Inherit empty | Inherit empty | Inherit | Inherit |
| Server_Ability_002_Begin | Local (block) | Inherit stub | Local | Inherit | Inherit |
| Server_Ability_002_End | Local | Inherit | Inherit empty | Inherit | Inherit |
| Server_Ability_003_Begin | Local (charge) | Inherit | Local (DivineCircle) | Inherit | Inherit |
| Server_Ability_003_End | Inherit | Inherit | Local → EndConcentrate | Inherit | Inherit |
| Server_Ability_004_Begin | Local | Inherit | Local (mana bypass) | Inherit | Inherit |
| Server_Ability_004_End | Inherit | Inherit | Inherit | Inherit | Inherit |
| UseAbility001 | Local Authority damage | Local Authority damage | Missing | Missing | Missing |
| UseAbility002 | Missing | Missing | Local Authority heal | Missing | Missing |
| UseAbility004 | Local Authority AoE | Missing | Local Authority spawn broken | Missing | Missing |
| Charge / Client_Charge | Local | — | — | — | — |
| ConcentrateHandle / EndConcentrate | — | — | Local | — | — |
Reliability: **Unknown — MCP property visibility limitation** for all CustomEvents.
---
## Resource and legacy-state inventory
| Symbol | Readers/Writers | Notes |
|---|---|---|
| DEPRECATED_Ability001Damage | Paladin UseAbility001; Amazonian UseAbility001 | ApplyDamage BaseDamage |
| DEPRECATED_Ability003Damage | Paladin ChargeBox | ApplyDamage |
| DEPRECATED_Ability004Damage | Paladin UseAbility004 | ApplyDamage |
| DEPRECATED_Ability002Damage | Cleric UseAbility002 | Heal amount via RecoverPlayerHealth |
| DEPRECATED_Ability00{2,3,4}ManaCost | Paladin 003/004; Cleric 002/003/004 | FCanUseMana / compare |
| DEPRECATED_CurrentHealth | Amazonian AnyDamage | Subtract + death check |
| DEPRECATED_RecoverPlayerHealth | Cleric UseAbility002 | Interface message |
| CurrentlyAttacking / IsDead | All ability gates | Replicated on base |
| IsBlocking | Paladin 002 Begin/End | Local; AnimBP dependency Unknown |
| PerformingWhirlwind | Amazonian AnyDamage | Get only — never Set |
| DivineCircleActive / TimerHandle | Cleric 003 | Timer loop |
**No ASC attribute reads/writes in ability graphs.** No GameplayAbility grant/activate.
---
## Authority / networking findings (flags, no fixes)
- Client IA → Server Begin: Observed Implementation
- Damage on UseAbility* / ChargeBox: Authority SwitchHasAuthority — Observed Implementation
- Multicast used for montage/SFX/particle presentation — Observed Implementation
- Cleric Ability 004: mana CanUse **unwired** (literal true) — Existing Baseline Defect
- Cleric Ability 004: SpawnActor Class empty — Existing Baseline Defect
- Multi_SpawnParticle EmitterTemplate empty (Paladin 004, Cleric 002) — Partially Implemented
- End events missing for most slots — Incomplete Refactor
- Amazonian/Paladin Ability 001: no mana cost — Observed Implementation
- Dual HUD still uses DEPRECATED floats on Server_UpdateHUD — Incomplete Refactor (Batch 2)
---
## Status rollup
| Classification | Characters / slots |
|---|---|
| **Implemented** | Paladin 001, 003, 004 (with noted FX holes); Amazonian 001; Cleric 003 |
| **Partial** | Paladin 002; Cleric 001, 002, 004; Amazonian End/whirlwind |
| **Stub** | Wizard 001004; Gunslinger 001004 (inherited PrintString) |
| **Missing** | Wizard/Gunslinger combat bodies; most Ends; UseAbility on Wizard/Gunslinger |
| **Present but Unconnected** | NS_Wizard_Ability001; GE_* DefaultAttributes orphans; BP_PlayerProjectile; PerformingWhirlwind setter |
| **Deprecated connected** | All DEPRECATED_* damage/mana/health in active paths |
---
## Migration relevance (inventory only)
Replacement targets: IA→Server custom events; ApplyDamage/RecoverPlayerHealth; FCanUseMana + DEPRECATED costs; Multicast_PlayMontage; Charge timeline; DivineCircle timer; dual HUD floats.
@@ -2,12 +2,12 @@
**Status: Draft** **Status: Draft**
- **Scope (Batch 1 seed):** Native GAS scaffolding — ASC ownership, AttributeSet, empty GameplayAbility base, EffectActor GE application, default-attribute property, tags from config. Full GE CDO / cue / grant-path inventory deferred. - **Scope:** Native GAS scaffolding (Batch 1) plus Batch 2 Blueprint seeds: BP_PlayerState defaults, legacy ability confirmation, dual HUD attribute paths.
- **Inspection method:** Native C++ read; AttributeSetToolset not re-run this batch (calibration prior); GameplayTags from DefaultGameplayTags.ini; subclass search for URIRGameplayAbility. - **Inspection method:** Native C++ read; Batch 2 ObjectTools on `BP_PlayerState` CDO; BlueprintTools on `BP_PlayerCharacterBase` for ASC/GA absence in ability graphs.
- **Last updated:** 2026-07-16 - **Last updated:** 2026-07-16
- **Current phase:** Phase 1 — Static Architecture - **Current phase:** Phase 1 — Static Architecture
- **Last completed pass:** Pass 2 (Batch 1) - **Last completed pass:** Pass 6 (Batch 3)
- **Next pass expected to contribute:** Batch 4 Pass 7 - **Next pass expected to contribute:** Batch 4 Pass 7 (GE/cue inventory)
## Draft tracking ## Draft tracking
@@ -19,28 +19,31 @@
- URIRGameplayAbility empty + no subclasses - URIRGameplayAbility empty + no subclasses
- EffectActor ApplyEffectToTarget mechanism - EffectActor ApplyEffectToTarget mechanism
- Project gameplay tags from config - Project gameplay tags from config
- **BP_PlayerState `DefaultAttributesGameplayEffect` = None** (Pass 3)
- Confirmation: abilities remain legacy BP `Server_Ability_*` (Pass 56 / doc 05)
- **Pass 6:** No ASC activate/grant/GameplayEffect apply in any connected ability path on five playables
### Pending sections ### Pending sections
- Default attribute GE CDO modifiers per character - Default attribute GE CDO modifiers per character (Pass 7)
- Gameplay Cue inventory - Gameplay Cue inventory
- Ability granting paths in Blueprints
- Tag referencers - Tag referencers
- Runtime ASC state (PIE-gated) - Runtime ASC state (PIE-gated)
### Evidence still required ### Evidence still required
- Whether BP_PlayerState assigns/applies `DefaultAttributesGameplayEffect` - Whether any other actor/BP applies default-attribute GEs at spawn
- Whether any Blueprint grants `URIRGameplayAbility` or engine GA classes - Whether OverlayWidgetController path and DEPRECATED HUD path both run in PIE
- Full GE asset inventory and referencer map (Pass 7)
--- ---
## Distinctions (Batch 1) ## Distinctions
| Layer | Status | Evidence | | Layer | Status | Evidence |
|-------|--------|----------| |-------|--------|----------|
| GAS infrastructure | Present | ASC, AttributeSet, IAbilitySystemInterface, EffectActor | | GAS infrastructure | Present | ASC, AttributeSet, IAbilitySystemInterface, EffectActor |
| GAS data | Partially present | Tags in INI; GE assets exist (calibration); DefaultAttributes property | | GAS data | Partially present | Tags in INI; GE assets exist (calibration); DefaultAttributes property |
| GAS runtime abilities | Not observed | No URIRGameplayAbility subclasses; calibration: no GA assets | | GAS runtime abilities | Not observed | No URIRGameplayAbility subclasses; no GA assets; base EventGraph has no ASC activate |
| Legacy BP abilities | Not inspected this batch | Calibration: Server_Ability_*, UseAbility* on Paladin | | Legacy BP abilities | **Documented (Batch 2)** | `05-LegacyAbilityArchitecture.md`: IA → Server_Ability_* → Multicast montage |
--- ---
@@ -70,21 +73,45 @@ Constructor inits Health/MaxHealth/Mana/MaxMana only; Stamina/MaxStamina not Ini
`DefaultAttributesGameplayEffect` on PlayerState: declared, **not applied in native**. `DefaultAttributesGameplayEffect` on PlayerState: declared, **not applied in native**.
**Batch 2 Observed Implementation:** `/Game/_Main/Blueprints/Player/BP_PlayerState` CDO property `defaultAttributesGameplayEffect` = **None**. Assignment/application path remains missing at both C++ and this BP.
--- ---
## Abilities ## Abilities
`URIRGameplayAbility`: InstancedPerActor only. **No project subclasses** (search_subclasses). `URIRGameplayAbility`: InstancedPerActor only. **No project subclasses** (search_subclasses).
**Conclusion (Observed Implementation):** No project-defined UGameplayAbility subclasses, Gameplay Ability assets, or **Conclusion (Observed Implementation):** No project-defined UGameplayAbility subclasses, Gameplay Ability assets, or static ability-granting paths observed. Playable abilities are legacy Blueprint custom events (`Server_Ability_*`) with Enhanced Input on `BP_PlayerCharacterBase` — see `05-LegacyAbilityArchitecture.md`.
static ability-granting paths have been observed so far.
Current evidence supports that the playable abilities have not yet been ---
converted into discrete Gameplay Ability implementations. This must be
reconfirmed during the dedicated GAS and Blueprint passes. ## Dual attribute UI paths (Batch 2)
| Path | Source | Consumer |
|------|--------|----------|
| Native GAS | `InitAbilityActorInfo``ARIRHUD::InitOverlay` → OverlayWidgetController ASC delegates | `WBP_Overlay` via `WBP_PlayerHUD` (AHUD) deps |
| Legacy BP | `Server_UpdateHUD` / `InitializeHUD` using `DEPRECATED_Current/Max Health/Mana` | `BPI_PlayerController.UpdatePlayerHUD` |
Both are Observed Implementation. Incomplete Refactor — legacy path still active.
--- ---
## Effects ## Effects
`ARIREffectActor::ApplyEffectToTarget` applies Instant/Duration class via ASC MakeOutgoingSpec + ApplyGameplayEffectSpecToSelf. Overlap/authority logic expected in Blueprint children (Batch 4 Pass 10 / doc 12). `ARIREffectActor::ApplyEffectToTarget` applies Instant/Duration class via ASC MakeOutgoingSpec + ApplyGameplayEffectSpecToSelf. Overlap/authority logic expected in Blueprint children (Batch 4 Pass 10 / doc 12).
---
## Pass 6 — GAS interactions encountered on playables
| Asset / interaction | Character | Status | Classification |
|---|---|---|---|
| ASC ActivateAbility / GrantAbility | All five | Not found in ability graphs | Observed Implementation (absence) |
| ApplyGameplayEffect / GE Spec | All five ability paths | Not found | Observed Implementation (absence) |
| `GE_Cleric_DefaultAttributes` | Cleric | Asset exists; 0 referencers; not in ability graphs | Present but Unconnected |
| `GE_Wizard_DefaultAttributes` | Wizard | Asset exists; unwired | Present but Unconnected |
| `GE_Gunslinger_*` | Gunslinger | Not found | Missing |
| `NS_Wizard_Ability001` | Wizard | Niagara present; unwired | Present but Unconnected |
| Damage / heal | Paladin / Amazonian / Cleric | `ApplyDamage` / `DEPRECATED_RecoverPlayerHealth`**not** GE | Observed Implementation |
**Conclusion (Observed Implementation):** Pass 6 reconfirms playable combat is legacy Blueprint. Character-named DefaultAttributes GE assets are orphaned relative to ability graphs and `BP_PlayerState.DefaultAttributesGameplayEffect=None`. Systemwide GE/cue archaeology remains Pass 7.
+147 -21
View File
@@ -2,49 +2,175 @@
**Status: Draft** **Status: Draft**
- **Scope (Batch 1 seed):** Native player character lineage and discovered Blueprint child paths only. No per-character ability inventory yet. - **Scope:** Player character Blueprint hierarchy (Pass 3), shared base architecture (Pass 5), and per-character Ability 001004 connected-path reconstruction (Pass 6).
- **Inspection method:** Native C++ + `search_subclasses` path listing. - **Inspection method:** Read-only AssetTools + BlueprintTools + ObjectTools; connected subgraphs on all five playables + base correlation.
- **Last updated:** 2026-07-16 - **Last updated:** 2026-07-16
- **Current phase:** Phase 1 — Static Architecture - **Current phase:** Phase 1 — Static Architecture
- **Last completed pass:** Pass 2 (Batch 1) - **Last completed pass:** Pass 6 (Batch 3)
- **Next pass expected to contribute:** Batch 2 Pass 3 (hierarchy), Pass 5 (base deep dive); Batch 3 Pass 6 (per-character) - **Next pass expected to contribute:** Batch 4 Pass 7 / Pass 8
## Draft tracking ## Draft tracking
### Completed sections ### Completed sections
- Native parent chain for players - Native player chain + ASC ownership (Batch 1)
- InitAbilityActorInfo / HUD overlay hook - Blueprint parent chains and structural sheets for five playables + base
- Exact Blueprint subclass paths for five playable classes + base - Shared input / RPC / death / HUD / multicast architecture
- Interface BPI_PlayerCharacter surface
- Override matrix (which Server_Ability events children implement)
- **Pass 6:** Full Ability 001004 path reconstruction per character — see `05-LegacyAbilityArchitecture.md`
- Charge / DivineCircle / Whirlwind / UseAbility hit paths inventoried
- Montage dependency seeds — see `10-AnimationDependencies.md`
### Pending sections ### Pending sections
- Components, weapons, AnimBP, inputs, abilities per character - AnimNotify → UseAbility wiring (Pass 8)
- Shared vs duplicated Blueprint behavior - Weapon component deep dive if separate assets exist beyond overlaps
- Interface BPI_PlayerCharacter - Gunslinger intended design (no static implementation)
### Evidence still required ### Evidence still required
- Full Blueprint variable/graph inventory (Batch 2+) - Exact who calls UseAbility* (likely AnimNotify — Pass 8)
- PlayerDeath callers beyond Amazonian ReceiveAnyDamage
--- ---
## Native player chain ## Native player chain
`ACharacter``ARIRBaseCharacter``ARIRPlayerCharacter` (Blueprint) `BP_PlayerCharacterBase``Player_*` `ACharacter``ARIRBaseCharacter``ARIRPlayerCharacter``BP_PlayerCharacterBase``Player_*`
**Observed Implementation:** Players do not create ASC on the pawn; ASC lives on `ARIRPlayerState`. Character caches ASC/AttributeSet pointers after possession / PlayerState replication. **Observed Implementation:** ASC on `ARIRPlayerState`; character caches pointers in `InitAbilityActorInfo`. Native also calls `ARIRHUD::InitOverlay` (GAS attribute UI path).
--- ---
## Playable Blueprint paths (seeds) ## Playable Blueprint paths
| Character | Asset path | | Character | Asset path |
|-----------|------------| |-----------|------------|
| Base | `/Game/_Main/Blueprints/Characters/PlayerCharacters/BP_PlayerCharacterBase` | | Base | `/Game/_Main/Blueprints/Characters/PlayerCharacters/BP_PlayerCharacterBase` |
| Paladin | `/Game/_Main/Blueprints/Characters/PlayerCharacters/PlayerCharacterClasses/Paladin/Player_Paladin` | | Paladin | `.../PlayerCharacterClasses/Paladin/Player_Paladin` |
| Amazonian | `/Game/_Main/Blueprints/Characters/PlayerCharacters/PlayerCharacterClasses/Amazonian/Player_Amazonian` | | Amazonian | `.../Amazonian/Player_Amazonian` |
| Cleric | `/Game/_Main/Blueprints/Characters/PlayerCharacters/PlayerCharacterClasses/Cleric/Player_Cleric` | | Cleric | `.../Cleric/Player_Cleric` |
| Wizard | `/Game/_Main/Blueprints/Characters/PlayerCharacters/PlayerCharacterClasses/Wizard/Player_Wizard` | | Wizard | `.../Wizard/Player_Wizard` |
| Gunslinger | `/Game/_Main/Blueprints/Characters/PlayerCharacters/PlayerCharacterClasses/Gunslinger/Player_Gunslinger` | | Gunslinger | `.../Gunslinger/Player_Gunslinger` |
**Naming note:** Use `Player_Amazonian`, not `Player_Amazon`. Default-attribute GE folder uses `Amazon` naming (calibration) — naming ambiguity for Batch 4/7. **Observed Runtime Behavior (project brief, not re-tested):** Amazonian melee works; most abilities inactive; Gunslinger incomplete — Existing Baseline Defects.
**Known runtime baseline (Observed Runtime Behavior from project brief, not re-tested):** Amazonian melee works; most abilities inactive; Gunslinger incomplete — Existing Baseline Defects, not migration regressions. ---
## BP_PlayerCharacterBase — shared architecture
Full ability/RPC inventory: [`05-LegacyAbilityArchitecture.md`](05-LegacyAbilityArchitecture.md).
### Components (Observed Implementation)
- Camera: TPSpringArm, ThirdPersonCamera, CameraPositionRef
- Footsteps: BP_FootstepComponent_Left / Right (EasyFootstepSystem)
- Native mesh / capsule / movement / arrow
### Shared vs child-owned behavior
| Concern | Shared on base | Child-specific |
|---------|----------------|----------------|
| Ability input IA_001004 | Yes — calls Server_Ability_* | Bodies overridden |
| Camera zoom/pan | Yes | — |
| Multicast montage/SFX/VFX | Yes helpers | Children supply montage assets |
| Death / respawn | Yes | — |
| HUD via DEPRECATED floats | Yes | — |
| Charge / DivineCircle / Whirlwind | — | Paladin / Cleric / Amazonian |
| Hit checks | — | PlayerHitCheck on Paladin/Amazonian/Cleric |
### BeginPlay / Possessed (Observed Implementation)
- BeginPlay: Set `InitialSpawnLocation` = GetActorLocation only
- Possessed: Set `PlayerController` → Delay 0.4 → `Server_UpdateHUD`
### Ability flow (shared)
```
IA_Ability_N Started → Server_Ability_N_Begin
IA_Ability_N Completed/Canceled → Server_Ability_N_End
```
Base Begin stubs PrintString `"Override Ability N"`. Base End stubs empty.
**Paladin Ability 001 override (Observed Implementation):** Does **not** call parent. Gate `NOT CurrentlyAttacking AND NOT IsDead` → set CurrentlyAttacking → SetPlayerCanMove(true) → Multicast_PlayMontage(random Ability001Montages). **Pass 6:** UseAbility001 Authority BoxOverlap → ApplyDamage(`DEPRECATED_Ability001Damage`). Full tables → `05-LegacyAbilityArchitecture.md`.
---
## Per-character structural sheets
### Paladin
| Field | Value |
|-------|--------|
| Graphs | UCS, EventGraph, GetPlayerPaladinREF, PlayerHitCheck |
| Local vars | Ability001Montages, ChargeStartLoc, ChargeFinishLoc, IsCharging, IsBlocking |
| AnimBP | ABP_Paladin |
| Ability events implemented | Server_001 Begin; 002 Begin+End; 003 Begin; 004 Begin; UseAbility001/004; Charge; Client_Charge |
| Parent Call on Ability overrides | **No** |
| Pass 6 status | 001 Implemented; 002 Partial (block); 003 Implemented (charge+damage); 004 Implemented (empty particle template) |
### Amazonian
| Field | Value |
|-------|--------|
| Graphs | UCS, EventGraph, GetPlayerAmazonREF, PlayerHitCheck |
| Local vars | DynamicMaterials, Ability001Montage, PerformingWhirlwind |
| AnimBP (deps) | ABP_Amazon |
| Ability events | Server_001 Begin; UseAbility001; ReceiveAnyDamage |
| Pass 6 status | 001 Implemented (= known working melee); 002004 inherited stubs; PerformingWhirlwind never Set |
### Cleric
| Field | Value |
|-------|--------|
| Graphs | UCS, EventGraph, GetPlayerClericREF, PlayerHitCheck |
| Local vars | Ability001Montages, DivineCircleActive, DivineCircleTimerHandle, IsBlocking, EnemyFound, ClosestEnemy |
| Ability events | Server_001004 Begin; Server_003 End; UseAbility002/004; ConcentrateHandle; EndConcentrate |
| Parent Call on Ability overrides | **No** |
| Pass 6 status | 001 Partial (montage only); 002 Partial heal (empty particle); 003 Implemented DivineCircle; 004 Broken spawn + mana bypass |
### Wizard
| Field | Value |
|-------|--------|
| Graphs | UCS, EventGraph, GetPlayerWizardREF |
| Local vars | EnemyFound, IsBlocking, ClosestEnemy (unused in EventGraph) |
| Ability events | **None** implemented (BeginPlay/Tick/Overlap only) |
| BeginPlay Parent | **No** (skips base InitialSpawnLocation set) |
| Pass 6 status | 001004 inherited PrintString stubs; NS_Wizard_Ability001 / GE_Wizard_DefaultAttributes / BP_PlayerProjectile unwired |
### Gunslinger
| Field | Value |
|-------|--------|
| IsDataOnly | True |
| Graphs | UCS, EventGraph |
| Local vars | [] |
| Dependencies | Only BP_PlayerCharacterBase |
| BeginPlay/Tick/Overlap | Call Parent |
| Pass 6 status | 001004 inherited PrintString stubs; no weapon/projectile/AnimBP/GE |
---
## Interfaces
`BP_PlayerCharacterBase` implements `BPI_PlayerCharacter`. Class REF getters on base return self-cast nulls for wrong class; children override own REF.
`BPI_PlayerController` used heavily for SetPlayerCanMove, UpdatePlayerHUD, PlayerRespawn, AddKill.
---
## GAS interaction findings (character side)
| Finding | Classification |
|---------|----------------|
| No GA grant/activate on base or child ability EventGraphs | Observed Implementation |
| Server_UpdateHUD uses DEPRECATED floats, not ASC | Observed Implementation |
| Native InitOverlay still runs from C++ possession | Observed Implementation (Batch 1) |
| Dual UI attribute paths | Incomplete Refactor |
| Character DefaultAttributes GE assets orphaned | Present but Unconnected (Pass 6) |
---
## Networking summary
See `05` RPC inventory. Replicated: IsDead, CurrentlyAttacking, DEPRECATED resource floats. Ability activation: client Enhanced Input → Server custom events → optional Multicast FX. Reliability: Unknown — MCP property visibility limitation.
@@ -2,11 +2,11 @@
**Status: Draft** **Status: Draft**
- **Scope (Batch 1 seed):** Native enemy class only + Blueprint child path seeds. No Behavior Tree assumption. No deep enemy Blueprint graph walk yet. - **Scope:** Native enemy class (Batch 1) + Pass 3 structural Blueprint inventory. Deep Tick/overlap/AI graph walk deferred to Pass 9.
- **Inspection method:** Read `ARIRBaseEnemyCharacter`; calibration prior (no BT/BB/custom AIController assets); subclass path search. - **Inspection method:** Native read; Batch 2 AssetTools tags + BlueprintTools list_graphs/events/variables/deps.
- **Last updated:** 2026-07-16 - **Last updated:** 2026-07-16
- **Current phase:** Phase 1 — Static Architecture - **Current phase:** Phase 1 — Static Architecture
- **Last completed pass:** Pass 2 (Batch 1) - **Last completed pass:** Pass 3 (Batch 2) — structural only
- **Next pass expected to contribute:** Batch 4 Pass 9 - **Next pass expected to contribute:** Batch 4 Pass 9
## Draft tracking ## Draft tracking
@@ -14,12 +14,13 @@
### Completed sections ### Completed sections
- Native enemy ASC ownership and highlight interface - Native enemy ASC ownership and highlight interface
- Confirmation: no chase/attack/MoveTo in native C++ - Confirmation: no chase/attack/MoveTo in native C++
- Blueprint child paths - Blueprint child paths + Pass 3 structural sheets
- BPI_EnemyCharacter API surface
### Pending sections ### Pending sections
- BP_EnemyCharacterBase / BP_Enemy_Skeleton graphs (Tick, overlaps, MoveTo, timers) - Connected Tick / overlap / timer / MoveTo graphs on enemy BPs
- AIControllerClass / AutoPossessAI on CDOs - AIControllerClass / AutoPossessAI on CDOs (reconfirm)
- Reconfirm BT asset absence - Consumers of GetASC on enemies
### Evidence still required ### Evidence still required
- Where chase/attack was intended to live (Blueprint vs missing) - Where chase/attack was intended to live (Blueprint vs missing)
@@ -40,6 +41,36 @@
**Calibration (prior Observed Implementation):** Stock `/Script/AIModule.AIController`; AutoPossessAI PlacedInWorld on skeleton instance; no project BehaviorTree assets. **Calibration (prior Observed Implementation):** Stock `/Script/AIModule.AIController`; AutoPossessAI PlacedInWorld on skeleton instance; no project BehaviorTree assets.
**Issue:** Existing Baseline Defect (enemy chase/attack nonfunctional per project brief). Static native code alone cannot confirm root cause. **Issue:** Existing Baseline Defect (enemy chase/attack nonfunctional per project brief).
**Blueprint seeds:** `BP_EnemyCharacterBase`, `BP_Enemy_Skeleton`. ---
## Pass 3 Blueprint structure (not Pass 9 deep dive)
### `BP_EnemyCharacterBase`
| Field | Value |
|-------|--------|
| Path | `/Game/_Main/Blueprints/Characters/Enemies/BP_EnemyCharacterBase` |
| Parent | `RIRBaseEnemyCharacter` |
| IsDataOnly | True |
| Graphs | UserConstructionScript, EventGraph |
| Variables | [] |
| Implemented events | ReceiveBeginPlay, ReceiveTick, ReceiveActorBeginOverlap |
| Deps | `/Script/REALMSINRUIN` only |
### `BP_Enemy_Skeleton`
| Field | Value |
|-------|--------|
| Path | `/Game/_Main/Blueprints/Characters/Enemies/Skeleton/BP_Enemy_Skeleton` |
| Parent | `BP_EnemyCharacterBase_C` |
| Interface | `BPI_EnemyCharacter` (`GetEnemyREF`) |
| Graphs | UCS, EventGraph, GetEnemyREF |
| Variables | [] |
| Implemented events | ReceiveBeginPlay, ReceiveTick, ReceiveActorBeginOverlap |
| Deps | SKM_Skeleton_Guard_Body, BPI_EnemyCharacter, BP_EnemyCharacterBase, ABP_Skeleton, REALMSINRUIN |
### `BPI_EnemyCharacter`
Graphs: `GetEnemyREF`, `AddPlayerTarget`, `EnemyMeleeAttack`**Documented Intent** surface for targeting/melee; connected implementations on Skeleton/base **not traced in Batch 2** (Pass 9).
@@ -0,0 +1,93 @@
# 10 — Animation Dependencies
**Status: Draft**
- **Scope:** Montage and AnimInstance seeds discovered during Pass 6 ability-path reconstruction. Not a full AnimBP / notify archaeology pass.
- **Inspection method:** Connected subgraphs on character ability events; AssetTools dependency paths when visible on Multicast_PlayMontage pins.
- **Evidence classifications used:** Observed Implementation, Inferred, Unknown.
- **Tool or visibility limitations:** Montage section names, play rate, start position, and AnimNotify tracks not deep-inspected — Defer Pass 8. Root-motion requirements Unknown without Montage asset inspection.
- **Last updated:** 2026-07-16
- **Current phase:** Phase 1 — Static Architecture
- **Last completed pass:** Pass 6 (Batch 3)
- **Next pass expected to contribute:** Batch 4 Pass 8
## Draft tracking
### Completed sections
- Per-character Montage asset paths tied to Ability 001004 Begin paths
- AnimBP class references from character deps (structural)
- Notes on UseAbility* vs Montage timing (inferred notify dependency)
### Pending sections
- AnimNotify → UseAbility* wiring
- Montage section / blend / root-motion details
- ABP state machines reacting to IsBlocking / CurrentlyAttacking
### Evidence still required
- Exact notify names that call UseAbility001 / UseAbility002 / UseAbility004
- Whether End events stop montages (most Ends missing)
---
## Shared helper
| Helper | Owning BP | Behavior |
|---|---|---|
| Multicast_PlayMontage | BP_PlayerCharacterBase | Multicast → PlayMontage on mesh AnimInstance |
Gameplay effects (ApplyDamage / heal / spawn) observed **after** Montage Begin in separate UseAbility* or timer/overlap events — typically **during** Montage if notify-driven. Exact notify wiring: **Unknown — Requires Manual Editor Inspection / Pass 8**.
---
## Player_Paladin
| Ability | Montage path(s) | AnimInstance | Gameplay vs Montage | End stops Montage? |
|---|---|---|---|---|
| 001 | `/Game/_Main/Animations/PlayerCharacters/Human/CharacterClasses/Paladin/AnimMontages/Attack_A_Fast_Montage` (+ B, C, D_Fast) via `Ability001Montages` array random | ABP_Paladin | UseAbility001 ApplyDamage separate Authority path | Unknown (no local End) |
| 002 | None in Begin subgraph | ABP_Paladin | IsBlocking state only — AnimBP reaction Inferred | End clears IsBlocking; Montage stop Unknown |
| 003 | ChargeTimeline (not Montage) | ABP_Paladin | ChargeBox ApplyDamage during charge | No local 003 End |
| 004 | `/Game/_Main/Animations/PlayerCharacters/Human/CharacterClasses/Paladin/AnimMontages/Abilities/Paladin_Ability004_Montage` | ABP_Paladin | UseAbility004 AoE + SFX separate | Unknown |
SFX: `MagicSpell_01_Cue` via Multicast_PlaySFX on Ability 004 UseAbility path.
---
## Player_Amazonian
| Ability | Montage path(s) | AnimInstance | Gameplay vs Montage | End stops Montage? |
|---|---|---|---|---|
| 001 | `/Game/_Main/Animations/PlayerCharacters/Human/CharacterClasses/Amazon/AnimMontages/A_Hu_F_Combat_2H_Attack01_Montage` (+ Attack02, Attack_Base, Attack) via `Ability001Montage` array | ABP_Amazon | UseAbility001 Authority damage separate | Unknown (no local End) |
| 002004 | None (inherited stubs) | — | — | — |
**Observed Runtime Behavior:** Amazonian melee (Ability 001 path) is the known working combat baseline.
---
## Player_Cleric
| Ability | Montage path(s) | Notes |
|---|---|---|
| 001 | Cleric_PrimaryAttack_* via Ability001Montages | Montage only — no UseAbility001 |
| 002 | Cleric_Ability002_Montage | Heal in UseAbility002 |
| 003 | Cleric_Ability003_Montage | Played inside ConcentrateHandle timer loop |
| 004 | Cleric_Ability004_Montage | Spawn broken; montage still plays |
Exact `/Game/...` Cleric montage folder paths: recorded as class-named montages under Cleric AnimMontages in deps — full absolute paths Require Manual Editor Confirmation if not pinned in subgraph (Observed Implementation of PlayMontage call; path strings from character asset deps).
---
## Player_Wizard / Player_Gunslinger
No ability Montage invocations. No character-local Multicast_PlayMontage callers for abilities.
---
## Cleanup / End dependency summary
| Character | Ability End stops Montage? |
|---|---|
| Most slots | **Unknown / Missing End** — Server_Ability_*_End not overridden; base End empty |
| Paladin 002 | Clears IsBlocking / CurrentlyAttacking / CanMove — Montage stop not observed |
| Cleric 003 | EndConcentrate clears timer / DivineCircleActive — Montage stop not observed |
Root motion required: **Unknown — Defer Pass 8**.
@@ -2,11 +2,11 @@
**Status: Draft** **Status: Draft**
- **Scope (Batch 1 seed):** Native HUD / widget-controller / attribute-delegate path; Advanced Sessions plugin presence. No widget tree or session Blueprint flow yet. - **Scope:** Native HUD / widget-controller path (Batch 1); Pass 3 resolution of `WBP_PlayerHUD` and GM/PC framework ties. Full frontend/session graphs deferred to Batch 4.
- **Inspection method:** Native C++ read; PluginToolset; subclass seeds. - **Inspection method:** Native C++ read; Batch 2 AssetTools class/tags/deps/refs; ObjectTools GM_Dungeoneer CDO; BlueprintTools PC_Character.
- **Last updated:** 2026-07-16 - **Last updated:** 2026-07-16
- **Current phase:** Phase 1 — Static Architecture - **Current phase:** Phase 1 — Static Architecture
- **Last completed pass:** Pass 2 (Batch 1) - **Last completed pass:** Pass 3 (Batch 2)
- **Next pass expected to contribute:** Batch 4 Passes 4 + 10 - **Next pass expected to contribute:** Batch 4 Passes 4 + 10
## Draft tracking ## Draft tracking
@@ -16,35 +16,69 @@
- OverlayWidgetController attribute broadcasts/bindings - OverlayWidgetController attribute broadcasts/bindings
- AdvancedSessions / AdvancedSteamSessions enabled + descriptor paths - AdvancedSessions / AdvancedSteamSessions enabled + descriptor paths
- Widget subclass path seeds - Widget subclass path seeds
- **WBP_PlayerHUD resolved as AHUD (`RIRHUD` child)**
- GM_Dungeoneer assigns HUDClass / PC / PS
### Pending sections ### Pending sections
- Main menu / browser / character-select widget flow - Main menu / browser / character-select widget flow
- Production vs Example Advanced Sessions Blueprints - Production vs Example Advanced Sessions Blueprints
- WBP_Overlay / progress bar bindings - WBP_Overlay / progress bar bindings deep dive
- CommonUI usage - CommonUI usage
- BPI_PlayerController.UpdatePlayerHUD widget targets
### Evidence still required ### Evidence still required
- Whether HUD class defaults assign OverlayWidgetClass / ControllerClass - Whether both Overlay ASC HUD and DEPRECATED UpdatePlayerHUD run in PIE
- Session create/find/join graphs - Session create/find/join graphs
--- ---
## WBP_PlayerHUD resolution (Pass 3)
| Field | Value |
|-------|--------|
| Path | `/Game/_Main/UI/Widgets/HUD/WBP_PlayerHUD` |
| Asset class | `WBP_PlayerHUD_C` |
| Generated parent | `/Script/REALMSINRUIN.RIRHUD` |
| Type | **AHUD Blueprint** (not `UserWidget`) |
| IsDataOnly | True |
| Referencers | `/Game/_Main/Blueprints/Game/GameMode/GM_Dungeoneer` |
| Dependencies | REALMSINRUIN, `/Game/_Main/UI/Widgets/WBP_Overlay`, `/Game/_Main/UI/Widgets/WidgetController/BP_OverlayWidgetController` |
**Observed Implementation:** Naming `WBP_` is misleading Documented Intent; asset is the game HUD class assigned on `GM_Dungeoneer`. Relationship to `ARIRHUD`: direct Blueprint child that supplies OverlayWidgetClass / OverlayWidgetControllerClass via deps to `WBP_Overlay` + `BP_OverlayWidgetController`.
---
## HUD init (Observed Implementation) ## HUD init (Observed Implementation)
### Native GAS path
`ARIRPlayerCharacter::InitAbilityActorInfo``ARIRHUD::InitOverlay(PC, PS, ASC, AS)` → create `OverlayWidgetClass``UOverlayWidgetController` binds ASC attribute delegates → `BroadcastInitialInitialValues``AddToViewport`. `ARIRPlayerCharacter::InitAbilityActorInfo``ARIRHUD::InitOverlay(PC, PS, ASC, AS)` → create `OverlayWidgetClass``UOverlayWidgetController` binds ASC attribute delegates → `BroadcastInitialInitialValues``AddToViewport`.
checkf text references `WBP_PlayerHUD` for class assignment. ### Legacy BP path (still connected)
**Subclass seeds:** `WBP_Overlay`, health/mana progress bars, `BP_OverlayWidgetController`. `BP_PlayerCharacterBase` EventPossessed → Delay 0.4 → `Server_UpdateHUD` → compute DEPRECATED health/mana percentages → `BPI_PlayerController.UpdatePlayerHUD`.
**Technical Debt:** Stamina delegates reuse Mana signature types in OverlayWidgetController.h. **Technical Debt:** Dual attribute UI; Stamina delegates reuse Mana signature types in OverlayWidgetController.h.
---
## Framework assignments (GM_Dungeoneer CDO)
| Property | Value |
|----------|--------|
| HUDClass | `WBP_PlayerHUD_C` |
| PlayerControllerClass | `PC_Character_C` |
| PlayerStateClass | `BP_PlayerState_C` |
| DefaultPawnClass | None |
`PC_Character` implements `BPI_PlayerController`; holds `CharacterSelectHUD`; Enhanced Input IMC `IMC_PlayerDefault` + `IA_Movement`.
--- ---
## Sessions (Observed Implementation) ## Sessions (Observed Implementation)
Project plugins AdvancedSessions + AdvancedSteamSessions enabled (VersionName 5.8). Depend on OnlineSubsystem / Steam stack. Project plugins AdvancedSessions + AdvancedSteamSessions enabled (VersionName 5.8). `GM_Dungeoneer` deps include AdvancedSessions.
**Unknown:** Live menu usage vs `/Game/_Main/Blueprints/Examples/ExampleAdvancedSessionsFunctionsChar` — Batch 4 Pass 4. **Unknown:** Live menu usage vs Example Advanced Sessions Blueprints — Batch 4 Pass 4.
**Unknown:** No OnlineSubsystem INI under project `Config/` — Requires Broader Filesystem/Configuration Inspection. **Unknown:** OnlineSubsystem INI location — Requires Broader Filesystem/Configuration Inspection.
@@ -2,142 +2,152 @@
**Status: Draft** **Status: Draft**
- **Scope:** Unresolved questions and verification requirements identified during Batch 1 (Passes 02). This document separates confirmed static findings from questions that require Blueprint, runtime, editor, network, or broader configuration inspection. - **Scope:** Unresolved questions after Batches 13. Separates confirmed static findings from questions needing further Blueprint, runtime, or config inspection.
- **Inspection method:** Consolidation of Batch 1 native C++, configuration, plugin, subclass-discovery, and MCP calibration findings. No new Unreal inspection was performed for this refactor. - **Inspection method:** Consolidation of Batches 13; Batch 3 resolved per-character ability path unknowns.
- **Evidence classifications used:** Observed Implementation, Documented Intent, Observed Runtime Behavior, Inferred, Unknown. - **Evidence classifications used:** Observed Implementation, Documented Intent, Observed Runtime Behavior, Inferred, Unknown.
- **Tool or visibility limitations:** No Git repository is available at the inspected project root. Semantic Search is not configured. Blueprint graphs, live ASC state, Montage notify timing, session behavior, and runtime consequences were outside Batch 1 scope. - **Tool or visibility limitations:** Semantic Search unavailable; CustomEvent FunctionFlags not readable; comment-box membership limited; no PIE this batch.
- **Last updated:** 2026-07-16 - **Last updated:** 2026-07-16
- **Current phase:** Phase 1 — Static Architecture - **Current phase:** Phase 1 — Static Architecture
- **Last completed pass:** Pass 2 (Batch 1) - **Last completed pass:** Pass 6 (Batch 3)
- **Next pass expected to contribute:** Every subsequent batch - **Next pass expected to contribute:** Batch 4 (Pass 4 / 7 / 8 / 9 — only when authorized)
## Draft tracking ## Draft tracking
### Completed sections ### Completed sections
- Batch 1 unknowns grouped by verification method
- Batch 1 unknowns grouped by required verification method - Batch 2 resolutions: WBP_PlayerHUD class; BP_PlayerState DefaultAttributes=None; legacy ability routing documented
- Confirmed enemy ASC accessor defect separated from its runtime-impact questions - Batch 3 resolutions: per-character Ability 001004 connected paths; Wizard/Gunslinger stub confirmation; UseAbility* presence matrix
- OnlineSubsystem and Steam configuration investigation separated from manual editor inspection - Enemy ASC accessor defect still confirmed static
- Tool and environment limitations recorded
- Naming ambiguities and conflicting evidence recorded
### Pending sections ### Pending sections
- Frontend/session/enemy AI/animation unknowns (Batch 4)
- Ability, RPC, animation, frontend, session, enemy Blueprint, UI, and pickup unknowns from Batches 24 - Runtime test procedures after static ability archaeology
- Runtime test procedures to be finalized after static Blueprint archaeology
- Priority updates after the ability migration matrix is complete
### Evidence still required ### Evidence still required
- AnimNotify → UseAbility* wiring (Pass 8)
- Live ASC vs DEPRECATED HUD coexistence in PIE
- Enemy BP AI connected graphs (Pass 9)
- GE/cue referencer map (Pass 7)
- Connected Blueprint graphs for player state, player base, playable characters, enemies, widgets, and pickups ---
- Exact Blueprint class and generated-parent verification for `WBP_PlayerHUD`
- Live ASC, attribute, Gameplay Effect, HUD, and session state through controlled PIE or network testing
- Broader project/plugin/Saved configuration search for OnlineSubsystem and Steam settings
### Unknowns requiring later verification ## Resolved in Batch 2 (no longer Unknown)
- Blueprint ownership of default attribute application | Question | Resolution | Classification | Doc |
- Blueprint-only ability RPC and resource-routing architecture |---|---|---|---|
- Runtime consequences of the confirmed enemy ASC accessor mismatch | Is `WBP_PlayerHUD` a Widget or AHUD? | Parent is `RIRHUD`; AHUD Blueprint; `WBP_` name misleading | Observed Implementation | 03, 11 |
- Exact source of enemy chase and attack behavior | Does `BP_PlayerState` assign DefaultAttributes GE? | CDO `defaultAttributesGameplayEffect` = **None** | Observed Implementation | 03, 06 |
- Session configuration and production widget flow | How are abilities routed/networked on base? | IA_Ability_* → Server_Ability_* stubs/overrides; Multicast FX helpers | Observed Implementation | 05, 08 |
- Montage notify and visual Blueprint comment-region details
---
## Resolved in Batch 3 (Pass 6)
| Question | Resolution | Classification | Doc |
|---|---|---|---|
| Full Ability 001004 paths per playable | Documented per character in tables | Observed Implementation | 05, 08 |
| Does Wizard implement Server_Ability_*? | No local implementations; inherit PrintString stubs | Observed Implementation | 05, 08 |
| Is Gunslinger data-only? | IsDataOnly=True; deps only base; inherited stubs | Observed Implementation | 05, 08 |
| Amazonian working melee path | Ability 001 Begin → Multicast montage → UseAbility001 Authority BoxOverlap ApplyDamage | Observed Implementation + Observed Runtime Behavior | 05 |
| Are UseAbility* still invoked? | Present and connected on Paladin 001/004, Amazonian 001, Cleric 002/004; caller of UseAbility* itself Unknown (likely AnimNotify) | Observed Implementation / Unknown caller | 05, 10 |
| Who calls PlayerDeath from Amazonian? | ReceiveAnyDamage → DEPRECATED_CurrentHealth ≤0 → PlayerDeath | Observed Implementation | 05, 08 |
| Parent calls on ability overrides? | Paladin/Amazonian/Cleric: **No** | Observed Implementation | 05 |
--- ---
## Confirmed static defects with runtime questions ## Confirmed static defects with runtime questions
The following item is **not Unknown** at the static implementation level.
| Confirmed finding | Evidence classification | Issue classification | Exact evidence | Runtime question | | Confirmed finding | Evidence classification | Issue classification | Exact evidence | Runtime question |
|---|---|---|---|---| |---|---|---|---|---|
| `ARIRBaseEnemyCharacter` owns and initializes an ASC on itself, while inherited `ARIRBaseCharacter::GetAbilitySystemComponent()` attempts to retrieve the ASC from `ARIRPlayerState`. No native enemy override was found. | Observed Implementation | Incomplete Refactor / Existing Baseline Defect | `Source/REALMSINRUIN/Private/Characters/RIRBaseEnemyCharacter.cpp`; `Source/REALMSINRUIN/Private/Characters/RIRBaseCharacter.cpp`; `ARIRBaseEnemyCharacter::BeginPlay`; `ARIRBaseCharacter::GetAbilitySystemComponent` | Which runtime systems fail or degrade because interface-based ASC lookup can return null for enemies? | | Enemy ASC on self vs GetASC from PlayerState | Observed Implementation | Incomplete Refactor | RIRBaseEnemyCharacter.cpp; RIRBaseCharacter.cpp | Which systems fail when interface ASC lookup is null for enemies? |
| Dual HUD attribute paths (ASC Overlay vs DEPRECATED floats) | Observed Implementation | Incomplete Refactor | RIRHUD InitOverlay; BP Server_UpdateHUD | Do both run? Which drives visible bars in PIE? |
The mismatch itself is statically confirmed. PIE is required only to determine its downstream impact on Gameplay Effects, attribute access, damage, death handling, Blueprint ability-system calls, and other consumers of `IAbilitySystemInterface`. | DefaultAttributesGameplayEffect unused (C++ and BP_PlayerState=None) | Observed Implementation | Partially Implemented | RIRPlayerState.h; BP_PlayerState CDO | What sets initial Health/Mana at spawn? |
| Cleric Ability 004 SpawnActor Class empty + mana CanUse unwired | Observed Implementation | Existing Baseline Defect | Player_Cleric UseAbility004 / Begin | Does 004 appear to fire but do nothing in PIE? |
| Multi_SpawnParticle empty EmitterTemplate (Paladin 004, Cleric 002) | Observed Implementation | Partially Implemented | UseAbility graphs | Visible missing VFX only? |
--- ---
## Requires Blueprint inspection ## Requires Blueprint / animation inspection (remaining)
| Question | Why static native inspection is insufficient | Relevant paths | Recommended safe verification method | Mutates project state? | Priority | Dependency | | Question | Why insufficient | Paths | Method | Priority | Dependency |
|---|---|---|---|---|---|---| |---|---|---|---|---|---|
| Does `BP_PlayerState` assign or apply `DefaultAttributesGameplayEffect`? | The property is declared on `ARIRPlayerState` but is never applied in native C++. | `/Game/_Main/Blueprints/Player/BP_PlayerState`; `Source/REALMSINRUIN/Public/Player/RIRPlayerState.h` | Read-only BlueprintTools inspection of class defaults, graphs, functions, and connected subgraphs | No | High | Native finding that `DefaultAttributesGameplayEffect` has no C++ apply path | | Who calls UseAbility*? | Events connected; callers not in EventGraph | Character AnimMontages / AnimBP | Pass 8 notify walk | High | Pass 6 bodies done |
| How are playable-character abilities routed and networked? | No native ability RPCs or native ability input bindings were found. | `/Game/_Main/Blueprints/Characters/PlayerCharacters/BP_PlayerCharacterBase`; `/Game/_Main/Blueprints/Characters/PlayerCharacters/PlayerCharacterClasses/Paladin/Player_Paladin`; `/Game/_Main/Blueprints/Characters/PlayerCharacters/PlayerCharacterClasses/Amazonian/Player_Amazonian`; `/Game/_Main/Blueprints/Characters/PlayerCharacters/PlayerCharacterClasses/Cleric/Player_Cleric`; `/Game/_Main/Blueprints/Characters/PlayerCharacters/PlayerCharacterClasses/Wizard/Player_Wizard`; `/Game/_Main/Blueprints/Characters/PlayerCharacters/PlayerCharacterClasses/Gunslinger/Player_Gunslinger` | Read-only graph inventory and connected path tracing of input events, `UseAbility*`, server/client/multicast events, validation, costs, damage, animation, and cleanup | No | High | Batch 2 player-base hierarchy and Batch 3 per-character reconstruction | | Enemy chase/attack Blueprint logic | Structural only in Pass 3 | BP_EnemyCharacterBase, BP_Enemy_Skeleton, BPI_EnemyCharacter | Pass 9 connected graphs | High | Pass 3 structure |
| Where was enemy chase and attack behavior intended to live? | Native enemy code contains no targeting, movement, perception, MoveTo, or attack implementation. | `/Game/_Main/Blueprints/Characters/Enemies/BP_EnemyCharacterBase`; `/Game/_Main/Blueprints/Characters/Enemies/Skeleton/BP_Enemy_Skeleton`; `/Game/_Main/Blueprints/Characters/Interfaces/BPI_EnemyCharacter` if present at that path | Read-only Blueprint graph, component, property, event, timer, navigation, and interface inspection | No | High | Native enemy inventory and calibration finding that no project BT/BB/custom AIController assets were found | | Do EffectActor children call ApplyEffectToTarget? | Native mechanism only | BP_HealthPotion etc. | Pass 10 | Medium | Batch 1 |
| Is `WBP_PlayerHUD` a Widget Blueprint, an `ARIRHUD` child, or a subclass-search anomaly? | The name and native `checkf` text suggest a widget, while subclass search returned it in an `ARIRHUD` query. | `/Game/_Main/UI/Widgets/HUD/WBP_PlayerHUD`; `Source/REALMSINRUIN/Private/UI/HUD/RIRHUD.cpp` | Read-only asset-class, generated-class parent, asset-tag, dependency, and referencer inspection | No | Medium | ObjectTools subclass-search anomaly recorded in Batch 1 | | Is CommonUI used by live content? | Plugin enabled; no native refs | /Game/_Main/UI | Widget parent inspection | Low | Batch 1 |
| Is CommonUI used by live project content? | CommonUI is enabled, but no native CommonUI references were found. | `/Game/_Main/UI`; `REALMSINRUIN_DEV.uproject` | Read-only widget parent-class, asset dependency, and referencer inspection | No | Low | Plugin enabled-state finding from `02-ProjectArchitecture.md` | | Paladin Ability 002 block absorb | IsBlocking set; no damage absorb path traced | ABP_Paladin / PlayerHitCheck | Pass 8 + hit graphs | Medium | Pass 6 |
| Do each of the `ARIREffectActor` Blueprint children invoke `ApplyEffectToTarget`? | Inheritance provides the native mechanism but does not prove that each child calls it. | `/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` | Read-only connected graph inspection for overlaps, authority checks, effect calls, destruction, and respawn | No | Medium | Native `ARIREffectActor::ApplyEffectToTarget` implementation | | Amazonian PerformingWhirlwind | Get without Set | Player_Amazonian | Search all graphs / macros | Low | Pass 6 |
--- ---
## Requires runtime inspection / PIE ## Requires runtime inspection / PIE
| Question | Why static inspection is insufficient | Relevant paths or systems | Recommended safe verification method | Mutates project state? | Priority | Dependency | | Question | Why | Method | Priority |
|---|---|---|---|---|---|---| |---|---|---|---|
| Which runtime systems are affected by the confirmed enemy ASC accessor mismatch? | Static analysis proves the mismatch but cannot show every consumer or symptom. | `ARIRBaseCharacter::GetAbilitySystemComponent`; `ARIRBaseEnemyCharacter`; `ARIREffectActor`; enemy damage/death/effect flows | Controlled PIE using AbilitySystemInspector and targeted read-only observation of enemy ASC, attributes, applied effects, damage, and death state | PIE changes the transient world; no asset save required | High | Confirmed static defect documented above; enemy Blueprint inspection should occur first | | Enemy ASC accessor impact | Static mismatch; need consumers | PIE + AbilitySystemInspector | High |
| Are default attributes applied when a player spawns? | No native application path was found, and Blueprint assignment/application is not yet known. | `/Game/_Main/Blueprints/Player/BP_PlayerState`; character default-attribute Gameplay Effects; player ASC | Controlled PIE inspection of granted effects and Health/Mana/Stamina values immediately after possession | PIE changes the transient world; no asset save required | High | Blueprint inspection of `BP_PlayerState` and default attribute GE CDOs | | Default attribute values after spawn | No apply path found | PIE attribute values after possess | High |
| Does HUD overlay creation complete successfully for every playable character? | Native call flow exists, but class assignments and widget bindings are Blueprint/editor data. | `ARIRPlayerCharacter::InitAbilityActorInfo`; `ARIRHUD::InitOverlay`; `/Game/_Main/UI/Widgets/HUD/WBP_PlayerHUD`; `/Game/_Main/UI/Widgets/WBP_Overlay` if confirmed | Controlled PIE observation of HUD creation, widget-controller assignment, and initial attribute broadcasts | PIE changes the transient world; no asset save required | Medium | Exact HUD/widget asset-class verification and Blueprint defaults | | Dual HUD coexistence | Two static paths | Observe both overlay and UpdatePlayerHUD | Medium |
| Do production session create, find, join, and travel flows succeed? | Advanced Sessions operations are latent and depend on runtime online-subsystem configuration. | Production main-menu and multiplayer-browser widgets; AdvancedSessions; AdvancedSteamSessions | Controlled standalone or multi-client network test after static frontend/session graph reconstruction | Network and transient session state | Medium | Broader configuration inspection and frontend/session Blueprint pass | | Session create/find/join | Latent online ops | Network test after Pass 4 | Medium |
| Ability Server RPC reliability / prediction feel | Flags unread | Multi-client ability press | Medium |
| Wizard BeginPlay skipping Parent | May leave InitialSpawnLocation unset | Spawn Wizard → death/respawn location | Medium |
--- ---
## Requires broader filesystem/configuration inspection ## Requires broader filesystem/configuration inspection
| Question | Why current inspection is insufficient | Search scope and likely terms | Recommended safe verification method | Mutates project state? | Priority | Dependency | | Question | Search | Priority |
|---|---|---|---|---|---|---| |---|---|---|
| Where are OnlineSubsystem and Steam runtime settings defined, if they exist? | No relevant sections were found in the initially inspected project `Config/` files. That does not establish project-wide absence. | `Config/**/*.ini`; `Plugins/**/Config/**/*.ini`; `Saved/Config/**/*.ini`; search terms: `DefaultPlatformService`, `OnlineSubsystem`, `OnlineSubsystemSteam`, `SteamDevAppId`, `SteamAppId`, `NetDriverDefinitions`, `GameServerQueryPort` | Read-only filesystem search followed by inspection of project-owned configuration. Keep engine defaults separate from project-owned settings. | No | Medium | AdvancedSessions and AdvancedSteamSessions are enabled; production usage remains unverified | | OnlineSubsystem / Steam settings location | Config/**, Plugins/**/Config, Saved/Config | Medium |
| Is the GameInstance class configured outside the inspected `DefaultEngine.ini` section? | `GI_Dungeoneer` was discovered, but no assignment was found in the inspected configuration. | Project and plugin INI files; map/world settings metadata; references to `/Game/_Main/Blueprints/Game/GameInstance/GI_Dungeoneer` | Read-only project-wide text search plus asset metadata and referencer inspection | No | Medium | Blueprint framework hierarchy pass and map metadata pass | | GameInstance class assignment outside DefaultEngine sample | INI + referencers of GI_Dungeoneer | Medium |
Do not treat absence from the initial `Config/` sample as proof that settings do not exist elsewhere.
--- ---
## Requires manual editor inspection ## Requires manual editor inspection
| Question | Why MCP/static metadata may be insufficient | Relevant paths | Recommended safe verification method | Mutates project state? | Priority | Dependency | | Question | Why | Paths |
|---|---|---|---|---|---|---| |---|---|---|
| What Montage sections, notifies, notify states, and exact timings drive abilities? | Calibration reported limited or empty notify metadata, and deep Montage structure may not be exposed through the approved tools. | Character Montage assets discovered during the animation and ability passes | Manually inspect Montage sections and notify tracks without saving assets | No, provided no asset is saved | Medium | Batch 3 ability inventory and Batch 4 animation pass | | Montage notify timings | Registry tags limited | Character montages |
| Which nodes visually belong to DEPRECATED comment regions? | MCP can trace executable connectivity but may not reliably expose visual comment-box membership and boundaries. | `/Game/_Main/Blueprints/Characters/PlayerCharacters/PlayerCharacterClasses/Paladin/Player_Paladin`; relevant ability graphs | Manually inspect Blueprint visual layout after connected paths have been documented | No, provided no asset is saved | Medium | Batch 2 player-base inspection and Batch 3 Paladin ability analysis | | DEPRECATED comment-box visual regions | find_nodes Comment returned [] | BP_PlayerCharacterBase / children EventGraphs |
| CustomEvent Reliable vs Unreliable | ObjectTools on node failed | Server_/Multicast_ events |
--- ---
## Tool and environment limitations ## Tool and environment limitations
| Item | Detail | Impact | Mitigation | | Item | Detail | Impact |
|---|---|---|---| |---|---|---|
| Git repository unavailable | The inspected project root returned `fatal: not a git repository`. | A complete repository diff and reliable unrelated-file change detection were unavailable. | Use filesystem listings and hashes for the current phase; establish a Git/LFS baseline before additional reconstruction work. | | Semantic Search | HTTP 401 / no API key | No semantic discovery |
| Semantic Search unavailable | Calibration returned HTTP 401 because no embedding API key was configured. | No semantic asset/code discovery through that tool. | Use deterministic asset registry, subclass, dependency, referencer, node, and filesystem searches. | | CustomEvent FunctionFlags | list_properties failed on event nodes | RPC reliability Unknown |
| Parallel MCP calls unreliable | Some batched calls failed with schema errors such as missing `server` or `toolName`. | Parallel query results may be incomplete when a batch fails. | Retry important read-only calls individually and record failures. | | Comment boxes | find_nodes(title=Comment) empty | Visual DEPRECATED regions Unknown |
| Blueprint comment-box membership limited | Tooling may expose comment text or nearby nodes without reliable visual containment. | Documented Intent can be captured, but exact visual grouping may remain uncertain. | Use connected subgraph evidence and defer visual boundaries to manual editor inspection. | | Git | Available (baseline commit exists) | Dirty-tree gate works |
| Live ASC and session state unavailable statically | Runtime grants, active effects, replicated attributes, and latent session outcomes do not exist in a static editor snapshot. | Static conclusions cannot establish runtime success. | Defer to controlled PIE or network tests after static reconstruction. | | No PIE in Batch 3 | Constraint honored | Runtime questions deferred |
--- ---
## Naming ambiguities ## Naming ambiguities
| Item | Current evidence | Required resolution | Dependency | | Item | Status |
|---|---|---|---| |---|---|
| Amazon vs Amazonian | Playable character asset is `/Game/_Main/Blueprints/Characters/PlayerCharacters/PlayerCharacterClasses/Amazonian/Player_Amazonian`; default-attribute content uses `Amazon` naming in calibration results. | Confirm exact GE asset names, assignments, and referencers during the dedicated GAS pass. | Gameplay Effect inventory and `BP_PlayerState`/character defaults | | Amazon vs Amazonian | Still open for GE folder naming (Pass 7) |
| `WBP_PlayerHUD` | Name and native error text suggest a widget; subclass search under `ARIRHUD` returned it. | Verify asset class, generated class, native parent, and referencers. | Batch 2 Blueprint hierarchy and UI asset inspection | | WBP_PlayerHUD | **Resolved** — AHUD named like a widget |
--- ---
## Conflicting evidence ## Conflicting evidence
| Conflict | Evidence A | Evidence B | Current resolution | Remaining verification | | Conflict | Current resolution | Remaining |
|---|---|---|---|---| |---|---|---|
| Enemy ASC ownership and accessor | `ARIRBaseEnemyCharacter` creates and initializes an ASC on itself. | Inherited `ARIRBaseCharacter::GetAbilitySystemComponent()` retrieves from `ARIRPlayerState`. | Both are Observed Implementation. The mismatch is a confirmed static defect. | Determine affected runtime systems through Blueprint inspection followed by controlled PIE. | | Enemy ASC ownership vs accessor | Confirmed static defect | PIE impact |
| Default attribute architecture | `ARIRPlayerState` declares `DefaultAttributesGameplayEffect`; default-attribute GE assets are known to exist. | No native C++ application path was found. | Property and assets are present, but the apply path is Unknown. | Inspect `BP_PlayerState`, playable-character defaults, and GE referencers. | | Default attributes present vs unused | BP_PlayerState=None; C++ unused; character GEs orphaned | Who applies GEs if anyone |
| Gameplay Ability migration | `URIRGameplayAbility` exists and is documented as a base for project abilities. | No project-derived GA class, GA asset, or static granting path has been observed so far. | Current evidence supports GAS scaffolding without completed discrete Gameplay Ability migration. | Reconfirm through Blueprint and dedicated GAS passes. | | URIRGameplayAbility "all abilities" vs legacy BP | Legacy active; GA scaffolding only | Pass 7 reconfirm |
| Dual HUD systems | Both connected | PIE which is authoritative for bars |
--- ---
## Priority order for later verification ## Priority order for later verification
1. Inspect `BP_PlayerState` default-attribute assignment/application. 1. Batch 4 Pass 7 — GE/cue/tag inventory
2. Reconstruct `BP_PlayerCharacterBase` input, RPC, resource, and legacy ability routing. 2. Pass 8 — AnimNotify → UseAbility wiring
3. Verify the exact class of `WBP_PlayerHUD`. 3. Pass 9 — enemy Blueprint AI
4. Inspect enemy Blueprint logic and identify consumers of the confirmed ASC accessor defect. 4. Pass 4 — sessions / frontend
5. Inspect per-character abilities and their animation dependencies. 5. Controlled PIE for ASC, attributes, dual HUD, enemy GetASC, Cleric 004 / Wizard spawn
6. Perform broader OnlineSubsystem and Steam configuration search.
7. Run controlled PIE only after the relevant static paths are fully documented.
+38 -21
View File
@@ -5,39 +5,56 @@
- **Scope:** Compact cross-model index of material findings. Full analysis lives in linked docs. - **Scope:** Compact cross-model index of material findings. Full analysis lives in linked docs.
- **Last updated:** 2026-07-16 - **Last updated:** 2026-07-16
- **Current phase:** Phase 1 — Static Architecture - **Current phase:** Phase 1 — Static Architecture
- **Last completed pass:** Pass 2 (Batch 1) - **Last completed pass:** Pass 6 (Batch 3)
- **Next pass expected to contribute:** Every batch - **Next pass expected to contribute:** Every batch
## Draft tracking ## Draft tracking
### Completed sections ### Completed sections
- Batch 1 evidence rows (modules, native hierarchy, GAS ownership, plugins, config) - Batch 1 evidence rows (modules, native hierarchy, GAS ownership, plugins, config)
- Batch 2 evidence rows (BP hierarchy, legacy abilities, WBP_PlayerHUD, BP_PlayerState)
- Batch 3 evidence rows (per-character Ability 001004 paths, RPCs, resources, montages)
### Pending sections ### Pending sections
- Blueprint graph/RPC/ability rows (Batch 2+) - GE/cue referencer rows (Pass 7)
- AnimNotify → UseAbility rows (Pass 8)
--- ---
| System | Subsystem | Finding | Evidence type | Classification | Exact source | Exact symbol | Blueprint path | Graph | Node/event | Asset/config | Doc | Confidence | Remaining verification | | System | Subsystem | Finding | Evidence type | Classification | Exact source | Exact symbol | Blueprint path | Graph | Node/event | Asset/config | Doc | Confidence | Remaining verification |
|--------|-----------|---------|---------------|----------------|--------------|--------------|----------------|-------|------------|--------------|-----|------------|------------------------| |--------|-----------|---------|---------------|----------------|--------------|--------------|----------------|-------|------------|--------------|-----|------------|------------------------|
| Module | Descriptor | Single runtime module REALMSINRUIN; Engine 5.8 | Observed Implementation | Intended Behavior | REALMSINRUIN_DEV.uproject | Modules[REALMSINRUIN] | — | — | — | REALMSINRUIN_DEV.uproject | 02 | High | — | | Module | Descriptor | Single runtime module REALMSINRUIN; Engine 5.8 | Observed Implementation | Intended Behavior | REALMSINRUIN_DEV.uproject | Modules[REALMSINRUIN] | — | — | — | REALMSINRUIN_DEV.uproject | 02 | High | — |
| Module | Build | Public deps include GAS + EnhancedInput; no UMG | Observed Implementation | Technical Debt | REALMSINRUIN.Build.cs | PublicDependencyModuleNames | — | — | — | — | 02 | High | Confirm link | | Character | Player ASC | ASC owned by PlayerState; Mixed replication | Observed Implementation | Intended Behavior | RIRPlayerState.cpp | CreateDefaultSubobject ASC | BP_PlayerState | — | — | — | 03,06,08 | High | Runtime values |
| Plugins | Project | AdvancedSessions enabled under Plugins/ | Observed Implementation | Intended Behavior | AdvancedSessions.uplugin | AdvancedSessions module | — | — | — | Plugins/AdvancedSessions | 02,11 | High | Live BP usage Batch 4 |
| Plugins | Project | AdvancedSteamSessions enabled | Observed Implementation | Intended Behavior | AdvancedSteamSessions.uplugin | — | — | — | — | Plugins/AdvancedSteamSessions | 02,11 | High | Steam config location |
| Config | Maps | GameDefaultMap=MainMenu; EditorStartupMap=Test01 | Observed Implementation | Intended Behavior | DefaultEngine.ini | GameMapsSettings | — | — | — | Config/DefaultEngine.ini | 02 | High | Per-map GameMode |
| Config | Redirects | GAS* classes redirected to RIR* | Observed Implementation | Incomplete Refactor | DefaultEngine.ini | CoreRedirects | — | — | — | Config/DefaultEngine.ini | 02,03 | High | — |
| Config | Tags | State/Disable/Effect project tags | Observed Implementation | Partially Implemented | DefaultGameplayTags.ini | GameplayTagList | — | — | — | Config/DefaultGameplayTags.ini | 02,06 | High | Referencers Pass 7 |
| Config | Input | Enhanced Input defaults + legacy Jump/Move axes | Observed Implementation | Partially Implemented | DefaultInput.ini | DefaultPlayerInputClass | — | — | — | Config/DefaultInput.ini | 02 | High | Ability IMCs |
| Character | Player ASC | ASC owned by PlayerState; Mixed replication | Observed Implementation | Intended Behavior | RIRPlayerState.cpp | CreateDefaultSubobject ASC | BP_PlayerState (seed) | — | — | — | 03,06,08 | High | Default GE apply |
| Character | Player init | InitAbilityActorInfo on PossessedBy/OnRep | Observed Implementation | Intended Behavior | RIRPlayerCharacter.cpp | InitAbilityActorInfo | — | — | — | — | 03,06 | High | Runtime HUD init |
| Character | Enemy ASC | ASC on enemy; Minimal replication | Observed Implementation | Intended Behavior | RIRBaseEnemyCharacter.cpp | CreateDefaultSubobject ASC | BP_Enemy_* (seed) | — | — | — | 03,06,09 | High | Interface GetASC |
| Character | GetASC | Base GetASC reads PlayerState only | Observed Implementation | Incomplete Refactor | RIRBaseCharacter.cpp | GetAbilitySystemComponent | — | — | — | — | 03,06,13 | High | PIE on enemy | | Character | GetASC | Base GetASC reads PlayerState only | Observed Implementation | Incomplete Refactor | RIRBaseCharacter.cpp | GetAbilitySystemComponent | — | — | — | — | 03,06,13 | High | PIE on enemy |
| GAS | Ability class | URIRGameplayAbility empty; no subclasses | Observed Implementation | Partially Implemented | RIRGameplayAbility.* | InstancingPolicy | — | — | — | — | 03,06 | High | Reconfirm GA assets Pass 7 | | GAS | Ability class | URIRGameplayAbility empty; no subclasses | Observed Implementation | Partially Implemented | RIRGameplayAbility.* | InstancingPolicy | — | — | — | — | 03,06 | High | Pass 7 |
| GAS | Attributes | Health/Mana/Stamina set; ctor inits H/M only | Observed Implementation | Partially Implemented | RIRAttributeSet.* | InitHealth etc. | — | — | — | — | 03,06 | High | GE overrides | | GAS | Default GE | BP_PlayerState DefaultAttributesGameplayEffect=None | Observed Implementation | Partially Implemented | ObjectTools CDO | defaultAttributesGameplayEffect | BP_PlayerState | — | — | — | 03,06,13 | High | Other apply sites |
| GAS | Default GE prop | DefaultAttributesGameplayEffect unused in cpp | Observed Implementation | Partially Implemented | RIRPlayerState.h | DefaultAttributesGameplayEffect | BP_PlayerState | — | — | — | 03,06,13 | High | BP apply path | | GAS | Orphan GE | GE_Cleric/Wizard_DefaultAttributes unwired; 0 referencers | Observed Implementation | Present but Unconnected | AssetTools refs | — | Player_Cleric / Wizard | — | — | GE_*_DefaultAttributes | 06 | High | Pass 7 |
| Effects | Apply | EffectActor applies GE via ASC library | Observed Implementation | Partially Implemented | RIREffectActor.cpp | ApplyEffectToTarget | BP_HealthPotion etc. | — | — | — | 03,12 | High | Overlap graphs | | Ability | Input | IA_Ability_001004 Started→Server_Ability_*_Begin | Observed Implementation | Intended Behavior | BlueprintTools | EnhancedInputAction | BP_PlayerCharacterBase | EventGraph | IA_Ability_* | IA_Ability_* | 05,08 | High | — |
| UI | HUD | InitOverlay from player init; attribute delegates | Observed Implementation | Partially Implemented | RIRHUD.cpp, OverlayWidgetController.cpp | InitOverlay, BindCallbacks | WBP_Overlay (seed) | — | — | — | 03,11 | High | Widget bindings | | Ability | Base stub | Server_Ability_*_Begin PrintString Override | Observed Implementation | Partially Implemented | get_connected_subgraph | PrintString | BP_PlayerCharacterBase | EventGraph | Server_Ability_001_Begin | — | 05 | High | |
| UI | Delegates | Stamina delegates use Mana signature types | Observed Implementation | Technical Debt | OverlayWidgetController.h | OnStaminaChanged | — | — | — | — | 03,11 | High | — | | Ability | Paladin 001 | Begin montage + UseAbility001 Authority BoxOverlap ApplyDamage | Observed Implementation | Implemented | get_connected_subgraph | ApplyDamage | Player_Paladin | EventGraph | UseAbility001 | Ability001Montages | 05,08 | High | Notify caller Pass 8 |
| Enemy | AI native | No MoveTo/chase/attack in native | Observed Implementation | Existing Baseline Defect | RIRBaseEnemyCharacter.* | — | BP_Enemy_* | — | — | — | 09 | High | BP Pass 9 | | Ability | Paladin 002 | Block state Begin/End; no ApplyDamage in Begin | Observed Implementation | Partial | get_connected_subgraph | IsBlocking | Player_Paladin | EventGraph | Server_Ability_002_* | — | 05 | High | Hit absorb Pass 8 |
| Framework | Seeds | GI_Dungeoneer, GM_Dungeoneer, GM_MainMenu | Observed Implementation | — | search_subclasses | — | those paths | — | — | — | 02,03 | High | BP internals | | Ability | Paladin 003 | Mana + ChargeTimeline + ChargeBox ApplyDamage | Observed Implementation | Implemented | get_connected_subgraph | ChargeBox | Player_Paladin | EventGraph | Charge / Client_Charge | — | 05 | High | |
| Continuity | Editor | PIE=false; level Test01; sel Skeleton_C_1 | Observed Implementation | — | EditorApp/SceneTools | IsPIERunning | — | — | — | Test01 | 15 | High | — | | Ability | Paladin 004 | Mana + montage + SphereOverlap ApplyDamage; empty particle | Observed Implementation | Implemented / Partial FX | get_connected_subgraph | UseAbility004 | Player_Paladin | EventGraph | UseAbility004 | Paladin_Ability004_Montage | 05,10 | High | — |
| Ability | Amazonian 001 | Same pattern as Paladin melee; known working runtime | Observed Implementation + Observed Runtime Behavior | Implemented | get_connected_subgraph | UseAbility001 | Player_Amazonian | EventGraph | Server_Ability_001_Begin | Amazon Attack montages | 05,08 | High | — |
| Ability | Amazonian 002004 | Inherited PrintString only | Observed Implementation | Stub | list_events | bIsImplemented | Player_Amazonian | — | — | — | 05 | High | — |
| Ability | Amazonian death | AnyDamage → DEPRECATED_CurrentHealth → PlayerDeath | Observed Implementation | Partial (legacy health) | get_connected_subgraph | ReceiveAnyDamage | Player_Amazonian | EventGraph | ReceiveAnyDamage | — | 05 | High | — |
| Ability | Cleric 001 | Montage only; no UseAbility001 | Observed Implementation | Partial | get_connected_subgraph | Multicast_PlayMontage | Player_Cleric | EventGraph | Server_Ability_001_Begin | — | 05 | High | — |
| Ability | Cleric 002 | Heal Players via RecoverPlayerHealth; empty particle | Observed Implementation | Partial | get_connected_subgraph | UseAbility002 | Player_Cleric | EventGraph | UseAbility002 | — | 05 | High | — |
| Ability | Cleric 003 | DivineCircle timer ConcentrateHandle ApplyDamage; End cleans | Observed Implementation | Implemented | get_connected_subgraph | ConcentrateHandle | Player_Cleric | EventGraph | Server_Ability_003_* | — | 05 | High | — |
| Ability | Cleric 004 | Mana CanUse unwired; SpawnActor Class empty | Observed Implementation | Existing Baseline Defect | get_connected_subgraph | SpawnActor | Player_Cleric | EventGraph | UseAbility004 | BP_PlayerProjectile unwired | 05,13 | High | PIE |
| Ability | Wizard | No Server_Ability_* / UseAbility*; inherit stubs | Observed Implementation | Stub | list_events + EventGraph | — | Player_Wizard | EventGraph | — | NS_Wizard_Ability001 unwired | 05,08 | High | — |
| Ability | Gunslinger | IsDataOnly; only base deps; inherit stubs | Observed Implementation | Stub / Existing Baseline Defect | get_asset_tags | IsDataOnly | Player_Gunslinger | — | — | — | 05,08 | High | — |
| Ability | Parent call | Paladin/Amazonian/Cleric ability overrides skip Parent | Observed Implementation | Incomplete Refactor | get_connected_subgraph | Parent call absent | Player_* | EventGraph | Server_Ability_*_Begin | — | 05 | High | — |
| Ability | Multicast | Multicast_PlayMontage→PlayMontage | Observed Implementation | Intended Behavior | get_connected_subgraph | PlayMontage | BP_PlayerCharacterBase | EventGraph | Multicast_PlayMontage | — | 05 | High | — |
| Ability | End stubs | Most child Ends missing; base End empty | Observed Implementation | Partially Implemented | list_events | Server_Ability_*_End | children | EventGraph | — | — | 05 | High | Pass 8 cleanup |
| Anim | Montages | Per-class Attack/Ability montages seeded | Observed Implementation | — | Multicast pins / deps | Ability001Montages | Player_* | EventGraph | Multicast_PlayMontage | /Game/.../AnimMontages/... | 10 | High | Pass 8 notifies |
| HUD | Legacy | Server_UpdateHUD uses DEPRECATED health/mana % | Observed Implementation | Incomplete Refactor | get_connected_subgraph | UpdatePlayerHUD | BP_PlayerCharacterBase | EventGraph | Server_UpdateHUD | DEPRECATED_* | 05,06,11 | High | PIE dual HUD |
| HUD | Native | InitOverlay ASC delegates | Observed Implementation | Partially Implemented | RIRHUD.cpp | InitOverlay | WBP_PlayerHUD | — | — | WBP_Overlay | 03,11 | High | Widget bindings |
| HUD | Class | WBP_PlayerHUD parent RIRHUD (AHUD) | Observed Implementation | Technical Debt (naming) | get_asset_tags | ParentClass | WBP_PlayerHUD | — | — | — | 03,11,13 | High | — |
| Framework | GM | HUDClass=WBP_PlayerHUD; PC=PC_Character; PS=BP_PlayerState | Observed Implementation | Intended Behavior | ObjectTools CDO | HUDClass | GM_Dungeoneer | — | — | — | 03,11 | High | — |
| Framework | PC | IMC_PlayerDefault + IA_Movement | Observed Implementation | Intended Behavior | ObjectTools CDO | PlayerMappingContext | PC_Character | — | — | IMC_PlayerDefault | 03,08 | High | Ability IMC add |
| Character | Death | PlayerDeath→IsDead→respawn destroy→PlayerRespawn | Observed Implementation | Partially Implemented | get_connected_subgraph | Server_RespawnPlayer | BP_PlayerCharacterBase | EventGraph | PlayerDeath | — | 05 | High | Other callers |
| Enemy | BP structure | Base+Skeleton Tick/Overlap only; BPI GetEnemyREF | Observed Implementation | — | list_events | ReceiveTick | BP_Enemy_* | EventGraph | — | — | 09 | Medium | Pass 9 graphs |
| Interface | BPI set | Four BPIs: PlayerCharacter, EnemyCharacter, PlayerController, GameMode | Observed Implementation | — | find_assets | BPI_ | Interfaces/ | — | — | — | 03 | High | — |
| Continuity | Editor | PIE=false; level Test01; sel Skeleton_C_1 | Observed Implementation | — | EditorApp/SceneTools | IsPIERunning | — | — | — | Test01 | 15 | High | Batch 3 close |
| Repo | Git | Archaeology Markdown only dirty after Batch 3 | Observed Implementation | — | git status | — | — | — | — | — | 15 | High | — |
+87 -69
View File
@@ -5,16 +5,16 @@
- **Scope:** Authoritative cross-model continuation document for Phase 1. - **Scope:** Authoritative cross-model continuation document for Phase 1.
- **Last updated:** 2026-07-16 - **Last updated:** 2026-07-16
- **Current phase:** Phase 1 — Static Architecture - **Current phase:** Phase 1 — Static Architecture
- **Last completed pass / batch:** Batch 1 (Passes 0, 1, 2) - **Last completed pass / batch:** Batch 3 (Pass 6)
- **Next authorized work:** Wait for user — recommend **Batch 2** (Passes 3 + 5) - **Next authorized work:** Wait for user — recommend **Batch 4** (Pass 4 sessions / Pass 7 GAS / Pass 8 animation — only as authorized)
## Phase completed ## Phase completed
| Item | Value | | Item | Value |
|------|--------| |------|--------|
| Phase | Phase 1 — Static Architecture (in progress) | | Phase | Phase 1 — Static Architecture (in progress) |
| Batch completed | Batch 1Foundation | | Batch completed | Batch 3Per-character ability archaeology |
| Passes completed | Pass 0 Continuity gate; Pass 1 Modules/plugins/config; Pass 2 Native C++ hierarchy | | Passes completed | Pass 6 (Paladin → Amazonian → Cleric → Wizard → Gunslinger) |
| Date completed | 2026-07-16 | | Date completed | 2026-07-16 |
| Model identifier | Cursor Grok 4.5 | | Model identifier | Cursor Grok 4.5 |
@@ -22,132 +22,150 @@
## Repository integrity ## Repository integrity
### Starting state (Pass 0) ### Starting state (Batch 3)
- **Git:** Not a git repository (`fatal: not a git repository`). Read-only git commands unavailable for dirty-file tracking. - **Git:** Dirty with expected Batch 2 Archaeology Markdown only (not unexpected):
- **Filesystem Archaeology baseline:** Only `Documentation/Archaeology/00-MCP-Capability-Calibration.md` present (SHA256 `91CDDBC1BD2880FA892CCC3753BA0C5B582D95916E62151251AC35C131134AA5`). - Modified: `03`, `06`, `08`, `09`, `11`, `13`, `14`, `15`
- **Pre-existing modified/untracked (git):** N/A — no git. No attempt to clean or alter other project files. - Untracked: `05-LegacyAbilityArchitecture.md`
- **Editor:** `IsPIERunning=false`; current level `/Game/_Main/Levels/Testing/Test01`; selected actor `BP_Enemy_Skeleton_C_1` (matches calibration). - **Baseline commit:** `ff5640a0` Establish UE 5.8 known-good baseline with Batch 1 archaeology docs.
- **Editor:** `IsPIERunning=false`; level `/Game/_Main/Levels/Testing/Test01`; selected actor `BP_Enemy_Skeleton_C_1`.
### Ending state (Batch 1 close) ### Ending state (Batch 3 close)
- New/modified files: Markdown only under `Documentation/Archaeology/` (listed below).
- `00-MCP-Capability-Calibration.md` hash unchanged (must verify at close).
- No source, config, plugin, map, or Unreal asset writes performed.
- Modified/created files: Markdown only under `Documentation/Archaeology/` (listed below).
- **Unexpected untracked file reported (not reverted):** `Documentation/Archaeology/01-Phase-1-Plan.md` — present at close; not created by Pass 6 doc writes; contents not inspected this closeout.
- No source, config, plugin, map, or Unreal asset writes.
- PIE not started; level and selection not changed intentionally.
- Ending Git check: only Archaeology Markdown dirty (confirm at close).
--- ---
## Areas fully inspected (Batch 1 tools) ## Areas fully inspected (Batch 3 tools)
- All `.h`/`.cpp` under `Source/REALMSINRUIN/` - Player_Paladin: Ability 001004 Begin/End/UseAbility/Charge/ChargeBox connected paths
- `REALMSINRUIN_DEV.uproject`, Targets, Build.cs, module startup - Player_Amazonian: Ability 001 + UseAbility001 + ReceiveAnyDamage; 002004 absence
- `Plugins/AdvancedSessions` + `AdvancedSteamSessions` descriptors and Build.cs - Player_Cleric: Ability 001004 + ConcentrateHandle/EndConcentrate + UseAbility002/004
- `Config/DefaultEngine.ini`, `DefaultGame.ini`, `DefaultGameplayTags.ini`, `DefaultInput.ini` (input file partially — defaults + Jump/Move mappings) - Player_Wizard: EventGraph walk; alternate UseAbility/input/spell search; unwired assets
- PluginToolset ListEnabledPlugins; GetPluginInfo AdvancedSessions/AdvancedSteamSessions - Player_Gunslinger: IsDataOnly confirmation; Parent-only EventGraph; inherited stubs
- Editor continuity: PIE, level, selection
- search_subclasses seeds for player/enemy/effect/HUD/PC/PS/GA/widget/GameMode/GameInstance
## Areas partially inspected ## Areas partially inspected
- DefaultInput.ini beyond movement/look mappings (full VR axis noise present; ability actions absent) - FCanUseMana function body (call sites only)
- Enabled engine plugin usage (listed; not usage-verified) - Client_Charge / ChargeTimeline numeric curve details
- GAS GE assets (known from calibration; CDOs not re-inspected this batch) - PlayerHitCheck graphs (existence known; full absorb logic → later)
- Montage notify tracks (seeded in doc 10 → Pass 8)
## Areas not yet inspected ## Areas not yet inspected
- All Blueprint graph/variable deep dives (Batch 2+) - Frontend/session flows (Batch 4 Pass 4)
- Frontend/session flows (Batch 4) - GE/cue systemwide inventory (Batch 4 Pass 7)
- Per-character abilities (Batch 3) - Animation deep dive / AnimNotify → UseAbility (Batch 4 Pass 8)
- Animation (Batch 4 Pass 8) - Enemy BP AI deep dive (Batch 4 Pass 9)
- Enemy BP AI (Batch 4 Pass 9) - Full UI trees / pickups (Batch 4)
- Full UI trees / pickups graphs (Batch 4) - Cross-character migration matrix doc 07 (Pass 11)
- Synthesis docs 01, 05, 07, 10 (not created — no substantive Batch 1 content for 05/07/10/01)
--- ---
## Blueprints inspected ## Blueprints inspected
None in depth. **Path seeds only** recorded in 03/08/09/11/12. | Asset | Depth |
|-------|--------|
| BP_PlayerCharacterBase | Correlation only (Batch 2 deep dive stands) |
| Player_Paladin | Pass 6 full ability path reconstruction |
| Player_Amazonian | Pass 6 full ability path reconstruction |
| Player_Cleric | Pass 6 full ability path reconstruction |
| Player_Wizard | Pass 6 ability + alternate path search |
| Player_Gunslinger | Pass 6 data-only / inherited stub confirmation |
Referenced when required for ability identity: montage paths, MagicSpell_01_Cue, BP_PlayerProjectile (unwired), GE_* DefaultAttributes (orphans), NS_Wizard_Ability001 (unwired).
## C++ classes inspected ## C++ classes inspected
ARIRBaseCharacter, ARIRPlayerCharacter, ARIRBaseEnemyCharacter, ARIRPlayerState, ARIRPlayerController, ARIRHUD, URIRAbilitySystemComponent, URIRAttributeSet, URIRGameplayAbility, ARIREffectActor, URIRUserWidget, URIRWidgetController, UOverlayWidgetController, ITargetInterface / UTargetInterface; module REALMSINRUIN.h/cpp. None new this batch (Batch 1 inventory stands).
## Assets / configs inspected ## Assets / configs inspected
Listed in §Areas fully inspected. No Unreal assets modified or saved. Unreal content via MCP read-only only. No config file writes.
## Files created ## Files created
| File | Status | | File | Status |
|------|--------| |------|--------|
| Documentation/Archaeology/02-ProjectArchitecture.md | Draft | | Documentation/Archaeology/10-AnimationDependencies.md | Draft |
| Documentation/Archaeology/03-ClassHierarchy.md | Draft |
## Files updated
| File | Status |
|------|--------|
| Documentation/Archaeology/05-LegacyAbilityArchitecture.md | Draft (major Pass 6 rewrite) |
| Documentation/Archaeology/06-PartialGASArchitecture.md | Draft | | Documentation/Archaeology/06-PartialGASArchitecture.md | Draft |
| Documentation/Archaeology/08-CharacterSystems.md | Draft | | Documentation/Archaeology/08-CharacterSystems.md | Draft |
| Documentation/Archaeology/09-EnemyAI-StaticAnalysis.md | Draft |
| Documentation/Archaeology/11-UI-HUD-And-Sessions.md | Draft |
| Documentation/Archaeology/12-Pickups-And-Effects.md | Draft |
| Documentation/Archaeology/13-Unknowns-And-RuntimeQuestions.md | Draft | | Documentation/Archaeology/13-Unknowns-And-RuntimeQuestions.md | Draft |
| Documentation/Archaeology/14-EvidenceIndex.md | Draft | | Documentation/Archaeology/14-EvidenceIndex.md | Draft |
| Documentation/Archaeology/15-HandoffStatus.md | Draft | | Documentation/Archaeology/15-HandoffStatus.md | Draft |
## Files updated **03-ClassHierarchy.md not modified** (no Batch 2 structural correction required).
**00-MCP-Capability-Calibration.md not modified.**
None pre-existing except this handoff/index created new. **00-MCP-Capability-Calibration.md not modified.** **07-AbilityMigrationMatrix.md not created** (Pass 11).
## Toolsets used ## Toolsets used
EditorAppToolset (IsPIERunning, GetSelectedActors); SceneTools (get_current_level); PluginToolset (ListEnabledPlugins, GetPluginInfo); ObjectTools (search_subclasses); filesystem reads of Source/Config/Plugins. EditorAppToolset (IsPIERunning, GetSelectedActors); SceneTools (get_current_level); AssetTools (class/tags/deps/refs); BlueprintTools (graphs/events/functions/variables/find_nodes/get_node_infos/get_connected_subgraph/read_graph_dsl); ObjectTools (get_properties).
## Tool limitations / failed queries ## Tool limitations / failed queries
- Git unavailable (not a repository) - CustomEvent Reliable/Unreliable flags: **Unknown — MCP property visibility limitation**
- Some parallel CallMcpTool batches failed with schema errors; succeeded when retried singly - `find_nodes(title="Comment")` returned [] — comment-box regions Unknown
- SemanticSearch not used (not configured) - SemanticSearch unavailable
- GetPluginInfo for GameplayAbilities/CommonUI/IsEnabled calls failed in parallel batch (AdvancedSessions info succeeded on retry); ListEnabledPlugins already confirmed AdvancedSessions/Steam/CommonUI/GameplayAbilities enabled - Some CallMcpTool invocations initially failed when `server`/`toolName` wrapper omitted; retried successfully
- Blocked read-only continuity queries (if any): recorded as tool limitation, not mutation
## Contradictory evidence ## Contradictory evidence
1. **Enemy ASC ownership vs GetAbilitySystemComponent:** Enemy creates ASC on self; base character GetASC uses PlayerState only. Both Observed Implementation. Better supported: both true — interface path likely wrong for enemies. Logged for Batch 4 / runtime. 1. Dual HUD: native ASC Overlay vs DEPRECATED float UpdatePlayerHUD — both active statically.
2. **Documented Intent URIRGameplayAbility “all abilities” vs no subclasses / no GA assets:** Infrastructure only. Better supported: not migrated. 2. DefaultAttributes: GE assets exist (incl. character orphans); BP_PlayerState=None; C++ never applies.
3. **DefaultAttributesGameplayEffect declared vs never applied in native:** Scaffolding; apply path Unknown (Blueprint?). 3. Enemy ASC ownership vs GetASC PlayerState path — unchanged from Batch 1.
4. Cleric Ability 004: FCanUseMana executed but Branch uses literal true — structural defect.
## Unresolved naming ambiguities ## Unresolved naming ambiguities
- `Player_Amazonian` vs GE `Amazon` folder naming - Amazon vs Amazonian GE folder naming (Pass 7)
- `WBP_PlayerHUD` returned as RIRHUD subclass - WBP_PlayerHUD naming — resolved class-wise; name still misleading
## Requires Manual Editor Inspection ## Requires Manual Editor Inspection
- OnlineSubsystem/Steam config location - CustomEvent Reliable/Unreliable flags
- Confirm WBP_PlayerHUD asset type - DEPRECATED comment-box visual boundaries
- CommonUI content usage - Montage notify tracks → UseAbility*
## Requires Runtime Inspection / PIE ## Requires Runtime Inspection / PIE
- Enemy GetASC / EffectActor apply - Dual HUD behavior
- Default attribute values after spawn - Default attribute spawn values
- HUD overlay creation success - Enemy GetASC impact
- Session flows (later) - Cleric Ability 004 / Wizard BeginPlay Parent skip
- Ability networking feel / reliability
## Suggested next bounded task ## Suggested next bounded task
**Authorize Batch 2 only:** **Authorize Batch 4 only** (choose one or more Passes explicitly):
1. Pass 3Blueprint hierarchy for `BP_PlayerCharacterBase`, five `Player_*`, `BP_EnemyCharacterBase`, `BP_Enemy_Skeleton`, `BPI_*`, `GI_Dungeoneer`, `GM_*`, `PC_Character`, `BP_PlayerState` (structure: parents, vars, graphs list, events — not full ability path walk yet where Pass 5 owns deep dive). 1. Pass 7GAS GE/cue/tag inventory
2. Pass 5Deep dive `BP_PlayerCharacterBase` ability/RPC/DEPRECATED/GAS/comments. 2. Pass 8Animation / AnimNotify → UseAbility wiring
3. Pass 4 — Frontend / session flows
4. Pass 9 — Enemy BP AI
**Do not begin** Pass 11 migration matrix or PIE until authorized.
**Exact starting files for next model:** **Exact starting files for next model:**
- Read: `00-MCP-Capability-Calibration.md`, `15-HandoffStatus.md`, `14-EvidenceIndex.md`, `03-ClassHierarchy.md`, `08-CharacterSystems.md` - Read: `00`, `05`, `06`, `08`, `10`, `13`, `14`, `15`
- Inspect first: `/Game/_Main/Blueprints/Characters/PlayerCharacters/BP_PlayerCharacterBase` - For Pass 7: start GE assets under `/Game/_Main/` + ASC defaults
- For Pass 8: start montages listed in `10-AnimationDependencies.md`
**Subsystem continuity:** Keep player-base ability reconstruction with one model through Batch 2 Pass 5 before switching mid-graph.
## Confirmation ## Confirmation
- No Unreal assets modified - No Unreal assets modified
- No source/config/map/plugin modified - No source/config/map/plugin modified
- No editor state intentionally modified (PIE not started; level/selection/camera not changed) - No editor state intentionally modified (PIE not started; level/selection unchanged)
- No work beyond Pass 2 performed - No work beyond Pass 6 performed
- Waiting for explicit authorization before Batch 4