66 lines
2.5 KiB
C#
66 lines
2.5 KiB
C#
using BlockOutReplica.Domain;
|
|
using UnityEngine;
|
|
|
|
namespace BlockOutReplica.Gameplay
|
|
{
|
|
public sealed class BlockOutProgress
|
|
{
|
|
private const string LevelKey = "BlockOutReplica.PlayerLevel.v2";
|
|
private readonly BlockOutFlowDefinition flow;
|
|
private readonly bool persist;
|
|
private bool catalogCompleted;
|
|
|
|
public int LevelNumber { get; private set; }
|
|
public int CompletedLevels => catalogCompleted ? flow.LevelIds.Count : LevelNumber - 1;
|
|
public bool CatalogCompleted => catalogCompleted;
|
|
public bool IsTutorialChapter => LevelNumber <= flow.TutorialLevelCount;
|
|
// Native Continue compares the post-win current level to threshold 10.
|
|
public bool ShouldReturnHomeAfterWin => (long)LevelNumber + 1 >= flow.ReturnHomeFromLevel;
|
|
public bool ShouldStartAtHome => LevelNumber >= flow.ReturnHomeFromLevel;
|
|
|
|
public BlockOutProgress(BlockOutFlowDefinition flow, bool persist = true, int initialLevel = 1)
|
|
{
|
|
this.flow = flow;
|
|
this.persist = persist;
|
|
LevelNumber = Mathf.Clamp(persist ? PlayerPrefs.GetInt(LevelKey, 1) : initialLevel, 1,
|
|
Mathf.Max(1, flow.LevelIds.Count));
|
|
catalogCompleted = persist && PlayerPrefs.GetInt(LevelKey + ".Completed", 0) != 0;
|
|
}
|
|
|
|
public string CurrentLevelId => flow.LevelIds[LevelNumber - 1];
|
|
|
|
public bool CompleteLevel()
|
|
{
|
|
if (catalogCompleted) return false;
|
|
catalogCompleted = LevelNumber == flow.LevelIds.Count;
|
|
LevelNumber = Mathf.Min(LevelNumber + 1, flow.LevelIds.Count);
|
|
if (persist)
|
|
{
|
|
PlayerPrefs.SetInt(LevelKey, LevelNumber);
|
|
PlayerPrefs.SetInt(LevelKey + ".Completed", catalogCompleted ? 1 : 0);
|
|
PlayerPrefs.Save();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public void MoveBy(int direction)
|
|
{
|
|
LevelNumber = Mathf.Clamp(LevelNumber + direction, 1, flow.LevelIds.Count);
|
|
catalogCompleted = false;
|
|
if (persist) { PlayerPrefs.SetInt(LevelKey, LevelNumber); PlayerPrefs.SetInt(LevelKey + ".Completed", 0); }
|
|
}
|
|
|
|
public void ResetCurrentRun()
|
|
{
|
|
LevelNumber = 1;
|
|
catalogCompleted = false;
|
|
if (persist)
|
|
{
|
|
PlayerPrefs.SetInt(LevelKey, LevelNumber);
|
|
PlayerPrefs.SetInt(LevelKey + ".Completed", 0);
|
|
PlayerPrefs.Save();
|
|
}
|
|
}
|
|
}
|
|
}
|