## Game explosion / heavy collision

- Use case: A game impact: sharp initial crack, then a rumble that decays over half a second.
- Feel: An instant sharp hit followed by a low rumble fading out — like debris settling.
- APIs: CHHapticEvent, CHHapticParameterCurve
- Minimum OS: iOS 13+

### Core Haptics

```swift
import CoreHaptics

func playExplosion(engine: CHHapticEngine,
                   magnitude: Float = 1.0) throws {   // scale 0–1 by event size
    // 1) The crack
    let crack = CHHapticEvent(eventType: .hapticTransient, parameters: [
        CHHapticEventParameter(parameterID: .hapticIntensity, value: magnitude),
        CHHapticEventParameter(parameterID: .hapticSharpness, value: 1.0),
    ], relativeTime: 0)

    // 2) The rumble
    let rumble = CHHapticEvent(eventType: .hapticContinuous, parameters: [
        CHHapticEventParameter(parameterID: .hapticIntensity, value: 0.8 * magnitude),
        CHHapticEventParameter(parameterID: .hapticSharpness, value: 0.1),
    ], relativeTime: 0.02, duration: 0.5)

    // 3) Decay curve: rumble fades to zero
    let decay = CHHapticParameterCurve(
        parameterID: .hapticIntensityControl,
        controlPoints: [
            .init(relativeTime: 0.02, value: 1.0),
            .init(relativeTime: 0.52, value: 0.0),
        ],
        relativeTime: 0)

    let pattern = try CHHapticPattern(events: [crack, rumble],
                                      parameterCurves: [decay])
    let player = try engine.makePlayer(with: pattern)
    try engine.start()
    try player.start(atTime: CHHapticTimeImmediate)
}
```

### Notes
- Scale magnitude with in-game distance to the explosion for spatial believability.
- In games, also pair with CHHapticEngine(audioSession:) so haptics and sound stay sample-locked.
