# BPC_StaminaSystem / BPC_StressSystem / BPC_MovementStateSystem
# BPC_HidingSystem / BPC_EmbodimentSystem / BPC_CameraStateLayer / BPC_PlayerMetricsTracker
#
# Player Component Assets — Quick Creation Sheet (7 components)

> **UE5 Path:** `Content/Framework/Player/`
> **Parent Class:** `ActorComponent`
> **Attach To:** Player pawn

---

## Quick Creation — All 7 Components

For each component below:
1. Content Browser → `Content/Framework/Player/`
2. Right-click → **Blueprint Class** → Parent: `ActorComponent`
3. Name: as listed
4. Attach to player pawn Blueprint via **Add Component**

---

## BPC_StaminaSystem

| Variable | Type | Default |
|----------|------|---------|
| `MaxStamina` | Float | `100.0` |
| `CurrentStamina` | Float | `100.0` |
| `SprintDrainRate` | Float | `10.0` |
| `StaminaRegenRate` | Float | `5.0` |
| `ExhaustionThreshold` | Float | `10.0` |
| `bExhausted` | Boolean | `false` |

**Key Functions:** `ConsumeStamina(Amount)`, `IsExhausted()`

**Dispatchers:** `OnStaminaChanged`, `OnExhaustionStateChanged`

---

## BPC_StressSystem

| Variable | Type | Default |
|----------|------|---------|
| `CurrentStress` | Float | `0.0` |
| `StressDecayRate` | Float | `1.0` |
| `StressTier` | Enum (E_PlayerVitalSignals) | `Calm` |

**Key Functions:** `AddStress(Amount, Source)`, `GetStressTier()`

**Dispatchers:** `OnStressChanged`, `OnStressTierChanged(Tier)`

**Stress Tiers:** Calm → Tense → Anxious → Fearful → Catatonic

---

## BPC_MovementStateSystem

| Variable | Type | Default |
|----------|------|---------|
| `CurrentMovementMode` | GameplayTag | `Framework.Player.Movement.Standing` |
| `CurrentPosture` | GameplayTag | `Framework.Player.Posture.Standing` |
| `bIsSprinting` | Boolean | `false` |
| `bIsCrouching` | Boolean | `false` |

**Key Functions:** `SetMovementMode(Tag)`, `SetPosture(Tag)`, `GetMovementIntensity()`

**Dispatchers:** `OnMovementModeChanged`, `OnPostureChanged`

**GASP Liaison:** This component updates GASP variables — never modify GASP directly.

---

## BPC_HidingSystem

| Variable | Type | Default |
|----------|------|---------|
| `CurrentHideState` | GameplayTag | `Framework.Player.State.Exposed` |
| `bIsPeeking` | Boolean | `false` |
| `bIsHoldingBreath` | Boolean | `false` |
| `BreathHoldMax` | Float | `8.0` |
| `BreathHoldCurrent` | Float | `8.0` |

**Key Functions:** `EnterHide(HidingSpot)`, `ExitHide()`, `Peek()`, `HoldBreath()`

**Dispatchers:** `OnHideStateChanged`, `OnBreathHoldChanged`

---

## BPC_EmbodimentSystem

| Variable | Type | Default |
|----------|------|---------|
| `bFirstPersonBodyVisible` | Boolean | `true` |
| `bArmsOnlyMode` | Boolean | `false` |
| `BodyMesh` | SkeletalMesh | (assign) |

**Key Functions:** `SetBodyVisibility(bVisible)`, `SetArmsOnlyMode(bActive)`

**Dispatchers:** `OnEmbodimentModeChanged`

---

## BPC_CameraStateLayer

| Variable | Type | Default |
|----------|------|---------|
| `BaseFOV` | Float | `90.0` |
| `CurrentFOV` | Float | `90.0` |
| `FOVSmoothSpeed` | Float | `5.0` |
| `CameraOffset` | Vector | `(0,0,0)` |

**Key Functions:** `SetFOVOverride(Tag, FOV)`, `ClearFOVOverride(Tag)`, `SetCameraOffset(Tag, Offset)`

**Dispatchers:** `OnFOVChanged`, `OnCameraOffsetChanged`

---

## BPC_PlayerMetricsTracker

| Variable | Type | Default |
|----------|------|---------|
| `TotalShotsFired` | Integer | `0` |
| `TotalShotsHit` | Integer | `0` |
| `TotalDeaths` | Integer | `0` |
| `TotalKills` | Integer | `0` |
| `Accuracy` | Float | `0.0` |
| `KDRatio` | Float | `0.0` |

**Key Functions:** `RecordShot(bHit)`, `RecordDeath()`, `RecordKill()`, `GetAccuracy()`

**Dispatchers:** `OnMetricsUpdated`

---

## Test All Components
- [ ] All 7 components visible on player pawn
- [ ] BeginPlay sets default values correctly
- [ ] Each dispatcher fires when its state changes
- [ ] Components don't conflict (Stamina drain doesn't affect Stress directly — let StateManager coordinate)
