/// <summary>
        /// Deals with Hardware input relivant to the playstate
        /// </summary>
        private void DealWithInput()
        {
            KeyboardState New_Key_State = Keyboard.GetState();
            // SAVE THE CURRENT LEVEL TO A NEW LEVEL
            if (New_Key_State.IsKeyDown(Key.Period) && !Old_Key_State.IsKeyDown(Key.Period) ||
                New_Key_State.IsKeyDown(Key.BracketLeft) && !Old_Key_State.IsKeyDown(Key.BracketLeft) ||
                New_Key_State.IsKeyDown(Key.BracketRight) && !Old_Key_State.IsKeyDown(Key.BracketRight) ||
                New_Key_State.IsKeyDown(Key.Slash) && !Old_Key_State.IsKeyDown(Key.Slash) ||
                New_Key_State.IsKeyDown(Key.Semicolon) && !Old_Key_State.IsKeyDown(Key.Semicolon))
                showUI = true;

            if (New_Key_State.IsKeyDown(Key.Period) && !Old_Key_State.IsKeyDown(Key.Period))
            {
                _write_level_file("TestLevelWrite", 99);
                Console.WriteLine("Level Written");
            }

            // Allow snapping for movement
            if (New_Key_State.IsKeyDown(Key.Slash) && !Old_Key_State.IsKeyDown(Key.Slash))
            {
                AllowSnapping = !AllowSnapping;
                if (AllowSnapping)
                {
                    UnitsToMove = 10.0f;
                }
                else
                {
                    UnitsToMove = 1.0f;
                }
                Console.WriteLine("Snapping is: {0}", AllowSnapping.ToString());
            }
            if (New_Key_State.IsKeyDown(Key.Semicolon) && !Old_Key_State.IsKeyDown(Key.Semicolon))
            {
                int totalKeys = ObjectList.Keys.Count;
                listKey += 1;
                objectIter = 0;
                if (listKey > totalKeys - 1)
                {
                    listKey = 0;
                }
                Console.WriteLine(" You are in {0}", listKey);
            }

            // If we are in 2D View, Allow user to zoom out and in with W and S
            if (!enable3d)
            {

                if (New_Key_State.IsKeyDown(Key.W))
                {
                    orthoWidth = Math.Max(192, orthoWidth - orthoWidth * 0.01);
                    orthoHeight = Math.Max(108, orthoHeight - orthoHeight * 0.01);
                    camera.Set2DCamera(orthoWidth, orthoHeight);
                }
                if (New_Key_State.IsKeyDown(Key.S))
                {
                    orthoWidth = Math.Min(1920, orthoWidth + orthoWidth * 0.01);
                    orthoHeight = Math.Min(1080, orthoHeight + orthoHeight * 0.01);
                    camera.Set2DCamera(orthoWidth, orthoHeight);
                }
            }
            // Testing the Level Design feature of re-loading LoadLevel after changing coords for a given game object
            if (eng.Keyboard[Key.F5])
            {
                LevelDesignerState lds = new LevelDesignerState(eng, menustate, current_level);
                if (!window.IsActive)
                {
                    window.Show();
                }
                eng.ChangeState(lds);

                //LoadLevel.Load(0, pst);
            }

            if (eng.Keyboard[Key.Escape] || eng.Keyboard[Key.Tilde])
            {
                //eng.PushState(menustate);
                eng.PushState(pms);
            }

            //********************** tab
            if (!camera.isInTransition && player.onGround)
            {
                if (eng.Keyboard[Key.Tab] && !tabDown)
                {
                    enable3d = !enable3d;
                    tabDown = true;
                    player.velocity.Z = 0;
                    camera.startTransition(enable3d);

                    //figure out if the player gets a grace jump
                    if (enable3d && player.onGround && !VectorUtil.overGround3dLoose(player, physList))
                    {
                        player.viewSwitchJumpTimer = 1.0;
                    }
                }
                else if (!eng.Keyboard[Key.Tab])
                {
                    tabDown = false;
                }
            }
            // Allow movement of the selected objects
            if (!enable3d)
            {
                if (New_Key_State.IsKeyDown(Key.Up) && !Old_Key_State.IsKeyDown(Key.Up))
                {
                    MoveObjects(SelectedObject, new Vector3(0.0f, UnitsToMove, 0.0f));
                }
                if (New_Key_State.IsKeyDown(Key.Down) && !Old_Key_State.IsKeyDown(Key.Down))
                {
                    MoveObjects(SelectedObject, new Vector3(0.0f, -UnitsToMove, 0.0f));
                }
                if (New_Key_State.IsKeyDown(Key.Left) && !Old_Key_State.IsKeyDown(Key.Left))
                {
                    MoveObjects(SelectedObject, new Vector3(-UnitsToMove, 0.0f, 0.0f));
                }
                if (New_Key_State.IsKeyDown(Key.Right) && !Old_Key_State.IsKeyDown(Key.Right))
                {
                    MoveObjects(SelectedObject, new Vector3(UnitsToMove, 0.0f, 0.0f));
                }
                // Moving between obstacles
                if (New_Key_State.IsKeyDown(Key.BracketLeft) && !Old_Key_State.IsKeyDown(Key.BracketLeft))
                {
                    if (objectIter - 1 < 0)
                        objectIter = ObjectList[listKey].Count - 1;
                    else objectIter--;

                    Console.WriteLine("Using {0}", ObjectList[listKey][objectIter]);
                }
                if (New_Key_State.IsKeyDown(Key.BracketRight) && !Old_Key_State.IsKeyDown(Key.BracketRight))
                {
                    if (objectIter + 1 > ObjectList[listKey].Count - 1)
                        objectIter = 0;
                    else objectIter++;


                    Console.WriteLine("Using {0}", ObjectList[listKey][objectIter]);
                }
            }
            #region 3D Move Controls
            else
            {
                if (New_Key_State.IsKeyDown(Key.Up) && !Old_Key_State.IsKeyDown(Key.Up) && !eng.Keyboard[Key.ControlLeft])
                {
                    MoveObjects(SelectedObject, new Vector3(UnitsToMove, 0.0f, 0.0f));
                }
                if (New_Key_State.IsKeyDown(Key.Down) && !Old_Key_State.IsKeyDown(Key.Down) && !eng.Keyboard[Key.ControlLeft])
                {
                    MoveObjects(SelectedObject, new Vector3(-UnitsToMove, 0.0f, 0.0f));
                }
                if (New_Key_State.IsKeyDown(Key.Left) && !Old_Key_State.IsKeyDown(Key.Left))
                {
                    MoveObjects(SelectedObject, new Vector3(0.0f, 0.0f, -UnitsToMove));
                }
                if (New_Key_State.IsKeyDown(Key.Right) && !Old_Key_State.IsKeyDown(Key.Right))
                {
                    MoveObjects(SelectedObject, new Vector3(0.0f, 0.0f, UnitsToMove));
                }
                if (New_Key_State.IsKeyDown(Key.Up) && !Old_Key_State.IsKeyDown(Key.Up) && eng.Keyboard[Key.ControlLeft])
                {
                    MoveObjects(SelectedObject, new Vector3(0.0f, UnitsToMove, 0.0f));
                }
                if (New_Key_State.IsKeyDown(Key.Down) && !Old_Key_State.IsKeyDown(Key.Down) && eng.Keyboard[Key.ControlLeft])
                {
                    MoveObjects(SelectedObject, new Vector3(0.0f, -UnitsToMove, 0.0f));
                }
            }
            #endregion


            Old_Key_State = New_Key_State;
        }
		/// <summary>
		/// Called by mouse or keyboard handlers when the user picked a button (by clicking or hitting enter)
		/// </summary>
		internal void handleButtonPress() {
			switch(_cur_butn) {
				case 0: //new game
					loadPlayState(0);
					break;
				case 1: //load saved game
					loadPlayState(saved_level_index);
					break;
				case 2: //quit
					eng.Exit();
					break;
				case 3: //level designer
					musicFile.Stop();
					LevelDesignerState ls = new LevelDesignerState(eng, this, 0);
					eng.ChangeState(ls);
					eng.GameInProgress = true;
					break;
			}
		}