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