Files
realms-in-ruin-dev/Documentation/Archaeology/08-CharacterSystems.md
T
tedwardsandCursor 0d045d142f 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>
2026-07-16 20:29:10 -07:00

7.2 KiB
Raw Blame History

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 6 (Batch 3)
  • Next pass expected to contribute: Batch 4 Pass 7 / Pass 8

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: 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

  • AnimNotify → UseAbility wiring (Pass 8)
  • Weapon component deep dive if separate assets exist beyond overlaps
  • Gunslinger intended design (no static implementation)

Evidence still required

  • Exact who calls UseAbility* (likely AnimNotify — Pass 8)
  • PlayerDeath callers beyond Amazonian ReceiveAnyDamage

Native player chain

ACharacterARIRBaseCharacterARIRPlayerCharacterBP_PlayerCharacterBasePlayer_*

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.

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.