public AggregateUpdateResult DoPlayerAction(PlayerActions playerAction) { switch (playerAction) { case PlayerActions.MoveRight: case PlayerActions.MoveUp: case PlayerActions.MoveLeft: case PlayerActions.MoveDown: _snapshotManager.TakeTentativeSnapshot(this); bool requiresUpdate = false; foreach (var playerEntity in PlayerEntities) { requiresUpdate |= playerEntity.HandlePlayerAction(this, playerAction); } if (requiresUpdate) { _snapshotManager.AddPlayerActionHistory(playerAction); Move++; var updateResult = UpdateLevel(); return(updateResult); } return(new AggregateUpdateResult(AggregateUpdateResult.ResultTypes.Cancelled, 0, _updateResults)); case PlayerActions.Undo: if (!_snapshotManager.CanUndo) { return(new AggregateUpdateResult(AggregateUpdateResult.ResultTypes.Cancelled, 0, _updateResults)); } _snapshotManager.AddPlayerActionHistory(playerAction); Undo(); return(new AggregateUpdateResult(AggregateUpdateResult.ResultTypes.UndoPerformed, 0, _updateResults)); case PlayerActions.None: default: return(new AggregateUpdateResult(AggregateUpdateResult.ResultTypes.Cancelled, 0, _updateResults)); } }