using BriarQueen.Data.Identifiers; using BriarQueen.Framework.Effects; using BriarQueen.Framework.Events.UI; using BriarQueen.Framework.Managers.Levels.Data; using BriarQueen.Framework.Managers.Player.Data; using BriarQueen.Framework.Managers.UI; using Cysharp.Threading.Tasks; using UnityEngine; namespace BriarQueen.Game.Puzzles.ChapterOne.AshwickHallow.GatePuzzle { public enum StreetlightGlowState { Off = 0, Red = 1, Orange = 2, Green = 3, Blue = 4 } public class StreetlightGlow : BaseItem { [Header("Puzzle")] [SerializeField] private AshwickMarketGatePuzzle _puzzle; [Header("Light")] [SerializeField] private UILightGlow _light; [SerializeField] private float _changeDuration = 0.25f; [SerializeField] private float _activeIntensity = 1.5f; [Header("Colours")] [SerializeField] private Color _red = new(0.872f, 0.08f, 0.1704798f, 1f); [SerializeField] private Color _orange = new(0.8666667f, 0.5109999f, 0f, 1f); [SerializeField] private Color _green = new(0.12f, 0.865f, 0.1f, 1f); [SerializeField] private Color _blue = new(0.1490196f, 0.6001954f, 1f, 1f); private bool _isChanging; private StreetlightGlowState _currentState = StreetlightGlowState.Off; public StreetlightGlowState CurrentState => _currentState; public override string InteractableName { get { if (_isLocked) { return string.Empty; } return _currentState == StreetlightGlowState.Off ? "Turn On" : "Switch Colour"; } } public override UICursorService.CursorStyle ApplicableCursorStyle => UICursorService.CursorStyle.Interact; public void Initialize(AshwickMarketGatePuzzle puzzle) { if (_puzzle == null) { _puzzle = puzzle; } SetState(_currentState, false).Forget(); } public override async UniTask OnInteract(ItemDataSo item = null) { if (item != null) { EventCoordinator.Publish(new DisplayInteractEvent(InteractEventIDs.Get(ItemInteractKey.CantUseItem))); return; } if (_isLocked || _isChanging) { return; } if (!CheckEmptyHands()) { return; } await CycleNext(); if (_puzzle != null) { await _puzzle.EvaluateCompletion(); } } public async UniTask SetState(StreetlightGlowState state, bool animate) { _currentState = state; if (_light == null) { return; } var targetColor = GetColorForState(state); var targetIntensity = state == StreetlightGlowState.Off ? 0f : _activeIntensity; if (!animate) { _light.SetLightColor(targetColor); _light.SetIntensity(targetIntensity); return; } _isChanging = true; try { await _light.TweenTo(targetColor, targetIntensity, _changeDuration); } finally { _isChanging = false; } } public void Lock() { _isLocked = true; } public void Unlock() { _isLocked = false; } public Color GetCurrentColor() { return GetColorForState(_currentState); } private UniTask CycleNext() { var nextState = _currentState switch { StreetlightGlowState.Off => StreetlightGlowState.Red, StreetlightGlowState.Red => StreetlightGlowState.Green, StreetlightGlowState.Green => StreetlightGlowState.Orange, StreetlightGlowState.Orange => StreetlightGlowState.Blue, StreetlightGlowState.Blue => StreetlightGlowState.Off, _ => StreetlightGlowState.Off }; return SetState(nextState, true); } private Color GetColorForState(StreetlightGlowState state) { return state switch { StreetlightGlowState.Red => _red, StreetlightGlowState.Orange => _orange, StreetlightGlowState.Green => _green, StreetlightGlowState.Blue => _blue, _ => Color.black }; } } }