Document Batch 2–3 Phase 1 archaeology: shared player-base architecture and per-character ability inventories.

Captures Blueprint hierarchy, legacy ability/RPC paths, animation dependency seeds, and handoff state without modifying Unreal assets.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-16 20:29:10 -07:00
co-authored by Cursor
parent ff5640a020
commit 0d045d142f
11 changed files with 1106 additions and 463 deletions
+147 -21
View File
@@ -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 001004 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 001004 path reconstruction per character — see `05-LegacyAbilityArchitecture.md`
- Charge / DivineCircle / Whirlwind / UseAbility hit paths inventoried
- Montage dependency seeds — see `10-AnimationDependencies.md`
### Pending sections
- 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_001004 | Yes — calls Server_Ability_* | Bodies overridden |
| Camera zoom/pan | Yes | — |
| Multicast montage/SFX/VFX | Yes helpers | Children supply montage assets |
| Death / respawn | Yes | — |
| HUD via DEPRECATED floats | Yes | — |
| Charge / DivineCircle / Whirlwind | — | Paladin / Cleric / Amazonian |
| Hit checks | — | PlayerHitCheck on Paladin/Amazonian/Cleric |
### BeginPlay / Possessed (Observed Implementation)
- BeginPlay: Set `InitialSpawnLocation` = GetActorLocation only
- Possessed: Set `PlayerController` → Delay 0.4 → `Server_UpdateHUD`
### Ability flow (shared)
```
IA_Ability_N Started → Server_Ability_N_Begin
IA_Ability_N Completed/Canceled → Server_Ability_N_End
```
Base Begin stubs PrintString `"Override Ability N"`. Base End stubs empty.
**Paladin Ability 001 override (Observed Implementation):** Does **not** call parent. Gate `NOT CurrentlyAttacking AND NOT IsDead` → set CurrentlyAttacking → SetPlayerCanMove(true) → Multicast_PlayMontage(random Ability001Montages). **Pass 6:** UseAbility001 Authority BoxOverlap → ApplyDamage(`DEPRECATED_Ability001Damage`). Full tables → `05-LegacyAbilityArchitecture.md`.
---
## Per-character structural sheets
### Paladin
| Field | Value |
|-------|--------|
| Graphs | UCS, EventGraph, GetPlayerPaladinREF, PlayerHitCheck |
| Local vars | Ability001Montages, ChargeStartLoc, ChargeFinishLoc, IsCharging, IsBlocking |
| AnimBP | ABP_Paladin |
| Ability events implemented | Server_001 Begin; 002 Begin+End; 003 Begin; 004 Begin; UseAbility001/004; Charge; Client_Charge |
| Parent Call on Ability overrides | **No** |
| Pass 6 status | 001 Implemented; 002 Partial (block); 003 Implemented (charge+damage); 004 Implemented (empty particle template) |
### Amazonian
| Field | Value |
|-------|--------|
| Graphs | UCS, EventGraph, GetPlayerAmazonREF, PlayerHitCheck |
| Local vars | DynamicMaterials, Ability001Montage, PerformingWhirlwind |
| AnimBP (deps) | ABP_Amazon |
| Ability events | Server_001 Begin; UseAbility001; ReceiveAnyDamage |
| Pass 6 status | 001 Implemented (= known working melee); 002004 inherited stubs; PerformingWhirlwind never Set |
### Cleric
| Field | Value |
|-------|--------|
| Graphs | UCS, EventGraph, GetPlayerClericREF, PlayerHitCheck |
| Local vars | Ability001Montages, DivineCircleActive, DivineCircleTimerHandle, IsBlocking, EnemyFound, ClosestEnemy |
| Ability events | Server_001004 Begin; Server_003 End; UseAbility002/004; ConcentrateHandle; EndConcentrate |
| Parent Call on Ability overrides | **No** |
| Pass 6 status | 001 Partial (montage only); 002 Partial heal (empty particle); 003 Implemented DivineCircle; 004 Broken spawn + mana bypass |
### Wizard
| Field | Value |
|-------|--------|
| Graphs | UCS, EventGraph, GetPlayerWizardREF |
| Local vars | EnemyFound, IsBlocking, ClosestEnemy (unused in EventGraph) |
| Ability events | **None** implemented (BeginPlay/Tick/Overlap only) |
| BeginPlay Parent | **No** (skips base InitialSpawnLocation set) |
| Pass 6 status | 001004 inherited PrintString stubs; NS_Wizard_Ability001 / GE_Wizard_DefaultAttributes / BP_PlayerProjectile unwired |
### Gunslinger
| Field | Value |
|-------|--------|
| IsDataOnly | True |
| Graphs | UCS, EventGraph |
| Local vars | [] |
| Dependencies | Only BP_PlayerCharacterBase |
| BeginPlay/Tick/Overlap | Call Parent |
| Pass 6 status | 001004 inherited PrintString stubs; no weapon/projectile/AnimBP/GE |
---
## Interfaces
`BP_PlayerCharacterBase` implements `BPI_PlayerCharacter`. Class REF getters on base return self-cast nulls for wrong class; children override own REF.
`BPI_PlayerController` used heavily for SetPlayerCanMove, UpdatePlayerHUD, PlayerRespawn, AddKill.
---
## GAS interaction findings (character side)
| Finding | Classification |
|---------|----------------|
| No GA grant/activate on base or child ability EventGraphs | Observed Implementation |
| Server_UpdateHUD uses DEPRECATED floats, not ASC | Observed Implementation |
| Native InitOverlay still runs from C++ possession | Observed Implementation (Batch 1) |
| Dual UI attribute paths | Incomplete Refactor |
| Character DefaultAttributes GE assets orphaned | Present but Unconnected (Pass 6) |
---
## Networking summary
See `05` RPC inventory. Replicated: IsDead, CurrentlyAttacking, DEPRECATED resource floats. Ability activation: client Enhanced Input → Server custom events → optional Multicast FX. Reliability: Unknown — MCP property visibility limitation.