public static void ResetCurrentPuzzleShapes(bool invalidOnly, bool isHardReset)
        {
            bool playCue = false;

            Cursor.CursorMode = CursorState.Reset;

            if (SelectedShape != null)
            {
                resetSelectedShape();
                playCue = true;
            }

            foreach (Shape shape in CurrentPuzzleSet.ShapesDict.Values)
            {
                if (shape.State != Shape.ShapeState.Waiting)
                {
                    if (invalidOnly)
                    {
                        if (!shape.IsValid)
                        {
                            CurrentPuzzle.RemoveShape(shape);
                            if (isHardReset)
                            {
                                shape.Reset();
                                //                                shape.State = Shape.ShapeState.Resetting;
                            }
                            else
                            {
                                playCue     = true;
                                shape.State = Shape.ShapeState.TransitionOut;
                            }
                        }
                    }
                    else
                    {
                        CurrentPuzzle.RemoveShape(shape);
                        if (isHardReset)
                        {
                            shape.Reset();
                        }
                        else
                        {
                            playCue     = true;
                            shape.State = Shape.ShapeState.TransitionOut;
                        }
                    }
                }
            }

            if (playCue)
            {
                AudioManager.PlayCue("replaceShape");
            }

            Cursor.CursorMode = CursorState.Free;
        }
        public static void ShapeGrabTriggered()
        {
            if (MainScreen.PuzzlePanel.SelectedShapeKey == 0)
            {
                return;
            }

            Shape selectedShape = CurrentPuzzleSet.ShapesDict[MainScreen.PuzzlePanel.SelectedShapeKey];

            switch (selectedShape.State)
            {
            case Shape.ShapeState.Dropped:
                Cursor.CursorMode   = CursorState.Grab;
                SelectedShapeKey    = selectedShape.Key;
                SelectedShape.State = Shape.ShapeState.Selected;
                SelectedShape.CursorReturnOffset = Cursor.ScreenPosition - SelectedShape.Shape00Position;

                Cursor.ScreenPosition = SelectedShape.Shape00Position;
                CurrentPuzzle.RemoveShape(SelectedShape);

                if (SelectedShape.IsSnapped)
                {
                    AudioManager.PlayCue("grabSnapped");
                }
                else
                {
                    AudioManager.PlayCue("grab");
                }
//                    return;
                break;

            case Shape.ShapeState.Waiting:
                Cursor.CursorMode   = CursorState.Grab;
                SelectedShapeKey    = selectedShape.Key;
                SelectedShape.State = Shape.ShapeState.TransitionIn;
                SelectedShape.CursorReturnOffset = SelectedShape.ShapeOrigin;

                Cursor.ScreenPosition = SelectedShape.Shape00Position;

                AudioManager.PlayCue("selectShape");
//                    return;
                break;
            }
        }