using UnityEngine; using Unheimlich.Core.Events; namespace Unheimlich.Features.Hallucination { /// /// Self-contained zone that triggers a hallucination effect when the player enters. /// Handles the once-flag, optional delay, insanity increase, and a discrete HallucinationEvent /// — no GameEventTrigger or HallucinationTrigger required alongside it. /// public class HallucinationTriggerZone : TriggerZoneBase { [Header("Zone Behaviour")] [Tooltip("Allow the zone to fire again after the player exits and re-enters")] [SerializeField] private bool _retriggerable = false; [Tooltip("Delay in seconds before the hallucination fires after the player enters")] [SerializeField] private float _delay = 0f; [Header("Sanity")] [Tooltip("Amount of insanity added when the zone fires (0 = no change)")] [SerializeField, Range(0f, 1f)] private float _insanityAmount = 0f; [Header("Hallucination Event")] [Tooltip("Optional discrete hallucination event (ghost word, vision flash, etc.)")] [SerializeField] private HallucinationEvent _hallucinationEvent; [Header("Debug")] [SerializeField] private bool _debugMode; protected override bool IsRetriggerable => _retriggerable; protected override void OnPlayerEntered(Collider playerCollider) { if (_delay > 0f) Invoke(nameof(Fire), _delay); else Fire(); } /// /// Fires the hallucination effect. Can also be called from external scripts or UnityEvents. /// public void Fire() { if (HallucinationManager.Instance == null) { Debug.LogError("[HallucinationTriggerZone] HallucinationManager not found in scene!", this); return; } if (_insanityAmount > 0f) { HallucinationManager.Instance.AddInsanity(_insanityAmount); if (_debugMode) Debug.Log($"[HallucinationTriggerZone] Added {_insanityAmount:F2} insanity on '{gameObject.name}'.", this); } if (_hallucinationEvent != null) { HallucinationManager.Instance.TriggerHallucinationEvent(_hallucinationEvent); if (_debugMode) Debug.Log($"[HallucinationTriggerZone] Fired event: {_hallucinationEvent.Label}", this); } } } }