First commit for private source control. Older commits available on Github.
This commit is contained in:
@@ -0,0 +1,185 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using BriarQueen.Data.Identifiers;
|
||||
using BriarQueen.Data.IO.Saves;
|
||||
using BriarQueen.Framework.Events.Progression;
|
||||
using BriarQueen.Framework.Events.UI;
|
||||
using BriarQueen.Framework.Managers.Hints.Data;
|
||||
using BriarQueen.Framework.Managers.Levels.Data;
|
||||
using BriarQueen.Framework.Managers.Player.Data;
|
||||
using BriarQueen.Framework.Services.Puzzles.Base;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using MemoryPack;
|
||||
using UnityEngine;
|
||||
|
||||
namespace BriarQueen.Game.Puzzles.ChapterOne.Fountain
|
||||
{
|
||||
[Serializable]
|
||||
[MemoryPackable]
|
||||
public partial struct FountainGemPuzzleState
|
||||
{
|
||||
public bool IsCompleted;
|
||||
public string[] InputtedGemIDs;
|
||||
}
|
||||
|
||||
public class FountainGemBasePuzzle : BasePuzzle, IPuzzleStateful
|
||||
{
|
||||
[SerializeField]
|
||||
private FountainGemSlot _fountainGemSlot;
|
||||
|
||||
public override string PuzzleID => PuzzleIdentifiers.AllPuzzles[PuzzleKey.FountainGemPuzzle];
|
||||
public override string LevelName => "Hole in the side of a Fountain";
|
||||
public override Dictionary<int, BaseHint> Hints { get; } = new();
|
||||
|
||||
private readonly List<ItemDataSo> _inputtedGems = new();
|
||||
private readonly List<string> _inputtedGemIDs = new();
|
||||
|
||||
private readonly string[] _correctSequence =
|
||||
{
|
||||
ItemIDs.Get(ItemKey.Sapphire),
|
||||
ItemIDs.Get(ItemKey.Emerald),
|
||||
ItemIDs.Get(ItemKey.Ruby)
|
||||
};
|
||||
|
||||
private bool _isCompleted;
|
||||
public bool IsCompleted => _isCompleted;
|
||||
|
||||
protected override UniTask PostActivateInternal()
|
||||
{
|
||||
TutorialService.DisplayTutorial(TutorialPopupID.ResetPuzzles);
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
protected void Start()
|
||||
{
|
||||
if (_fountainGemSlot != null)
|
||||
_fountainGemSlot.Initialize(this);
|
||||
}
|
||||
|
||||
internal bool TryInsertGem(ItemDataSo item)
|
||||
{
|
||||
if (_isCompleted || item == null)
|
||||
return false;
|
||||
|
||||
var itemID = item.UniqueID;
|
||||
if (string.IsNullOrWhiteSpace(itemID))
|
||||
return false;
|
||||
|
||||
_inputtedGems.Add(item);
|
||||
_inputtedGemIDs.Add(itemID);
|
||||
|
||||
ConsumePlayerGem(item);
|
||||
|
||||
if (_inputtedGemIDs.Count < _correctSequence.Length)
|
||||
return true;
|
||||
|
||||
if (IsCorrectSequence())
|
||||
{
|
||||
CompletePuzzle().Forget();
|
||||
return true;
|
||||
}
|
||||
|
||||
AudioManager.Play(AudioNameIdentifiers.Get(SFXKey.PuzzleIncorrect));
|
||||
ResetPuzzleState();
|
||||
return false;
|
||||
}
|
||||
|
||||
public override UniTask CompletePuzzle()
|
||||
{
|
||||
if (_isCompleted)
|
||||
return UniTask.CompletedTask;
|
||||
|
||||
_isCompleted = true;
|
||||
|
||||
SaveManager.SetLevelFlag(LevelFlag.StreetGateOpen, true);
|
||||
SaveManager.SetPuzzleCompleted(PuzzleKey.FountainGemPuzzle, true);
|
||||
AudioManager.Play(AudioNameIdentifiers.Get(SFXKey.GateOpening));
|
||||
EventCoordinator.Publish(new UnlockAchievementEvent(AchievementID.FountainGemPuzzleSolved));
|
||||
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
public UniTask<byte[]> CaptureState()
|
||||
{
|
||||
var state = new FountainGemPuzzleState
|
||||
{
|
||||
IsCompleted = _isCompleted,
|
||||
InputtedGemIDs = _inputtedGemIDs.ToArray()
|
||||
};
|
||||
|
||||
return UniTask.FromResult(MemoryPackSerializer.Serialize(state));
|
||||
}
|
||||
|
||||
public UniTask RestoreState(byte[] state)
|
||||
{
|
||||
_inputtedGems.Clear();
|
||||
_inputtedGemIDs.Clear();
|
||||
_isCompleted = false;
|
||||
|
||||
if (state == null || state.Length == 0)
|
||||
{
|
||||
_isCompleted = SaveManager.GetLevelFlag(LevelFlag.StreetGateOpen);
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
var restoredState = MemoryPackSerializer.Deserialize<FountainGemPuzzleState>(state);
|
||||
|
||||
_isCompleted = restoredState.IsCompleted;
|
||||
|
||||
if (restoredState.InputtedGemIDs != null)
|
||||
_inputtedGemIDs.AddRange(restoredState.InputtedGemIDs);
|
||||
|
||||
if (_isCompleted)
|
||||
{
|
||||
SaveManager.SetLevelFlag(LevelFlag.StreetGateOpen, true, false);
|
||||
SaveManager.SetPuzzleCompleted(PuzzleKey.FountainGemPuzzle, true, false);
|
||||
}
|
||||
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
public void ResetPuzzleState()
|
||||
{
|
||||
if (_isCompleted)
|
||||
return;
|
||||
|
||||
for (int i = 0; i < _inputtedGems.Count; i++)
|
||||
{
|
||||
var gem = _inputtedGems[i];
|
||||
if (gem != null)
|
||||
PlayerManager.CollectItem(gem);
|
||||
}
|
||||
|
||||
_inputtedGems.Clear();
|
||||
_inputtedGemIDs.Clear();
|
||||
}
|
||||
|
||||
public void OnResetButtonPressed()
|
||||
{
|
||||
AudioManager.Play(AudioNameIdentifiers.Get(SFXKey.ResetPuzzle));
|
||||
ResetPuzzleState();
|
||||
}
|
||||
|
||||
private bool IsCorrectSequence()
|
||||
{
|
||||
if (_inputtedGemIDs.Count != _correctSequence.Length)
|
||||
return false;
|
||||
|
||||
for (int i = 0; i < _correctSequence.Length; i++)
|
||||
{
|
||||
if (_inputtedGemIDs[i] != _correctSequence[i])
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private void ConsumePlayerGem(ItemDataSo item)
|
||||
{
|
||||
if (item == null)
|
||||
return;
|
||||
|
||||
PlayerManager.RemoveItem(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b6d0351ea34c4c918d254f72ac186173
|
||||
timeCreated: 1773930345
|
||||
@@ -0,0 +1,50 @@
|
||||
using BriarQueen.Data.Identifiers;
|
||||
using BriarQueen.Framework.Managers.Levels.Data;
|
||||
using BriarQueen.Framework.Managers.Player.Data;
|
||||
using Cysharp.Threading.Tasks;
|
||||
|
||||
namespace BriarQueen.Game.Puzzles.ChapterOne.Fountain
|
||||
{
|
||||
public class FountainGemSlot : BaseItem
|
||||
{
|
||||
private FountainGemBasePuzzle _puzzle;
|
||||
|
||||
private readonly string _firstPieceKey = ItemIDs.Get(ItemKey.Sapphire);
|
||||
private readonly string _secondPieceKey = ItemIDs.Get(ItemKey.Emerald);
|
||||
private readonly string _thirdPieceKey = ItemIDs.Get(ItemKey.Ruby);
|
||||
|
||||
public override string InteractableName => "Hole";
|
||||
|
||||
public void Initialize(FountainGemBasePuzzle puzzle)
|
||||
{
|
||||
_puzzle = puzzle;
|
||||
}
|
||||
|
||||
public override UniTask OnInteract(ItemDataSo item = null)
|
||||
{
|
||||
if (_puzzle == null || item == null || _puzzle.IsCompleted)
|
||||
{
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
if (!CheckEmptyHands())
|
||||
return UniTask.CompletedTask;
|
||||
|
||||
var itemID = item.UniqueID;
|
||||
if (!IsValidGem(itemID))
|
||||
{
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
_puzzle.TryInsertGem(item);
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
private bool IsValidGem(string itemID)
|
||||
{
|
||||
return itemID == _firstPieceKey ||
|
||||
itemID == _secondPieceKey ||
|
||||
itemID == _thirdPieceKey;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 40ab281620b846b3b4798a035abae950
|
||||
timeCreated: 1773930669
|
||||
@@ -0,0 +1,30 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace BriarQueen.Game.Puzzles.ChapterOne.Fountain
|
||||
{
|
||||
public class FountainResetButton : MonoBehaviour
|
||||
{
|
||||
[SerializeField]
|
||||
private Button _resetButton;
|
||||
|
||||
[SerializeField]
|
||||
private FountainGemBasePuzzle _fountainGemBasePuzzle;
|
||||
|
||||
protected void Start()
|
||||
{
|
||||
_resetButton.onClick.AddListener(OnResetClicked);
|
||||
}
|
||||
|
||||
protected void OnDestroy()
|
||||
{
|
||||
_resetButton.onClick.RemoveListener(OnResetClicked);
|
||||
}
|
||||
|
||||
private void OnResetClicked()
|
||||
{
|
||||
_fountainGemBasePuzzle.OnResetButtonPressed();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 52594bb963824a15b8916933f552312d
|
||||
timeCreated: 1773933231
|
||||
Reference in New Issue
Block a user