chore: Project Restructuring & Theatre
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user