# DA_HapticProfile — Data Asset **Parent Class:** `UPrimaryDataAsset` **Dependencies:** [`BPC_HapticsController`](../12-settings/148_BPC_HapticsController.md) **Purpose:** Defines haptic feedback profiles for controller vibration and force feedback effects tied to gameplay events. Each profile maps a GameplayTag to a platform-specific `UForceFeedbackEffect` waveform asset with configurable intensity, duration, motor mask, and priority. --- ## Enums Used | Enum | Defined In | Values | |------|-----------|--------| | `EHapticEvent` | `BPC_HapticsController` (148) | Damage, HeavyDamage, Heartbeat, WeaponFire, WeaponReload, MeleeImpact, Footstep, Explosion, PickupItem, DropItem, GrabObject, ReleaseObject, ScareEvent, AmbientPulse, UI_Confirm, UI_Navigate, LowHealth, StaminaExhausted, Death | | `EHapticMotor` | `BPC_HapticsController` (148) | Left, Right, Both | --- ## Variables / Structure ### Core Fields | Field | Type | Description | |-------|------|-------------| | `ProfileTag` | `FGameplayTag` | Unique haptic profile identifier (e.g., `Haptic.Damage.Heavy`) | | `EventType` | `EHapticEvent` | Event category this profile handles | | `ForceFeedbackEffect_Generic` | `UForceFeedbackEffect*` | Waveform curve asset for PC/Xbox generic controllers | | `ForceFeedbackEffect_PS5` | `UForceFeedbackEffect*` | Waveform curve asset for PS5 DualSense (higher fidelity) | | `ForceFeedbackEffect_Xbox` | `UForceFeedbackEffect*` | Waveform curve asset for Xbox controllers (optional override) | | `IntensityCurve` | `UCurveFloat*` | Optional: vibration intensity over time (0.0–1.0) | | `Duration` | `float` | Total haptic effect duration in seconds | | `MotorMask` | `EHapticMotor` | Left motor, Right motor, or Both | | `Priority` | `int32` | Higher priority overrides lower during conflicts (0 = lowest, 100 = highest) | | `bCanInterrupt` | `bool` | Can this effect be interrupted by a higher-priority effect? | | `bIgnoreTimeDilation` | `bool` | Should this play at real-time regardless of game speed? | ### Platform-Specific Fields | Field | Type | Description | |-------|------|-------------| | `PlatformMinIntensity` | `float` | Minimum intensity threshold before effect is felt (0.0–1.0) | | `DualSense_TriggerSide` | `FName` | PS5 adaptive trigger side ("Left", "Right", "None") | | `DualSense_TriggerEffect` | `FName` | PS5 trigger effect type ("Resistance", "Vibration", "WeaponFire", "BowDraw", "None") | | `DualSense_TriggerStartPosition` | `int32` | PS5 trigger position where effect begins (0–9) | | `DualSense_TriggerStrength` | `int32` | PS5 trigger effect strength (0–8) | ### Heartbeat-Specific Fields | Field | Type | Description | |-------|------|-------------| | `bIsHeartbeatProfile` | `bool` | Whether this profile is used for heartbeat pulse effects | | `TargetBPMRange_Min` | `float` | Minimum BPM this profile handles | | `TargetBPMRange_Max` | `float` | Maximum BPM this profile handles | --- ## Gameplay Tags - Namespace: `Haptic..` - Examples: `Haptic.Damage.Heavy`, `Haptic.Heartbeat.Normal`, `Haptic.WeaponFire.Pistol` - All tags must be registered in `DT_Tags_Player.csv` for validation at startup ### Full Tag Hierarchy ``` Haptic. ├── Damage.Light ├── Damage.Heavy ├── Damage.Critical ├── Heartbeat.Normal ├── Heartbeat.Fast ├── Heartbeat.Panic ├── WeaponFire.Pistol ├── WeaponFire.Shotgun ├── WeaponReload ├── MeleeImpact.Crowbar ├── MeleeImpact.Default ├── Footstep.Tile ├── Footstep.Wood ├── Footstep.Concrete ├── Footstep.Metal ├── Footstep.Gravel ├── Explosion ├── Pickup.Item ├── Pickup.Weapon ├── Grab ├── Release.Throw ├── Scare.JumpScare ├── Scare.TensionRise ├── Ambient.Void ├── Ambient.Default ├── LowHealth ├── StaminaExhausted ├── Death ├── UI.Confirm └── UI.Navigate ``` --- ## Validation Rules - `ProfileTag` must be unique across all profiles - `Duration` must be > 0.0 - At least one `ForceFeedbackEffect_*` must be assigned (Generic falls back for all platforms) - `Priority` must be 0–100 - If `bIsHeartbeatProfile` is true, `TargetBPMRange_Min` and `TargetBPMRange_Max` must be set - If `DualSense_TriggerSide != "None"`, trigger effect fields must be valid --- ## Example Data ### Damage Profile — Heavy Hit | Field | Value | |-------|-------| | `ProfileTag` | `Haptic.Damage.Heavy` | | `EventType` | `HeavyDamage` | | `Duration` | `0.4` | | `MotorMask` | `Both` | | `Priority` | `80` | | `bCanInterrupt` | `true` | | `bIgnoreTimeDilation` | `true` | | `ForceFeedbackEffect_Generic` | `FFE_Damage_Heavy` | | `ForceFeedbackEffect_PS5` | `FFE_Damage_Heavy_PS5` | ### Heartbeat Profile — Normal | Field | Value | |-------|-------| | `ProfileTag` | `Haptic.Heartbeat.Normal` | | `EventType` | `Heartbeat` | | `Duration` | `0.1` | | `MotorMask` | `Left` | | `Priority` | `30` | | `bCanInterrupt` | `true` | | `bIsHeartbeatProfile` | `true` | | `TargetBPMRange_Min` | `60.0` | | `TargetBPMRange_Max` | `90.0` | | `ForceFeedbackEffect_Generic` | `FFE_Heartbeat` | ### Weapon Fire — Pistol | Field | Value | |-------|-------| | `ProfileTag` | `Haptic.WeaponFire.Pistol` | | `EventType` | `WeaponFire` | | `Duration` | `0.08` | | `MotorMask` | `Right` | | `Priority` | `50` | | `DualSense_TriggerSide` | `Right` | | `DualSense_TriggerEffect` | `WeaponFire` | | `DualSense_TriggerStartPosition` | `4` | | `DualSense_TriggerStrength` | `6` | --- ## Consumed By - [`BPC_HapticsController`](../12-settings/148_BPC_HapticsController.md) — loads all profiles into `HapticProfileMap` at initialization ## Referenced By - `BPC_HealthSystem` (08) — damage haptics - `BPC_FirearmSystem` (74) — weapon fire haptics - `BPC_MeleeSystem` (76) — melee impact haptics - `BPC_ScareEventSystem` (101) — scare event haptics - `BPC_MovementStateSystem` (11) — footstep haptics - `BPC_ReloadSystem` (78) — reload haptics - `BPC_PhysicsDragSystem` (22) — grab/release haptics - `BP_ItemPickup` (25) — pickup haptics - `BPC_DeathHandlingSystem` (39) — death haptics - `BPC_StaminaSystem` (09) — stamina exhausted haptics --- ## Reuse Notes - Haptic profiles are platform-agnostic in design; `BPC_HapticsController` selects the correct `UForceFeedbackEffect` asset at runtime based on `CurrentPlatform`. - Designers create FFE waveform curves in the Content Browser — no Blueprint changes needed for tuning. - For heartbeat profiles: create 3 instances (Normal 60-90 BPM, Fast 90-140 BPM, Panic 140-180 BPM). `BPC_HapticsController` auto-selects based on current BPM. - For footstep profiles: create one per surface type. `BPC_MovementStateSystem` selects based on physical surface trace result. - Priority guidelines: 0–20 (ambient/footsteps), 30–50 (weapons/reload/pickups), 60–80 (damage), 90–100 (scares/death). - The `Haptic.` namespace should be registered in `DT_Tags_Player.csv` so `DA_GameTagRegistry` validates them at startup.