Files
realms-in-ruin-dev/Documentation/Archaeology/08-CharacterSystems.md
T
tedwardsandCursor e50c8032ef Document Batch 4B Pass 7 partial GAS archaeology: effects, tags, and legacy boundaries.
Inventories Gameplay Effects, orphan default attributes, missing abilities/cues, and consumable EffectActor wiring without modifying Unreal assets.

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

185 lines
8.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 08 — Character Systems
**Status: Draft**
- **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 7 (Batch 4B)
- **Next pass expected to contribute:** Pass 9 / Pass 4 when authorized
## Draft tracking
### Completed sections
- 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 Ability 001004 path reconstruction
- Pass 8: AnimBP/Montage/AnimNotify callback wiring — see `10-AnimationDependencies.md`
- **Pass 7:** Character DefaultAttributes GEs orphaned; no per-character ASC grant; Gunslinger still no GE
### Pending sections
- Weapon component deep dive if separate assets exist beyond overlaps
- Gunslinger intended design (no static implementation)
### Evidence still required
- Notify trigger times (Manual Editor)
- Interrupt cleanup if AN_AttackComplete skipped
- PIE spawn attribute values vs orphan default GEs
---
## Native player chain
`ACharacter``ARIRBaseCharacter``ARIRPlayerCharacter``BP_PlayerCharacterBase``Player_*`
**Observed Implementation:** ASC on `ARIRPlayerState`; character caches pointers in `InitAbilityActorInfo`. Native also calls `ARIRHUD::InitOverlay` (GAS attribute UI path).
---
## Playable Blueprint paths
| Character | Asset path |
|-----------|------------|
| Base | `/Game/_Main/Blueprints/Characters/PlayerCharacters/BP_PlayerCharacterBase` |
| Paladin | `.../PlayerCharacterClasses/Paladin/Player_Paladin` |
| Amazonian | `.../Amazonian/Player_Amazonian` |
| Cleric | `.../Cleric/Player_Cleric` |
| Wizard | `.../Wizard/Player_Wizard` |
| Gunslinger | `.../Gunslinger/Player_Gunslinger` |
**Observed Runtime Behavior (project brief, not re-tested):** Amazonian melee works; most abilities inactive; Gunslinger incomplete — Existing Baseline Defects.
---
## 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 (`.../Paladin/ABP_Paladin`) — Locomotion: Idle/WalkRun/Charge/Block/Death |
| Ability events | 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) |
| Pass 8 | AN_Ability_001/004 + AN_AttackComplete on montages; IsBlocking drives Block state |
### Amazonian
| Field | Value |
|-------|--------|
| Graphs | UCS, EventGraph, GetPlayerAmazonREF, PlayerHitCheck |
| Local vars | DynamicMaterials, Ability001Montage, PerformingWhirlwind |
| AnimBP (deps) | ABP_Amazon — Locomotion Idle/WalkRun/Death only |
| Ability events | Server_001 Begin; UseAbility001; ReceiveAnyDamage |
| Pass 6 status | 001 Implemented (= known working melee); 002004 inherited stubs; PerformingWhirlwind never Set |
| Pass 8 | AN_Ability_001 + AN_AttackComplete on all four attack montages; whirlwind not in AnimBP |
### 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 |
| Pass 8 | AN_Ability_001/003 dead (UseAbility unimplemented); 002/004 notify-live; ABP Divine Circle state; AN_AttackComplete on all ability montages |
### 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 |
| Pass 8 | ABP_Wizard locomotion+death only; **no** Wizard montages in class folder |
### 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 |
| Pass 8 | Confirmed: no AnimBP dependency; no shared attack montage path |
---
## 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 (0 referencers); BP_PlayerState = None | Present but Unreferenced / Scaffolding Only (Pass 7) |
| Amazon GE naming folder `Amazon` vs Blueprint `Amazonian` | Technical Debt (Pass 7) |
| No GE_Gunslinger | Missing (Pass 7) |
| Consumable GEs modify ASC Health/Mana independently of ability DEPRECATED state | Partially Integrated (Pass 7) |
---
## 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.