Restructured for new direction.
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9afe762158da4f8c8bb8a1bcb98d62b1
|
||||
timeCreated: 1778242706
|
||||
@@ -0,0 +1,26 @@
|
||||
using System.Linq;
|
||||
using BriarQueen.Data.Identifiers;
|
||||
using BriarQueen.Framework.Events.UI;
|
||||
using BriarQueen.Framework.Managers.Levels.Data;
|
||||
using BriarQueen.Framework.Managers.Player.Data;
|
||||
using Cysharp.Threading.Tasks;
|
||||
|
||||
namespace BriarQueen.Game.Puzzles.ChapterOne.AshwickHallow.GatePuzzle
|
||||
{
|
||||
public class AshwickGate : BaseItem
|
||||
{
|
||||
public override UniTask OnInteract(ItemDataSo item = null)
|
||||
{
|
||||
var codex = PlayerManager.GetDiscoveredCodexEntriesByType(CodexType.PuzzleClue);
|
||||
|
||||
if (codex.Any(x => x.UniqueID == CodexEntryIDs.Get(ClueEntryID.AshwickMarketGate)))
|
||||
{
|
||||
EventCoordinator.Publish(new DisplayInteractEvent($"The note said to use the lights."));
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
EventCoordinator.Publish(new DisplayInteractEvent($"It's locked."));
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1bc3c6697e5b4c029e807116f930e9a3
|
||||
timeCreated: 1778247353
|
||||
@@ -0,0 +1,167 @@
|
||||
using BriarQueen.Data.Identifiers;
|
||||
using BriarQueen.Data.IO.Saves;
|
||||
using BriarQueen.Framework.Effects;
|
||||
using BriarQueen.Framework.Events.Save;
|
||||
using BriarQueen.Framework.Services.Puzzles.Base;
|
||||
using BriarQueen.Game.Items.HoverZones;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using MemoryPack;
|
||||
using UnityEngine;
|
||||
|
||||
namespace BriarQueen.Game.Puzzles.ChapterOne.AshwickHallow.GatePuzzle
|
||||
{
|
||||
public class AshwickMarketGatePuzzle : BasePuzzle, IPuzzleStateful
|
||||
{
|
||||
[Header("Lights")]
|
||||
[SerializeField]
|
||||
private StreetlightGlow _leftLight;
|
||||
[SerializeField]
|
||||
private StreetlightGlow _rightLight;
|
||||
|
||||
[Header("Solution")]
|
||||
[SerializeField]
|
||||
private StreetlightGlowState _leftLightRequiredState = StreetlightGlowState.Blue;
|
||||
[SerializeField]
|
||||
private StreetlightGlowState _rightLightRequiredState = StreetlightGlowState.Blue;
|
||||
|
||||
[Header("Gate")]
|
||||
[SerializeField]
|
||||
private UIDissolveImage _gateImage;
|
||||
|
||||
[Header("Transition")]
|
||||
[SerializeField]
|
||||
private InteractZone _marketplaceZone;
|
||||
|
||||
private bool _isCompleted;
|
||||
private bool _isCompleting;
|
||||
|
||||
public override string PuzzleID => PuzzleIdentifiers.AllPuzzles[PuzzleKey.AshwickMarketGate];
|
||||
|
||||
public bool IsCompleted => _isCompleted;
|
||||
|
||||
public override UniTask PostLoad()
|
||||
{
|
||||
_leftLight?.Initialize(this);
|
||||
_rightLight?.Initialize(this);
|
||||
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
public async UniTask EvaluateCompletion()
|
||||
{
|
||||
if (_isCompleted || _isCompleting)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!CheckComplete())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
await CompletePuzzle();
|
||||
}
|
||||
|
||||
public override async UniTask CompletePuzzle()
|
||||
{
|
||||
if (_isCompleted || _isCompleting)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_isCompleting = true;
|
||||
|
||||
try
|
||||
{
|
||||
_isCompleted = true;
|
||||
|
||||
_leftLight?.Lock();
|
||||
_rightLight?.Lock();
|
||||
|
||||
_marketplaceZone.gameObject.SetActive(true);
|
||||
|
||||
SaveManager.SetPuzzleCompleted(PuzzleKey.AshwickMarketGate, true, false);
|
||||
SaveManager.SetLevelFlag(LevelFlag.MarketGateOpen, true, false);
|
||||
EventCoordinator.PublishImmediate(new RequestGameSaveEvent());
|
||||
|
||||
if (_gateImage != null)
|
||||
{
|
||||
await _gateImage.DissolveOutAndDestroy();
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
_isCompleting = false;
|
||||
}
|
||||
}
|
||||
|
||||
public bool CheckComplete()
|
||||
{
|
||||
if (_leftLight == null || _rightLight == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return _leftLight.CurrentState == _leftLightRequiredState &&
|
||||
_rightLight.CurrentState == _rightLightRequiredState;
|
||||
}
|
||||
|
||||
public UniTask<byte[]> CaptureState()
|
||||
{
|
||||
var payload = new AshwickMarketGatePuzzleStatePayload
|
||||
{
|
||||
LeftLightState = _leftLight != null ? _leftLight.CurrentState : StreetlightGlowState.Off,
|
||||
RightLightState = _rightLight != null ? _rightLight.CurrentState : StreetlightGlowState.Off,
|
||||
IsCompleted = _isCompleted
|
||||
};
|
||||
|
||||
return UniTask.FromResult(MemoryPackSerializer.Serialize(payload));
|
||||
}
|
||||
|
||||
public async UniTask RestoreState(byte[] state)
|
||||
{
|
||||
var isMarkedComplete = SaveManager.CurrentSave?.PersistentVariables?.Game
|
||||
?.IsPuzzleCompleted(PuzzleKey.AshwickMarketGate) == true;
|
||||
|
||||
var payload = new AshwickMarketGatePuzzleStatePayload
|
||||
{
|
||||
LeftLightState = StreetlightGlowState.Off,
|
||||
RightLightState = StreetlightGlowState.Off,
|
||||
IsCompleted = isMarkedComplete
|
||||
};
|
||||
|
||||
if (state is { Length: > 0 })
|
||||
{
|
||||
payload = MemoryPackSerializer.Deserialize<AshwickMarketGatePuzzleStatePayload>(state);
|
||||
payload.IsCompleted |= isMarkedComplete;
|
||||
}
|
||||
|
||||
if (_leftLight != null)
|
||||
{
|
||||
await _leftLight.SetState(payload.LeftLightState, false);
|
||||
}
|
||||
|
||||
if (_rightLight != null)
|
||||
{
|
||||
await _rightLight.SetState(payload.RightLightState, false);
|
||||
}
|
||||
|
||||
if (!payload.IsCompleted)
|
||||
{
|
||||
_isCompleted = false;
|
||||
_leftLight?.Unlock();
|
||||
_rightLight?.Unlock();
|
||||
return;
|
||||
}
|
||||
|
||||
_isCompleted = true;
|
||||
_leftLight?.Lock();
|
||||
_rightLight?.Lock();
|
||||
|
||||
if (_gateImage != null && DestructionService != null)
|
||||
{
|
||||
await DestructionService.Destroy(_gateImage.gameObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 701653a82bc1487d8aff6ea83a9abaeb
|
||||
timeCreated: 1778243473
|
||||
@@ -0,0 +1,12 @@
|
||||
using MemoryPack;
|
||||
|
||||
namespace BriarQueen.Game.Puzzles.ChapterOne.AshwickHallow.GatePuzzle
|
||||
{
|
||||
[MemoryPackable]
|
||||
public partial struct AshwickMarketGatePuzzleStatePayload
|
||||
{
|
||||
public StreetlightGlowState LeftLightState;
|
||||
public StreetlightGlowState RightLightState;
|
||||
public bool IsCompleted;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: de15a1ddef77473cb145cd59500cde71
|
||||
@@ -0,0 +1,182 @@
|
||||
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
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 74c68ae5d328428f87e9fb87424df340
|
||||
timeCreated: 1778242706
|
||||
Reference in New Issue
Block a user