Files
blockout/BlockOutReplica/Assets/Scripts/Gameplay/BlockOutProgress.cs
T
2026-10-20 13:21:04 +08:00

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();
}
}
}
}