using System.Collections.Generic; using UnityEngine; using Unheimlich.Features.Dialogue.UI; namespace Unheimlich.Features.Hallucination { // ─── Per-label override data ─────────────────────────────────────────────── /// /// Describes how a specific FloatingLabel should behave when a HallucinationEvent fires. /// [System.Serializable] public class FloatingLabelOverride { [Tooltip("The FloatingLabel to override when this event fires.")] public FloatingLabel Target; [Header("Shake Override")] [Tooltip("Absolute shake radius applied during the override (world units). 0 = no shake.")] [Min(0f)] public float ShakeRadius = 0.15f; [Tooltip("Shake speed during the override.")] [Min(0f)] public float ShakeSpeed = 3f; [Tooltip("Shake smoothness during the override.")] [Min(0f)] public float ShakeSmoothness = 4f; [Header("Ghost Trail Override")] public bool GhostEnabled = true; [Range(0f, 1f)] public float GhostAlpha = 0.5f; [Header("Duration")] [Tooltip("How long the override lasts (seconds) before reverting to the sanity baseline.")] [Min(0f)] public float Duration = 2f; } // ─── ScriptableObject ────────────────────────────────────────────────────── /// /// ScriptableObject describing a discrete hallucination event. /// /// Ghost word spawn removed. Words live on FloatingLabel components in the scene. /// LabelOverrides targets specific labels with timed shake/ghost overrides. /// [CreateAssetMenu( fileName = "HallucinationEvent", menuName = "Unheimlich/Hallucination/Hallucination Event")] public class HallucinationEvent : ScriptableObject { [Header("Identity")] [SerializeField] private string _label; [Header("Sanity Cost")] [SerializeField, Range(0f, 1f)] private float _sanityCost = 0f; [Header("Floating Label Overrides")] [Tooltip("One entry per FloatingLabel to affect when this event fires.")] [SerializeField] private List _labelOverrides = new(); // ─── Public Accessors ────────────────────────────────────────────────── public string Label => _label; public float SanityCost => _sanityCost; public IReadOnlyList LabelOverrides => _labelOverrides; // ─── Internal ───────────────────────────────────────────────────────── /// /// Pushes all label overrides onto their target FloatingLabels. /// Called by HallucinationManager.TriggerHallucinationEvent(). /// internal void ApplyLabelOverrides() { foreach (FloatingLabelOverride entry in _labelOverrides) { if (entry.Target == null) continue; entry.Target.ApplyOverride( entry.ShakeRadius, entry.ShakeSpeed, entry.ShakeSmoothness, entry.GhostEnabled, entry.GhostAlpha, entry.Duration); } } } }