diff --git a/Documentation/Archaeology/05-LegacyAbilityArchitecture.md b/Documentation/Archaeology/05-LegacyAbilityArchitecture.md index 429eb653..ddb46e58 100644 --- a/Documentation/Archaeology/05-LegacyAbilityArchitecture.md +++ b/Documentation/Archaeology/05-LegacyAbilityArchitecture.md @@ -2,14 +2,14 @@ **Status: Draft** -- **Scope:** Shared `BP_PlayerCharacterBase` ability architecture (Batch 2) plus per-character Ability 001–004 connected-path reconstruction (Batch 3 Pass 6). -- **Inspection method:** Read-only BlueprintTools `find_nodes` / `get_node_infos` / `get_connected_subgraph` / `read_graph_dsl`; AssetTools deps; ObjectTools CDO samples. +- **Scope:** Shared `BP_PlayerCharacterBase` ability architecture (Batch 2) plus per-character Ability 001–004 connected-path reconstruction (Batch 3 Pass 6), qualified by animation-notify wiring (Batch 4A Pass 8). +- **Inspection method:** BlueprintTools connected subgraphs (Pass 6); AnimNotify `Received_Notify` DSL + montage dependency/referencer graphs (Pass 8). - **Evidence classifications used:** Observed Implementation, Documented Intent, Observed Runtime Behavior, Inferred, Unknown. -- **Tool or visibility limitations:** CustomEvent Reliable/Unreliable flags not exposed; comment-box regions not found via `find_nodes(title=Comment)`; Montage notify tracks not deep-inspected (Pass 8). +- **Tool or visibility limitations:** CustomEvent Reliable flags not exposed; Montage Notifies array / trigger times unreadable via ObjectTools; AnimGraph DSL empty. - **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 (GAS systemwide) / Pass 8 (AnimBP/Montage notifies) +- **Last completed pass:** Pass 8 (Batch 4A) +- **Next pass expected to contribute:** Pass 7 (GAS) when authorized ## Draft tracking @@ -18,20 +18,21 @@ - Base Server_Ability_* stubs - Multicast FX helpers - Death / respawn / HUD (DEPRECATED floats) -- **Per-character Ability 001–004 connected paths for all five playables** +- Per-character Ability 001–004 connected paths for all five playables - Parent-call inventory - Resource / damage / projectile inventories - Montage dependency seeds +- **Pass 8:** UseAbility* callers resolved (`AN_Ability_001–004`); `AN_AttackComplete` cleanup; Pass 6 reclassification table in `10` ### Pending sections - Cross-character migration matrix (Pass 11 → doc 07) -- Montage notify → UseAbility exact wiring (Pass 8) - Runtime verification of CDO damage/mana values (PIE) +- Interrupt cleanup if `AN_AttackComplete` skipped ### Evidence still required -- Who fires UseAbility* (anim notifies vs other) — Requires Manual Editor Inspection / Pass 8 -- FCanUseMana implementation body (function on base — not re-walked this batch beyond call sites) -- Client_Charge timeline details beyond ChargeTimeline / LineTrace / SetActorLocation +- Notify trigger times (Manual Editor Inspection) +- FCanUseMana implementation body (call sites only) +- Client_Charge timeline numeric details --- @@ -44,12 +45,17 @@ flowchart TD SBegin -->|base| Print[PrintString Override] SBegin -->|child override| Child[Character body] Child --> MC[Multicast_PlayMontage] - Child --> Use[UseAbilityN Authority] + MC --> AN[AN_Ability_00N notify] + AN --> Use[UseAbilityN Authority] Use --> Dmg[ApplyDamage or RecoverHealth] + MC --> ANC[AN_AttackComplete] + ANC --> Clear[SetIsAttacking clears CurrentlyAttacking] ``` **Observed Implementation:** No `UGameplayAbility` activation. Reliability: **Unknown — MCP property visibility limitation**. +**Pass 8:** `UseAbility*` is invoked from AnimNotify Blueprints (`AN_Ability_001–004`), not from AnimBP EventGraphs. `Multicast_PlayMontage` completion pins are unwired — cleanup for notify-driven attacks uses `AN_AttackComplete` → `SetIsAttacking`. Full animation tables: `10-AnimationDependencies.md`. + | Base event | Body | |---|---| | Server_Ability_*_Begin | PrintString `"Override Ability N"` | @@ -76,10 +82,10 @@ flowchart TD | Slot/System | Entry point | Parent called | Server path | Multicast/client path | Validation | Resource | Damage/effect | Animation | End/cleanup | Status | Evidence | |---|---|---|---|---|---|---|---|---|---|---|---| -| Ability 001 | Server_Ability_001_Begin; UseAbility001 | No | Gate !attacking && !dead → CurrentlyAttacking → SetPlayerCanMove(true) → Multicast_PlayMontage(random Ability001Montages) | Multicast_PlayMontage | Gate only | None | UseAbility001 Authority: BoxOverlap(90,50,100) forward×150 → ApplyDamage(DEPRECATED_Ability001Damage) | Attack_A/B/C/D_Fast_Montage | Server_Ability_001_End not implemented locally | **Implemented** (End Partial) | get_connected_subgraph | -| Ability 002 | Server_Ability_002_Begin; Server_Ability_002_End | No | Begin: gate → CurrentlyAttacking → CanMove false → IsBlocking true | None in Begin | Gate | None | Block state only (no ApplyDamage in Begin) | None in Begin (IsBlocking likely AnimBP) | End: CurrentlyAttacking=false → CanMove true → IsBlocking false | **Partial** (block state; no hit absorb path traced) | subgraph Event_5 / Event_7 | -| Ability 003 | Server_Ability_003_Begin; Charge; Client_Charge; ChargeBox overlap | No | Gate → FCanUseMana(DEPRECATED_Ability003ManaCost) → CurrentlyAttacking → CanMove false → ChargeBox QueryOnly → Charge + Client_Charge | Client_Charge | Gate + mana | DEPRECATED_Ability003ManaCost via FCanUseMana | ChargeBox Authority: NOT tag Player → ApplyDamage(DEPRECATED_Ability003Damage) | ChargeTimeline + LineTrace + SetActorLocation lerp | Ends not locally implemented for 003 | **Implemented** (charge + overlap damage) | subgraph Event_6 / Charge / ChargeBox | -| Ability 004 | Server_Ability_004_Begin; UseAbility004 | No | Gate → FCanUseMana(DEPRECATED_Ability004ManaCost) → CurrentlyAttacking → CanMove false → Multicast_PlayMontage(Paladin_Ability004_Montage) | Multicast_PlayMontage; UseAbility004: Multi_SpawnParticle (EmitterTemplate empty) + Multicast_PlaySFX(MagicSpell_01_Cue) | Gate + mana | DEPRECATED_Ability004ManaCost | UseAbility004 Authority: SphereOverlap radius 300 → ApplyDamage(DEPRECATED_Ability004Damage) | Paladin_Ability004_Montage | End not local | **Implemented** (FX particle template empty) | subgraph Event_8 / Event_11 | +| Ability 001 | Server_Ability_001_Begin; UseAbility001 | No | Gate !attacking && !dead → CurrentlyAttacking → SetPlayerCanMove(true) → Multicast_PlayMontage(random Ability001Montages) | Multicast_PlayMontage | Gate only | None | UseAbility001 Authority BoxOverlap ApplyDamage — **caller: AN_Ability_001** | Attack_A/B/C/D_Fast_Montage | **AN_AttackComplete** → SetIsAttacking (no local End) | **Implemented** (Pass 8 qualified) | Pass 6 + Pass 8 | +| Ability 002 | Server_Ability_002_Begin; Server_Ability_002_End | No | Begin: gate → CurrentlyAttacking → CanMove false → IsBlocking true | ABP Block (no Montage) | Gate | None | Block state only | ABP_Paladin Block via IsBlocking | End clears attacking/CanMove/IsBlocking | **Partial** | Pass 6 + Pass 8 | +| Ability 003 | Server_Ability_003_Begin; Charge; Client_Charge; ChargeBox overlap | No | Gate → FCanUseMana → Charge + Client_Charge | Client_Charge | Gate + mana | DEPRECATED_Ability003ManaCost | ChargeBox Authority ApplyDamage | ChargeTimeline (not Montage) | Not notify-driven | **Implemented** | Pass 6 | +| Ability 004 | Server_Ability_004_Begin; UseAbility004 | No | Gate → FCanUseMana → Multicast_PlayMontage(Paladin_Ability004_Montage) | Multicast_PlayMontage | Gate + mana | DEPRECATED_Ability004ManaCost | UseAbility004 Authority AoE — **caller: AN_Ability_004**; empty particle | Paladin_Ability004_Montage | **AN_AttackComplete** cleanup | **Implemented** (Pass 8 qualified; FX hole) | Pass 6 + Pass 8 | | Basic attack | Same as Ability 001 | No | Same | Same | Same | Same | Same | Attack_* montages | Same | **Implemented** (=001) | — | | Passive | — | — | — | — | — | — | — | — | — | **Missing** | — | | Death | Inherited PlayerDeath | — | Base | Base | — | DEPRECATED health (if damaged via AnyDamage — Paladin has no local AnyDamage) | Base | Base | Base | **Inherited** | list_events | @@ -97,7 +103,7 @@ flowchart TD | Slot/System | Entry point | Parent called | Server path | Multicast/client path | Validation | Resource | Damage/effect | Animation | End/cleanup | Status | Evidence | |---|---|---|---|---|---|---|---|---|---|---|---| -| Ability 001 | Server_Ability_001_Begin; UseAbility001 | No | Gate → CurrentlyAttacking → CanMove true → Multicast_PlayMontage(random Ability001Montage) | Multicast_PlayMontage | Gate | None | UseAbility001 Authority: BoxOverlap → ApplyDamage(DEPRECATED_Ability001Damage) | A_Hu_F_Combat_2H_Attack* montages | End not local; CurrentlyAttacking cleared via base SetIsAttacking (Inferred) | **Implemented** | subgraph | +| Ability 001 | Server_Ability_001_Begin; UseAbility001 | No | Gate → CurrentlyAttacking → CanMove true → Multicast_PlayMontage(random Ability001Montage) | Multicast_PlayMontage | Gate | None | UseAbility001 Authority BoxOverlap ApplyDamage — **caller: AN_Ability_001** | A_Hu_F_Combat_2H_Attack* montages | **AN_AttackComplete** → SetIsAttacking | **Implemented** (Pass 8 confirmed) | Pass 6 + Pass 8 | | Ability 002–004 | Inherited only | N/A | Base PrintString | — | — | — | — | — | Base empty End | **Stub** (inherited) | list_events | | Basic attack | Ability 001 | No | Same | Same | Same | Same | Same | Attack montages | Same | **Implemented** (=001); **Observed Runtime Behavior:** known working melee | parity brief + subgraph | | Passive | — | — | — | — | — | — | — | — | — | **Missing** | — | @@ -116,10 +122,10 @@ flowchart TD | Slot/System | Entry point | Parent called | Server path | Multicast/client path | Validation | Resource | Damage/effect | Animation | End/cleanup | Status | Evidence | |---|---|---|---|---|---|---|---|---|---|---|---| -| Ability 001 | Server_Ability_001_Begin | No | Gate → CurrentlyAttacking → CanMove false → Multicast_PlayMontage(random Ability001Montages) | Multicast_PlayMontage | Gate | None | **No UseAbility001** — no hit path | Cleric_PrimaryAttack_* | End not local | **Partial** (montage only) | subgraph | -| Ability 002 | Server_Ability_002_Begin; UseAbility002 | No | Gate → FCanUseMana(Ability002ManaCost) → CurrentlyAttacking → CanMove true → Multicast_PlayMontage(Cleric_Ability002_Montage) | Multi_SpawnParticle (EmitterTemplate **empty**); UseAbility002 Authority heal | Gate + mana | DEPRECATED_Ability002ManaCost | SphereOverlap 400 tag Player → DEPRECATED_RecoverPlayerHealth(Ability002Damage); self heal | Cleric_Ability002_Montage | End not local | **Partial** (heal works; particle empty) | subgraph | -| Ability 003 | Server_Ability_003_Begin; Server_Ability_003_End; ConcentrateHandle; EndConcentrate | No | Mana≥cost → DivineCircleActive + SetTimer 0.25 ConcentrateHandle | ConcentrateHandle: Multicast_PlayMontage(Cleric_Ability003) + ApplyDamage(Ability003Damage) on non-Player | Gate + mana | DEPRECATED_Ability003ManaCost | ApplyDamage DoT | Cleric_Ability003_Montage (in timer) | End → EndConcentrate clears timer/state | **Implemented** | subgraph + DSL | -| Ability 004 | Server_Ability_004_Begin; UseAbility004 | No | Gate → FCanUseMana called but Branch Condition=**literal true** (CanUse unwired) → montage | UseAbility004: find ClosestEnemy tag Enemy → SpawnActor **Class empty** | Gate; mana bypassed | DEPRECATED_Ability004ManaCost (unused result) | Spawn params Damage=20 HealPerHit=10 (unwired class) | Cleric_Ability004_Montage | End not local | **Partial / Existing Baseline Defect** | subgraph | +| Ability 001 | Server_Ability_001_Begin | No | Gate → CurrentlyAttacking → CanMove false → Multicast_PlayMontage(random Ability001Montages) | Multicast_PlayMontage | Gate | None | **AN_Ability_001 present but UseAbility001 unimplemented** — no hit | Cleric_PrimaryAttack_* | AN_AttackComplete still clears attacking | **Partial** (montage + dead notify) | Pass 6 + Pass 8 | +| Ability 002 | Server_Ability_002_Begin; UseAbility002 | No | Gate → FCanUseMana → Multicast_PlayMontage(Cleric_Ability002_Montage) | Multicast_PlayMontage | Gate + mana | DEPRECATED_Ability002ManaCost | UseAbility002 Authority heal — **caller: AN_Ability_002**; empty particle | Cleric_Ability002_Montage | AN_AttackComplete | **Partial** (notify-driven heal; FX hole) | Pass 6 + Pass 8 | +| Ability 003 | Server_Ability_003_Begin; Server_Ability_003_End; ConcentrateHandle; EndConcentrate | No | Mana≥cost → DivineCircleActive + SetTimer 0.25 ConcentrateHandle | ConcentrateHandle plays montage + ApplyDamage; ABP Divine Circle state | Gate + mana | DEPRECATED_Ability003ManaCost | ApplyDamage in timer; **AN_Ability_003 → UseAbility003 dead/vestigial** | Cleric_Ability003_Montage (timer byproduct) | EndConcentrate | **Implemented** (timer-driven; vestigial notify) | Pass 6 + Pass 8 | +| Ability 004 | Server_Ability_004_Begin; UseAbility004 | No | Gate → FCanUseMana called but Branch Condition=**literal true** → montage | Multicast_PlayMontage | Gate; mana bypassed | DEPRECATED_Ability004ManaCost unused | UseAbility004 — **caller: AN_Ability_004**; SpawnActor Class empty | Cleric_Ability004_Montage | AN_AttackComplete | **Partial / Existing Baseline Defect** | Pass 6 + Pass 8 | | Basic attack | Ability 001 montage | No | Same | Same | Same | — | Missing hit | PrimaryAttack montages | — | **Partial** | — | | Passive | — | — | — | — | — | — | — | — | — | **Missing** | — | | Death / HUD | Inherited | — | Base | Base | — | — | — | — | — | **Inherited** | — | @@ -195,9 +201,9 @@ Reliability: **Unknown — MCP property visibility limitation** for all CustomEv | DEPRECATED_CurrentHealth | Amazonian AnyDamage | Subtract + death check | | DEPRECATED_RecoverPlayerHealth | Cleric UseAbility002 | Interface message | | CurrentlyAttacking / IsDead | All ability gates | Replicated on base | -| IsBlocking | Paladin 002 Begin/End | Local; AnimBP dependency Unknown | -| PerformingWhirlwind | Amazonian AnyDamage | Get only — never Set | -| DivineCircleActive / TimerHandle | Cleric 003 | Timer loop | +| IsBlocking | Paladin 002 Begin/End | Local; **ABP_Paladin Block state** (Pass 8 Observed Implementation) | +| PerformingWhirlwind | Amazonian AnyDamage | Get only — never Set; **not in AnimBP/montages** (Pass 8) | +| DivineCircleActive / TimerHandle | Cleric 003 | Timer loop; **ABP_Cleric Divine Circle state** reads flag (Pass 8) | **No ASC attribute reads/writes in ability graphs.** No GameplayAbility grant/activate. @@ -208,10 +214,12 @@ Reliability: **Unknown — MCP property visibility limitation** for all CustomEv - Client IA → Server Begin: Observed Implementation - Damage on UseAbility* / ChargeBox: Authority SwitchHasAuthority — Observed Implementation - Multicast used for montage/SFX/particle presentation — Observed Implementation +- **Pass 8:** Multicast montage → AnimNotifies fire on evaluating machines; gameplay still Authority-gated inside UseAbility* / SetIsAttacking +- **Pass 8 static risk:** hit windows depend on server evaluating Multicast montage notifies; interrupt may skip `AN_AttackComplete` (completion pins unwired) - Cleric Ability 004: mana CanUse **unwired** (literal true) — Existing Baseline Defect - Cleric Ability 004: SpawnActor Class empty — Existing Baseline Defect - Multi_SpawnParticle EmitterTemplate empty (Paladin 004, Cleric 002) — Partially Implemented -- End events missing for most slots — Incomplete Refactor +- End events missing for most slots — Incomplete Refactor (cleanup often via `AN_AttackComplete` instead) - Amazonian/Paladin Ability 001: no mana cost — Observed Implementation - Dual HUD still uses DEPRECATED floats on Server_UpdateHUD — Incomplete Refactor (Batch 2) @@ -221,15 +229,22 @@ Reliability: **Unknown — MCP property visibility limitation** for all CustomEv | Classification | Characters / slots | |---|---| -| **Implemented** | Paladin 001, 003, 004 (with noted FX holes); Amazonian 001; Cleric 003 | -| **Partial** | Paladin 002; Cleric 001, 002, 004; Amazonian End/whirlwind | +| **Implemented** | Paladin 001, 003, 004 (FX hole on 004); Amazonian 001; Cleric 003 (timer; vestigial AN_Ability_003) | +| **Partial** | Paladin 002; Cleric 001 (dead notify), 002 (heal + FX hole), 004 (broken spawn); Amazonian whirlwind | | **Stub** | Wizard 001–004; Gunslinger 001–004 (inherited PrintString) | -| **Missing** | Wizard/Gunslinger combat bodies; most Ends; UseAbility on Wizard/Gunslinger | -| **Present but Unconnected** | NS_Wizard_Ability001; GE_* DefaultAttributes orphans; BP_PlayerProjectile; PerformingWhirlwind setter | +| **Missing** | Wizard/Gunslinger combat bodies; most Server Ends | +| **Present but Unconnected** | NS_Wizard_Ability001; GE_* orphans; BP_PlayerProjectile; PerformingWhirlwind setter; Cleric_Hu_M_Spell_Staff_Up_Impact_Montage (0 refs) | | **Deprecated connected** | All DEPRECATED_* damage/mana/health in active paths | +| **Notify Present; Receiver Unimplemented** | Cleric AN_Ability_001 → UseAbility001; Cleric AN_Ability_003 → UseAbility003 | + +--- + +## Pass 8 animation callback note + +Full tables and reclassification: `10-AnimationDependencies.md`. Primary status labels unchanged except qualifications above; no silent rewrites. --- ## Migration relevance (inventory only) -Replacement targets: IA→Server custom events; ApplyDamage/RecoverPlayerHealth; FCanUseMana + DEPRECATED costs; Multicast_PlayMontage; Charge timeline; DivineCircle timer; dual HUD floats. +Replacement targets: IA→Server custom events; AnimNotify→UseAbility timing; ApplyDamage/RecoverPlayerHealth; FCanUseMana + DEPRECATED costs; Multicast_PlayMontage; Charge timeline; DivineCircle timer; dual HUD floats; `AN_AttackComplete` lockout cleanup. diff --git a/Documentation/Archaeology/08-CharacterSystems.md b/Documentation/Archaeology/08-CharacterSystems.md index 758d7124..c17f9efc 100644 --- a/Documentation/Archaeology/08-CharacterSystems.md +++ b/Documentation/Archaeology/08-CharacterSystems.md @@ -6,8 +6,8 @@ - **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 +- **Last completed pass:** Pass 8 (Batch 4A) +- **Next pass expected to contribute:** Pass 7 / Pass 4 / Pass 9 when authorized ## Draft tracking @@ -17,18 +17,16 @@ - Shared input / RPC / death / HUD / multicast architecture - Interface BPI_PlayerCharacter surface - Override matrix (which Server_Ability events children implement) -- **Pass 6:** Full Ability 001–004 path reconstruction per character — see `05-LegacyAbilityArchitecture.md` -- Charge / DivineCircle / Whirlwind / UseAbility hit paths inventoried -- Montage dependency seeds — see `10-AnimationDependencies.md` +- Pass 6 Ability 001–004 path reconstruction +- **Pass 8:** AnimBP/Montage/AnimNotify callback wiring — 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 +- Notify trigger times (Manual Editor) +- Interrupt cleanup if AN_AttackComplete skipped --- @@ -103,10 +101,11 @@ Base Begin stubs PrintString `"Override Ability N"`. Base End stubs empty. |-------|--------| | 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 | +| 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 @@ -114,9 +113,10 @@ Base Begin stubs PrintString `"Override Ability N"`. Base End stubs empty. |-------|--------| | Graphs | UCS, EventGraph, GetPlayerAmazonREF, PlayerHitCheck | | Local vars | DynamicMaterials, Ability001Montage, PerformingWhirlwind | -| AnimBP (deps) | ABP_Amazon | +| AnimBP (deps) | ABP_Amazon — Locomotion Idle/WalkRun/Death only | | Ability events | Server_001 Begin; UseAbility001; ReceiveAnyDamage | | Pass 6 status | 001 Implemented (= known working melee); 002–004 inherited stubs; PerformingWhirlwind never Set | +| Pass 8 | AN_Ability_001 + AN_AttackComplete on all four attack montages; whirlwind not in AnimBP | ### Cleric @@ -127,6 +127,7 @@ Base Begin stubs PrintString `"Override Ability N"`. Base End stubs empty. | Ability events | Server_001–004 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 @@ -137,6 +138,7 @@ Base Begin stubs PrintString `"Override Ability N"`. Base End stubs empty. | Ability events | **None** implemented (BeginPlay/Tick/Overlap only) | | BeginPlay Parent | **No** (skips base InitialSpawnLocation set) | | Pass 6 status | 001–004 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 @@ -148,6 +150,7 @@ Base Begin stubs PrintString `"Override Ability N"`. Base End stubs empty. | Dependencies | Only BP_PlayerCharacterBase | | BeginPlay/Tick/Overlap | Call Parent | | Pass 6 status | 001–004 inherited PrintString stubs; no weapon/projectile/AnimBP/GE | +| Pass 8 | Confirmed: no AnimBP dependency; no shared attack montage path | --- diff --git a/Documentation/Archaeology/10-AnimationDependencies.md b/Documentation/Archaeology/10-AnimationDependencies.md index 0d8ac664..2a755f22 100644 --- a/Documentation/Archaeology/10-AnimationDependencies.md +++ b/Documentation/Archaeology/10-AnimationDependencies.md @@ -2,92 +2,174 @@ **Status: Draft** -- **Scope:** Montage and AnimInstance seeds discovered during Pass 6 ability-path reconstruction. Not a full AnimBP / notify archaeology pass. -- **Inspection method:** Connected subgraphs on character ability events; AssetTools dependency paths when visible on Multicast_PlayMontage pins. -- **Evidence classifications used:** Observed Implementation, Inferred, Unknown. -- **Tool or visibility limitations:** Montage section names, play rate, start position, and AnimNotify tracks not deep-inspected — Defer Pass 8. Root-motion requirements Unknown without Montage asset inspection. +- **Scope:** Animation Blueprints, Montages, AnimNotify Blueprints, and ability-callback wiring for the five playable characters (Batch 4A Pass 8). Builds on Pass 6 montage seeds. +- **Inspection method:** AssetTools deps/referencers/tags; BlueprintTools list_graphs/variables/events + `read_graph_dsl` on notify `Received_Notify` and AnimBP EventGraphs; character ability paths correlated from Pass 6 (not re-walked). +- **Evidence classifications used:** Observed Implementation, Documented Intent, Observed Runtime Behavior, Inferred, Unknown. +- **Tool or visibility limitations:** Montage `Notifies` array unreadable via ObjectTools; asset-registry `AnimNotifyList` tag often empty for BP notifies; `read_graph_dsl` empty on AnimGraph/state/transition graphs; notify trigger times/section names not exposed; no dedicated Montage toolset. Notify presence recovered via dependency/referencer graphs + notify BP bodies. - **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 8 +- **Last completed pass:** Pass 8 (Batch 4A) +- **Next pass expected to contribute:** Pass 7 (GAS) or Pass 4/9 when authorized — not auto-started ## Draft tracking ### Completed sections -- Per-character Montage asset paths tied to Ability 001–004 Begin paths -- AnimBP class references from character deps (structural) -- Notes on UseAbility* vs Montage timing (inferred notify dependency) +- Per-character AnimBP architecture table +- Per-ability Montage + notify tables +- AnimNotify/callback inventory (`AN_Ability_001–004`, `AN_AttackComplete`) +- Resolved UseAbility* callers (montage notifies → BPI) +- Pass 6 reclassification table +- Cleanup via `AN_AttackComplete` → `SetIsAttacking` +- Networking/authority static notes for multicast montage + notify gameplay +- Wizard / Gunslinger animation dependency confirmation ### Pending sections -- AnimNotify → UseAbility* wiring -- Montage section / blend / root-motion details -- ABP state machines reacting to IsBlocking / CurrentlyAttacking +- Exact notify trigger times / track indices (Requires Manual Editor Inspection) +- Montage section names / blend / root-motion flags (MCP unreadable) +- Transition-rule DSL for every AnimBP (partial reconstruction via VariableGet nodes on Paladin) +- Weapon collision enable/disable notify states (none found on inspected montages) ### Evidence still required -- Exact notify names that call UseAbility001 / UseAbility002 / UseAbility004 -- Whether End events stop montages (most Ends missing) +- Manual editor confirmation of notify timing windows +- Whether interrupted montages skip `AN_AttackComplete` (static risk only) +- Gunslinger mesh AnimClass assignment on CDO (data-only; deps show no AnimBP) --- -## Shared helper +## Shared animation → ability architecture -| Helper | Owning BP | Behavior | +```mermaid +flowchart TD + Begin[Server_Ability_N_Begin] --> MC[Multicast_PlayMontage] + MC --> Play[PlayMontage Mesh] + Play --> AN1[AN_Ability_00N] + Play --> ANC[AN_AttackComplete] + AN1 --> BPI[BPI UseAbility00N] + BPI --> Auth[SwitchHasAuthority] + Auth --> FX[ApplyDamage / Heal / Spawn] + ANC --> SetAtk[BPI SetIsAttacking] + SetAtk --> Clear[CurrentlyAttacking false] +``` + +**Observed Implementation:** `Multicast_PlayMontage` on `BP_PlayerCharacterBase` plays the montage with **OnCompleted / OnBlendOut / OnInterrupted unwired**. Attack-window gameplay and `CurrentlyAttacking` cleanup for notify-driven abilities depend on embedded AnimNotify Blueprints, not montage delegates. + +**Shared notify Blueprints** (`/Game/_Main/Blueprints/Characters/PlayerCharacters/PlayerCharacterRelated/`): + +| Notify BP | Received_Notify body | Classification | |---|---|---| -| Multicast_PlayMontage | BP_PlayerCharacterBase | Multicast → PlayMontage on mesh AnimInstance | - -Gameplay effects (ApplyDamage / heal / spawn) observed **after** Montage Begin in separate UseAbility* or timer/overlap events — typically **during** Montage if notify-driven. Exact notify wiring: **Unknown — Requires Manual Editor Inspection / Pass 8**. +| `AN_Ability_001` | `Abilities\|UseAbility001(GetOwner(MeshComp))` | Observed Implementation | +| `AN_Ability_002` | `UseAbility002(GetOwner)` | Observed Implementation (Cleric agent + deps) | +| `AN_Ability_003` | `UseAbility003(GetOwner)` | Observed Implementation (Cleric agent + deps) | +| `AN_Ability_004` | `UseAbility004(GetOwner)` | Observed Implementation (Paladin/Cleric agents + deps) | +| `AN_AttackComplete` | `BPIPlayerCharacter\|SetIsAttacking(GetOwner(MeshComp))` | Observed Implementation (`read_graph_dsl`) | --- -## Player_Paladin +## 1. Per-character animation architecture -| Ability | Montage path(s) | AnimInstance | Gameplay vs Montage | End stops Montage? | -|---|---|---|---|---| -| 001 | `/Game/_Main/Animations/PlayerCharacters/Human/CharacterClasses/Paladin/AnimMontages/Attack_A_Fast_Montage` (+ B, C, D_Fast) via `Ability001Montages` array random | ABP_Paladin | UseAbility001 ApplyDamage separate Authority path | Unknown (no local End) | -| 002 | None in Begin subgraph | ABP_Paladin | IsBlocking state only — AnimBP reaction Inferred | End clears IsBlocking; Montage stop Unknown | -| 003 | ChargeTimeline (not Montage) | ABP_Paladin | ChargeBox ApplyDamage during charge | No local 003 End | -| 004 | `/Game/_Main/Animations/PlayerCharacters/Human/CharacterClasses/Paladin/AnimMontages/Abilities/Paladin_Ability004_Montage` | ABP_Paladin | UseAbility004 AoE + SFX separate | Unknown | +| Character | AnimBP | Skeleton | Relevant state machines | Montage slots | Ability callbacks | Death path | Confidence | +|---|---|---|---|---|---|---|---| +| Paladin | `/Game/_Main/Animations/PlayerCharacters/Human/CharacterClasses/Paladin/ABP_Paladin` | `SKEL_Hu_M` | `Locomotion`: Idle, Walk/Run, Charge, Block, Death | UpperBody (montages) | None in ABP — notifies call character BPI | `IsDead` → Death state; DeathIndex random | High | +| Amazonian | `/Game/_Main/Animations/PlayerCharacters/Human/CharacterClasses/Amazon/ABP_Amazon` | `SKEL_Hu_F` | `Locomotion`: Idle, Walk/Run, Death | UpperBody | None in ABP | `IsDead` → Death | High | +| Cleric | `/Game/_Main/Animations/PlayerCharacters/Human/CharacterClasses/Cleric/ABP_Cleric` | Male (`SKEL_Hu_M` family) | `Locomotion`: Idle, Walk/Run, **Divine Circle**, Death | UpperBody | None in ABP; reads `DivineCircleActive?` from Cleric | `IsDead` → Death | High | +| Wizard | `/Game/_Main/Animations/PlayerCharacters/Human/CharacterClasses/Wizard/ABP_Wizard` | `SKEL_Hu_M` | `Locomotion`: Idle, Walk/Run, Death | None used by abilities | None — no ability montages in Wizard folder | Death anims in deps | High | +| Gunslinger | **None** (deps = base only; IsDataOnly) | Unknown / inherited | N/A | N/A | None | Inherited base death only | Medium | -SFX: `MagicSpell_01_Cue` via Multicast_PlaySFX on Ability 004 UseAbility path. +**ABP parent class (all inspected):** stock `Engine.AnimInstance` — Observed Implementation. + +**Paladin ABP drivers (EventGraph):** per-frame reads `IsCharging`, `IsBlocking`, `IsDead`, velocity→`IsMoving` from Paladin REF. Block/Charge/Death transitions driven by those booleans — Observed Implementation. + +**Cleric ABP drivers:** `DivineCircleActive?` ← `GetDivineCircleActive` on Cleric REF; `IsDead`; speed/moving — Observed Implementation (`read_graph_dsl`). + +**Amazonian / Wizard ABP:** locomotion + death only — no Block/Charge/DivineCircle states — Observed Implementation. --- -## Player_Amazonian +## 2. Per-ability Montage table -| Ability | Montage path(s) | AnimInstance | Gameplay vs Montage | End stops Montage? | -|---|---|---|---|---| -| 001 | `/Game/_Main/Animations/PlayerCharacters/Human/CharacterClasses/Amazon/AnimMontages/A_Hu_F_Combat_2H_Attack01_Montage` (+ Attack02, Attack_Base, Attack) via `Ability001Montage` array | ABP_Amazon | UseAbility001 Authority damage separate | Unknown (no local End) | -| 002–004 | None (inherited stubs) | — | — | — | +| Character | Slot/system | Caller | Montage | Section | Notifies | Callback target | Gameplay consequence | Cleanup dependency | Evidence status | +|---|---|---|---|---|---|---|---|---|---| +| Paladin | Ability 001 | `Server_Ability_001_Begin` → Multicast | `.../Paladin/AnimMontages/Attack_{A,B,C,D}_Fast_Montage` (random) | Default (single segment); name Unknown | `AN_Ability_001`, `AN_AttackComplete` (+ sound on A) | `UseAbility001`; `SetIsAttacking` | Authority BoxOverlap ApplyDamage | `AN_AttackComplete` → clear CurrentlyAttacking | Observed Implementation | +| Paladin | Ability 002 | Begin/End set `IsBlocking` | **No Montage** | — | — | ABP Block state | Presentation only | End clears IsBlocking | Observed Implementation | +| Paladin | Ability 003 | Charge + Client_Charge | **No Montage** (ChargeTimeline) | — | — | — | ChargeBox ApplyDamage | Timeline/End paths (not notify) | Observed Implementation | +| Paladin | Ability 004 | `Server_Ability_004_Begin` → Multicast | `.../Paladin/AnimMontages/Abilities/Paladin_Ability004_Montage` | Unknown | `AN_Ability_004`, `AN_AttackComplete`, Niagara `NS_Paladin_Ability004` | `UseAbility004`; `SetIsAttacking` | Authority SphereOverlap ApplyDamage + SFX | `AN_AttackComplete` | Observed Implementation | +| Amazonian | Ability 001 / melee | `Server_Ability_001_Begin` → Multicast | `.../Amazon/AnimMontages/A_Hu_F_Combat_2H_Attack{01,02,_Base,_}_Montage` | Unknown | `AN_Ability_001`, `AN_AttackComplete` | `UseAbility001`; `SetIsAttacking` | Authority BoxOverlap ApplyDamage | `AN_AttackComplete` | Observed Implementation + Observed Runtime Behavior | +| Amazonian | 002–004 | Inherited stubs | None | — | — | — | PrintString | — | Observed Implementation | +| Cleric | Ability 001 | `Server_Ability_001_Begin` → Multicast | `.../Cleric/AnimMontages/Cleric_PrimaryAttack_*` (4) | Unknown | `AN_Ability_001`, `AN_AttackComplete` | `UseAbility001` (**unimplemented** on Cleric) | **No hit** — dead notify | `AN_AttackComplete` still clears attacking | Observed Implementation | +| Cleric | Ability 002 | Begin → Multicast | `.../Cleric/AnimMontages/Abilities/Cleric_Ability002_Montage` | Unknown | `AN_Ability_002`, `AN_AttackComplete` (+ Niagara/sound deps) | `UseAbility002` (implemented) | Authority heal Players | `AN_AttackComplete` | Observed Implementation | +| Cleric | Ability 003 | `ConcentrateHandle` timer plays montage | `.../Cleric/AnimMontages/Abilities/Cleric_Ability003_Montage` | Unknown | `AN_Ability_003` (**dead**), `AN_AttackComplete` | `UseAbility003` unimplemented; damage in timer | ApplyDamage in ConcentrateHandle | `EndConcentrate` (not notify) | Observed Implementation | +| Cleric | Ability 004 | Begin → Multicast | `.../Cleric/AnimMontages/Abilities/Cleric_Ability004_Montage` | Unknown | `AN_Ability_004`, `AN_AttackComplete` | `UseAbility004` (broken spawn) | SpawnActor empty class | `AN_AttackComplete` | Observed Implementation | +| Wizard | 001–004 | Inherited stubs | **No montages** in Wizard anim folder | — | — | — | PrintString | — | Observed Implementation | +| Gunslinger | 001–004 | Inherited stubs | None | — | — | — | PrintString | — | Observed Implementation | -**Observed Runtime Behavior:** Amazonian melee (Ability 001 path) is the known working combat baseline. +**Present but Unconnected montage:** `/Game/_Main/Animations/PlayerCharacters/Human/CharacterClasses/Cleric/AnimMontages/Cleric_Hu_M_Spell_Staff_Up_Impact_Montage` — references `AN_Ability_004` / `AN_AttackComplete`; **0 referencers**. + +Play rate: Multicast path uses rate **1** (Pass 6 / Amazonian agent). Start position: Unknown. Root motion: Unknown — Tool Limitation. --- -## Player_Cleric +## 3. AnimNotify / callback table -| Ability | Montage path(s) | Notes | -|---|---|---| -| 001 | Cleric_PrimaryAttack_* via Ability001Montages | Montage only — no UseAbility001 | -| 002 | Cleric_Ability002_Montage | Heal in UseAbility002 | -| 003 | Cleric_Ability003_Montage | Played inside ConcentrateHandle timer loop | -| 004 | Cleric_Ability004_Montage | Spawn broken; montage still plays | - -Exact `/Game/...` Cleric montage folder paths: recorded as class-named montages under Cleric AnimMontages in deps — full absolute paths Require Manual Editor Confirmation if not pinned in subgraph (Observed Implementation of PlayMontage call; path strings from character asset deps). +| Notify or callback | Asset | Character | Ability | Receiver | Downstream path | Authority observation | Connection status | +|---|---|---|---|---|---|---|---| +| AN_Ability_001 | `.../PlayerCharacterRelated/AN_Ability_001` | Paladin, Amazonian | 001 | Character via BPI `UseAbility001` | Authority overlap ApplyDamage | Multicast montage → notify all machines; damage Authority-only | **Connected** | +| AN_Ability_001 | same | Cleric | 001 | BPI `UseAbility001` | **No implementation** on Cleric/base | Notify fires; no gameplay | **Notify Present; Receiver Unimplemented** | +| AN_Ability_002 | `.../AN_Ability_002` | Cleric | 002 | `UseAbility002` | Authority heal | Same multicast pattern | **Connected** | +| AN_Ability_003 | `.../AN_Ability_003` | Cleric | 003 | `UseAbility003` | Unimplemented; damage is timer | Vestigial | **Notify Present; Receiver Unimplemented** | +| AN_Ability_004 | `.../AN_Ability_004` | Paladin | 004 | `UseAbility004` | Authority AoE damage | Multicast + Authority | **Connected** | +| AN_Ability_004 | same | Cleric | 004 | `UseAbility004` | Broken SpawnActor | Multicast + Authority | **Connected (broken body)** | +| AN_AttackComplete | `.../AN_AttackComplete` | Paladin, Amazonian, Cleric (all listed montages) | 001/002/004 (+ Cleric primary) | BPI `SetIsAttacking` | Base Authority: CurrentlyAttacking=false, CanMove true | Multicast notify; state Authority-only | **Connected** | +| PerformingWhirlwind | N/A animation | Amazonian | — | Character EventAnyDamage Get only | No AnimBP/montage Set | — | **Present but Unconnected setter** | +| Divine Circle state | ABP_Cleric | Cleric | 003 presentation | Reads DivineCircleActive | Locomotion state | Cosmetic | **Connected** (presentation) | --- -## Player_Wizard / Player_Gunslinger +## 4. Pass 6 reclassification table -No ability Montage invocations. No character-local Multicast_PlayMontage callers for abilities. +| Character | Slot | Previous status | Revised status | New evidence | Reason | +|---|---|---|---|---|---| +| Paladin | 001 | Implemented | **Implemented** (qualified) | `AN_Ability_001` → `UseAbility001`; cleanup `AN_AttackComplete` | Animation connectivity confirmed; status unchanged | +| Paladin | 002 | Partial | **No change** | ABP Block driven by `IsBlocking` | Presentation path confirmed; hit absorb still untraced | +| Paladin | 003 | Implemented | **No change** | No Montage; ChargeTimeline | Animation pass does not alter charge path | +| Paladin | 004 | Implemented | **Implemented** (qualified) | `AN_Ability_004` → `UseAbility004` | Connectivity confirmed; empty particle remains | +| Amazonian | 001 | Implemented | **No change** | Full notify → damage → cleanup chain | Confirms known working melee path | +| Amazonian | 002–004 | Stub | **No change** | No montages/notifies | — | +| Amazonian | Whirlwind | Partial / unconnected setter | **No change** | Not in ABP or montages | Still Get-only on character | +| Cleric | 001 | Partial (montage only) | **Partial** (qualified: dead notify) | `AN_Ability_001` present; `UseAbility001` unimplemented | Notify does not add gameplay | +| Cleric | 002 | Partial | **Partial** (qualified: notify-driven heal) | `AN_Ability_002` → `UseAbility002` | Heal path confirmed animation-timed; FX hole remains | +| Cleric | 003 | Implemented | **Implemented** (qualified: timer + vestigial notify) | Damage in ConcentrateHandle; `AN_Ability_003` dead; ABP Divine Circle state | Notify not required for damage | +| Cleric | 004 | Partial / defect | **No change** (qualified: notify-timed) | `AN_Ability_004` → broken `UseAbility004` | Spawn defect unchanged | +| Wizard | 001–004 | Stub | **No change** | ABP locomotion only; zero Wizard montages | — | +| Gunslinger | 001–004 | Stub | **No change** | No AnimBP; deps = base only | — | --- -## Cleanup / End dependency summary +## Networking and authority (static) -| Character | Ability End stops Montage? | +| Observation | Classification | |---|---| -| Most slots | **Unknown / Missing End** — Server_Ability_*_End not overridden; base End empty | -| Paladin 002 | Clears IsBlocking / CurrentlyAttacking / CanMove — Montage stop not observed | -| Cleric 003 | EndConcentrate clears timer / DivineCircleActive — Montage stop not observed | +| Montage started via Multicast → notifies evaluate on server and clients | Observed Implementation / Inferred (UE montage notify semantics) | +| `UseAbility*` / `SetIsAttacking` bodies use `SwitchHasAuthority` | Observed Implementation (Pass 6) | +| Duplicate damage prevented by Authority gate if notify fires everywhere | Inferred static risk mitigation — Requires Runtime Inspection | +| Gameplay depends on cosmetic Multicast montage evaluating notifies on the server | Observed Implementation — **static risk:** if server skips animation evaluation, hit windows may not fire | +| Missing `AN_AttackComplete` (interrupt) leaves `CurrentlyAttacking` true | Inferred — PlayMontage interrupt pins unwired | +| No client-authoritative ApplyDamage in notify receivers | Observed Implementation | -Root motion required: **Unknown — Defer Pass 8**. +--- + +## Answers to Pass 8 known questions (compact) + +1. **UseAbility* callers:** `AN_Ability_001–004` AnimNotify BPs (not AnimBP EventGraph). +2. **Paladin 001 damage:** Yes — via `AN_Ability_001` during montage. +3. **Paladin block:** No Montage; ABP `Block` state from `IsBlocking`; End clears flags. +4. **Paladin charge cleanup:** Not Montage-callback; ChargeTimeline / ability logic. +5. **Amazonian melee path:** Begin → Multicast montage → `AN_Ability_001` → `UseAbility001` → Authority damage; `AN_AttackComplete` clears attacking. +6. **Weapon collision notifies:** Not observed on inspected montages (overlap queries inside UseAbility*). +7. **PerformingWhirlwind:** Never set by animation; still unconnected. +8. **Cleric 001 hidden gameplay:** No — notify dead (`UseAbility001` unimplemented). +9. **Cleric 002/003/004:** 002/004 notify-driven; 003 timer-driven; Divine Circle ABP presentation. +10. **Wizard spell assets via anim:** No Wizard montages; no notify chain to unwired NS/GE/projectile. +11. **Gunslinger shared AnimBP/Montage:** No — no AnimBP dependency. +12. **CurrentlyAttacking clear:** Via `AN_AttackComplete` for notify-driven attacks; interrupt cleanup Unknown. +13. **Death anims:** ABP Death state from `IsDead`; destruction/respawn remain character `PlayerDeath` (not notify-driven). +14. **Client-only gameplay timing:** Damage Authority-gated; presentation may diverge — Requires Runtime Inspection. diff --git a/Documentation/Archaeology/13-Unknowns-And-RuntimeQuestions.md b/Documentation/Archaeology/13-Unknowns-And-RuntimeQuestions.md index 329c3ead..fda20d89 100644 --- a/Documentation/Archaeology/13-Unknowns-And-RuntimeQuestions.md +++ b/Documentation/Archaeology/13-Unknowns-And-RuntimeQuestions.md @@ -2,152 +2,101 @@ **Status: Draft** -- **Scope:** Unresolved questions after Batches 1–3. Separates confirmed static findings from questions needing further Blueprint, runtime, or config inspection. -- **Inspection method:** Consolidation of Batches 1–3; Batch 3 resolved per-character ability path unknowns. +- **Scope:** Unresolved questions after Batches 1–3 and Batch 4A Pass 8. +- **Inspection method:** Consolidation of Batches 1–3 + Pass 8 animation archaeology. - **Evidence classifications used:** Observed Implementation, Documented Intent, Observed Runtime Behavior, Inferred, Unknown. -- **Tool or visibility limitations:** Semantic Search unavailable; CustomEvent FunctionFlags not readable; comment-box membership limited; no PIE this batch. +- **Tool or visibility limitations:** Semantic Search unavailable; CustomEvent FunctionFlags unread; Montage Notifies array / times unreadable; AnimGraph DSL empty; no PIE. - **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 4 / 7 / 8 / 9 — only when authorized) +- **Last completed pass:** Pass 8 (Batch 4A) +- **Next pass expected to contribute:** Pass 7 / 4 / 9 when authorized ## Draft tracking ### Completed sections -- Batch 1 unknowns grouped by verification method -- Batch 2 resolutions: WBP_PlayerHUD class; BP_PlayerState DefaultAttributes=None; legacy ability routing documented -- Batch 3 resolutions: per-character Ability 001–004 connected paths; Wizard/Gunslinger stub confirmation; UseAbility* presence matrix -- Enemy ASC accessor defect still confirmed static +- Batch 1–3 unknowns and resolutions +- **Pass 8 resolutions:** UseAbility* callers; Amazonian melee anim path; Cleric dead notifies; cleanup via AN_AttackComplete; PerformingWhirlwind not animation-driven ### Pending sections -- Frontend/session/enemy AI/animation unknowns (Batch 4) -- Runtime test procedures after static ability archaeology +- Frontend/session/enemy AI (Pass 4 / 9) +- GE/cue inventory (Pass 7) +- Runtime test procedures ### Evidence still required -- AnimNotify → UseAbility* wiring (Pass 8) -- Live ASC vs DEPRECATED HUD coexistence in PIE -- Enemy BP AI connected graphs (Pass 9) -- GE/cue referencer map (Pass 7) +- Notify trigger times (Manual Editor) +- Interrupt vs AN_AttackComplete behavior (PIE) +- Live ASC vs DEPRECATED HUD coexistence (PIE) --- -## Resolved in Batch 2 (no longer Unknown) +## Resolved in Batch 2–3 (unchanged) -| Question | Resolution | Classification | Doc | -|---|---|---|---| -| Is `WBP_PlayerHUD` a Widget or AHUD? | Parent is `RIRHUD`; AHUD Blueprint; `WBP_` name misleading | Observed Implementation | 03, 11 | -| Does `BP_PlayerState` assign DefaultAttributes GE? | CDO `defaultAttributesGameplayEffect` = **None** | Observed Implementation | 03, 06 | -| How are abilities routed/networked on base? | IA_Ability_* → Server_Ability_* stubs/overrides; Multicast FX helpers | Observed Implementation | 05, 08 | +See prior tables in git history / Batch 3 handoff. Key: legacy IA→Server_Ability_*; DefaultAttributes=None; WBP_PlayerHUD is AHUD. --- -## Resolved in Batch 3 (Pass 6) +## Resolved in Batch 4A (Pass 8) | Question | Resolution | Classification | Doc | |---|---|---|---| -| Full Ability 001–004 paths per playable | Documented per character in tables | Observed Implementation | 05, 08 | -| Does Wizard implement Server_Ability_*? | No local implementations; inherit PrintString stubs | Observed Implementation | 05, 08 | -| Is Gunslinger data-only? | IsDataOnly=True; deps only base; inherited stubs | Observed Implementation | 05, 08 | -| Amazonian working melee path | Ability 001 Begin → Multicast montage → UseAbility001 Authority BoxOverlap ApplyDamage | Observed Implementation + Observed Runtime Behavior | 05 | -| Are UseAbility* still invoked? | Present and connected on Paladin 001/004, Amazonian 001, Cleric 002/004; caller of UseAbility* itself Unknown (likely AnimNotify) | Observed Implementation / Unknown caller | 05, 10 | -| Who calls PlayerDeath from Amazonian? | ReceiveAnyDamage → DEPRECATED_CurrentHealth ≤0 → PlayerDeath | Observed Implementation | 05, 08 | -| Parent calls on ability overrides? | Paladin/Amazonian/Cleric: **No** | Observed Implementation | 05 | +| Who calls UseAbility*? | `AN_Ability_001–004` AnimNotify BPs → BPI interface on montage owner | Observed Implementation | 10, 05 | +| Paladin 001 damage via anim callback? | Yes — `AN_Ability_001` during Attack_* montages | Observed Implementation | 10 | +| Paladin block Montage/notify? | No Montage; ABP Block from `IsBlocking`; End clears | Observed Implementation | 10 | +| Paladin charge Montage cleanup? | No — ChargeTimeline / ability logic | Observed Implementation | 10 | +| Amazonian working melee anim path? | Begin → Multicast → `AN_Ability_001` → UseAbility001 → Authority damage; `AN_AttackComplete` clears | Observed Implementation + Observed Runtime Behavior | 10 | +| Weapon collision notify windows? | Not observed — overlaps inside UseAbility* | Observed Implementation (absence) | 10 | +| PerformingWhirlwind set by anim? | No — not in ABP/montages; still Get-only | Observed Implementation | 10 | +| Cleric 001 hidden notify gameplay? | Notify present; `UseAbility001` unimplemented — dead | Observed Implementation | 10 | +| Cleric 002/003/004 anim dependency? | 002/004 notify-driven; 003 timer + vestigial AN_Ability_003; ABP Divine Circle | Observed Implementation | 10 | +| Wizard spell via anim callbacks? | No Wizard montages; ABP locomotion only | Observed Implementation | 10 | +| Gunslinger shared AnimBP/Montage? | No AnimBP dependency | Observed Implementation | 10 | +| CurrentlyAttacking clear on montage complete? | Via `AN_AttackComplete` → SetIsAttacking; interrupt Unknown | Observed Implementation / Unknown interrupt | 10 | +| Death anim invoke destroy/respawn? | No — ABP Death presentation; PlayerDeath on character | Observed Implementation | 10 | --- ## Confirmed static defects with runtime questions -| Confirmed finding | Evidence classification | Issue classification | Exact evidence | Runtime question | -|---|---|---|---|---| -| Enemy ASC on self vs GetASC from PlayerState | Observed Implementation | Incomplete Refactor | RIRBaseEnemyCharacter.cpp; RIRBaseCharacter.cpp | Which systems fail when interface ASC lookup is null for enemies? | -| Dual HUD attribute paths (ASC Overlay vs DEPRECATED floats) | Observed Implementation | Incomplete Refactor | RIRHUD InitOverlay; BP Server_UpdateHUD | Do both run? Which drives visible bars in PIE? | -| DefaultAttributesGameplayEffect unused (C++ and BP_PlayerState=None) | Observed Implementation | Partially Implemented | RIRPlayerState.h; BP_PlayerState CDO | What sets initial Health/Mana at spawn? | -| Cleric Ability 004 SpawnActor Class empty + mana CanUse unwired | Observed Implementation | Existing Baseline Defect | Player_Cleric UseAbility004 / Begin | Does 004 appear to fire but do nothing in PIE? | -| Multi_SpawnParticle empty EmitterTemplate (Paladin 004, Cleric 002) | Observed Implementation | Partially Implemented | UseAbility graphs | Visible missing VFX only? | - ---- - -## Requires Blueprint / animation inspection (remaining) - -| Question | Why insufficient | Paths | Method | Priority | Dependency | -|---|---|---|---|---|---| -| Who calls UseAbility*? | Events connected; callers not in EventGraph | Character AnimMontages / AnimBP | Pass 8 notify walk | High | Pass 6 bodies done | -| Enemy chase/attack Blueprint logic | Structural only in Pass 3 | BP_EnemyCharacterBase, BP_Enemy_Skeleton, BPI_EnemyCharacter | Pass 9 connected graphs | High | Pass 3 structure | -| Do EffectActor children call ApplyEffectToTarget? | Native mechanism only | BP_HealthPotion etc. | Pass 10 | Medium | Batch 1 | -| Is CommonUI used by live content? | Plugin enabled; no native refs | /Game/_Main/UI | Widget parent inspection | Low | Batch 1 | -| Paladin Ability 002 block absorb | IsBlocking set; no damage absorb path traced | ABP_Paladin / PlayerHitCheck | Pass 8 + hit graphs | Medium | Pass 6 | -| Amazonian PerformingWhirlwind | Get without Set | Player_Amazonian | Search all graphs / macros | Low | Pass 6 | - ---- - -## Requires runtime inspection / PIE - -| Question | Why | Method | Priority | -|---|---|---|---| -| Enemy ASC accessor impact | Static mismatch; need consumers | PIE + AbilitySystemInspector | High | -| Default attribute values after spawn | No apply path found | PIE attribute values after possess | High | -| Dual HUD coexistence | Two static paths | Observe both overlay and UpdatePlayerHUD | Medium | -| Session create/find/join | Latent online ops | Network test after Pass 4 | Medium | -| Ability Server RPC reliability / prediction feel | Flags unread | Multi-client ability press | Medium | -| Wizard BeginPlay skipping Parent | May leave InitialSpawnLocation unset | Spawn Wizard → death/respawn location | Medium | - ---- - -## Requires broader filesystem/configuration inspection - -| Question | Search | Priority | +| Confirmed finding | Issue | Runtime question | |---|---|---| -| OnlineSubsystem / Steam settings location | Config/**, Plugins/**/Config, Saved/Config | Medium | -| GameInstance class assignment outside DefaultEngine sample | INI + referencers of GI_Dungeoneer | Medium | +| Enemy ASC vs GetASC | Incomplete Refactor | PIE impact | +| Dual HUD paths | Incomplete Refactor | Which drives bars? | +| DefaultAttributes unused | Partially Implemented | Spawn attribute source? | +| Cleric 004 empty SpawnActor + mana bypass | Existing Baseline Defect | PIE behavior | +| Gameplay hit windows depend on Multicast montage notify eval on server | Technical Debt / static risk | Does server always evaluate notifies? | +| Interrupt may skip AN_AttackComplete | Incomplete Refactor | Stuck CurrentlyAttacking? | +| Cleric AN_Ability_001 / 003 dead receivers | Existing Baseline Defect / Technical Debt | Cosmetic-only primary attack? | --- -## Requires manual editor inspection +## Requires further inspection -| Question | Why | Paths | +| Question | Method | Priority | |---|---|---| -| Montage notify timings | Registry tags limited | Character montages | -| DEPRECATED comment-box visual regions | find_nodes Comment returned [] | BP_PlayerCharacterBase / children EventGraphs | -| CustomEvent Reliable vs Unreliable | ObjectTools on node failed | Server_/Multicast_ events | +| Notify trigger times / sections | Manual Editor | Medium | +| Interrupt cleanup | PIE | High | +| GE/cue referencers | Pass 7 | High | +| Enemy BP AI | Pass 9 | High | +| Sessions / frontend | Pass 4 | Medium | +| Paladin block absorb (PlayerHitCheck) | Graph walk (non-anim) | Medium | --- ## Tool and environment limitations -| Item | Detail | Impact | -|---|---|---| -| Semantic Search | HTTP 401 / no API key | No semantic discovery | -| CustomEvent FunctionFlags | list_properties failed on event nodes | RPC reliability Unknown | -| Comment boxes | find_nodes(title=Comment) empty | Visual DEPRECATED regions Unknown | -| Git | Available (baseline commit exists) | Dirty-tree gate works | -| No PIE in Batch 3 | Constraint honored | Runtime questions deferred | - ---- - -## Naming ambiguities - -| Item | Status | +| Item | Impact | |---|---| -| Amazon vs Amazonian | Still open for GE folder naming (Pass 7) | -| WBP_PlayerHUD | **Resolved** — AHUD named like a widget | - ---- - -## Conflicting evidence - -| Conflict | Current resolution | Remaining | -|---|---|---| -| Enemy ASC ownership vs accessor | Confirmed static defect | PIE impact | -| Default attributes present vs unused | BP_PlayerState=None; C++ unused; character GEs orphaned | Who applies GEs if anyone | -| URIRGameplayAbility "all abilities" vs legacy BP | Legacy active; GA scaffolding only | Pass 7 reconfirm | -| Dual HUD systems | Both connected | PIE which is authoritative for bars | +| Montage `Notifies` property unreadable | Times Unknown; presence via deps | +| AnimNotifyList registry tag empty for BP notifies | Do not trust tag alone | +| AnimGraph / transition DSL empty | State drivers via EventGraph + VariableGet | +| CustomEvent Reliable flags | Unknown | +| No PIE in Batch 4A | Runtime deferred | --- ## Priority order for later verification -1. Batch 4 Pass 7 — GE/cue/tag inventory -2. Pass 8 — AnimNotify → UseAbility wiring -3. Pass 9 — enemy Blueprint AI -4. Pass 4 — sessions / frontend -5. Controlled PIE for ASC, attributes, dual HUD, enemy GetASC, Cleric 004 / Wizard spawn +1. Pass 7 — GE/cue/tag inventory +2. Pass 9 — enemy Blueprint AI +3. Pass 4 — sessions / frontend +4. Controlled PIE — dual HUD, notify interrupt, server montage eval, Cleric 001/004 diff --git a/Documentation/Archaeology/14-EvidenceIndex.md b/Documentation/Archaeology/14-EvidenceIndex.md index f18d87a7..770329f0 100644 --- a/Documentation/Archaeology/14-EvidenceIndex.md +++ b/Documentation/Archaeology/14-EvidenceIndex.md @@ -5,56 +5,36 @@ - **Scope:** Compact cross-model index of material findings. Full analysis lives in linked docs. - **Last updated:** 2026-07-16 - **Current phase:** Phase 1 — Static Architecture -- **Last completed pass:** Pass 6 (Batch 3) +- **Last completed pass:** Pass 8 (Batch 4A) - **Next pass expected to contribute:** Every batch ## Draft tracking ### Completed sections -- Batch 1 evidence rows (modules, native hierarchy, GAS ownership, plugins, config) -- Batch 2 evidence rows (BP hierarchy, legacy abilities, WBP_PlayerHUD, BP_PlayerState) -- Batch 3 evidence rows (per-character Ability 001–004 paths, RPCs, resources, montages) +- Batch 1–3 evidence rows +- Batch 4A Pass 8 AnimBP / Montage / AnimNotify rows ### Pending sections - GE/cue referencer rows (Pass 7) -- AnimNotify → UseAbility rows (Pass 8) --- | System | Subsystem | Finding | Evidence type | Classification | Exact source | Exact symbol | Blueprint path | Graph | Node/event | Asset/config | Doc | Confidence | Remaining verification | |--------|-----------|---------|---------------|----------------|--------------|--------------|----------------|-------|------------|--------------|-----|------------|------------------------| -| Module | Descriptor | Single runtime module REALMSINRUIN; Engine 5.8 | Observed Implementation | Intended Behavior | REALMSINRUIN_DEV.uproject | Modules[REALMSINRUIN] | — | — | — | REALMSINRUIN_DEV.uproject | 02 | High | — | -| Character | Player ASC | ASC owned by PlayerState; Mixed replication | Observed Implementation | Intended Behavior | RIRPlayerState.cpp | CreateDefaultSubobject ASC | BP_PlayerState | — | — | — | 03,06,08 | High | Runtime values | -| Character | GetASC | Base GetASC reads PlayerState only | Observed Implementation | Incomplete Refactor | RIRBaseCharacter.cpp | GetAbilitySystemComponent | — | — | — | — | 03,06,13 | High | PIE on enemy | -| GAS | Ability class | URIRGameplayAbility empty; no subclasses | Observed Implementation | Partially Implemented | RIRGameplayAbility.* | InstancingPolicy | — | — | — | — | 03,06 | High | Pass 7 | -| GAS | Default GE | BP_PlayerState DefaultAttributesGameplayEffect=None | Observed Implementation | Partially Implemented | ObjectTools CDO | defaultAttributesGameplayEffect | BP_PlayerState | — | — | — | 03,06,13 | High | Other apply sites | -| GAS | Orphan GE | GE_Cleric/Wizard_DefaultAttributes unwired; 0 referencers | Observed Implementation | Present but Unconnected | AssetTools refs | — | Player_Cleric / Wizard | — | — | GE_*_DefaultAttributes | 06 | High | Pass 7 | -| Ability | Input | IA_Ability_001–004 Started→Server_Ability_*_Begin | Observed Implementation | Intended Behavior | BlueprintTools | EnhancedInputAction | BP_PlayerCharacterBase | EventGraph | IA_Ability_* | IA_Ability_* | 05,08 | High | — | -| Ability | Base stub | Server_Ability_*_Begin PrintString Override | Observed Implementation | Partially Implemented | get_connected_subgraph | PrintString | BP_PlayerCharacterBase | EventGraph | Server_Ability_001_Begin | — | 05 | High | — | -| Ability | Paladin 001 | Begin montage + UseAbility001 Authority BoxOverlap ApplyDamage | Observed Implementation | Implemented | get_connected_subgraph | ApplyDamage | Player_Paladin | EventGraph | UseAbility001 | Ability001Montages | 05,08 | High | Notify caller Pass 8 | -| Ability | Paladin 002 | Block state Begin/End; no ApplyDamage in Begin | Observed Implementation | Partial | get_connected_subgraph | IsBlocking | Player_Paladin | EventGraph | Server_Ability_002_* | — | 05 | High | Hit absorb Pass 8 | -| Ability | Paladin 003 | Mana + ChargeTimeline + ChargeBox ApplyDamage | Observed Implementation | Implemented | get_connected_subgraph | ChargeBox | Player_Paladin | EventGraph | Charge / Client_Charge | — | 05 | High | — | -| Ability | Paladin 004 | Mana + montage + SphereOverlap ApplyDamage; empty particle | Observed Implementation | Implemented / Partial FX | get_connected_subgraph | UseAbility004 | Player_Paladin | EventGraph | UseAbility004 | Paladin_Ability004_Montage | 05,10 | High | — | -| Ability | Amazonian 001 | Same pattern as Paladin melee; known working runtime | Observed Implementation + Observed Runtime Behavior | Implemented | get_connected_subgraph | UseAbility001 | Player_Amazonian | EventGraph | Server_Ability_001_Begin | Amazon Attack montages | 05,08 | High | — | -| Ability | Amazonian 002–004 | Inherited PrintString only | Observed Implementation | Stub | list_events | bIsImplemented | Player_Amazonian | — | — | — | 05 | High | — | -| Ability | Amazonian death | AnyDamage → DEPRECATED_CurrentHealth → PlayerDeath | Observed Implementation | Partial (legacy health) | get_connected_subgraph | ReceiveAnyDamage | Player_Amazonian | EventGraph | ReceiveAnyDamage | — | 05 | High | — | -| Ability | Cleric 001 | Montage only; no UseAbility001 | Observed Implementation | Partial | get_connected_subgraph | Multicast_PlayMontage | Player_Cleric | EventGraph | Server_Ability_001_Begin | — | 05 | High | — | -| Ability | Cleric 002 | Heal Players via RecoverPlayerHealth; empty particle | Observed Implementation | Partial | get_connected_subgraph | UseAbility002 | Player_Cleric | EventGraph | UseAbility002 | — | 05 | High | — | -| Ability | Cleric 003 | DivineCircle timer ConcentrateHandle ApplyDamage; End cleans | Observed Implementation | Implemented | get_connected_subgraph | ConcentrateHandle | Player_Cleric | EventGraph | Server_Ability_003_* | — | 05 | High | — | -| Ability | Cleric 004 | Mana CanUse unwired; SpawnActor Class empty | Observed Implementation | Existing Baseline Defect | get_connected_subgraph | SpawnActor | Player_Cleric | EventGraph | UseAbility004 | BP_PlayerProjectile unwired | 05,13 | High | PIE | -| Ability | Wizard | No Server_Ability_* / UseAbility*; inherit stubs | Observed Implementation | Stub | list_events + EventGraph | — | Player_Wizard | EventGraph | — | NS_Wizard_Ability001 unwired | 05,08 | High | — | -| Ability | Gunslinger | IsDataOnly; only base deps; inherit stubs | Observed Implementation | Stub / Existing Baseline Defect | get_asset_tags | IsDataOnly | Player_Gunslinger | — | — | — | 05,08 | High | — | -| Ability | Parent call | Paladin/Amazonian/Cleric ability overrides skip Parent | Observed Implementation | Incomplete Refactor | get_connected_subgraph | Parent call absent | Player_* | EventGraph | Server_Ability_*_Begin | — | 05 | High | — | -| Ability | Multicast | Multicast_PlayMontage→PlayMontage | Observed Implementation | Intended Behavior | get_connected_subgraph | PlayMontage | BP_PlayerCharacterBase | EventGraph | Multicast_PlayMontage | — | 05 | High | — | -| Ability | End stubs | Most child Ends missing; base End empty | Observed Implementation | Partially Implemented | list_events | Server_Ability_*_End | children | EventGraph | — | — | 05 | High | Pass 8 cleanup | -| Anim | Montages | Per-class Attack/Ability montages seeded | Observed Implementation | — | Multicast pins / deps | Ability001Montages | Player_* | EventGraph | Multicast_PlayMontage | /Game/.../AnimMontages/... | 10 | High | Pass 8 notifies | -| HUD | Legacy | Server_UpdateHUD uses DEPRECATED health/mana % | Observed Implementation | Incomplete Refactor | get_connected_subgraph | UpdatePlayerHUD | BP_PlayerCharacterBase | EventGraph | Server_UpdateHUD | DEPRECATED_* | 05,06,11 | High | PIE dual HUD | -| HUD | Native | InitOverlay ASC delegates | Observed Implementation | Partially Implemented | RIRHUD.cpp | InitOverlay | WBP_PlayerHUD | — | — | WBP_Overlay | 03,11 | High | Widget bindings | -| HUD | Class | WBP_PlayerHUD parent RIRHUD (AHUD) | Observed Implementation | Technical Debt (naming) | get_asset_tags | ParentClass | WBP_PlayerHUD | — | — | — | 03,11,13 | High | — | -| Framework | GM | HUDClass=WBP_PlayerHUD; PC=PC_Character; PS=BP_PlayerState | Observed Implementation | Intended Behavior | ObjectTools CDO | HUDClass | GM_Dungeoneer | — | — | — | 03,11 | High | — | -| Framework | PC | IMC_PlayerDefault + IA_Movement | Observed Implementation | Intended Behavior | ObjectTools CDO | PlayerMappingContext | PC_Character | — | — | IMC_PlayerDefault | 03,08 | High | Ability IMC add | -| Character | Death | PlayerDeath→IsDead→respawn destroy→PlayerRespawn | Observed Implementation | Partially Implemented | get_connected_subgraph | Server_RespawnPlayer | BP_PlayerCharacterBase | EventGraph | PlayerDeath | — | 05 | High | Other callers | -| Enemy | BP structure | Base+Skeleton Tick/Overlap only; BPI GetEnemyREF | Observed Implementation | — | list_events | ReceiveTick | BP_Enemy_* | EventGraph | — | — | 09 | Medium | Pass 9 graphs | -| Interface | BPI set | Four BPIs: PlayerCharacter, EnemyCharacter, PlayerController, GameMode | Observed Implementation | — | find_assets | BPI_ | Interfaces/ | — | — | — | 03 | High | — | -| Continuity | Editor | PIE=false; level Test01; sel Skeleton_C_1 | Observed Implementation | — | EditorApp/SceneTools | IsPIERunning | — | — | — | Test01 | 15 | High | Batch 3 close | -| Repo | Git | Archaeology Markdown only dirty after Batch 3 | Observed Implementation | — | git status | — | — | — | — | — | 15 | High | — | +| Anim | Caller | UseAbility001 called by AN_Ability_001 | Observed Implementation | Intended Behavior | read_graph_dsl | UseAbility001 | AN_Ability_001 | Received_Notify | Received_Notify | .../PlayerCharacterRelated/AN_Ability_001 | 10,05 | High | Notify times | +| Anim | Caller | UseAbility004 called by AN_Ability_004 | Observed Implementation | Intended Behavior | deps + notify body | UseAbility004 | AN_Ability_004 | Received_Notify | — | .../AN_Ability_004 | 10 | High | Times | +| Anim | Cleanup | AN_AttackComplete → SetIsAttacking clears CurrentlyAttacking | Observed Implementation | Intended Behavior | read_graph_dsl | SetIsAttacking | AN_AttackComplete | Received_Notify | — | .../AN_AttackComplete | 10,05 | High | Interrupt PIE | +| Anim | Paladin ABP | Locomotion Idle/WalkRun/Charge/Block/Death; reads IsBlocking/IsCharging/IsDead | Observed Implementation | Intended Behavior | list_graphs + EventGraph | IsBlocking | ABP_Paladin | EventGraph / Locomotion | BlueprintUpdateAnimation | .../Paladin/ABP_Paladin | 10,08 | High | — | +| Anim | Amazon ABP | Locomotion Idle/WalkRun/Death only | Observed Implementation | — | list_graphs | — | ABP_Amazon | Locomotion | — | .../Amazon/ABP_Amazon | 10 | High | — | +| Anim | Cleric ABP | Divine Circle state; DivineCircleActive? from Cleric | Observed Implementation | Intended Behavior | list_graphs + EventGraph DSL | DivineCircleActive? | ABP_Cleric | EventGraph | BlueprintUpdateAnimation | .../Cleric/ABP_Cleric | 10 | High | — | +| Anim | Wizard ABP | Locomotion only; no class montages | Observed Implementation | Stub context | find_assets + deps | — | ABP_Wizard | Locomotion | — | .../Wizard/ABP_Wizard | 10 | High | — | +| Anim | Gunslinger | No AnimBP dependency | Observed Implementation | Existing Baseline Defect | get_dependencies | IsDataOnly | Player_Gunslinger | — | — | — | 10,08 | High | — | +| Anim | Cleric 001 | AN_Ability_001 present; UseAbility001 unimplemented | Observed Implementation | Existing Baseline Defect | list_events + deps | UseAbility001 | Player_Cleric | — | AN_Ability_001 | Cleric_PrimaryAttack_* | 10,05 | High | — | +| Anim | Cleric 003 | AN_Ability_003 vestigial; damage in ConcentrateHandle | Observed Implementation | Technical Debt | Pass 6+8 | UseAbility003 | Player_Cleric | EventGraph | ConcentrateHandle | Cleric_Ability003_Montage | 10,05 | High | — | +| Anim | Unconnected | Cleric_Hu_M_Spell_Staff_Up_Impact_Montage 0 referencers | Observed Implementation | Present but Unconnected | get_referencers | — | — | — | — | .../Cleric_Hu_M_Spell_Staff_Up_Impact_Montage | 10 | High | — | +| Anim | Tool limit | Montage Notifies array unreadable; AnimNotifyList empty for BP notifies | Unknown — Tool Limitation | — | ObjectTools | Notifies | AnimMontage | — | — | — | 10,13 | High | Manual Editor | +| Ability | Multicast risk | Hit windows depend on server montage notify evaluation | Inferred | Technical Debt | architecture | Multicast_PlayMontage | BP_PlayerCharacterBase | EventGraph | Multicast_PlayMontage | — | 10,13 | Medium | PIE | +| Ability | Paladin 001 | Pass 6 Implemented; Pass 8 no status change (qualified) | Observed Implementation | Implemented | — | AN_Ability_001 | Player_Paladin | — | — | Attack_*_Fast_Montage | 05,10 | High | — | +| GAS | Default GE | BP_PlayerState DefaultAttributes=None | Observed Implementation | Partially Implemented | ObjectTools CDO | defaultAttributesGameplayEffect | BP_PlayerState | — | — | — | 06 | High | Pass 7 | +| Continuity | Editor | PIE=false; Test01; sel Skeleton_C_1 | Observed Implementation | — | EditorApp/SceneTools | IsPIERunning | — | — | — | Test01 | 15 | High | — | +| Repo | Git | Clean at Batch 4A start; Archaeology md only after | Observed Implementation | — | git status | — | — | — | — | — | 15 | High | — | diff --git a/Documentation/Archaeology/15-HandoffStatus.md b/Documentation/Archaeology/15-HandoffStatus.md index 552848e0..7323b788 100644 --- a/Documentation/Archaeology/15-HandoffStatus.md +++ b/Documentation/Archaeology/15-HandoffStatus.md @@ -5,16 +5,16 @@ - **Scope:** Authoritative cross-model continuation document for Phase 1. - **Last updated:** 2026-07-16 - **Current phase:** Phase 1 — Static Architecture -- **Last completed pass / batch:** Batch 3 (Pass 6) -- **Next authorized work:** Wait for user — recommend **Batch 4** (Pass 4 sessions / Pass 7 GAS / Pass 8 animation — only as authorized) +- **Last completed pass / batch:** Batch 4A (Pass 8) +- **Next authorized work:** Wait for user — recommend **Pass 7** (GAS) or remaining Batch 4 passes as separately authorized ## Phase completed | Item | Value | |------|--------| | Phase | Phase 1 — Static Architecture (in progress) | -| Batch completed | Batch 3 — Per-character ability archaeology | -| Passes completed | Pass 6 (Paladin → Amazonian → Cleric → Wizard → Gunslinger) | +| Batch completed | Batch 4A — Animation dependencies and ability callbacks | +| Passes completed | Pass 8 | | Date completed | 2026-07-16 | | Model identifier | Cursor Grok 4.5 | @@ -22,150 +22,114 @@ ## Repository integrity -### Starting state (Batch 3) +### Starting state (Batch 4A) -- **Git:** Dirty with expected Batch 2 Archaeology Markdown only (not unexpected): - - Modified: `03`, `06`, `08`, `09`, `11`, `13`, `14`, `15` - - Untracked: `05-LegacyAbilityArchitecture.md` -- **Baseline commit:** `ff5640a0` Establish UE 5.8 known-good baseline with Batch 1 archaeology docs. +- **Git:** Clean (`git status --short` empty; diffs empty). +- **Baseline commits:** `ff5640a0` Batch 1; `0d045d14` Batch 2–3 archaeology. +- **Authorization:** Batch 1–3 docs committed; `01-Phase-1-Plan.md` resolved as `00A-Phase-1-Execution-Plan.md` (committed). - **Editor:** `IsPIERunning=false`; level `/Game/_Main/Levels/Testing/Test01`; selected actor `BP_Enemy_Skeleton_C_1`. -### Ending state (Batch 3 close) +### Ending state (Batch 4A close) -- Modified/created files: Markdown only under `Documentation/Archaeology/` (listed below). -- **Unexpected untracked file reported (not reverted):** `Documentation/Archaeology/01-Phase-1-Plan.md` — present at close; not created by Pass 6 doc writes; contents not inspected this closeout. +- Modified files: Markdown only under `Documentation/Archaeology/` (listed below). - No source, config, plugin, map, or Unreal asset writes. -- PIE not started; level and selection not changed intentionally. -- Ending Git check: only Archaeology Markdown dirty (confirm at close). +- PIE not started; level and selection unchanged. +- Ending Git: only authorized Archaeology Markdown dirty. + --- -## Areas fully inspected (Batch 3 tools) +## Areas fully inspected (Batch 4A) -- Player_Paladin: Ability 001–004 Begin/End/UseAbility/Charge/ChargeBox connected paths -- Player_Amazonian: Ability 001 + UseAbility001 + ReceiveAnyDamage; 002–004 absence -- Player_Cleric: Ability 001–004 + ConcentrateHandle/EndConcentrate + UseAbility002/004 -- Player_Wizard: EventGraph walk; alternate UseAbility/input/spell search; unwired assets -- Player_Gunslinger: IsDataOnly confirmation; Parent-only EventGraph; inherited stubs +- ABP_Paladin / ABP_Amazon / ABP_Cleric / ABP_Wizard structure and EventGraph ability-related reads +- Paladin / Amazonian / Cleric ability Montages via dependency → AnimNotify BP chains +- `AN_Ability_001–004`, `AN_AttackComplete` Received_Notify bodies +- Wizard animation folder (ABP only; no montages) +- Gunslinger deps (no AnimBP) +- Pass 6 status qualification / reclassification table ## Areas partially inspected -- FCanUseMana function body (call sites only) -- Client_Charge / ChargeTimeline numeric curve details -- PlayerHitCheck graphs (existence known; full absorb logic → later) -- Montage notify tracks (seeded in doc 10 → Pass 8) +- Montage section names, blend, root motion, notify times (tool limits) +- AnimGraph transition rule DSL (Paladin reconstructed via VariableGet; others partial) +- `Cleric_Ability003` non-montage asset referencing AN_AttackComplete (identity only) ## Areas not yet inspected -- Frontend/session flows (Batch 4 Pass 4) -- GE/cue systemwide inventory (Batch 4 Pass 7) -- Animation deep dive / AnimNotify → UseAbility (Batch 4 Pass 8) -- Enemy BP AI deep dive (Batch 4 Pass 9) -- Full UI trees / pickups (Batch 4) -- Cross-character migration matrix doc 07 (Pass 11) +- Pass 7 GE/cue/tag inventory +- Pass 4 frontend/sessions +- Pass 9 enemy BP AI +- Pass 10 pickups/UI trees +- Pass 11 migration matrix +- PIE / runtime --- -## Blueprints inspected +## Animation assets inspected | Asset | Depth | |-------|--------| -| BP_PlayerCharacterBase | Correlation only (Batch 2 deep dive stands) | -| Player_Paladin | Pass 6 full ability path reconstruction | -| Player_Amazonian | Pass 6 full ability path reconstruction | -| Player_Cleric | Pass 6 full ability path reconstruction | -| Player_Wizard | Pass 6 ability + alternate path search | -| Player_Gunslinger | Pass 6 data-only / inherited stub confirmation | - -Referenced when required for ability identity: montage paths, MagicSpell_01_Cue, BP_PlayerProjectile (unwired), GE_* DefaultAttributes (orphans), NS_Wizard_Ability001 (unwired). - -## C++ classes inspected - -None new this batch (Batch 1 inventory stands). - -## Assets / configs inspected - -Unreal content via MCP read-only only. No config file writes. +| ABP_Paladin, ABP_Amazon, ABP_Cleric, ABP_Wizard | Graphs, variables, EventGraph DSL where available | +| Attack_*_Fast_Montage (Paladin); Paladin_Ability004_Montage | Deps → notifies | +| A_Hu_F_Combat_2H_Attack* (Amazon) | Deps → notifies | +| Cleric_PrimaryAttack_*; Cleric_Ability002/003/004_Montage | Deps → notifies | +| AN_Ability_001–004, AN_AttackComplete | Received_Notify DSL / bodies | +| Cleric_Hu_M_Spell_Staff_Up_Impact_Montage | Referencers = [] | ## Files created -| File | Status | -|------|--------| -| Documentation/Archaeology/10-AnimationDependencies.md | Draft | +None new (updated existing `10`). ## Files updated | File | Status | |------|--------| -| Documentation/Archaeology/05-LegacyAbilityArchitecture.md | Draft (major Pass 6 rewrite) | -| Documentation/Archaeology/06-PartialGASArchitecture.md | Draft | +| Documentation/Archaeology/10-AnimationDependencies.md | Draft (Pass 8 rewrite) | +| Documentation/Archaeology/05-LegacyAbilityArchitecture.md | Draft | | Documentation/Archaeology/08-CharacterSystems.md | Draft | | Documentation/Archaeology/13-Unknowns-And-RuntimeQuestions.md | Draft | | Documentation/Archaeology/14-EvidenceIndex.md | Draft | | Documentation/Archaeology/15-HandoffStatus.md | Draft | -**03-ClassHierarchy.md not modified** (no Batch 2 structural correction required). -**00-MCP-Capability-Calibration.md not modified.** -**07-AbilityMigrationMatrix.md not created** (Pass 11). +**06 not modified** (no new connected GAS interactions). +**07 not created.** ## Toolsets used -EditorAppToolset (IsPIERunning, GetSelectedActors); SceneTools (get_current_level); AssetTools (class/tags/deps/refs); BlueprintTools (graphs/events/functions/variables/find_nodes/get_node_infos/get_connected_subgraph/read_graph_dsl); ObjectTools (get_properties). +EditorAppToolset; SceneTools; AssetTools; BlueprintTools; ObjectTools (limited). Subagents for Paladin/Amazonian/Cleric deep walks. ## Tool limitations / failed queries -- CustomEvent Reliable/Unreliable flags: **Unknown — MCP property visibility limitation** -- `find_nodes(title="Comment")` returned [] — comment-box regions Unknown -- SemanticSearch unavailable -- Some CallMcpTool invocations initially failed when `server`/`toolName` wrapper omitted; retried successfully -- Blocked read-only continuity queries (if any): recorded as tool limitation, not mutation +- Montage `Notifies` property unreadable +- Asset-registry `AnimNotifyList` empty for BP notify classes +- `read_graph_dsl` empty on AnimGraph/state/transition graphs +- `AssetTools.get_class` Unknown tool (used tags) +- Some CallMcpTool batches failed schema intermittently; retried +- Notify trigger times: Unknown — Tool Limitation -## Contradictory evidence +## Key Pass 8 outcomes -1. Dual HUD: native ASC Overlay vs DEPRECATED float UpdatePlayerHUD — both active statically. -2. DefaultAttributes: GE assets exist (incl. character orphans); BP_PlayerState=None; C++ never applies. -3. Enemy ASC ownership vs GetASC PlayerState path — unchanged from Batch 1. -4. Cleric Ability 004: FCanUseMana executed but Branch uses literal true — structural defect. - -## Unresolved naming ambiguities - -- Amazon vs Amazonian GE folder naming (Pass 7) -- WBP_PlayerHUD naming — resolved class-wise; name still misleading - -## Requires Manual Editor Inspection - -- CustomEvent Reliable/Unreliable flags -- DEPRECATED comment-box visual boundaries -- Montage notify tracks → UseAbility* - -## Requires Runtime Inspection / PIE - -- Dual HUD behavior -- Default attribute spawn values -- Enemy GetASC impact -- Cleric Ability 004 / Wizard BeginPlay Parent skip -- Ability networking feel / reliability +1. **UseAbility* callers resolved** — AnimNotify BPs, not AnimBP graphs. +2. **Cleanup** for notify-driven attacks — `AN_AttackComplete` → `SetIsAttacking`. +3. **Cleric 001/003 notifies dead** — interface unimplemented. +4. **Pass 6 primary statuses unchanged**; qualifications recorded in `10` reclassification table. +5. **Static networking risk** — Multicast montage notify evaluation required for hit windows. ## Suggested next bounded task -**Authorize Batch 4 only** (choose one or more Passes explicitly): +**Authorize explicitly one of:** 1. Pass 7 — GAS GE/cue/tag inventory -2. Pass 8 — Animation / AnimNotify → UseAbility wiring -3. Pass 4 — Frontend / session flows -4. Pass 9 — Enemy BP AI +2. Pass 9 — Enemy BP AI +3. Pass 4 — Frontend / sessions -**Do not begin** Pass 11 migration matrix or PIE until authorized. +**Do not begin** Pass 11 or PIE until authorized. -**Exact starting files for next model:** - -- Read: `00`, `05`, `06`, `08`, `10`, `13`, `14`, `15` -- For Pass 7: start GE assets under `/Game/_Main/` + ASC defaults -- For Pass 8: start montages listed in `10-AnimationDependencies.md` +**Starting files:** `00`, `05`, `06`, `08`, `10`, `13`, `14`, `15`. ## Confirmation - No Unreal assets modified - No source/config/map/plugin modified -- No editor state intentionally modified (PIE not started; level/selection unchanged) -- No work beyond Pass 6 performed -- Waiting for explicit authorization before Batch 4 +- No editor state intentionally modified +- No work beyond Pass 8 performed +- Waiting for explicit authorization before Pass 7 or other Batch 4 passes