# Blueprint Condensed Summary — 129 Files Analyzed **Generated:** 2026-05-18 **Agent:** Ask (Knowledge Keeper) **Source:** `docs/blueprints/` (all 15 categories) --- # SUMMARY A — Animation Requirements Catalog ## 1. Core/System (No direct animation triggers) | System | File | Notes | |--------|------|-------| | `DA_GameTagRegistry` | 01 | Passive data asset — no animations | | `FL_GameUtilities` | 02 | Pure function library — no animations | | `I_InterfaceLibrary` | 03 | Interface contracts only — no animations | | `GI_GameFramework` | 04 | GameInstance — no animations | | `GM_CoreGameMode` | 05 | GameMode — no animations | | `GS_CoreGameState` | 06 | GameState — no animations | | `DA_ItemData` | 07 | Data asset — no animations | ## 2. Player Systems | System | Trigger | Type | Body | GASP Notes | |--------|---------|------|------|------------| | `BPC_HealthSystem` (08) | OnDeath → HandleDeath | Montage | Full | Death animation sequence (E_DeathAnimationStage: PreDeath, DeathAnim, PostDeath, RespawnTransition). Hit reaction implied via dispatcher | | `BPC_StaminaSystem` (09) | OnExhaustionStateChanged | Montage/Blend | Upper | Heavy breathing animation, refers to `ABP_GASP` (breathing animation). Exhausted state drives breathing anim | | `BPC_StressSystem` (10) | OnStressTierChanged (≥Panicked) | PoseAsset/Blend | Full | FOV distortion via camera, no direct skeletal anim specified. Catatonic tier applies stumble/freeze | | `BPC_MovementStateSystem` (11) | OnMovementModeChanged (all modes) | BlendSpace/Montage | Full | **GASP-centric.** Sets GASP-specific variables (bStrafing, bSprinting) in AnimationBlueprint. Notifies `ABP_GASP` via interface/direct cast. Posture changes: capsule height changes for Crouch/Prone. Forced transitions apply impulse/knockback | | `BPC_MovementStateSystem` (11) | Transition between postures | Blend | Full | `E_StanceTransition`: Instant, Smooth (TransitionBlendTime=0.2s), Forced | | `BPC_MovementStateSystem` (11) | OnJumped / OnLanded | Montage | Full | Landing impact animation | | `BPC_MovementStateSystem` (11) | OnClimbStarted / OnClimbEnded | Montage | Full | Climbing animation | | `BPC_MovementStateSystem` (11) | OnFootstep | None (audio only) | — | Footstep dispatcher—animation handled by GASP locomotion blend | | `BPC_HidingSystem` (12) | EnterHideSpot | Montage | Full | **EnterMontage** — plays entering animation via `ABP_GASP`. On animation notify → Set HideState=Hidden | | `BPC_HidingSystem` (12) | ExitHideSpot | Montage | Full | **ExitMontage** — plays exiting animation. bForceExit skips animation | | `BPC_HidingSystem` (12) | StartPeek | Pose | Upper | Camera moves to peek socket — no animation, camera-only | | `BPC_EmbodimentSystem` (13) | SetVisibilityMode | — | Arms | Arms mesh toggle for ArmsOnly/FullBody/Hidden modes. Arm IK offset on wall proximity | | `BPC_EmbodimentSystem` (13) | CheckWallProximity | IK Pose | Arms | Arm IK offset when near walls. Notifies `ABP_Arms` | | `BPC_CameraStateLayer` (14) | RequestCameraState (all states) | None | — | Camera FOV/offset only — no skeletal animation | | `BPC_PlayerMetricsTracker` (15) | None | — | — | Pure data gathering — no animation | ## 3. Interaction Systems | System | Trigger | Type | Body | Notes | |--------|---------|------|------|-------| | `BPC_InteractionDetector` (16) | Hold interaction | None | — | Hold progress uses timer, no animation | | `I_HidingSpot` / `BP_HidingSpotBase` (17) | EnterMontage | Montage | Full | `EnterMontage`, `ExitMontage`, `IdleMontage` defined as variables. Player animation for entering/exiting hiding spots | | `BP_DoorActor` (19) | TryOpen / TryClose | Timeline/Interp | — | Door rotation/slide animation via Timeline (0→1 over 1/OpenSpeed seconds). Skeletal mesh relative rotation interpolation | | `BP_DoorActor` (19) | PlayOpenAnimation / PlayCloseAnimation | Timeline | — | Interpolates DoorMeshComponent RelativeRotation.Yaw. Not a character animation | | `BPC_ContextualTraversalSystem` (21) | AttemptTraversal | Montage (root motion) | Full | **Root motion traversal montages** with Motion Warping. Vault, Mantle, Slide, Squeeze, LedgeGrab. MotionWarpingTarget set for accurate placement | | `BPC_PhysicsDragSystem` (22) | GrabObject | Pose/IK | Arms | Hand IK for holding physics object. Grabbed object attached to hand socket | | `BPC_UsableWorldObjectSystem` (23) | None | — | — | Generic use — no animations | ## 4. Inventory Systems | System | Trigger | Type | Body | Notes | |--------|---------|------|------|-------| | `BPC_ContainerInventory` (24) | None | — | — | UI only | | `BP_ItemPickup` (25) | BeingPickedUp | Montage | Arms | **Pickup animation** before destruction. `OnPickupAnimationComplete` callback. Also: Idle bobbing/rotating timeline | | `BPC_ActiveItemSystem` (26) | SelectSlot | — | — | Quick slot switching — animation implied via weapon equip | | `BPC_ConsumableSystem` (28) | UseConsumable | Montage | Upper | Use animation for consuming items (health pack, etc.) | | `BPC_EquipmentSlotSystem` (30) | EquipItem | Montage | Upper | `E_EquipAnimationType`: Instant, Holster, Equip, Unequip. Weapon draw/holster animations, armor equip anim | | Remaining inventory (27,29,31-34) | None | — | — | Data/UI systems, no animations | ## 5. Save/Load Systems | System | Trigger | Type | Body | Notes | |--------|---------|------|------|-------| | All SS/BP save systems (35-43) | None | — | — | No animation triggers. Death sequence animations handled by `BPC_DeathHandlingSystem` which references `E_DeathAnimationStage` | ## 6. Weapon Systems (08-weapons) | System | Trigger | Type | Body | Notes | |--------|---------|------|------|-------| | `BP_WeaponBase` (69) | Fire | Montage | Upper | Fire animation. Recoil animation. Equip/Holster animations | | `BP_WeaponBase` (69) | Reload | Montage | Upper | Reload montage with notifies for ammo insertion/action cycles | | `BPC_FirearmSystem` (74) | StartSwing (melee) | Montage | Upper | Melee swing animation. Chamber check animation | | `BPC_MeleeSystem` (76) | StartSwing | Montage | Upper | Melee attack montage with hit-window notifies | | `BPC_MeleeSystem` (76) | Parry / Block | Montage | Upper | Block and parry animations | | `BPC_ReloadSystem` (78) | StartReload | Montage | Upper | Full reload montage. Interruptible at specific notifies | | `BPC_RecoilSystem` (77) | OnFire | Procedural | — | Camera recoil/hand animation — procedural via spring arm offset | | `BPC_HitReactionSystem` (75) | OnDamageTaken | Montage | Full | Hit reaction montage. Directional hit reacts (front/back/left/right). Stagger animation | | `BPC_ShieldDefenseSystem` (79) | OnBlock | Montage | Arms | Shield raise/block animation. Block stun animation | | `BPC_CombatFeedbackComponent` (71) | OnHitConfirmed | VFX/Montage | — | No direct skeletal anim. Camera shake + VFX | | `BPC_DamageReceptionSystem` (72) | OnDamageTaken | Montage | Full | Damage reception animations. Stagger, knockdown | | `BPC_DeathCauseTracker` (73) | None | — | — | Data tracking — no animation | | `BPC_AmmoComponent` (70) | None | — | — | Data tracking — no animation | ## 7. AI Systems (09-ai) | System | Trigger | Type | Body | Notes | |--------|---------|------|------|-------| | `BP_EnemyBase` (80) | State transitions | BlendSpace/Montage | Full | Locomotion blendspace. Attack montages. Hit reactions. Death montage | | `BPC_AIStateMachine` (83) | State transitions (Patrol→Combat→Search) | BlendSpace | Full | BlendSpace-based locomotion per state. Alert→Combat transition animation | | `BPC_AIPerceptionSystem` (87) | OnTargetDetected | — | — | No direct animation trigger | | `BPC_AlertSystem` (82) | AlertState transitions | Montage | Full | Alerted animation (head snap, body turn). Suspicious look animation | | `BPC_BehaviourVariantSelector` (88) | Variant selection | Montage | Full | Chooses between variant attack/patrol animations | | AI Memory, Patrol, BB (81,84-86) | None | — | — | Data/state only | ## 8. Adaptive/Atmosphere Systems (10-adaptive) | System | Trigger | Type | Body | Notes | |--------|---------|------|------|-------| | `BPC_FearSystem` (90) | Fear level changes | Procedural | — | Character fear pose/breathing animations | | `BPC_ScareEventSystem` (101) | OnScareTriggered | Montage | Full | Player jump-scare animation (body jerk, camera whip) | | `BPC_MemoryDriftSystem` (97) | Memory distortion active | PostProcess | — | Visual distortion — no skeletal animation | | Remaining adaptive systems | Atmosphere/light changes | — | — | Environment animation only (light flicker, audio fade) | ## 9. UI Systems (06-ui) No skeletal animation triggers. All UI widget animations (fade in/out, slide, pulse) are WidgetAnimations on `UUserWidget`. --- # SUMMARY B — Sound/Audio Requirements Catalog ## 1. Player Systems | System | Sound Trigger | Type | Surface/Variation | 3D | |--------|--------------|------|-------------------|-----| | `BPC_HealthSystem` (08) | OnDamageTaken | SFX | Varies by damage type (Physical, Fire, Fear, etc.) | Yes | | `BPC_HealthSystem` (08) | OnDeath | SFX | Death sound | Yes | | `BPC_HealthSystem` (08) | OnHealthCritical | SFX | Low-health heartbeat/breathing | No (2D) | | `BPC_HealthSystem` (08) | OnHealingReceived | SFX | Healing sound | Yes | | `BPC_StaminaSystem` (09) | OnExhausted | SFX/VO | Heavy breathing, heartbeat, fatigue voice lines | No (2D) | | `BPC_StaminaSystem` (09) | OnStaminaChanged | SFX | Low stamina warning | No | | `BPC_StaminaSystem` (09) | OnStaminaFullyRestored | SFX | Restored chime | No | | `BPC_StressSystem` (10) | OnStressTierChanged | SFX/Music/Ambience | Heartbeat audio (Panicked), breathing (Distressed), audio hallucinations (Terrified) | Mixed (hallucinations 3D/2D) | | `BPC_StressSystem` (10) | OnHallucinationTriggered | SFX/VO | Random hallucination audio | Yes/No | | `BPC_StressSystem` (10) | OnCatatonicStateEntered | SFX | Freeze/stumble sound | Yes | | `BPC_MovementStateSystem` (11) | OnFootstep | SFX | **Surface-based.** `S_FootstepProfile`: SoundSoft/SoundHard based on velocity threshold. `EPhysicalSurface` lookup | Yes | | `BPC_MovementStateSystem` (11) | OnJumped | SFX | Jump sound | Yes | | `BPC_MovementStateSystem` (11) | OnLanded | SFX | Landing sound, velocity-based | Yes | | `BPC_MovementStateSystem` (11) | OnSprintStateChanged | SFX | Sprint wind/breath | No | | `BPC_HidingSystem` (12) | OnHideStateChanged | SFX | Enter/exit hide sounds. Breath-hold sounds | Yes | | `BPC_HidingSystem` (12) | OnHideSpotCompromised | Music | Tension/heartbeat music | No | | `BPC_HidingSystem` (12) | OnForcedExitWarning | SFX/Music | Heartbeat audio | No | | `BPC_EmbodimentSystem` (13) | OnOverlayChanged (blood/water) | SFX | Blood spatter, water drip | Yes | ## 2. Interaction Systems | System | Sound Trigger | Type | Notes | 3D | |--------|--------------|------|-------|-----| | `BP_DoorActor` (19) | PlayOpenAnimation | SFX | `S_DoorAudioConfig.OpenSound` | Yes | | `BP_DoorActor` (19) | PlayCloseAnimation | SFX | `S_DoorAudioConfig.CloseSound` | Yes | | `BP_DoorActor` (19) | TryUnlock (locked) | SFX | `LockedSound` | Yes | | `BP_DoorActor` (19) | UnlockDoor | SFX | `UnlockSound` | Yes | | `BP_DoorActor` (19) | DamageBarricade (break) | SFX | `BarricadeBreakSound` | Yes | | `BP_DoorActor` (19) | Moving squeak | SFX | `SqueakInterval` timer | Yes | | `BP_DoorActor` (19) | OnInteractionFailed | SFX | Blocked feedback | Yes | | `BP_ItemPickup` (25) | PlayPickupFeedback | SFX | Pickup sound | Yes | | `BPC_PhysicsDragSystem` (22) | OnObjectGrabbed / Released | SFX | Grab/release sound | Yes | | `BPC_UsableWorldObjectSystem` (23) | OnObjectUsed | SFX | Generic use sound | Yes | ## 3. Narrative Systems | System | Sound Trigger | Type | Notes | 3D | |--------|--------------|------|-------|-----| | `BPC_DialoguePlaybackSystem` (60) | OnLineStarted | VO/Dialogue | Voice audio per speaker (optional). Lip-sync audio | Yes | | `BPC_DialoguePlaybackSystem` (60) | OnDialogueStarted/Ended | Music | Dialogue music stinger | No | | `BPC_DialogueChoiceSystem` (61) | OnChoicesPresented | UI | Choice UI open/select sounds | No | | `BPC_CutsceneBridge` (64) | OnCutscenePlayRequested | Music | Cutscene music | No | | `BPC_CutsceneBridge` (64) | OnCutsceneMilestoneReached | SFX/Music | Milestone stingers | No | ## 4. Weapon Systems | System | Sound Trigger | Type | Notes | 3D | |--------|--------------|------|-------|-----| | `BP_WeaponBase` (69) | Fire | SFX | Weapon fire sound (variation: suppressed/normal) | Yes | | `BP_WeaponBase` (69) | Reload | SFX | Reload sounds (mag out, mag in, bolt) | Yes | | `BPC_AmmoComponent` (70) | OnOutOfAmmo | SFX | Click | Yes | | `BPC_ReloadSystem` (78) | StartReload / CompleteReload | SFX | Tactical/empty reload sounds | Yes | | `BPC_MeleeSystem` (76) | StartSwing | SFX | Swing whoosh | Yes | | `BPC_MeleeSystem` (76) | OnHitConfirmed | SFX | Impact sound (varies by material) | Yes | | `BPC_HitReactionSystem` (75) | OnDamageTaken | SFX | Pain/death sounds | Yes | | `BPC_CombatFeedbackComponent` (71) | OnHitConfirmed | SFX | Impact sound, ricochet | Yes | | `BPC_ShieldDefenseSystem` (79) | OnBlock | SFX | Block impact | Yes | ## 5. AI Systems | System | Sound Trigger | Type | Notes | 3D | |--------|--------------|------|-------|-----| | `BP_EnemyBase` (80) | Alert state transitions | VO/SFX | Alert callout, combat bark, pain, death | Yes | | `BPC_AlertSystem` (82) | OnAlertStateChanged | VO | Suspicious line, combat shout | Yes | | `BPC_AIPerceptionSystem` (87) | OnTargetDetected / Lost | VO | Detection lines | Yes | | `BPC_FearSystem` (90) | OnFearStateChanged | VO/SFX | Fearful whimper, heavy breathing | Yes | ## 6. Adaptive/Atmosphere Systems | System | Sound Trigger | Type | Notes | 3D | |--------|--------------|------|-------|-----| | `BPC_AudioAtmosphereController` (95) | OnAtmosphereChanged | Ambience/Music | Ambient layer swap. Music intensity change. Dynamic mixing | Yes | | `BPC_ScareEventSystem` (101) | OnScareTriggered | SFX/Music | Stinger sound, music hit | Yes | | `BPC_PacingDirector` (98) | Intensity level changes | Music | Music intensity ramping | No | | `BPC_DifficultyManager` (89) | Difficulty changed | — | No direct audio trigger | — | ## 7. Interactive World Objects | System | Sound Trigger | Type | Notes | 3D | |--------|--------------|------|-------|-----| | `BPC_ContainerInventory` (24) | OnContainerOpened | SFX | Open chest/drawer | Yes | | `BP_PuzzleDeviceActor` (20) | OnPuzzleStateChanged | SFX | Puzzle click/solve/fail | Yes | | `BPC_ContextualTraversalSystem` (21) | OnTraversalStarted | SFX | Vault/climb/slide sound | Yes | --- # SUMMARY C — Chooser Table Candidates ## Condition-Based Selection Nodes | File | System | Selects Between | Input Columns (Conditions) | Output | Row Logic | |------|--------|----------------|---------------------------|--------|-----------| | 08 | `BPC_HealthSystem` | Damage resistance multiplier | `E_DamageType`, stackable flag | EffectiveDamage multiplier | Lookup DamageType → multiplier. If bIsStackable, accumulate | | 09 | `BPC_StaminaSystem` | Exhaustion state (Normal/Low/Exhausted) | CurrentStamina/MaxStamina ratio vs thresholds | Regen rate, regen delay, sprint block | if ratio ≤ ExhaustedThreshold → Exhausted; if ≤ LowThreshold → Low; else Normal | | 10 | `BPC_StressSystem` | Stress tier (Calm→Catatonic) | CurrentStress vs threshold values | Visual/audio penalty tier | Descending threshold check: highest exceeded → assign tier | | 11 | `BPC_MovementStateSystem` | Movement mode settings (speed/accel) | Current movement mode | MaxWalkSpeed, Acceleration, Deceleration | Map lookup: `MovementSettings[CurrentMovementMode]` | | 11 | `BPC_MovementStateSystem` | Footstep sound (Soft vs Hard) | SurfaceType, MovementMode, velocity vs threshold | SoundBase (SoundSoft/SoundHard) | Trace surface → lookup profile → if velocity > threshold use Hard | | 11 | `BPC_MovementStateSystem` | Stance transition type | `E_StanceTransition` (Instant/Smooth/Forced) | Blend time, impulse | Switch on transition type | | 12 | `BPC_HidingSystem` | IsPlayerDetectable | HideType, enemy distance, LOS trace | Boolean detectable | If Hidden false→true. LOS trace: hits cover first→false; hits player→true | | 17 | `I_HidingSpot` / BP | Detectability modifier | `E_HideSpotQuality` | DetectionRangeModifier (0-1), DetectionSpeedModifier (0-1) | Better quality = lower detection | | 19 | `BP_DoorActor` | Door interaction outcome | CurrentState, LockState, HasKey | Play open/play locked/start unlock | If Locked→check key; if Closed→open; if Open→close | | 19 | `BP_DoorActor` | Auto-close timer | AutoCloseDelay > 0 | Countdown or none | If delay > 0 → start timer after open | | 21 | `BPC_ContextualTraversalSystem` | Traversal type | Obstacle height vs thresholds (Low/Medium/High) | Vault/Mantle/Slide/Squeeze | if height ≤ Low→step; ≤ Medium→vault; ≤ High→mantle | | 24 | `BPC_ContainerInventory` | Loot generation | `E_ContainerFillMethod` | Fixed/loot-table/empty | Switch on FillMethod | | 24 | `BPC_ContainerInventory` | Weighted loot selection | Per-entry Weight, bGuaranteed | Item + quantity | Roll random against weight sum. If guaranteed→always spawn | | 25 | `BP_ItemPickup` | Pickup visual state | Distance/overlap | Idle/Highlighted/BeingPickedUp/Respawning | Player overlap→Highlighted; Interact→BeingPickedUp; Respawn→Respawning | | 30 | `BPC_EquipmentSlotSystem` | Equip result | Slot occupied, category, state | Success/SlotOccupied/NotEquippable/BlockedByState | Cascading validation checks | | 30 | `BPC_EquipmentSlotSystem` | Equip animation type | `E_EquipAnimationType` | Montage to play | Switch: Instant→none; Holster→holster anim; Equip→equip anim | | 31 | `BPC_InventorySystem` | Sort mode | `E_SortMode` | Reordered slot array | Switch: ByName, ByCategory, ByRarity, ByWeight, ByQuantity, ByRecent | | 31 | `BPC_InventorySystem` | Add item outcome | Has space, has existing stack, weight capacity | Add to stack/new slot/return error | FindExistingStack→if found increment; else FindFreeSlot→new entry | | 38 | `BPC_AltDeathSpaceSystem` | Alt death space level | GameplayTag vs AltDeathSpaceMap | Level soft reference | Map lookup by context tag | | 39 | `BPC_DeathHandlingSystem` | Death outcome | `S_DeathOutcomeRules` + context | StandardRespawn/GameOver/AltDeathSpace | Evaluate configurable rules: max deaths reached? → GameOver; has alt space? → AltDeathSpace | | 50 | `WBP_JournalDocumentViewer` | Font style | `E_DocumentFontStyle` | Handwritten/Typewritten/Digital/BloodScrawled | Per-document font style selection | | 58 | `BPC_NarrativeStateSystem` | HasAllFlags vs HasAnyFlag | Array of GameplayTag values | True/false | AND query vs OR query | | 61 | `BPC_DialogueChoiceSystem` | GetValidChoices | RequiredFlagTag exists + matches narrative state | Filtered choice array | Filter: if RequiredFlagTag is set, show choice; else hide | | 62 | `BPC_BranchingConsequenceSystem` | Consequence action type | `EConsequenceActionType` | Different system calls | Switch: PlayDialogue, UpdateObjective, SetWorldState, TriggerCutscene, etc. | | 63 | `BPC_TrialScenarioSystem` | Scenario end outcome | CheckAllObjectives, CheckFailureConditions | Success or Failure | All objectives complete→Success; failure condition→Failure | | 74 | `BPC_FirearmSystem` | Fire mode | `E_FireMode` (Single/Burst/Auto) | Fire rate, ammo consumption | Switch on fire mode | | 78 | `BPC_ReloadSystem` | Reload type | Ammo count = 0 vs > 0 | Empty reload vs tactical reload | If current ammo = 0 → empty reload montage; else → tactical | | 83 | `BPC_AIStateMachine` | AI state | Perception, alert level, health | Patrol/Search/Combat/Flee | State transition conditions | | 88 | `BPC_BehaviourVariantSelector` | Behaviour variant | `DA_BehaviourVariant` data | Different attack patterns, movement speeds | Weighted random selection from variant set | | 89 | `BPC_DifficultyManager` | Difficulty level | Player metrics vs thresholds | Damage multipliers, spawn rates, resource amounts | Metric-to-difficulty mapping | | 97 | `BPC_MemoryDriftSystem` | Memory distortion type | Random roll vs tier | Visual/audio/dialogue distortion effects | Random selection weighted by stress tier | | 98 | `BPC_PacingDirector` | Pacing intensity | Stress, combat, exploration time | Music intensity, encounter frequency | Composite score → intensity band | | 99 | `BPC_PlaystyleClassifier` | Player archetype | Metrics (hiding vs combat vs exploration) | Aggressive/Stealthy/Explorer/Balanced | Metric ratio analysis | | 100 | `BPC_RareEventSystem` | Rare event selection | Weight table per event | Event to execute | Weighted random from `DA_RareEvent` entries | | 103 | `SS_AchievementSystem` | Achievement unlock | Metrics thresholds | Achievement granted | if metric ≥ threshold → unlock | | 118 | `DA_DataAssetArchitecture` | Data asset type | Inherited class type | Struct definition | Per-asset-type variable set | --- # SUMMARY D — State-Gating Actions ## Actions that MUST be BLOCKED in certain states | Action | System Owner | Blocking States/Conditions | Existing Gating | |--------|-------------|---------------------------|-----------------| | **ApplyDamage** | BPC_HealthSystem (08) | DeathState == Dead, bIsInvincible | Early-out at top of function | | **ApplyHealing** | BPC_HealthSystem (08) | DeathState == Dead | Early-out at top of function | | **KillInstant** | BPC_HealthSystem (08) | Already dead | No gating (bypasses all) | | **DrainStamina** | BPC_StaminaSystem (09) | Action cooldown active, CurrentStamina < MinStamina | Check `ActionCooldownTimers` + `CanAffordAction` | | **StartContinuousDrain** | BPC_StaminaSystem (09) | CurrentStamina <= 0 | Stops drain on exhaustion | | **EnterHideSpot** | BPC_HidingSystem (12) | CurrentHideState != Exposed, !bCanHide | Early-out state check | | **ExitHideSpot** | BPC_HidingSystem (12) | CurrentHideState != Hidden && != Peeking | State check at top | | **StartPeek** | BPC_HidingSystem (12) | CurrentHideState != Hidden, !bCanPeek, !bHasPeekAbility | Multiple early-outs | | **StopPeek** | BPC_HidingSystem (12) | CurrentHideState != Peeking | State check | | **SetVisibilityMode** | BPC_EmbodimentSystem (13) | NewMode == Current | No-op guard | | **PerformInteraction** | BPC_InteractionDetector (16) | bIsPerformingInteraction, DetectionState < TargetConfirmed, InputMode mismatch | Triple guard | | **CancelInteraction** | BPC_InteractionDetector (16) | !bIsPerformingInteraction | Early-out | | **TryOpen** | BP_DoorActor (19) | DoorState is Opening/Closing/Barricaded, !IsDoorUsable | `IsDoorUsable()` check, state machine prevents during transitions | | **TryClose** | BP_DoorActor (19) | DoorState is Opening/Closing, State != Open | State check | | **EquipItem** | BPC_EquipmentSlotSystem (30) | `E_EquipResult.BlockedByState`, `BlockedByCondition` | `CanEquipItem` pre-check | | **UseItem** | BPC_InventorySystem (31) | Item on cooldown, ItemNotUsable, bIsEquipped (weapons) | Cooldown map + usability check | | **OnPlayerDeath** | BPC_DeathHandlingSystem (39) | bIsDying (prevents re-entrant death) | Guard flag | | **RespawnPlayer** | BPC_PlayerRespawnSystem (42) | Invalid respawn transform | Null-check before respawn | | **ForcePanic** | BPC_StressSystem (10) | Already at Catatonic → immune | Early-out at `AddStress` if Catatonic and !bIsInstant | | **FireWeapon** | BP_WeaponBase (69) / BPC_FirearmSystem (74) | Out of ammo, reloading, in hide spot, cutscene, dead | Ammo check, state checks from character | | **Reload** | BPC_ReloadSystem (78) | Full ammo, not holding weapon, dead | Ammo check, weapon validity | | **MeleeAttack** | BPC_MeleeSystem (76) | In hide spot, dead, mid-combo | Combo state machine | | **Block/Parry** | BPC_ShieldDefenseSystem (79) | Not equipped, no stamina, dead | Equipment + stamina check | | **Jump** | (Character/PC) | In hide spot, dead, stamina exhausted | Movement state check | | **Sprint** | (BPC_MovementStateSystem 11) | Not grounded, dead, exhausted, in hide | MovementState + stamina check | | **Crouch/Prone Transition** | BPC_MovementStateSystem (11) | Ceiling clearance fail, no CrouchWalk mode | `CanTransitionToPosture()`, clearance trace | | **Open Inventory** | SS_UIManager (44) | Cutscene playing, dead, in dialogue | GamePhase check by UIManager | | **Pause Game** | SS_UIManager (44) | !bPauseAllowed (set by GM_CoreGameMode), cutscene | `GM_CoreGameMode.bPauseAllowed` runtime flag | | **Initiate Dialogue** | BPC_DialoguePlaybackSystem (60) | bIsPlaying (already in dialogue) | Early-out if already playing | | **Skip Dialogue** | BPC_DialoguePlaybackSystem (60) | !bCanSkipLine | Per-sequence option check | | **Skip Cutscene** | BPC_CutsceneBridge (64) | !bCanSkip, TimeBeforeSkip not elapsed | `CanSkipCutscene()` with timer | | **SetGamePhase** | GI_GameFramework (04) | Same phase as current (optional guard) | Would normally fire dispatcher even for same value | | **EnterAltDeathSpace** | BPC_AltDeathSpaceSystem (38) | bIsInAltDeathSpace | Guard flag | | **ExitAltDeathSpace** | BPC_AltDeathSpaceSystem (38) | !bIsInAltDeathSpace | Guard flag | | **BeginScenario** | BPC_TrialScenarioSystem (63) | ScenarioState != Inactive | Active scenario guard | | **EndScenario** | BPC_TrialScenarioSystem (63) | ScenarioState == Inactive | Must be active | | **PlayCutscene** | BPC_CutsceneBridge (64) | bIsPlaying | Guard flag | | **SelectChoice** | BPC_DialogueChoiceSystem (61) | !bChoiceActive | Guard flag | | **AddStress** | BPC_StressSystem (10) | CurrentTier == Catatonic (if !bIsInstant) | Immunity at max tier | | **QuickSlot Switch** | BPC_ActiveItemSystem (26) | !bCanSwitchItems (during animation), SwitchCooldown | Cooldown timer + switch block | | **Interact Hold** | BPC_InteractionDetector (16) | bBlockDuringDeath, bBlockDuringHiding, bBlockDuringCombat | Config-based blocking per state | | **ApplyMovementPenalty** | BPC_MovementStateSystem (11) | !bApplyMovementPenalties | Config toggle | | **LockDoor** | BP_DoorActor (19) | Already locked | Redundant state guard | --- ## Key Architectural Patterns Observed 1. **Event Dispatcher-driven communication** — Systems never call each other directly except through `I_InterfaceLibrary` interfaces or direct reference on same actor. All cross-component communication uses dispatchers. 2. **State machine everywhere** — Every significant system uses state machines: `E_HideState`, `E_DoorState`, `E_DeathOutcome`, `E_StressTier`, `E_CameraState`, `E_DiegeticDisplayMode`, `E_PuzzleState`, `EScenarioState`, `E_DetectionState`. 3. **GASP integration pattern** — Systems that need animation notify `ABP_GASP` via dispatcher (`OnMovementModeChanged`, `OnPostureChanged`, `OnSprintStateChanged`, `OnExhaustionStateChanged`, `OnHideStateChanged`). GASP reads movement mode/posture variables directly. 4. **GameplayTag-driven state** — All enums map to GameplayTag namespaces. Conditions are checked via tag queries, not enums. Enums exist for performance in tight loops (stamina drain, movement mode switching). 5. **Montage notify patterns used** — `EnterHideSpot` notifies `OnAnimationHideEnterComplete`. `HideSpotBase` calls `EnterMontage`. Death uses `E_DeathAnimationStage` timeline. Reload/Fire use montage notifies for ammo insertion timing.