Files
realms-in-ruin-dev/Documentation/Archaeology/08-CharacterSystems.md
T
tedwardsandCursor aa0058a018 Document Pass 11 Phase 1 synthesis and close static archaeology.
Add executive summary and ability migration matrix; finalize evidence index, runtime validation plan, and Phase 1 handoff.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-16 23:40:52 -07:00

7.9 KiB
Raw Blame History

08 — Character Systems

Status: Complete

  • 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 (complete)
  • Last completed pass: Pass 11 (Batch 5) — migration matrix correlates; static content through Pass 4/10
  • Next pass expected to contribute: Phase 2C when authorized

Completion notes

Static character-system archaeology is complete. Gunslinger design and weapon deep dive are Defer pending design decision. Runtime interrupt/select/attribute tests: doc 13. Migration dispositions: doc 07.


Native player chain

ACharacterARIRBaseCharacterARIRPlayerCharacterBP_PlayerCharacterBasePlayer_*

Observed Implementation: ASC on ARIRPlayerState; character caches pointers in InitAbilityActorInfo. Native also calls ARIRHUD::InitOverlay (GAS attribute UI path).

Pass 4 spawn path: With GM_Dungeoneer.DefaultPawnClass=None, playable pawns come from WBP_CharacterSelectPC_Character.PlayerSelectScreenChoiceServerSpawnCharacterGM_Dungeoneer.GetSelectedClassPlayerFirstSpawn (SpawnActor + Possess). Selectable classes: Paladin, Wizard, Cleric, Amazonian. Gunslinger not offered on the select UI.


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 (.../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.