Document Batch 4D archaeology and add README title image outside LFS.

Exclude REALMSINRUIN_TITLE_DEV.png from Git LFS so the README hero renders on Gitea.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-16 23:17:56 -07:00
co-authored by Cursor
parent e028e16f70
commit ee65271212
11 changed files with 501 additions and 215 deletions
@@ -2,30 +2,37 @@
**Status: Draft**
- **Scope:** Native `ARIREffectActor` mechanism; Pass 7 consumable GE assignments and overlap→apply wiring. Full per-pickup respawn/UI/authority deep dive deferred to Pass 10.
- **Inspection method:** Native C++; search_subclasses; AssetTools refs; ObjectTools GE class props; BlueprintTools EventGraph DSL on `BP_HealthPotion`.
- **Scope:** Pass 10 pickup / consumable / EffectActor / currency archaeology (Batch 4D). Complements Pass 7 GE inventory in doc 06.
- **Inspection method:** BlueprintTools EventGraph DSL; ObjectTools CDO; `search_subclasses` on `RIREffectActor`; AssetTools referencers; SceneTools `find_actors` on already-loaded Test01 (read-only).
- **Last updated:** 2026-07-16
- **Current phase:** Phase 1 — Static Architecture
- **Last completed pass:** Pass 7 (Batch 4B) — EffectActor + GE wiring seed
- **Next pass expected to contribute:** Pass 10
- **Last completed pass:** Pass 10 (Batch 4D)
- **Next pass expected to contribute:** Pass 11 when authorized; PIE for authority / overlap validation
## Draft tracking
### Completed sections
- ApplyEffectToTarget GE application path
- Instant/Duration GE class properties
- Blueprint child paths for potions / orange slice / mana crystal
- **Pass 7:** Exact Instant/Duration GE assignments; HealthPotion overlap→Apply→Destroy; GE modifier magnitudes; enemy GetASC null risk
- All four `ARIREffectActor` children overlap → Apply → Destroy
- Legacy `BP_BasePickUp` / gold path
- GE application matrix + enemy GetASC incompatibility
- Currency / collectible matrix + negative stamina-potion inventory
- Pickup issue matrix
### Pending sections
- Per-pickup authority, destroy/respawn, UI notify (Pass 10)
- ManaPotion / ManaCrystal / OrangeSlice graph confirmation beyond refs (HealthPotion DSL verified)
- Gold / stamina pickups if present
- Sphere collision profile / `GenerateOverlapEvents` exact values (tool limit)
- Runtime multiplayer authority behavior for non-replicating EffectActors
- Whether full-health HealthPickUp leaves actor undestroyed (DSL branch shape)
### Evidence still required
- Whether ApplyEffect runs with HasAuthority on overlap
- Whether GetAbilitySystemComponent succeeds for player vs fails for enemy in PIE
- Stacking / re-pickup behavior
- PIE: player overlap applies GE and updates Overlay bars
- PIE: enemy overlap early-out
- PIE: gold AddGold no-op (unimplemented BPI)
- Respawn / lifespan (none found statically)
### Tool or visibility limitations
- CDO `get_properties("sphere")` → None (component templates)
- Redirector paths reject `read_graph_dsl` (use canonical Potion/Food/Treasure paths)
- Native `ApplyEffectToTarget` body in C++ (already documented Pass 7)
---
@@ -35,23 +42,112 @@
1. `UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(TargetActor)`
2. Early-out if null
3. MakeOutgoingSpec(GEClass, 1.f) + ApplyGameplayEffectSpecToSelf
3. `MakeOutgoingSpec(GEClass, 1.f)` + `ApplyGameplayEffectSpecToSelf`
**Enemy ASC defect interaction:** Library GetASC uses `ARIRBaseCharacter::GetAbilitySystemComponent` → PlayerState. Enemies return **nullptr** ApplyEffect early-out. **Issue:** Existing Baseline Defect / Incomplete Refactor. Classify static consequence separately from runtime chase/attack defects.
**Enemy compatibility:** Library/interface GetASC uses `ARIRBaseCharacter::GetAbilitySystemComponent` → PlayerState. Enemies return **nullptr** → early-out. **Enemy-Incompatible Due to ASC Accessor** (static). Separate from chase/attack Implementation Missing (doc 09).
---
## Blueprint subclasses (Observed Implementation)
## 1. Pickup inventory
| Asset | InstantGameplayEffectClass | DurationGameplayEffectClass |
|-------|----------------------------|------------------------------|
| `/Game/_Main/Blueprints/Items/Potion/BP_HealthPotion` | `GE_PotionHeal` (+25 Health Instant) | None |
| `/Game/_Main/Blueprints/Items/Potion/BP_ManaPotion` | `GE_PotionMana` (+30 Mana Instant) | None |
| `/Game/_Main/Blueprints/Items/Potion/BP_ManaCrystal` | None | `GE_MoT_Small` (+0.25 Mana / 0.1s for 1s) |
| `/Game/_Main/Blueprints/Items/Food/BP_OrangeSlice` | None | `GE_HoT_Small` (+0.5 Health / 0.1s for 1s) |
| Pickup | Parent | Collision/overlap | Authority | Effect or mutation | Presentation | Destroy/respawn | Status |
|--------|--------|-------------------|-----------|--------------------|--------------|-----------------|--------|
| `/Game/_Main/Blueprints/Items/Potion/BP_HealthPotion` | `RIREffectActor` | `OnComponentBeginOverlap(Sphere)` | **None** (`SwitchHasAuthority` absent); `bReplicates=false` | Instant `GE_PotionHeal` via `ApplyEffecttoTarget` | None in graph | Immediate `DestroyActor`; **no respawn/lifespan** | Active but Unverified / Authority Risk |
| `/Game/_Main/Blueprints/Items/Potion/BP_ManaPotion` | `RIREffectActor` | Sphere overlap | Same | Instant `GE_PotionMana` | None | Destroy; no respawn | Active but Unverified / Authority Risk |
| `/Game/_Main/Blueprints/Items/Potion/BP_ManaCrystal` | `RIREffectActor` | Sphere overlap | Same | Duration `GE_MoT_Small` | None | Destroy; no respawn | Active but Unverified / Authority Risk |
| `/Game/_Main/Blueprints/Items/Food/BP_OrangeSlice` | `RIREffectActor` | Sphere overlap | Same | Duration `GE_HoT_Small` | None | Destroy; no respawn | Active but Unverified / Authority Risk |
| `/Game/_Main/Blueprints/Items/Treasure/BP_SmallGoldPickUp` | `BP_BasePickUp``Actor` | Parent `PickUpRadius` overlap | **Yes** Authority + tag `Player` | `AddGold(PickUpAmount=25)` | `CoinsPickUp_Cue` | Destroy; no respawn | Partial (AddGold unimplemented) |
| `/Game/_Main/Blueprints/Items/BP_BasePickUp` | `Actor` | `PickUpRadius` | Authority + `Player` tag | Switch `E_PickUpType`: Gold / Health / Mana | SFX on paths | Destroy on success paths | Partial / Technical Debt |
**BP_HealthPotion EventGraph (Observed Implementation):** `OnComponentBeginOverlap(Sphere)``ApplyEffecttoTarget(OtherActor, InstantGameplayEffectClass)``DestroyActor`.
**Redirectors (not separate logic):** `Items/BP_HealthPotion`, `Items/BP_ManaPotion`, `Items/BP_OrangeSlice`, `Items/BP_SmallGoldPickUp` → canonical paths above.
Same structural pattern reported for other three consumables (referencer graph + agent); Pass 10 should re-confirm each DSL.
**`search_subclasses(RIREffectActor)`:** only the four GE pickups (+ native base). Gold is **not** an EffectActor child.
**Classification:** Pickups are the **only Observed Implementation** of runtime Gameplay Effect application found in Pass 7. Combat abilities remain ApplyDamage / DEPRECATED (doc 05). Full GE inventory: doc 06.
**Stamina pickup:** project search for stamina potion/widget assets → **none**. Explicit negative inventory.
**Test01 placement (Observed Implementation):** 1× each GE pickup; 3× `BP_SmallGoldPickUp`.
---
## 2. Gameplay Effect application matrix
| Pickup | Target filter | ASC lookup | GE | Apply call | Null behavior | Player compatibility | Enemy compatibility |
|--------|---------------|------------|----|------------|---------------|----------------------|---------------------|
| BP_HealthPotion | None in BP (any OtherActor) | Native ApplyEffectToTarget → GetASC | `GE_PotionHeal` Instant +25 Health | `ApplyEffecttoTarget(OtherActor, InstantGameplayEffectClass)` | Early-out; **DestroyActor still runs after call** | Compatible if player ASC via PlayerState | **Enemy-Incompatible Due to ASC Accessor** (null ASC) |
| BP_ManaPotion | None | Same | `GE_PotionMana` Instant +30 Mana | Instant class | Same (destroy always) | Compatible (static) | Enemy-Incompatible |
| BP_ManaCrystal | None | Same | `GE_MoT_Small` Duration | `DurationGameplayEffectClass` | Same | Compatible (static) | Enemy-Incompatible |
| BP_OrangeSlice | None | Same | `GE_HoT_Small` Duration | Duration class | Same | Compatible (static) | Enemy-Incompatible |
**Connected path (all four GE pickups):**
`OnComponentBeginOverlap(Sphere)``ApplyEffecttoTarget``DestroyActor`
No actor-class filter, no Player tag, no authority switch, no UI notification, no Niagara in graph.
**Classification reminder:** GE property assignment + overlap apply call = Connected static path. Runtime success = **Requires Runtime Inspection**.
---
## 3. Currency / collectible matrix
| Asset/system | Entry point | Stored value | Authority | Replication | UI | Persistence | Status |
|--------------|-------------|--------------|-----------|-------------|----|-------------|--------|
| `BP_SmallGoldPickUp` / `GoldPickUp` | Authority overlap + tag Player | Calls `BPI_PlayerController.AddGold(PickUpAmount)`; CDO Amount=25 | Authority gated on pickup | Pickup `bReplicates=true` | No gold UI widget found | **No GI / save store found** | Partial |
| `AddGold` on `PC_Character` | Called from `GoldPickUp` | Interface method | — | — | — | — | **Present but Unconnected** (`bIsImplemented=false`; not in `RIRPlayerController` C++) |
| Legacy Health/Mana via `BP_BasePickUp` | Enum Health/Mana | `DEPRECATED_RecoverPlayerHealth/Mana` | Authority | — | None | Character DEPRECATED floats | Technical Debt / dual with GAS potions |
| Inventory / Coin / Currency / Score systems | Searched | — | — | — | — | — | **Explicit negative inventory** (no connected non-gold currency beyond above) |
| Stamina collectible | Searched | — | — | — | — | — | **Missing** |
**Gold consequence:** Overlap can destroy the gold actor and play SFX while `AddGold` does nothing statically — **Incomplete Refactor**.
---
## 4. Pickup issue matrix
| Asset | Missing or defective link | Static consequence | Runtime question | Classification |
|-------|---------------------------|--------------------|------------------|----------------|
| All four EffectActor pickups | No `SwitchHasAuthority`; `bReplicates=false` | Overlap may fire on clients; destroy may desync | Who applies GE / who destroys? | Authority Risk |
| All four EffectActor pickups | No target filter | Non-player actors may trigger destroy | Does debris/AI destroy potions? | Requires Runtime Inspection |
| All four EffectActor pickups | Destroy after Apply even if ASC null | Enemy (or null ASC) still destroys pickup | Wasted loot on enemy touch? | Enemy-Incompatible Due to ASC Accessor + destroy side effect |
| All four EffectActor pickups | No respawn / lifespan | One-shot only | Intentional? | Partially Implemented |
| All four EffectActor pickups | No UI notify | Overlay may update via ASC only | Bars animate on pickup? | Active but Unverified |
| `BP_BasePickUp` Health/Mana | Uses DEPRECATED recover, not GEs | Dual heal/mana systems vs potions | Which values HUD shows? | Technical Debt / Incomplete Refactor |
| `BP_SmallGoldPickUp` | `AddGold` unimplemented on PC | Gold mutation missing | Does gold vanish with no score? | Present but Unconnected (receiver) |
| Stamina | No pickup / no Overlay widget | Stamina attribute UI unused | — | Missing |
| Sphere collision props | Unreadable via MCP CDO | Cannot classify Collision Configuration Conflict from profile alone | GenerateOverlapEvents true? | Unknown — Tool Limitation |
---
## Legacy BP_BasePickUp detail (Observed Implementation)
```
OnComponentBeginOverlap(PickUpRadius)
→ SwitchHasAuthority → Authority
→ ActorHasTag(OtherActor, "Player")
→ Switch E_PickUpType:
Gold → GoldPickUp → GetPlayerREF → AddGold(PC, Amount) → Coins SFX → Destroy
Health → HealthPickUp → if DEPRECATED health < max → DEPRECATED_RecoverPlayerHealth → potion SFX → Destroy
Mana → ManaPickUp → analogous DEPRECATED mana recover
```
**DSL note:** Health/Mana sound+destroy appear in the true branch of the “not full” check (no explicit `else`). If already full, static reading suggests **no destroy****Requires Runtime Inspection** / possible Partial behavior.
---
## UI notifications from pickups
| Source | Notification | Status |
|--------|--------------|--------|
| GE pickups | None in graphs | Missing |
| Gold | Audio only | Partial |
| `WBP_BannerMessage` | Not referenced by pickups this pass | Present; Unconnected to pickups |
ASC Overlay health/mana bars may reflect GE changes if InitOverlay path active — that is attribute UI, not pickup-specific notification.
---
## Correlation to prior docs
- GE CDO magnitudes / orphan default-attribute GEs: **doc 06** (unchanged inventory; reachability of consumable GEs **confirmed Active static path** again).
- Enemy GetASC: **doc 06 / 09** — pickup enemy incompatibility unchanged; no new enemy AI analysis.
- HUD dual path: **doc 11** — Overlay may show GE heals; legacy UpdatePlayerHUD unimplemented.