public void OnRestoreToPrevState() { if (!(HasEnoughCoin(ItemType.UNDO) || GameManager.instance.debug) || _snapshots.Count <= 0 || GameManager.instance.transition != GameManager.Transition.None) { SoundManager.Instance.PlayUISoundInstance( GameConstants.UIFX_TOUCH_LOCKED_BUTTON_ITEM ); return; } SoundManager.Instance.PlayUISoundInstance( GameConstants.UIFX_TOUCH_BUTTON_ITEM ); BoardSnapshot snapshot = _snapshots[_snapshots.Count - 1]; _snapshots.Remove(snapshot); _scoreCounter.Setup(snapshot.score); _savings = snapshot.savings; GameManager.instance.RestoreToPrevState(snapshot); }
IEnumerator ProcessRestoreToPrevState(BoardSnapshot snapshot) { transition = Transition.Restore; _nextBlockNumbers.Push(_block.numbers); float halfRestoreBoardTime = _restoreBoardTime * 0.5f; _board.highestNumber = snapshot.highestNumber; for (int i = 0, max = _board.tiles.Length; i < max; ++i) { NumberedHexaTile tile = _board.tiles[i] as NumberedHexaTile; if (tile != null && tile.cell != null) { tile.cell.LeanCancel(); tile.cell.LeanScale(Vector3.zero, halfRestoreBoardTime). setEaseInBack(). setOnComplete(() => tile.Reset()); } } NumberedHexaCell[] cells = _block.PopCells(); for (int i = 0, max = cells.Length; i < max; ++i) { NumberedHexaCell cell = cells[i]; cell.LeanCancel(); cell.LeanScale(Vector3.zero, halfRestoreBoardTime). setEaseInBack(). setOnComplete(() => ReleaseHexaCell(cell)); } yield return(new WaitForSeconds(halfRestoreBoardTime + 0.1f)); for (int i = 0, max = snapshot.boardNumbers.Length; i < max; ++i) { if (snapshot.boardNumbers[i] > 0) { NumberedHexaCell cell = GenerateHexaCell() as NumberedHexaCell; cell.Setup(snapshot.boardNumbers[i]); _board.tiles[i].SetCell(cell); cell.LeanCancel(); cell.LeanScale(Vector3.zero, Vector3.one, halfRestoreBoardTime). setEaseOutBack(); } } _block.Setup(snapshot.blockNumbers); if (onUseItem != null) { onUseItem(ItemType.UNDO); } transition = Transition.None; }
public void RestoreToPrevState(BoardSnapshot snapshot) { if (snapshot == null) { return; } StartCoroutine(ProcessRestoreToPrevState(snapshot)); }
public void GenerateSnapshot() { BoardSnapshot snapshot = new BoardSnapshot( GameManager.instance.board, GameManager.instance.block, _scoreCounter.value, _savings ); _snapshots.Add(snapshot); if (_snapshots.Count > _maxSnapshot) { _snapshots.RemoveAt(0); } }