183 lines
4.8 KiB
C#
183 lines
4.8 KiB
C#
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 bool _isLocked;
|
|
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
|
|
};
|
|
}
|
|
}
|
|
}
|