86 lines
3.7 KiB
C#
86 lines
3.7 KiB
C#
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using Unheimlich.Features.Dialogue.UI;
|
|
|
|
namespace Unheimlich.Features.Hallucination
|
|
{
|
|
// ─── Per-label override data ───────────────────────────────────────────────
|
|
|
|
/// <summary>
|
|
/// Describes how a specific FloatingLabel should behave when a HallucinationEvent fires.
|
|
/// </summary>
|
|
[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 ──────────────────────────────────────────────────────
|
|
|
|
/// <summary>
|
|
/// 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.
|
|
/// </summary>
|
|
[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<FloatingLabelOverride> _labelOverrides = new();
|
|
|
|
// ─── Public Accessors ──────────────────────────────────────────────────
|
|
|
|
public string Label => _label;
|
|
public float SanityCost => _sanityCost;
|
|
public IReadOnlyList<FloatingLabelOverride> LabelOverrides => _labelOverrides;
|
|
|
|
// ─── Internal ─────────────────────────────────────────────────────────
|
|
|
|
/// <summary>
|
|
/// Pushes all label overrides onto their target FloatingLabels.
|
|
/// Called by HallucinationManager.TriggerHallucinationEvent().
|
|
/// </summary>
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
} |