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

170 lines
7.9 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: 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
`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).
**Pass 4 spawn path:** With `GM_Dungeoneer.DefaultPawnClass=None`, playable pawns come from `WBP_CharacterSelect``PC_Character.PlayerSelectScreenChoice``ServerSpawnCharacter``GM_Dungeoneer.GetSelectedClass``PlayerFirstSpawn` (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`](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.