public void NewTurn()
        {
            TurnTransaction turn = this.EndCurrentTurn();

            this.previousTurns.Push(turn);
            this.StartTurn(new TurnTransaction());
        }
        private TurnTransaction EndCurrentTurn()
        {
            this.currentTurn.UndoQueue = this._UndoQueue;
            this.currentTurn.RedoQueue = this._RedoQueue;
            TurnTransaction turn = this.currentTurn;

            this.currentTurn = null;
            return(turn);
        }
        private void StartTurn(TurnTransaction turn)
        {
            this.currentTurn = turn;
            this._UndoQueue  = turn.UndoQueue;

            // Only reset Redoqueue if we're restoring a turn that already has one, otherwise we're just undoing over turn boundaries
            if (turn.RedoQueue.Count > 0)
            {
                this._RedoQueue = turn.RedoQueue;
            }
        }
        public void BackupOneTurn()
        {
            if (this.previousTurns.Count > 0)
            {
                while (this._UndoQueue.Count > 0)
                {
                    ICommand command = _UndoQueue.Pop();
                    command.Undo();
                    this._RedoQueue.Push(command);
                }

                TurnTransaction turn = this.EndCurrentTurn();
                this.futureTurns.Push(turn);
                this.StartTurn(this.previousTurns.Pop());
            }
        }
        public void ForwardOneTurn()
        {
            Debug.Assert(this.HasFutureTurns);
            while (this._RedoQueue.Count > 0)
            {
                ICommand command = _RedoQueue.Pop();
                command.Do();
                this._UndoQueue.Push(command);
            }

            this.EndCurrentTurn();
            TurnTransaction turn = this.futureTurns.Pop();

            this.StartTurn(turn);
            while (this._RedoQueue.Count > 0)
            {
                ICommand command = this._RedoQueue.Pop();
                command.Do();
                this._UndoQueue.Push(command);
            }
        }