From 0d045d142f1678cc8774c47be84972b2d956808d Mon Sep 17 00:00:00 2001 From: Trevor Date: Thu, 16 Jul 2026 20:29:10 -0700 Subject: [PATCH] =?UTF-8?q?Document=20Batch=202=E2=80=933=20Phase=201=20ar?= =?UTF-8?q?chaeology:=20shared=20player-base=20architecture=20and=20per-ch?= =?UTF-8?q?aracter=20ability=20inventories.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Captures Blueprint hierarchy, legacy ability/RPC paths, animation dependency seeds, and handoff state without modifying Unreal assets. Co-authored-by: Cursor --- .../Archaeology/00A-Phase-1-Execution-Plan.md | 161 ++++++++ .../Archaeology/03-ClassHierarchy.md | 365 ++++++------------ .../05-LegacyAbilityArchitecture.md | 235 +++++++++++ .../Archaeology/06-PartialGASArchitecture.md | 59 ++- .../Archaeology/08-CharacterSystems.md | 168 +++++++- .../Archaeology/09-EnemyAI-StaticAnalysis.md | 49 ++- .../Archaeology/10-AnimationDependencies.md | 93 +++++ .../Archaeology/11-UI-HUD-And-Sessions.md | 56 ++- .../13-Unknowns-And-RuntimeQuestions.md | 168 ++++---- Documentation/Archaeology/14-EvidenceIndex.md | 59 ++- Documentation/Archaeology/15-HandoffStatus.md | 156 ++++---- 11 files changed, 1106 insertions(+), 463 deletions(-) create mode 100644 Documentation/Archaeology/00A-Phase-1-Execution-Plan.md create mode 100644 Documentation/Archaeology/05-LegacyAbilityArchitecture.md create mode 100644 Documentation/Archaeology/10-AnimationDependencies.md diff --git a/Documentation/Archaeology/00A-Phase-1-Execution-Plan.md b/Documentation/Archaeology/00A-Phase-1-Execution-Plan.md new file mode 100644 index 00000000..3977ff88 --- /dev/null +++ b/Documentation/Archaeology/00A-Phase-1-Execution-Plan.md @@ -0,0 +1,161 @@ +--- +name: Phase 1 Archaeology +overview: Execute Phase 1 archaeology in user-authorized batches (Batch 1–5). 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 0–2 — 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 1–4 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 0–2) | **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 001–004 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. diff --git a/Documentation/Archaeology/03-ClassHierarchy.md b/Documentation/Archaeology/03-ClassHierarchy.md index 5ddf3490..0af25606 100644 --- a/Documentation/Archaeology/03-ClassHierarchy.md +++ b/Documentation/Archaeology/03-ClassHierarchy.md @@ -2,37 +2,33 @@ **Status: Draft** -- **Scope:** Native C++ class hierarchy under `Source/REALMSINRUIN/`, including parents, components, properties, replication, RPCs, GAS hooks, Blueprint extension points, and discovered Blueprint subclass paths (seeds only). -- **Inspection method:** Full read of every `.h`/`.cpp` under `Source/REALMSINRUIN/`; MCP `ObjectTools.search_subclasses` for child discovery (paths only — no Blueprint graph inspection). +- **Scope:** Native C++ hierarchy under `Source/REALMSINRUIN/` plus Blueprint parent chains, interfaces, and framework Blueprints inspected in Batch 2 Pass 3. +- **Inspection method:** Batch 1 native reads; Batch 2 read-only AssetTools tags/deps + BlueprintTools graphs/events/variables; ObjectTools CDO properties. - **Evidence classifications used:** Observed Implementation, Documented Intent, Inferred, Unknown. -- **Tool or visibility limitations:** Batch 1 forbids deep Blueprint graph analysis. Inherited Blueprint variables not inspected. No native RPCs found to verify runtime. +- **Tool or visibility limitations:** Inherited Blueprint variables require querying each parent; CustomEvent FunctionFlags not exposed via ObjectTools; Gunslinger FiB/IsDataOnly anomaly. - **Last updated:** 2026-07-16 - **Current phase:** Phase 1 — Static Architecture -- **Last completed pass:** Pass 2 (Batch 1) -- **Next pass expected to contribute:** Batch 2 Passes 3 + 5 (Blueprint hierarchy and BP_PlayerCharacterBase) +- **Last completed pass:** Pass 5 (Batch 2) +- **Next pass expected to contribute:** Batch 3 Pass 6 (per-character ability graphs) ## Draft tracking ### Completed sections -- Full native class inventory for characters, player framework, GAS, UI, interfaces -- ASC ownership split (player vs enemy) -- AttributeSet replication and constructor defaults -- EffectActor GE application path -- HUD / OverlayWidgetController attribute delegate wiring -- Blueprint subclass path seeds +- Full native class inventory (Batch 1) +- Blueprint parent chains for players, enemies, PC/PS, GI/GM +- Interface inventory under `/Game/_Main/Blueprints/Interfaces` +- WBP_PlayerHUD asset-class resolution (AHUD, not UserWidget) +- BP_PlayerState DefaultAttributesGameplayEffect = None ### Pending sections -- Blueprint parent chains, variables, graphs, interfaces on children -- GameMode / GameInstance Blueprint internals -- Whether DefaultAttributesGameplayEffect is assigned on BP_PlayerState +- Deep child ability graphs (Pass 6) +- Enemy AI graph deep dive (Pass 9) +- Frontend/session graphs (Pass 4) ### Evidence still required -- Connected ability/RPC graphs on BP_PlayerCharacterBase and Player_* classes -- Whether enemy BP overrides GetAbilitySystemComponent behavior (native override is PlayerState-based) - -### Unknowns requiring later verification -- Runtime behavior of `IAbilitySystemInterface` on enemies given base `GetAbilitySystemComponent` implementation -- Application of `DefaultAttributesGameplayEffect` (declared, never called in native) +- Exact CustomEvent reliable flags +- Who invokes `PlayerDeath` from damage +- CommonUI content usage --- @@ -45,269 +41,164 @@ flowchart TD ARIRBaseCharacter --> ARIRPlayerCharacter ARIRBaseCharacter --> ARIRBaseEnemyCharacter ITarget[ITargetInterface] --> ARIRBaseEnemyCharacter + ARIRPlayerCharacter --> BP_PlayerCharacterBase + BP_PlayerCharacterBase --> Player_Paladin + BP_PlayerCharacterBase --> Player_Amazonian + BP_PlayerCharacterBase --> Player_Cleric + BP_PlayerCharacterBase --> Player_Wizard + BP_PlayerCharacterBase --> Player_Gunslinger + ARIRBaseEnemyCharacter --> BP_EnemyCharacterBase + BP_EnemyCharacterBase --> BP_Enemy_Skeleton APlayerState --> ARIRPlayerState - IASI --> ARIRPlayerState + ARIRPlayerState --> BP_PlayerState APlayerController --> ARIRPlayerController + ARIRPlayerController --> PC_Character AHUD --> ARIRHUD - UAbilitySystemComponent --> URIRAbilitySystemComponent - UAttributeSet --> URIRAttributeSet - UGameplayAbility --> URIRGameplayAbility - AActor --> ARIREffectActor - UUserWidget --> URIRUserWidget - UObject --> URIRWidgetController - URIRWidgetController --> UOverlayWidgetController + ARIRHUD --> WBP_PlayerHUD + AGameModeBase --> GM_Dungeoneer + AGameModeBase --> GM_MainMenu + UGameInstance --> GI_Dungeoneer ``` -**Observed Implementation:** No native `AGameMode`, `UGameInstance`, or `AGameState` subclasses in the module. +--- + +## 1. Characters (native — Batch 1 summary) + +See Batch 1 sections for `ARIRBaseCharacter`, `ARIRPlayerCharacter`, `ARIRBaseEnemyCharacter` native details. Key contradictions unchanged: enemy ASC on self vs base `GetAbilitySystemComponent` from PlayerState; `DefaultAttributesGameplayEffect` unused in C++. --- -## 1. Characters +## 2. Player Blueprint hierarchy (Pass 3) -### 1.1 `ARIRBaseCharacter` (ABSTRACT) +### 2.1 `BP_PlayerCharacterBase` -| | | -|--|--| -| Header | [`Public/Characters/RIRBaseCharacter.h`](Source/REALMSINRUIN/Public/Characters/RIRBaseCharacter.h) | -| Impl | [`Private/Characters/RIRBaseCharacter.cpp`](Source/REALMSINRUIN/Private/Characters/RIRBaseCharacter.cpp) | -| Parent | `ACharacter` | -| Interfaces | `IAbilitySystemInterface` | +| Field | Value | +|-------|--------| +| Asset path | `/Game/_Main/Blueprints/Characters/PlayerCharacters/BP_PlayerCharacterBase` | +| Asset class | `BP_PlayerCharacterBase_C` | +| Parent | `/Script/REALMSINRUIN.RIRPlayerCharacter` | +| Native parent | `RIRPlayerCharacter` | +| Interfaces | `BPI_PlayerCharacter` (graphs: GetPlayer*REF, GetPlayerREF) | +| NumReplicatedProperties (tag) | 18 | +| Components | Native: CollisionCylinder, Arrow, CharacterMesh0, CharMoveComp; BP: ThirdPersonCamera, CameraPositionRef, TPSpringArm, BP_FootstepComponent_Left/Right | -**Properties (Observed Implementation):** +**Graphs:** UserConstructionScript, EventGraph, GetPlayerPaladinREF, GetPlayerREF, GetPlayerWizardREF, GetPlayerAmazonREF, GetPlayerClericREF -- `TObjectPtr AbilitySystemComponent` — VisibleAnywhere, BlueprintReadOnly, Category Abilities -- `TObjectPtr AttributeSet` — same +**Variables (local):** PlayerController, PlayerPawn, CurrentlyAttacking, CharacterClass, ManaRegenTimer, CameraPanTriggerDown, CameraTurnRate, IsDead, InitialSpawnLocation, plus DEPRECATED_Current/Max Health/Mana/Stamina, DEPRECATED_ManaRegenOverTime, DEPRECATED_Ability001–004 Damage/ManaCost -**Functions:** +**Replication samples:** CurrentlyAttacking, IsDead, DEPRECATED_CurrentHealth/Mana = Replicated; PlayerController, CharacterClass = None -- `GetAbilitySystemComponent()` override — **returns `GetPlayerState()->GetAbilitySystemComponent()`**, else nullptr. Does **not** return the local `AbilitySystemComponent` member. -- `GetAttributeSet()` — returns local `AttributeSet` member -- Constructor empty; `BeginPlay` comment: "GAS Initialization moved to PossessedBy / OnRep_PlayerState" +**Implemented custom events (selection):** Server_Ability_001–004 Begin/End, Server_UpdateHUD, PlayerDeath, Client_PlayerDeath, Server_RespawnPlayer, RotateCamera, Multicast_PlayMontage, Multicast_PlaySFX, Multi_SpawnParticle, HandleDeath; plus Possessed, BeginPlay, SetIsAttacking, InitializeHUD, AddKill_PlayerCharacter -**Documented Intent:** Comment on class: "Base Character class using GAS for RIR Project." +**Input Action refs (deps):** IA_Ability_001–004, 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_001–004 Begin; Server_003 End; UseAbility002/004; Concentrate* | +| Wizard | `.../Wizard/Player_Wizard` | BP_PlayerCharacterBase_C | False | EnemyFound, IsBlocking, ClosestEnemy | ReceiveBeginPlay/Tick/ActorBeginOverlap only | +| Gunslinger | `.../Gunslinger/Player_Gunslinger` | BP_PlayerCharacterBase_C | **True** | [] | ReceiveBeginPlay/Tick/ActorBeginOverlap; **deps only base** | + +**AnimBP (Paladin sample):** Mesh AnimClass = `/Game/_Main/Animations/PlayerCharacters/Human/CharacterClasses/Paladin/ABP_Paladin` + +**Naming:** Use `Player_Amazonian` (not Amazon). BPI_PlayerCharacter deps list Amazonian/Cleric/Paladin/Wizard — **not Gunslinger**. --- -### 1.2 `ARIRPlayerCharacter` +## 3. Enemy Blueprint hierarchy (Pass 3 seed) -| | | -|--|--| -| Header | [`Public/Player/RIRPlayerCharacter.h`](Source/REALMSINRUIN/Public/Player/RIRPlayerCharacter.h) | -| Impl | [`Private/Player/RIRPlayerCharacter.cpp`](Source/REALMSINRUIN/Private/Player/RIRPlayerCharacter.cpp) | -| Parent | `ARIRBaseCharacter` | +| Asset | Parent | Interface | Graphs | Vars | Implemented events | +|-------|--------|-----------|--------|------|--------------------| +| `/Game/_Main/Blueprints/Characters/Enemies/BP_EnemyCharacterBase` | RIRBaseEnemyCharacter | — | UCS, EventGraph | [] | BeginPlay, Tick, ActorBeginOverlap | +| `/Game/_Main/Blueprints/Characters/Enemies/Skeleton/BP_Enemy_Skeleton` | BP_EnemyCharacterBase_C | BPI_EnemyCharacter (GetEnemyREF) | UCS, EventGraph, GetEnemyREF | [] | BeginPlay, Tick, ActorBeginOverlap | -**Observed Implementation:** +**Deps (Skeleton):** SKM_Skeleton_Guard_Body, BPI_EnemyCharacter, BP_EnemyCharacterBase, ABP_Skeleton, REALMSINRUIN -- Constructor comment: "Removed GAS component creation — now handled by PlayerState" -- `PossessedBy` → `InitAbilityActorInfo()` (server) -- `OnRep_PlayerState` → `InitAbilityActorInfo()` (client) -- `InitAbilityActorInfo()`: - 1. `check(GetPlayerState())` - 2. `ASC->InitAbilityActorInfo(PlayerState, this)` — Owner = PlayerState, Avatar = Character - 3. Copies ASC and AttributeSet pointers from PlayerState onto character members - 4. If controller is `ARIRPlayerController` and HUD is `ARIRHUD`, calls `RIRHUD->InitOverlay(...)` - -**No RPCs. No ability granting. No DefaultAttributes application.** - -**Known Blueprint subclasses (seed — Observed Implementation via search_subclasses):** - -- `/Game/_Main/Blueprints/Characters/PlayerCharacters/BP_PlayerCharacterBase` -- `/Game/_Main/Blueprints/Characters/PlayerCharacters/PlayerCharacterClasses/Amazonian/Player_Amazonian` -- `.../Cleric/Player_Cleric` -- `.../Paladin/Player_Paladin` -- `.../Wizard/Player_Wizard` -- `.../Gunslinger/Player_Gunslinger` +Deep AI graph analysis deferred to Pass 9. --- -### 1.3 `ARIRBaseEnemyCharacter` +## 4. Player framework Blueprints -| | | -|--|--| -| Header | [`Public/Characters/RIRBaseEnemyCharacter.h`](Source/REALMSINRUIN/Public/Characters/RIRBaseEnemyCharacter.h) | -| Impl | [`Private/Characters/RIRBaseEnemyCharacter.cpp`](Source/REALMSINRUIN/Private/Characters/RIRBaseEnemyCharacter.cpp) | -| Parent | `ARIRBaseCharacter` | -| Interfaces | `ITargetInterface` | +### 4.1 `PC_Character` -**Observed Implementation — constructor:** +| Field | Value | +|-------|--------| +| Path | `/Game/_Main/Blueprints/Player/PC_Character` | +| Parent | RIRPlayerController | +| Interface | BPI_PlayerController (GetPC_DungeoneerReference) | +| Variables | CharacterSelectHUD | +| Implemented events | ServerSpawnCharacter, ReceiveBeginPlay, PlayerFirstSpawn, PlayerSelectScreenChoice, PlayerRespawn | +| CDO IMC | `/Game/_Main/Blueprints/Player/Inputs/IMC_PlayerDefault` | +| CDO MovementInput | `/Game/_Main/Blueprints/Player/Inputs/Movement/IA_Movement` | -- Mesh Visibility channel → Block -- Creates `URIRAbilitySystemComponent` on self; `SetIsReplicated(true)`; `SetReplicationMode(Minimal)` -- Creates `URIRAttributeSet` on self +### 4.2 `BP_PlayerState` -**BeginPlay:** `AbilitySystemComponent->InitAbilityActorInfo(this, this)` — Owner and Avatar both the enemy. - -**ITargetInterface:** `HighlightActor` / `UnHighlightActor` toggle custom depth stencil `CUSTOM_DEPTH_RED` (250). - -**No AI movement, targeting, attack, Behavior Tree, or Perception code in native.** - -**Known Blueprint subclasses (seed):** - -- `/Game/_Main/Blueprints/Characters/Enemies/BP_EnemyCharacterBase` -- `/Game/_Main/Blueprints/Characters/Enemies/Skeleton/BP_Enemy_Skeleton` - -**Issue classification:** Incomplete Refactor / Partially Implemented (ASC on enemy vs base GetASC from PlayerState). **Requires Runtime Inspection** for GE application to enemies via `UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent`. +| Field | Value | +|-------|--------| +| Path | `/Game/_Main/Blueprints/Player/BP_PlayerState` | +| Parent | RIRPlayerState | +| IsDataOnly | True | +| Variables | [] | +| Implemented events | BeginPlay, Tick | +| **DefaultAttributesGameplayEffect** | **None** (Observed Implementation on CDO) | --- -## 2. Player framework +## 5. Game framework Blueprints -### 2.1 `ARIRPlayerState` +| Asset | Parent | Notes | +|-------|--------|-------| +| `/Game/_Main/Blueprints/Game/GameInstance/GI_Dungeoneer` | GameInstance | IsDataOnly; no implemented events; empty deps | +| `/Game/_Main/Blueprints/Game/GameMode/GM_Dungeoneer` | GameModeBase | BPI_GameMode; vars PlayerStartLocations, ConnectedPlayers, Player Stats; events PostLogin/Logout/BeginPlay/GetSelectedClass | +| `/Game/_Main/Blueprints/Game/GameMode/GM_MainMenu` | GameModeBase | IsDataOnly; deps PC_MainMenu, BP_MainMenuPawn | -| | | -|--|--| -| Header | [`Public/Player/RIRPlayerState.h`](Source/REALMSINRUIN/Public/Player/RIRPlayerState.h) | -| Impl | [`Private/Player/RIRPlayerState.cpp`](Source/REALMSINRUIN/Private/Player/RIRPlayerState.cpp) | -| Parent | `APlayerState` | -| Interfaces | `IAbilitySystemInterface` | +**GM_Dungeoneer CDO (Observed Implementation):** -**Observed Implementation:** - -- Owns `URIRAbilitySystemComponent` — replicated, `EGameplayEffectReplicationMode::Mixed` -- Owns `URIRAttributeSet` -- `NetUpdateFrequency = 100.f` -- `TSubclassOf DefaultAttributesGameplayEffect` (EditDefaultsOnly) — **never referenced in .cpp** - -**Blueprint subclass seed:** `/Game/_Main/Blueprints/Player/BP_PlayerState` - -**Issue:** Partially Implemented — default attributes GE property without native apply path. +- HUDClass = `WBP_PlayerHUD_C` +- PlayerControllerClass = `PC_Character_C` +- PlayerStateClass = `BP_PlayerState_C` +- DefaultPawnClass = None (spawn via PC flow) --- -### 2.2 `ARIRPlayerController` +## 6. Interfaces discovered -| | | -|--|--| -| Header | [`Public/Player/RIRPlayerController.h`](Source/REALMSINRUIN/Public/Player/RIRPlayerController.h) | -| Impl | [`Private/Player/RIRPlayerController.cpp`](Source/REALMSINRUIN/Private/Player/RIRPlayerController.cpp) | -| Parent | `APlayerController` | +| Interface | Path | Key graphs | +|-----------|------|------------| +| BPI_PlayerCharacter | `/Game/_Main/Blueprints/Interfaces/BPI_PlayerCharacter` | UseAbility001–004, SetIsAttacking, InitializeHUD, GetPlayer*REF, DEPRECATED_Recover*, AddKill_PlayerCharacter | +| BPI_EnemyCharacter | `.../BPI_EnemyCharacter` | GetEnemyREF, AddPlayerTarget, EnemyMeleeAttack | +| BPI_PlayerController | `.../BPI_PlayerController` | SetPlayerCanMove, UpdatePlayerHUD, PlayerRespawn, PlayerSelectScreenChoice, PlayerFirstSpawn, AddGold, GetPC_DungeoneerReference, AddKill_PlayerController | +| BPI_GameMode | `.../BPI_GameMode` | GetPlayerStats (on GM_Dungeoneer) | -**Observed Implementation:** - -- `bReplicates = true` -- Enhanced Input: `PlayerMappingContext`, `MovementInput` (EditAnywhere — must be assigned in editor/BP) -- `BeginPlay`: `check(PlayerMappingContext)`; add IMC; show mouse; GameAndUI input mode -- `SetupInputComponent`: bind MovementInput → `HandleMovementInput` -- `PlayerTick` → `CursorTrace` for `ITargetInterface` highlight -- `BindCallbacksToDependencies()` empty stub -- TODO comment: controller-compatible cursor / Gauntlet-style targeting - -**No ability input bindings in native. No RPCs.** - -**Blueprint subclass seed:** `/Game/_Main/Blueprints/Player/PC_Character` +No separate ability/damage/targeting/session BPI assets under `/Game/_Main/Blueprints/Interfaces` beyond the four above. --- -### 2.3 `ARIRHUD` +## 7. WBP_PlayerHUD resolution -| | | -|--|--| -| Header | [`Public/UI/HUD/RIRHUD.h`](Source/REALMSINRUIN/Public/UI/HUD/RIRHUD.h) | -| Impl | [`Private/UI/HUD/RIRHUD.cpp`](Source/REALMSINRUIN/Private/UI/HUD/RIRHUD.cpp) | -| Parent | `AHUD` | +| Field | Value | +|-------|--------| +| Path | `/Game/_Main/UI/Widgets/HUD/WBP_PlayerHUD` | +| Asset class | `WBP_PlayerHUD_C` | +| Parent | `/Script/REALMSINRUIN.RIRHUD` (**AHUD**) | +| IsDataOnly | True | +| Verdict | **AHUD Blueprint**, not a Widget Blueprint. `WBP_` prefix is misleading. | +| Referencers | `GM_Dungeoneer` | +| Dependencies | REALMSINRUIN, `WBP_Overlay`, `BP_OverlayWidgetController` | -**Observed Implementation:** - -- `OverlayWidgetClass`, `OverlayWidgetControllerClass` (EditAnywhere — editor/BP assigned) -- `InitOverlay`: checkf messages reference filling `WBP_PlayerHUD`; creates widget; builds `FWidgetControllerParams`; `BroadcastInitialInitialValues`; `AddToViewport` -- `GetOverlayWidgetController`: creates controller, `SetWidgetControllerParams`, `BindCallbacksToDependencies` - -**Subclass search seed:** returned `/Game/_Main/UI/Widgets/HUD/WBP_PlayerHUD` — **Requires Manual Editor Inspection** to confirm whether this asset is a HUD Blueprint or mis-tagged; name suggests Widget Blueprint. +Resolves Batch 1 subclass-search anomaly: ObjectTools returned this asset under RIRHUD search because it **is** an RIRHUD child. --- -## 3. GAS scaffolding +## 8. Native RPCs -### 3.1 `URIRAbilitySystemComponent` - -Thin subclass of `UAbilitySystemComponent`. Empty constructor. No custom granting, input binding, or tag logic. - -Header: [`Public/Abilities/RIRAbilitySystemComponent.h`](Source/REALMSINRUIN/Public/Abilities/RIRAbilitySystemComponent.h) - -### 3.2 `URIRAttributeSet` - -| Attributes | Replication | -|------------|-------------| -| Health, MaxHealth, Mana, MaxMana, Stamina, MaxStamina | `DOREPLIFETIME_CONDITION_NOTIFY` + OnRep_* → `GAMEPLAYATTRIBUTE_REPNOTIFY` | - -Constructor inits: Health=75, MaxHealth=100, Mana=25, MaxMana=50. **Does not call InitStamina / InitMaxStamina** (remain default 0.f unless set by GE). - -No `PostGameplayEffectExecute` / clamping logic in .cpp. - -### 3.3 `URIRGameplayAbility` - -**Documented Intent:** "Base class for all Gameplay Abilities in RIR Project" - -**Observed Implementation:** Sets `InstancingPolicy = InstancedPerActor` only. No ActivateAbility, tags, costs, or cooldowns. - -**search_subclasses:** **only** `/Script/REALMSINRUIN.RIRGameplayAbility` — **no derived project ability classes**. - -**Classification:** GAS infrastructure only / Partially Implemented. Do **not** conclude abilities migrated to GAS. - -### 3.4 `ARIREffectActor` - -- Root: `USceneComponent` -- `ApplyEffectToTarget` (BlueprintCallable): gets ASC via `UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent`; MakeOutgoingSpec level 1; ApplyGameplayEffectSpecToSelf -- Properties: `InstantGameplayEffectClass`, `DurationGameplayEffectClass` (not auto-applied in native BeginPlay) - -**Blueprint subclass seeds:** - -- `/Game/_Main/Blueprints/Items/Food/BP_OrangeSlice` -- `/Game/_Main/Blueprints/Items/Potion/BP_HealthPotion` -- `/Game/_Main/Blueprints/Items/Potion/BP_ManaPotion` -- `/Game/_Main/Blueprints/Items/Potion/BP_ManaCrystal` - ---- - -## 4. UI - -### 4.1 `URIRUserWidget` - -- `SetWidgetController` BlueprintCallable → fires `WidgetControllerSet` BlueprintImplementableEvent - -**Subclasses seed:** `WBP_ProgressBarBase`, `WBP_ManaProgressBar`, `WBP_HealthProgressBar`, `WBP_Overlay` - -### 4.2 `URIRWidgetController` / `FWidgetControllerParams` - -Holds PC, PS, ASC, AS. Base `BroadcastInitialInitialValues` / `BindCallbacksToDependencies` empty. - -### 4.3 `UOverlayWidgetController` - -**Observed Implementation:** Broadcasts and binds Health/MaxHealth/Mana/MaxMana/Stamina/MaxStamina via ASC attribute change delegates. - -**Observed Implementation quirk:** `OnStaminaChanged` typed as `FOnManaChangedSignature`; `OnMaxStaminaChanged` typed as `FOnMaxManaChangedSignature` — likely copy-paste. **Technical Debt** (delegate type names wrong; broadcast still float). - -**Subclass seed:** `/Game/_Main/UI/Widgets/WidgetController/BP_OverlayWidgetController` - ---- - -## 5. Interfaces - -### `ITargetInterface` - -Pure virtual `HighlightActor` / `UnHighlightActor`. Implemented by `ARIRBaseEnemyCharacter`. Used by `ARIRPlayerController::CursorTrace`. - ---- - -## 6. Framework Blueprints discovered (seeds — no native parents in module) - -| Class | Path | -|-------|------| -| GameInstance | `/Game/_Main/Blueprints/Game/GameInstance/GI_Dungeoneer` | -| GameMode | `/Game/_Main/Blueprints/Game/GameMode/GM_Dungeoneer` | -| GameMode | `/Game/_Main/Blueprints/Game/GameMode/GM_MainMenu` | - ---- - -## 7. Native RPCs - -**Observed Implementation:** Grep of `Source/REALMSINRUIN` found **no** `Server_`, `Client_`, or `Multicast_` UFUNCTIONs. Ability networking, if present, is Blueprint-only (Batch 2/3). +**Observed Implementation:** Still no native Server/Client/Multicast UFUNCTIONs in `Source/REALMSINRUIN`. All ability networking is Blueprint-only (`05`). --- @@ -315,8 +206,8 @@ Pure virtual `HighlightActor` / `UnHighlightActor`. Implemented by `ARIRBaseEnem | Topic | Evidence A | Evidence B | Better supported | |-------|------------|------------|------------------| -| Enemy ASC access | Enemy creates ASC on self; InitAbilityActorInfo(this,this) | Base `GetAbilitySystemComponent` reads PlayerState only | Both Observed Implementation; interface path likely broken for enemies | -| Default attributes | `DefaultAttributesGameplayEffect` on PlayerState; GE assets exist (calibration) | Never applied in native .cpp | Property is scaffolding; apply path Unknown (Blueprint?) | -| Gameplay Abilities | `URIRGameplayAbility` + Documented Intent "all abilities" | No subclasses; calibration found no GA assets | Infrastructure only — abilities not GAS-converted | - -Log also in `15-HandoffStatus.md`. +| Enemy ASC access | Enemy ASC on self | Base GetASC from PlayerState | Both Observed; interface path likely broken for enemies | +| Default attributes | GE assets exist; property on PS | BP_PlayerState CDO = None; never applied in C++ | Property unused; apply path still Unknown / missing | +| HUD naming | `WBP_PlayerHUD` name suggests widget | Parent is RIRHUD (AHUD) | AHUD — name is Documented Intent mismatch | +| Dual HUD systems | Native InitOverlay → WBP_Overlay + ASC | BP Server_UpdateHUD → DEPRECATED floats → UpdatePlayerHUD | Both Observed Implementation; incomplete GAS migration | +| Gameplay Abilities | URIRGameplayAbility Documented Intent | No GA assets; legacy Server_Ability_* | Legacy BP abilities active | diff --git a/Documentation/Archaeology/05-LegacyAbilityArchitecture.md b/Documentation/Archaeology/05-LegacyAbilityArchitecture.md new file mode 100644 index 00000000..429eb653 --- /dev/null +++ b/Documentation/Archaeology/05-LegacyAbilityArchitecture.md @@ -0,0 +1,235 @@ +# 05 — Legacy Ability Architecture + +**Status: Draft** + +- **Scope:** Shared `BP_PlayerCharacterBase` ability architecture (Batch 2) plus per-character Ability 001–004 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 001–004 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 002–004 | 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 001–004 | 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 001–004 | 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 001–004; Gunslinger 001–004 (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. diff --git a/Documentation/Archaeology/06-PartialGASArchitecture.md b/Documentation/Archaeology/06-PartialGASArchitecture.md index e24e54ec..a7d2f798 100644 --- a/Documentation/Archaeology/06-PartialGASArchitecture.md +++ b/Documentation/Archaeology/06-PartialGASArchitecture.md @@ -2,12 +2,12 @@ **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. -- **Inspection method:** Native C++ read; AttributeSetToolset not re-run this batch (calibration prior); GameplayTags from DefaultGameplayTags.ini; subclass search for URIRGameplayAbility. +- **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; Batch 2 ObjectTools on `BP_PlayerState` CDO; BlueprintTools on `BP_PlayerCharacterBase` for ASC/GA absence in ability graphs. - **Last updated:** 2026-07-16 - **Current phase:** Phase 1 — Static Architecture -- **Last completed pass:** Pass 2 (Batch 1) -- **Next pass expected to contribute:** Batch 4 Pass 7 +- **Last completed pass:** Pass 6 (Batch 3) +- **Next pass expected to contribute:** Batch 4 Pass 7 (GE/cue inventory) ## Draft tracking @@ -19,28 +19,31 @@ - URIRGameplayAbility empty + no subclasses - EffectActor ApplyEffectToTarget mechanism - Project gameplay tags from config +- **BP_PlayerState `DefaultAttributesGameplayEffect` = None** (Pass 3) +- Confirmation: abilities remain legacy BP `Server_Ability_*` (Pass 5–6 / doc 05) +- **Pass 6:** No ASC activate/grant/GameplayEffect apply in any connected ability path on five playables ### Pending sections -- Default attribute GE CDO modifiers per character +- Default attribute GE CDO modifiers per character (Pass 7) - Gameplay Cue inventory -- Ability granting paths in Blueprints - Tag referencers - Runtime ASC state (PIE-gated) ### Evidence still required -- Whether BP_PlayerState assigns/applies `DefaultAttributesGameplayEffect` -- Whether any Blueprint grants `URIRGameplayAbility` or engine GA classes +- Whether any other actor/BP applies default-attribute GEs at spawn +- 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 | |-------|--------|----------| | GAS infrastructure | Present | ASC, AttributeSet, IAbilitySystemInterface, EffectActor | | 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 | -| Legacy BP abilities | Not inspected this batch | Calibration: Server_Ability_*, UseAbility* on Paladin | +| GAS runtime abilities | Not observed | No URIRGameplayAbility subclasses; no GA assets; base EventGraph has no ASC activate | +| 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**. +**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 `URIRGameplayAbility`: InstancedPerActor only. **No project subclasses** (search_subclasses). -**Conclusion (Observed Implementation):** No project-defined UGameplayAbility subclasses, Gameplay Ability assets, or -static ability-granting paths have been observed so far. +**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`. -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 `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. diff --git a/Documentation/Archaeology/08-CharacterSystems.md b/Documentation/Archaeology/08-CharacterSystems.md index 8200682a..758d7124 100644 --- a/Documentation/Archaeology/08-CharacterSystems.md +++ b/Documentation/Archaeology/08-CharacterSystems.md @@ -2,49 +2,175 @@ **Status: Draft** -- **Scope (Batch 1 seed):** Native player character lineage and discovered Blueprint child paths only. No per-character ability inventory yet. -- **Inspection method:** Native C++ + `search_subclasses` path listing. +- **Scope:** Player character Blueprint hierarchy (Pass 3), shared base architecture (Pass 5), and per-character Ability 001–004 connected-path reconstruction (Pass 6). +- **Inspection method:** Read-only AssetTools + BlueprintTools + ObjectTools; connected subgraphs on all five playables + base correlation. - **Last updated:** 2026-07-16 - **Current phase:** Phase 1 — Static Architecture -- **Last completed pass:** Pass 2 (Batch 1) -- **Next pass expected to contribute:** Batch 2 Pass 3 (hierarchy), Pass 5 (base deep dive); Batch 3 Pass 6 (per-character) +- **Last completed pass:** Pass 6 (Batch 3) +- **Next pass expected to contribute:** Batch 4 Pass 7 / Pass 8 ## Draft tracking ### Completed sections -- Native parent chain for players -- InitAbilityActorInfo / HUD overlay hook -- Exact Blueprint subclass paths for five playable classes + base +- Native player chain + ASC ownership (Batch 1) +- Blueprint parent chains and structural sheets for five playables + base +- Shared input / RPC / death / HUD / multicast architecture +- Interface BPI_PlayerCharacter surface +- Override matrix (which Server_Ability events children implement) +- **Pass 6:** Full Ability 001–004 path reconstruction per character — see `05-LegacyAbilityArchitecture.md` +- Charge / DivineCircle / Whirlwind / UseAbility hit paths inventoried +- Montage dependency seeds — see `10-AnimationDependencies.md` ### Pending sections -- Components, weapons, AnimBP, inputs, abilities per character -- Shared vs duplicated Blueprint behavior -- Interface BPI_PlayerCharacter +- AnimNotify → UseAbility wiring (Pass 8) +- Weapon component deep dive if separate assets exist beyond overlaps +- Gunslinger intended design (no static implementation) ### 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 -`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 | |-----------|------------| | Base | `/Game/_Main/Blueprints/Characters/PlayerCharacters/BP_PlayerCharacterBase` | -| Paladin | `/Game/_Main/Blueprints/Characters/PlayerCharacters/PlayerCharacterClasses/Paladin/Player_Paladin` | -| Amazonian | `/Game/_Main/Blueprints/Characters/PlayerCharacters/PlayerCharacterClasses/Amazonian/Player_Amazonian` | -| Cleric | `/Game/_Main/Blueprints/Characters/PlayerCharacters/PlayerCharacterClasses/Cleric/Player_Cleric` | -| Wizard | `/Game/_Main/Blueprints/Characters/PlayerCharacters/PlayerCharacterClasses/Wizard/Player_Wizard` | -| Gunslinger | `/Game/_Main/Blueprints/Characters/PlayerCharacters/PlayerCharacterClasses/Gunslinger/Player_Gunslinger` | +| Paladin | `.../PlayerCharacterClasses/Paladin/Player_Paladin` | +| Amazonian | `.../Amazonian/Player_Amazonian` | +| Cleric | `.../Cleric/Player_Cleric` | +| Wizard | `.../Wizard/Player_Wizard` | +| 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_001–004 | 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); 002–004 inherited stubs; PerformingWhirlwind never Set | + +### Cleric + +| Field | Value | +|-------|--------| +| Graphs | UCS, EventGraph, GetPlayerClericREF, PlayerHitCheck | +| Local vars | Ability001Montages, DivineCircleActive, DivineCircleTimerHandle, IsBlocking, EnemyFound, ClosestEnemy | +| Ability events | Server_001–004 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 | 001–004 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 | 001–004 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. diff --git a/Documentation/Archaeology/09-EnemyAI-StaticAnalysis.md b/Documentation/Archaeology/09-EnemyAI-StaticAnalysis.md index de2e4781..ad2c359e 100644 --- a/Documentation/Archaeology/09-EnemyAI-StaticAnalysis.md +++ b/Documentation/Archaeology/09-EnemyAI-StaticAnalysis.md @@ -2,11 +2,11 @@ **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. -- **Inspection method:** Read `ARIRBaseEnemyCharacter`; calibration prior (no BT/BB/custom AIController assets); subclass path search. +- **Scope:** Native enemy class (Batch 1) + Pass 3 structural Blueprint inventory. Deep Tick/overlap/AI graph walk deferred to Pass 9. +- **Inspection method:** Native read; Batch 2 AssetTools tags + BlueprintTools list_graphs/events/variables/deps. - **Last updated:** 2026-07-16 - **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 ## Draft tracking @@ -14,12 +14,13 @@ ### Completed sections - Native enemy ASC ownership and highlight interface - Confirmation: no chase/attack/MoveTo in native C++ -- Blueprint child paths +- Blueprint child paths + Pass 3 structural sheets +- BPI_EnemyCharacter API surface ### Pending sections -- BP_EnemyCharacterBase / BP_Enemy_Skeleton graphs (Tick, overlaps, MoveTo, timers) -- AIControllerClass / AutoPossessAI on CDOs -- Reconfirm BT asset absence +- Connected Tick / overlap / timer / MoveTo graphs on enemy BPs +- AIControllerClass / AutoPossessAI on CDOs (reconfirm) +- Consumers of GetASC on enemies ### Evidence still required - 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. -**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). diff --git a/Documentation/Archaeology/10-AnimationDependencies.md b/Documentation/Archaeology/10-AnimationDependencies.md new file mode 100644 index 00000000..0d8ac664 --- /dev/null +++ b/Documentation/Archaeology/10-AnimationDependencies.md @@ -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 001–004 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) | +| 002–004 | 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**. diff --git a/Documentation/Archaeology/11-UI-HUD-And-Sessions.md b/Documentation/Archaeology/11-UI-HUD-And-Sessions.md index 61004141..5a1d1494 100644 --- a/Documentation/Archaeology/11-UI-HUD-And-Sessions.md +++ b/Documentation/Archaeology/11-UI-HUD-And-Sessions.md @@ -2,11 +2,11 @@ **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. -- **Inspection method:** Native C++ read; PluginToolset; subclass seeds. +- **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; Batch 2 AssetTools class/tags/deps/refs; ObjectTools GM_Dungeoneer CDO; BlueprintTools PC_Character. - **Last updated:** 2026-07-16 - **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 ## Draft tracking @@ -16,35 +16,69 @@ - OverlayWidgetController attribute broadcasts/bindings - AdvancedSessions / AdvancedSteamSessions enabled + descriptor paths - Widget subclass path seeds +- **WBP_PlayerHUD resolved as AHUD (`RIRHUD` child)** +- GM_Dungeoneer assigns HUDClass / PC / PS ### Pending sections - Main menu / browser / character-select widget flow - Production vs Example Advanced Sessions Blueprints -- WBP_Overlay / progress bar bindings +- WBP_Overlay / progress bar bindings deep dive - CommonUI usage +- BPI_PlayerController.UpdatePlayerHUD widget targets ### 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 --- +## 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) +### Native GAS path + `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) -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. \ No newline at end of file +**Unknown:** OnlineSubsystem INI location — Requires Broader Filesystem/Configuration Inspection. diff --git a/Documentation/Archaeology/13-Unknowns-And-RuntimeQuestions.md b/Documentation/Archaeology/13-Unknowns-And-RuntimeQuestions.md index 0d2f0124..329c3ead 100644 --- a/Documentation/Archaeology/13-Unknowns-And-RuntimeQuestions.md +++ b/Documentation/Archaeology/13-Unknowns-And-RuntimeQuestions.md @@ -2,142 +2,152 @@ **Status: Draft** -- **Scope:** Unresolved questions and verification requirements identified during Batch 1 (Passes 0–2). This document separates confirmed static findings from questions that require Blueprint, runtime, editor, network, or broader configuration 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. +- **Scope:** Unresolved questions after Batches 1–3. Separates confirmed static findings from questions needing further Blueprint, runtime, or config inspection. +- **Inspection method:** Consolidation of Batches 1–3; Batch 3 resolved per-character ability path unknowns. - **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 - **Current phase:** Phase 1 — Static Architecture -- **Last completed pass:** Pass 2 (Batch 1) -- **Next pass expected to contribute:** Every subsequent batch +- **Last completed pass:** Pass 6 (Batch 3) +- **Next pass expected to contribute:** Batch 4 (Pass 4 / 7 / 8 / 9 — only when authorized) ## Draft tracking ### Completed sections - -- Batch 1 unknowns grouped by required verification method -- Confirmed enemy ASC accessor defect separated from its runtime-impact questions -- OnlineSubsystem and Steam configuration investigation separated from manual editor inspection -- Tool and environment limitations recorded -- Naming ambiguities and conflicting evidence recorded +- Batch 1 unknowns grouped by verification method +- Batch 2 resolutions: WBP_PlayerHUD class; BP_PlayerState DefaultAttributes=None; legacy ability routing documented +- Batch 3 resolutions: per-character Ability 001–004 connected paths; Wizard/Gunslinger stub confirmation; UseAbility* presence matrix +- Enemy ASC accessor defect still confirmed static ### Pending sections - -- Ability, RPC, animation, frontend, session, enemy Blueprint, UI, and pickup unknowns from Batches 2–4 -- Runtime test procedures to be finalized after static Blueprint archaeology -- Priority updates after the ability migration matrix is complete +- Frontend/session/enemy AI/animation unknowns (Batch 4) +- Runtime test procedures after static ability archaeology ### 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 -- Blueprint-only ability RPC and resource-routing architecture -- Runtime consequences of the confirmed enemy ASC accessor mismatch -- Exact source of enemy chase and attack behavior -- Session configuration and production widget flow -- Montage notify and visual Blueprint comment-region details +| Question | Resolution | Classification | Doc | +|---|---|---|---| +| Is `WBP_PlayerHUD` a Widget or AHUD? | Parent is `RIRHUD`; AHUD Blueprint; `WBP_` name misleading | Observed Implementation | 03, 11 | +| Does `BP_PlayerState` assign DefaultAttributes GE? | CDO `defaultAttributesGameplayEffect` = **None** | Observed Implementation | 03, 06 | +| How are abilities routed/networked on base? | IA_Ability_* → Server_Ability_* stubs/overrides; Multicast FX helpers | Observed Implementation | 05, 08 | + +--- + +## Resolved in Batch 3 (Pass 6) + +| Question | Resolution | Classification | Doc | +|---|---|---|---| +| Full Ability 001–004 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 -The following item is **not Unknown** at the static implementation level. - | 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? | - -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`. +| 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? | +| 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 | -|---|---|---|---|---|---|---| -| 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 | -| 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 | -| 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 | -| 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 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` | -| 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 | +| Question | Why insufficient | Paths | Method | Priority | Dependency | +|---|---|---|---|---|---| +| Who calls UseAbility*? | Events connected; callers not in EventGraph | Character AnimMontages / AnimBP | Pass 8 notify walk | High | Pass 6 bodies done | +| 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 | +| Do EffectActor children call ApplyEffectToTarget? | Native mechanism only | BP_HealthPotion etc. | Pass 10 | Medium | Batch 1 | +| Is CommonUI used by live content? | Plugin enabled; no native refs | /Game/_Main/UI | Widget parent inspection | Low | Batch 1 | +| Paladin Ability 002 block absorb | IsBlocking set; no damage absorb path traced | ABP_Paladin / PlayerHitCheck | Pass 8 + hit graphs | Medium | Pass 6 | +| Amazonian PerformingWhirlwind | Get without Set | Player_Amazonian | Search all graphs / macros | Low | Pass 6 | --- ## Requires runtime inspection / PIE -| Question | Why static inspection is insufficient | Relevant paths or systems | Recommended safe verification method | Mutates project state? | Priority | Dependency | -|---|---|---|---|---|---|---| -| 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 | -| 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 | -| 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 | -| 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 | +| Question | Why | Method | Priority | +|---|---|---|---| +| Enemy ASC accessor impact | Static mismatch; need consumers | PIE + AbilitySystemInspector | High | +| Default attribute values after spawn | No apply path found | PIE attribute values after possess | High | +| Dual HUD coexistence | Two static paths | Observe both overlay and UpdatePlayerHUD | Medium | +| 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 -| Question | Why current inspection is insufficient | Search scope and likely terms | Recommended safe verification method | Mutates project state? | Priority | Dependency | -|---|---|---|---|---|---|---| -| 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 | -| 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 | - -Do not treat absence from the initial `Config/` sample as proof that settings do not exist elsewhere. +| Question | Search | Priority | +|---|---|---| +| OnlineSubsystem / Steam settings location | Config/**, Plugins/**/Config, Saved/Config | Medium | +| GameInstance class assignment outside DefaultEngine sample | INI + referencers of GI_Dungeoneer | Medium | --- ## Requires manual editor inspection -| Question | Why MCP/static metadata may be insufficient | Relevant paths | Recommended safe verification method | Mutates project state? | Priority | Dependency | -|---|---|---|---|---|---|---| -| 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 | -| 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 | +| Question | Why | Paths | +|---|---|---| +| Montage notify timings | Registry tags limited | Character montages | +| 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 -| Item | Detail | Impact | Mitigation | -|---|---|---|---| -| 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 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. | -| 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. | -| 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. | -| 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. | +| Item | Detail | Impact | +|---|---|---| +| Semantic Search | HTTP 401 / no API key | No semantic discovery | +| CustomEvent FunctionFlags | list_properties failed on event nodes | RPC reliability Unknown | +| Comment boxes | find_nodes(title=Comment) empty | Visual DEPRECATED regions Unknown | +| Git | Available (baseline commit exists) | Dirty-tree gate works | +| No PIE in Batch 3 | Constraint honored | Runtime questions deferred | --- ## Naming ambiguities -| Item | Current evidence | Required resolution | Dependency | -|---|---|---|---| -| 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 | -| `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 | +| Item | Status | +|---|---| +| Amazon vs Amazonian | Still open for GE folder naming (Pass 7) | +| WBP_PlayerHUD | **Resolved** — AHUD named like a widget | --- ## Conflicting evidence -| Conflict | Evidence A | Evidence B | Current resolution | Remaining verification | -|---|---|---|---|---| -| 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. | -| 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. | -| 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. | +| Conflict | Current resolution | Remaining | +|---|---|---| +| Enemy ASC ownership vs accessor | Confirmed static defect | PIE impact | +| Default attributes present vs unused | BP_PlayerState=None; C++ unused; character GEs orphaned | Who applies GEs if anyone | +| 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 -1. Inspect `BP_PlayerState` default-attribute assignment/application. -2. Reconstruct `BP_PlayerCharacterBase` input, RPC, resource, and legacy ability routing. -3. Verify the exact class of `WBP_PlayerHUD`. -4. Inspect enemy Blueprint logic and identify consumers of the confirmed ASC accessor defect. -5. Inspect per-character abilities and their animation dependencies. -6. Perform broader OnlineSubsystem and Steam configuration search. -7. Run controlled PIE only after the relevant static paths are fully documented. \ No newline at end of file +1. Batch 4 Pass 7 — GE/cue/tag inventory +2. Pass 8 — AnimNotify → UseAbility wiring +3. Pass 9 — enemy Blueprint AI +4. Pass 4 — sessions / frontend +5. Controlled PIE for ASC, attributes, dual HUD, enemy GetASC, Cleric 004 / Wizard spawn diff --git a/Documentation/Archaeology/14-EvidenceIndex.md b/Documentation/Archaeology/14-EvidenceIndex.md index 09fd7802..f18d87a7 100644 --- a/Documentation/Archaeology/14-EvidenceIndex.md +++ b/Documentation/Archaeology/14-EvidenceIndex.md @@ -5,39 +5,56 @@ - **Scope:** Compact cross-model index of material findings. Full analysis lives in linked docs. - **Last updated:** 2026-07-16 - **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 ## Draft tracking ### Completed sections - 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 001–004 paths, RPCs, resources, montages) ### 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 | |--------|-----------|---------|---------------|----------------|--------------|--------------|----------------|-------|------------|--------------|-----|------------|------------------------| | 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 | -| 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 | Player ASC | ASC owned by PlayerState; Mixed replication | Observed Implementation | Intended Behavior | RIRPlayerState.cpp | CreateDefaultSubobject ASC | BP_PlayerState | — | — | — | 03,06,08 | High | Runtime values | | 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 | 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 prop | DefaultAttributesGameplayEffect unused in cpp | Observed Implementation | Partially Implemented | RIRPlayerState.h | DefaultAttributesGameplayEffect | BP_PlayerState | — | — | — | 03,06,13 | High | BP apply path | -| Effects | Apply | EffectActor applies GE via ASC library | Observed Implementation | Partially Implemented | RIREffectActor.cpp | ApplyEffectToTarget | BP_HealthPotion etc. | — | — | — | 03,12 | High | Overlap graphs | -| 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 | -| UI | Delegates | Stamina delegates use Mana signature types | Observed Implementation | Technical Debt | OverlayWidgetController.h | OnStaminaChanged | — | — | — | — | 03,11 | High | — | -| Enemy | AI native | No MoveTo/chase/attack in native | Observed Implementation | Existing Baseline Defect | RIRBaseEnemyCharacter.* | — | BP_Enemy_* | — | — | — | 09 | High | BP Pass 9 | -| Framework | Seeds | GI_Dungeoneer, GM_Dungeoneer, GM_MainMenu | Observed Implementation | — | search_subclasses | — | those paths | — | — | — | 02,03 | High | BP internals | -| Continuity | Editor | PIE=false; level Test01; sel Skeleton_C_1 | Observed Implementation | — | EditorApp/SceneTools | IsPIERunning | — | — | — | Test01 | 15 | High | — | +| GAS | Ability class | URIRGameplayAbility empty; no subclasses | Observed Implementation | Partially Implemented | RIRGameplayAbility.* | InstancingPolicy | — | — | — | — | 03,06 | High | Pass 7 | +| GAS | Default GE | BP_PlayerState DefaultAttributesGameplayEffect=None | Observed Implementation | Partially Implemented | ObjectTools CDO | defaultAttributesGameplayEffect | BP_PlayerState | — | — | — | 03,06,13 | High | Other apply sites | +| 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 | +| Ability | Input | IA_Ability_001–004 Started→Server_Ability_*_Begin | Observed Implementation | Intended Behavior | BlueprintTools | EnhancedInputAction | BP_PlayerCharacterBase | EventGraph | IA_Ability_* | IA_Ability_* | 05,08 | High | — | +| 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 | — | +| 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 | +| 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 | +| Ability | Paladin 003 | Mana + ChargeTimeline + ChargeBox ApplyDamage | Observed Implementation | Implemented | get_connected_subgraph | ChargeBox | Player_Paladin | EventGraph | Charge / Client_Charge | — | 05 | 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 002–004 | 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 | — | diff --git a/Documentation/Archaeology/15-HandoffStatus.md b/Documentation/Archaeology/15-HandoffStatus.md index a1f1c55f..552848e0 100644 --- a/Documentation/Archaeology/15-HandoffStatus.md +++ b/Documentation/Archaeology/15-HandoffStatus.md @@ -5,16 +5,16 @@ - **Scope:** Authoritative cross-model continuation document for Phase 1. - **Last updated:** 2026-07-16 - **Current phase:** Phase 1 — Static Architecture -- **Last completed pass / batch:** Batch 1 (Passes 0, 1, 2) -- **Next authorized work:** Wait for user — recommend **Batch 2** (Passes 3 + 5) +- **Last completed pass / batch:** Batch 3 (Pass 6) +- **Next authorized work:** Wait for user — recommend **Batch 4** (Pass 4 sessions / Pass 7 GAS / Pass 8 animation — only as authorized) ## Phase completed | Item | Value | |------|--------| | Phase | Phase 1 — Static Architecture (in progress) | -| Batch completed | Batch 1 — Foundation | -| Passes completed | Pass 0 Continuity gate; Pass 1 Modules/plugins/config; Pass 2 Native C++ hierarchy | +| Batch completed | Batch 3 — Per-character ability archaeology | +| Passes completed | Pass 6 (Paladin → Amazonian → Cleric → Wizard → Gunslinger) | | Date completed | 2026-07-16 | | Model identifier | Cursor Grok 4.5 | @@ -22,132 +22,150 @@ ## 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. -- **Filesystem Archaeology baseline:** Only `Documentation/Archaeology/00-MCP-Capability-Calibration.md` present (SHA256 `91CDDBC1BD2880FA892CCC3753BA0C5B582D95916E62151251AC35C131134AA5`). -- **Pre-existing modified/untracked (git):** N/A — no git. No attempt to clean or alter other project files. -- **Editor:** `IsPIERunning=false`; current level `/Game/_Main/Levels/Testing/Test01`; selected actor `BP_Enemy_Skeleton_C_1` (matches calibration). +- **Git:** Dirty with expected Batch 2 Archaeology Markdown only (not unexpected): + - Modified: `03`, `06`, `08`, `09`, `11`, `13`, `14`, `15` + - Untracked: `05-LegacyAbilityArchitecture.md` +- **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) - -- 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. +### Ending state (Batch 3 close) +- 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/` -- `REALMSINRUIN_DEV.uproject`, Targets, Build.cs, module startup -- `Plugins/AdvancedSessions` + `AdvancedSteamSessions` descriptors and Build.cs -- `Config/DefaultEngine.ini`, `DefaultGame.ini`, `DefaultGameplayTags.ini`, `DefaultInput.ini` (input file partially — defaults + Jump/Move mappings) -- PluginToolset ListEnabledPlugins; GetPluginInfo AdvancedSessions/AdvancedSteamSessions -- Editor continuity: PIE, level, selection -- search_subclasses seeds for player/enemy/effect/HUD/PC/PS/GA/widget/GameMode/GameInstance +- Player_Paladin: Ability 001–004 Begin/End/UseAbility/Charge/ChargeBox connected paths +- Player_Amazonian: Ability 001 + UseAbility001 + ReceiveAnyDamage; 002–004 absence +- Player_Cleric: Ability 001–004 + ConcentrateHandle/EndConcentrate + UseAbility002/004 +- Player_Wizard: EventGraph walk; alternate UseAbility/input/spell search; unwired assets +- Player_Gunslinger: IsDataOnly confirmation; Parent-only EventGraph; inherited stubs ## Areas partially inspected -- DefaultInput.ini beyond movement/look mappings (full VR axis noise present; ability actions absent) -- Enabled engine plugin usage (listed; not usage-verified) -- GAS GE assets (known from calibration; CDOs not re-inspected this batch) +- FCanUseMana function body (call sites only) +- Client_Charge / ChargeTimeline numeric curve details +- PlayerHitCheck graphs (existence known; full absorb logic → later) +- Montage notify tracks (seeded in doc 10 → Pass 8) ## Areas not yet inspected -- All Blueprint graph/variable deep dives (Batch 2+) -- Frontend/session flows (Batch 4) -- Per-character abilities (Batch 3) -- Animation (Batch 4 Pass 8) -- Enemy BP AI (Batch 4 Pass 9) -- Full UI trees / pickups graphs (Batch 4) -- Synthesis docs 01, 05, 07, 10 (not created — no substantive Batch 1 content for 05/07/10/01) +- Frontend/session flows (Batch 4 Pass 4) +- GE/cue systemwide inventory (Batch 4 Pass 7) +- Animation deep dive / AnimNotify → UseAbility (Batch 4 Pass 8) +- Enemy BP AI deep dive (Batch 4 Pass 9) +- Full UI trees / pickups (Batch 4) +- Cross-character migration matrix doc 07 (Pass 11) --- ## 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 -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 -Listed in §Areas fully inspected. No Unreal assets modified or saved. +Unreal content via MCP read-only only. No config file writes. ## Files created | File | Status | |------|--------| -| Documentation/Archaeology/02-ProjectArchitecture.md | Draft | -| Documentation/Archaeology/03-ClassHierarchy.md | Draft | +| Documentation/Archaeology/10-AnimationDependencies.md | Draft | + +## Files updated + +| File | Status | +|------|--------| +| Documentation/Archaeology/05-LegacyAbilityArchitecture.md | Draft (major Pass 6 rewrite) | | Documentation/Archaeology/06-PartialGASArchitecture.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/14-EvidenceIndex.md | Draft | | Documentation/Archaeology/15-HandoffStatus.md | Draft | -## Files updated - -None pre-existing except this handoff/index created new. **00-MCP-Capability-Calibration.md not modified.** +**03-ClassHierarchy.md not modified** (no Batch 2 structural correction required). +**00-MCP-Capability-Calibration.md not modified.** +**07-AbilityMigrationMatrix.md not created** (Pass 11). ## 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 -- Git unavailable (not a repository) -- Some parallel CallMcpTool batches failed with schema errors; succeeded when retried singly -- SemanticSearch not used (not configured) -- GetPluginInfo for GameplayAbilities/CommonUI/IsEnabled calls failed in parallel batch (AdvancedSessions info succeeded on retry); ListEnabledPlugins already confirmed AdvancedSessions/Steam/CommonUI/GameplayAbilities enabled +- CustomEvent Reliable/Unreliable flags: **Unknown — MCP property visibility limitation** +- `find_nodes(title="Comment")` returned [] — comment-box regions Unknown +- SemanticSearch unavailable +- 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 -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. -2. **Documented Intent URIRGameplayAbility “all abilities” vs no subclasses / no GA assets:** Infrastructure only. Better supported: not migrated. -3. **DefaultAttributesGameplayEffect declared vs never applied in native:** Scaffolding; apply path Unknown (Blueprint?). +1. Dual HUD: native ASC Overlay vs DEPRECATED float UpdatePlayerHUD — both active statically. +2. DefaultAttributes: GE assets exist (incl. character orphans); BP_PlayerState=None; C++ never applies. +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 -- `Player_Amazonian` vs GE `Amazon` folder naming -- `WBP_PlayerHUD` returned as RIRHUD subclass +- Amazon vs Amazonian GE folder naming (Pass 7) +- WBP_PlayerHUD naming — resolved class-wise; name still misleading ## Requires Manual Editor Inspection -- OnlineSubsystem/Steam config location -- Confirm WBP_PlayerHUD asset type -- CommonUI content usage +- CustomEvent Reliable/Unreliable flags +- DEPRECATED comment-box visual boundaries +- Montage notify tracks → UseAbility* ## Requires Runtime Inspection / PIE -- Enemy GetASC / EffectActor apply -- Default attribute values after spawn -- HUD overlay creation success -- Session flows (later) +- Dual HUD behavior +- Default attribute spawn values +- Enemy GetASC impact +- Cleric Ability 004 / Wizard BeginPlay Parent skip +- Ability networking feel / reliability ## Suggested next bounded task -**Authorize Batch 2 only:** +**Authorize Batch 4 only** (choose one or more Passes explicitly): -1. Pass 3 — Blueprint 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). -2. Pass 5 — Deep dive `BP_PlayerCharacterBase` ability/RPC/DEPRECATED/GAS/comments. +1. Pass 7 — GAS GE/cue/tag inventory +2. Pass 8 — Animation / 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:** -- Read: `00-MCP-Capability-Calibration.md`, `15-HandoffStatus.md`, `14-EvidenceIndex.md`, `03-ClassHierarchy.md`, `08-CharacterSystems.md` -- Inspect first: `/Game/_Main/Blueprints/Characters/PlayerCharacters/BP_PlayerCharacterBase` - -**Subsystem continuity:** Keep player-base ability reconstruction with one model through Batch 2 Pass 5 before switching mid-graph. +- Read: `00`, `05`, `06`, `08`, `10`, `13`, `14`, `15` +- For Pass 7: start GE assets under `/Game/_Main/` + ASC defaults +- For Pass 8: start montages listed in `10-AnimationDependencies.md` ## Confirmation - No Unreal assets modified - No source/config/map/plugin modified -- No editor state intentionally modified (PIE not started; level/selection/camera not changed) -- No work beyond Pass 2 performed +- No editor state intentionally modified (PIE not started; level/selection unchanged) +- No work beyond Pass 6 performed +- Waiting for explicit authorization before Batch 4