//--------------------------------------------------------------------------------------------------------------------------------------------------- // // Copyright (C)2007 DarkWynter Studios. All rights reserved. // //--------------------------------------------------------------------------------------------------------------------------------------------------- // {Contact : darkwynter.com for licensing information //--------------------------------------------------------------------------------------------------------------------------------------------------- namespace DarkWynterEngine.Controllers { #region Using Statements using System; using System.Diagnostics; using System.Collections.Generic; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Storage; #endregion using Audio; using Globals; using ObjectLib; using Draw; /// /// Game Controller can have either a Mouse/Keyboard or XBox controller or both. /// It handles calling the controller interfaces of the system to ease portability between XBOX and PC /// and to provide an abstract movement and action interface usable by human players, bots, and network players. /// public class Controller { #if !XBOX360 private MouseState mouseState; private float MOUSE_ROTATION_SCALE = 0.005f; private float lastMouseX, lastMouseY; private int windowHeight, windowWidth; // Game window Height and Width for resetting the Mouse position private int lastMouseWheelPos = 0; // Position of mouse wheel on element list #endif private KeyboardState keyboardState; private GamePadState gamePadState; private float GAMEPAD_ROTATION_SCALE_Y = 0.03f; private float GAMEPAD_ROTATION_SCALE_X = 0.03f; private float MENU_ANALOG_THRESHOLD = 0.4f; /// /// Type of controller /// public Enums.ControllerType playerControllerType = Enums.ControllerType.NONE; /// /// Player index associated with this controller /// public PlayerIndex playerControllerIndex; // Controller Number private bool modeSwitchInputReleased = true; private bool attackSwitchInputReleased = true; private bool jumpKeyInputReleased = true; private bool fpsKeyInputReleased = true; private bool consoleKeyInputReleased = true; private bool movementTypeInputReleased = true; private bool menuUpInputReleased = true; private bool menuDownInputReleased = true; private bool menuLeftInputReleased = true; private bool menuRightInputReleased = true; private bool menuStartInputReleased = true; private bool menuBackInputReleased = true; private bool startInputReleased = true; private bool backInputReleased = true; private bool zoomInputReleased = true; private bool skipInputReleased = true; private bool blockStartBackInput = false; private Stopwatch dpadVerticalDelayTimer = new Stopwatch(); private Stopwatch dpadHorizontalDelayTimer = new Stopwatch(); /// /// This struct holds the controller updates for the player. It can be overriden as a test harness from public /// public struct GameInput { /// /// Returns the gravity for gpuObjects /// public float GetGPUGravityButton; /// /// Player rotation /// public Vector2 playerRotation; /// /// player motion /// public Vector2 playerMotion; /// /// Attack button /// public float attack; /// /// Attack amount (analog vs digital) /// public float attackAmount; /// /// Defend amount (analog vs digital) /// public float defendAmount; /// /// Amount of zoom /// public float zoomAmount; /// /// Terrain Mod enable/disable button /// public bool terrainModToggle; /// /// Walk or Hover mode button /// public bool movementTypeToggle; /// /// Jump... How high? /// public bool jump; /// /// Current attack type /// public Enums.AttackType modeSwitch; /// /// Current attack mode /// public Enums.AttackMode attackMode; /// /// Button for changing the gravity for gpuObjects /// public float gpuGravityButton; /// /// Bool check to see if this controller is being controlled by the player or by the system /// public bool manualOverride; // DEBUG public bool anyKey; /// /// Change in mass value /// public int massChangeDelta; /// /// Change in thermal value /// public int thermalChangeDelta; /// /// Toggle Frames Per Second Counter On/Off /// public bool fpsToggleButton; /// /// Toggles the Compiler console On/Off /// public bool compilerConsoleButton; /// /// Initialize our variables /// public void init() { playerRotation = Vector2.Zero; playerMotion = Vector2.Zero; attack = 0; attackAmount = 0; defendAmount = 0; terrainModToggle = false; movementTypeToggle = false; jump = false; modeSwitch = Enums.AttackType.NONE; manualOverride = false; massChangeDelta = 0; thermalChangeDelta = 0; manualOverride = false; } } /// /// Controller input object /// public GameInput gameInput = new GameInput(); /// /// Struct for handling input while in the menus /// public struct MenuInput { /// /// Left button pressed /// public bool GetMenuLeft; /// /// Right button pressed /// public bool GetMenuRight; /// /// Up button pressed /// public bool GetMenuUp; /// /// Down button pressed /// public bool GetMenuDown; /// /// Check to see if the start or back button input has been blocked /// public bool IsStartBackInputBlocked; /// /// Start button pressed /// public bool GetStartPressed; /// /// Back button pressed /// public bool GetBackPressed; /// /// Menu start button pressed /// public bool GetMenuStartPressed; /// /// Menu back button pressed /// public bool GetMenuBackPressed; /// /// Start button released /// public bool GetAllStartReleased; /// /// Back button released /// public bool GetAllBackReleased; /// /// Menu start or back button was released /// public bool GetMenuStartBackReleased; } /// /// Menu Inputs /// public MenuInput menuInput = new MenuInput(); /// /// Default Contructor /// public Controller(){} /// /// Constructor /// /// Controller type /// Index of player associated with this controller public Controller(Enums.ControllerType controllerType, PlayerIndex playerIndex) { #if !XBOX360 if (controllerType == Enums.ControllerType.PC_ONLY || controllerType == Enums.ControllerType.PC_AND_XBOX) { mouseState = new MouseState(); mouseState = Mouse.GetState(); lastMouseX = mouseState.X; lastMouseY = mouseState.Y; lastMouseWheelPos = 0; keyboardState = new KeyboardState(); playerControllerType = controllerType; } windowHeight = Statics.RenderSettings.clientHeight; windowWidth = Statics.RenderSettings.clientWidth; #endif if (controllerType == Enums.ControllerType.XBOX_ONLY || controllerType == Enums.ControllerType.PC_AND_XBOX) { gamePadState = new GamePadState(); playerControllerIndex = playerIndex; playerControllerType = controllerType; } gameInput.init(); modeSwitchInputReleased = true; attackSwitchInputReleased = true; movementTypeInputReleased = true; jumpKeyInputReleased = true; menuUpInputReleased = true; menuDownInputReleased = true; menuLeftInputReleased = true; menuRightInputReleased = true; menuStartInputReleased = true; menuBackInputReleased = true; startInputReleased = true; backInputReleased = true; //blockStartBackInput = false; dpadHorizontalDelayTimer = Stopwatch.StartNew(); dpadVerticalDelayTimer = Stopwatch.StartNew(); } private bool GetSkipButton() { if (skipInputReleased == true) { if (playerControllerType == Enums.ControllerType.PC_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (keyboardState.IsKeyDown(Keys.X)) { skipInputReleased = false; return true; } } if (playerControllerType == Enums.ControllerType.XBOX_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (gamePadState.Buttons.RightStick == ButtonState.Pressed) { skipInputReleased = false; return true; } } } else if (keyboardState.IsKeyUp(Keys.X) && gamePadState.Buttons.RightStick == ButtonState.Released) { skipInputReleased = true; } return false; } // Get key inputs for object rotation private Vector2 GetObjectRotation() { Vector2 mouseRotation = new Vector2(0.0f, 0.0f); Vector2 stickRotation = new Vector2(0.0f, 0.0f); #if !XBOX360 if (Statics.SystemSettings.WINDOW_IN_FOCUS) { if (playerControllerType == Enums.ControllerType.PC_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (Statics.SystemSettings.gameState != Enums.EngineState.GAME_PAUSE) { if (mouseState.X > 0 && mouseState.X < windowWidth - 1 && mouseState.Y > 0 && mouseState.Y < windowHeight - 1) { if (lastMouseX != mouseState.X || lastMouseY != mouseState.Y) { float diffX = mouseState.X - lastMouseX; float diffY = mouseState.Y - lastMouseY; int xSign = (int)(diffX / Math.Abs(diffX)); int ySign = (int)(diffY / Math.Abs(diffY)); mouseRotation = new Vector2(MOUSE_ROTATION_SCALE * diffX, -MOUSE_ROTATION_SCALE * diffY); } } Mouse.SetPosition(windowWidth / 2, windowHeight / 2); lastMouseX = windowWidth / 2; lastMouseY = windowHeight / 2; } else { lastMouseX = mouseState.X; lastMouseY = mouseState.Y; } } } if (playerControllerType == Enums.ControllerType.XBOX_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) #endif { int xSign = (int)(gamePadState.ThumbSticks.Right.X / Math.Abs(gamePadState.ThumbSticks.Right.X)); int ySign = (int)(gamePadState.ThumbSticks.Right.Y / Math.Abs(gamePadState.ThumbSticks.Right.Y)); stickRotation = new Vector2(GAMEPAD_ROTATION_SCALE_X * (gamePadState.ThumbSticks.Right.X * gamePadState.ThumbSticks.Right.X) * xSign, GAMEPAD_ROTATION_SCALE_Y * (gamePadState.ThumbSticks.Right.Y * gamePadState.ThumbSticks.Right.Y) * ySign); } // Window out of focus return mouseRotation + stickRotation; } // Get key inputs for object motion private Vector2 GetObjectMotion() { Vector2 motionVector = new Vector2(0.0f, 0.0f); if (playerControllerType == Enums.ControllerType.PC_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (keyboardState.IsKeyDown(Keys.A)) { motionVector.X = -10.0f; } else if (keyboardState.IsKeyDown(Keys.D)) { motionVector.X = 10.0f; } //Moving if (keyboardState.IsKeyDown(Keys.W)) { motionVector.Y = 10.0f; } else if (keyboardState.IsKeyDown(Keys.S)) { motionVector.Y = -10.0f; } if (playerControllerType == Enums.ControllerType.PC_ONLY) { return motionVector; } } if (playerControllerType == Enums.ControllerType.XBOX_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { int xSign = (int)(gamePadState.ThumbSticks.Left.X / Math.Abs(gamePadState.ThumbSticks.Left.X)); int ySign = (int)(gamePadState.ThumbSticks.Left.Y / Math.Abs(gamePadState.ThumbSticks.Left.Y)); motionVector += new Vector2((gamePadState.ThumbSticks.Left.X * gamePadState.ThumbSticks.Left.X) * xSign, (gamePadState.ThumbSticks.Left.Y * gamePadState.ThumbSticks.Left.Y) * ySign); if (playerControllerType == Enums.ControllerType.XBOX_ONLY) { return motionVector; } } return motionVector; } // Get key input for movement type (hover or walk) private bool GetMovementTypeToggle() { if (movementTypeInputReleased == true) { if (playerControllerType == Enums.ControllerType.PC_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (keyboardState.IsKeyDown(Keys.LeftShift)) { movementTypeInputReleased = false; return true; } } if (playerControllerType == Enums.ControllerType.XBOX_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (gamePadState.Buttons.LeftStick == ButtonState.Pressed) { movementTypeInputReleased = false; return true; } } } else if (gamePadState.Buttons.LeftStick == ButtonState.Released && keyboardState.IsKeyUp(Keys.LeftShift)) { movementTypeInputReleased = true; } return false; } // Get key inputs for Attack abilities private float GetAttackAmount() { if (playerControllerType == Enums.ControllerType.PC_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { #if !XBOX360 if (mouseState.LeftButton == ButtonState.Pressed) { return 0.5f; } #endif } if (playerControllerType == Enums.ControllerType.XBOX_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (gamePadState.Triggers.Right > 0.0f) { return gamePadState.Triggers.Right; } } return 0.0f; } // Get key inputs for Defense mode private float GetDefendAmount() { if (playerControllerType == Enums.ControllerType.PC_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { #if !XBOX360 if (mouseState.RightButton == ButtonState.Pressed) { return 0.5f; } #endif } if (playerControllerType == Enums.ControllerType.XBOX_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (gamePadState.Triggers.Left > 0.0f) { return gamePadState.Triggers.Left; } } return 0.0f; } // Get key inputs for Element Mode switching private Enums.AttackType GetElementModeSwitching(Enums.AttackType current) { Enums.AttackType elementSwitching = Enums.AttackType.NONE; int amount = 0; if (modeSwitchInputReleased == true && dpadHorizontalDelayTimer.ElapsedMilliseconds >= 100) { if (playerControllerType == Enums.ControllerType.PC_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { #if !XBOX360 // Use the mousewheel to switch if (Math.Abs(mouseState.ScrollWheelValue - lastMouseWheelPos) >= 200) { amount = (int)((mouseState.ScrollWheelValue - lastMouseWheelPos) / 100.0f); lastMouseWheelPos = mouseState.ScrollWheelValue; dpadHorizontalDelayTimer = Stopwatch.StartNew(); } #endif if (keyboardState.IsKeyDown(Keys.F1) || amount < 0) { if (current == Enums.AttackType.FIRE) { elementSwitching = Enums.AttackType.EARTH; } else if (current == Enums.AttackType.WATER) { elementSwitching = Enums.AttackType.FIRE; } else if (current == Enums.AttackType.EARTH) { elementSwitching = Enums.AttackType.TERRAIN; } else if (current == Enums.AttackType.WIND) { elementSwitching = Enums.AttackType.WATER; } else if (current == Enums.AttackType.TERRAIN) { elementSwitching = Enums.AttackType.WIND; } else { elementSwitching = Enums.AttackType.EARTH; } modeSwitchInputReleased = false; } else if (keyboardState.IsKeyDown(Keys.F2) || amount > 0) { if (current == Enums.AttackType.FIRE) { elementSwitching = Enums.AttackType.WATER; } else if (current == Enums.AttackType.WATER) { elementSwitching = Enums.AttackType.WIND; } else if (current == Enums.AttackType.EARTH) { elementSwitching = Enums.AttackType.FIRE; } else if (current == Enums.AttackType.WIND) { elementSwitching = Enums.AttackType.TERRAIN; } else if (current == Enums.AttackType.TERRAIN) { elementSwitching = Enums.AttackType.EARTH; } else { elementSwitching = Enums.AttackType.EARTH; } modeSwitchInputReleased = false; } } //if we haven't already pressed something in keyboard and gamepad is enabled if (modeSwitchInputReleased == true && (playerControllerType == Enums.ControllerType.XBOX_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX)) { //begin cutting here if (gamePadState.Buttons.A == ButtonState.Pressed || gamePadState.Buttons.X == ButtonState.Pressed) { if (current == Enums.AttackType.FIRE) { elementSwitching = Enums.AttackType.EARTH; } else if (current == Enums.AttackType.WATER) { elementSwitching = Enums.AttackType.FIRE; } else if (current == Enums.AttackType.EARTH) { elementSwitching = Enums.AttackType.TERRAIN; } else if (current == Enums.AttackType.WIND) { elementSwitching = Enums.AttackType.WATER; } else if (current == Enums.AttackType.TERRAIN) { elementSwitching = Enums.AttackType.WIND; } else { elementSwitching = Enums.AttackType.EARTH; } modeSwitchInputReleased = false; } else if (gamePadState.Buttons.B == ButtonState.Pressed || gamePadState.Buttons.Y == ButtonState.Pressed) { if (current == Enums.AttackType.FIRE) { elementSwitching = Enums.AttackType.WATER; } else if (current == Enums.AttackType.WATER) { elementSwitching = Enums.AttackType.WIND; } else if (current == Enums.AttackType.EARTH) { elementSwitching = Enums.AttackType.FIRE; } else if (current == Enums.AttackType.WIND) { elementSwitching = Enums.AttackType.TERRAIN; } else if (current == Enums.AttackType.TERRAIN) { elementSwitching = Enums.AttackType.EARTH; } else { elementSwitching = Enums.AttackType.EARTH; } modeSwitchInputReleased = false; } } } else { if (gamePadState.Buttons.A == ButtonState.Released && gamePadState.Buttons.B == ButtonState.Released && gamePadState.Buttons.X == ButtonState.Released && gamePadState.Buttons.Y == ButtonState.Released && keyboardState.IsKeyUp(Keys.F1) && keyboardState.IsKeyUp(Keys.F2) && keyboardState.IsKeyUp(Keys.F4) && keyboardState.IsKeyUp(Keys.F3)) { modeSwitchInputReleased = true; } } return elementSwitching; } private float GetZoomAmount() { if (playerControllerType == Enums.ControllerType.PC_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { #if !XBOX360 if (keyboardState.IsKeyDown(Keys.Z)) { return 0.1f; } if (keyboardState.IsKeyDown(Keys.X)) { return -0.1f; } #endif } if (playerControllerType == Enums.ControllerType.XBOX_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (gamePadState.Buttons.X == ButtonState.Pressed) { return 0.1f; } if (gamePadState.Buttons.Y == ButtonState.Pressed) { return -0.1f; } } return 0.0f; } // Size of attack object private int GetMassChangeDelta() { int amount = 0; if (dpadHorizontalDelayTimer.ElapsedMilliseconds >= 100) { if (playerControllerType == Enums.ControllerType.PC_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { // 3 or R: Up if (keyboardState.IsKeyDown(Keys.D3) || keyboardState.IsKeyDown(Keys.R) || keyboardState.IsKeyDown(Keys.Up)) { amount += 5; dpadHorizontalDelayTimer = Stopwatch.StartNew(); } // 4 or F: Down else if (keyboardState.IsKeyDown(Keys.D4) || keyboardState.IsKeyDown(Keys.F) || keyboardState.IsKeyDown(Keys.Down)) { amount -= 5; dpadHorizontalDelayTimer = Stopwatch.StartNew(); } } // If gamepad is enabled if (playerControllerType == Enums.ControllerType.XBOX_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { // Up if (gamePadState.DPad.Up == ButtonState.Pressed) { amount += 5; dpadHorizontalDelayTimer = Stopwatch.StartNew(); } // Down else if (gamePadState.DPad.Down == ButtonState.Pressed) { amount -= 5; dpadHorizontalDelayTimer = Stopwatch.StartNew(); } } } return amount; } // Temperature of attack object private int GetThermalChangeDelta() { int amount = 0; if (dpadVerticalDelayTimer.ElapsedMilliseconds >= 100) { if (playerControllerType == Enums.ControllerType.PC_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { // 1 or Q: Left if (keyboardState.IsKeyDown(Keys.D1) || keyboardState.IsKeyDown(Keys.Q) || keyboardState.IsKeyDown(Keys.Left)) { amount -= 5; dpadVerticalDelayTimer = Stopwatch.StartNew(); } // 2 or E: Right else if (keyboardState.IsKeyDown(Keys.D2) || keyboardState.IsKeyDown(Keys.E) || keyboardState.IsKeyDown(Keys.Right)) { amount += 5; dpadVerticalDelayTimer = Stopwatch.StartNew(); } } // If gamepad is enabled if (playerControllerType == Enums.ControllerType.XBOX_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { // Left if (gamePadState.DPad.Left == ButtonState.Pressed) { amount -= 5; dpadVerticalDelayTimer = Stopwatch.StartNew(); } // Right else if (gamePadState.DPad.Right == ButtonState.Pressed) { amount += 5; dpadVerticalDelayTimer = Stopwatch.StartNew(); } } } return amount; } // Get key inputs for jumping private bool GetJumpKey() { if (jumpKeyInputReleased == true) { if (playerControllerType == Enums.ControllerType.PC_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (keyboardState.IsKeyDown(Keys.Space)) { jumpKeyInputReleased = false; return true; } } if (playerControllerType == Enums.ControllerType.XBOX_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (gamePadState.Buttons.LeftShoulder == ButtonState.Pressed) { jumpKeyInputReleased = false; return true; } } } else if (keyboardState.IsKeyUp(Keys.Space) && gamePadState.Buttons.LeftShoulder == ButtonState.Released) { jumpKeyInputReleased = true; } return false; } private void SetJumpReleased(bool b) { jumpKeyInputReleased = b; } //Get GPU-Object Gravity Toggle private float GetGPUGravityButton() { if (playerControllerType == Enums.ControllerType.PC_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { Keys[] keys = keyboardState.GetPressedKeys(); if (keyboardState.IsKeyDown(Keys.J)) { return -0.1f; } else if (keyboardState.IsKeyDown(Keys.M)) { return 0.1f; } } // No Change return 0.0f; } private bool GetMenuLeft() { if (menuLeftInputReleased == true) { if (playerControllerType == Enums.ControllerType.PC_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (keyboardState.IsKeyDown(Keys.Left)) { menuLeftInputReleased = false; return true; } } if (playerControllerType == Enums.ControllerType.XBOX_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (gamePadState.DPad.Left == ButtonState.Pressed || gamePadState.ThumbSticks.Left.X < -MENU_ANALOG_THRESHOLD) { menuLeftInputReleased = false; return true; } } } else if (gamePadState.DPad.Left == ButtonState.Released && gamePadState.ThumbSticks.Left.X == 0 && keyboardState.IsKeyUp(Keys.Left)) { menuLeftInputReleased = true; } return false; } private bool GetMenuRight() { if (menuRightInputReleased == true) { if (playerControllerType == Enums.ControllerType.PC_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (keyboardState.IsKeyDown(Keys.Right)) { menuRightInputReleased = false; return true; } } if (playerControllerType == Enums.ControllerType.XBOX_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (gamePadState.DPad.Right == ButtonState.Pressed || gamePadState.ThumbSticks.Left.X > MENU_ANALOG_THRESHOLD) { menuRightInputReleased = false; return true; } } } else if (gamePadState.DPad.Right == ButtonState.Released && gamePadState.ThumbSticks.Left.X == 0 && keyboardState.IsKeyUp(Keys.Right)) { menuRightInputReleased = true; } return false; } private bool GetMenuUp() { if (menuUpInputReleased == true) { if (playerControllerType == Enums.ControllerType.PC_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (keyboardState.IsKeyDown(Keys.Up)) { menuUpInputReleased = false; return true; } } if (playerControllerType == Enums.ControllerType.XBOX_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (gamePadState.DPad.Up == ButtonState.Pressed || gamePadState.ThumbSticks.Left.Y > MENU_ANALOG_THRESHOLD) { menuUpInputReleased = false; return true; } } } else if (gamePadState.DPad.Up == ButtonState.Released && gamePadState.ThumbSticks.Left.Y == 0 && keyboardState.IsKeyUp(Keys.Up)) { menuUpInputReleased = true; } return false; } private bool GetMenuDown() { if (menuDownInputReleased == true) { if (playerControllerType == Enums.ControllerType.PC_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (keyboardState.IsKeyDown(Keys.Down)) { menuDownInputReleased = false; return true; } } if (playerControllerType == Enums.ControllerType.XBOX_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (gamePadState.DPad.Down == ButtonState.Pressed || gamePadState.ThumbSticks.Left.Y < -MENU_ANALOG_THRESHOLD) { menuDownInputReleased = false; return true; } } } else if (gamePadState.DPad.Down == ButtonState.Released && gamePadState.ThumbSticks.Left.Y == 0 && keyboardState.IsKeyUp(Keys.Down)) { menuDownInputReleased = true; } return false; } private bool GetStartPressed() { if (startInputReleased == true && blockStartBackInput == false) { if (playerControllerType == Enums.ControllerType.PC_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (keyboardState.IsKeyDown(Keys.Enter)) { startInputReleased = false; return true; } } if (playerControllerType == Enums.ControllerType.XBOX_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (gamePadState.Buttons.Start == ButtonState.Pressed) { startInputReleased = false; return true; } } } else if (keyboardState.IsKeyUp(Keys.Enter) && gamePadState.Buttons.Start == ButtonState.Released) { startInputReleased = true; } return false; } private bool GetBackPressed() { if (backInputReleased == true && blockStartBackInput == false) { if (playerControllerType == Enums.ControllerType.PC_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (keyboardState.IsKeyDown(Keys.Escape)) { backInputReleased = false; return true; } } if (playerControllerType == Enums.ControllerType.XBOX_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (gamePadState.Buttons.Back == ButtonState.Pressed) { backInputReleased = false; return true; } } } else if (keyboardState.IsKeyUp(Keys.Escape) && gamePadState.Buttons.Back == ButtonState.Released) { backInputReleased = true; } return false; } private bool GetMenuStartPressed() { if (menuStartInputReleased == true && blockStartBackInput == false) { if (playerControllerType == Enums.ControllerType.PC_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (keyboardState.IsKeyDown(Keys.Enter)) { menuStartInputReleased = false; return true; } } if (playerControllerType == Enums.ControllerType.XBOX_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (gamePadState.Buttons.Start == ButtonState.Pressed || gamePadState.Buttons.A == ButtonState.Pressed) { menuStartInputReleased = false; return true; } } } else if (keyboardState.IsKeyUp(Keys.Enter) && gamePadState.Buttons.Start == ButtonState.Released && gamePadState.Buttons.A == ButtonState.Released) { menuStartInputReleased = true; } return false; } private bool GetMenuBackPressed() { if (menuBackInputReleased == true && blockStartBackInput == false) { if (playerControllerType == Enums.ControllerType.PC_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (keyboardState.IsKeyDown(Keys.Escape)) { menuBackInputReleased =false; Statics.SystemSettings.gameState = Enums.EngineState.EXIT; return true; } } if (playerControllerType == Enums.ControllerType.XBOX_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (gamePadState.Buttons.Back == ButtonState.Pressed || gamePadState.Buttons.B == ButtonState.Pressed) { menuBackInputReleased = false; return true; } } } else if (keyboardState.IsKeyUp(Keys.Escape) && gamePadState.Buttons.Back == ButtonState.Released && gamePadState.Buttons.B == ButtonState.Released) { menuBackInputReleased = true; } return false; } private bool GetAllStartReleased() { if (keyboardState.IsKeyUp(Keys.Enter) && gamePadState.Buttons.Start == ButtonState.Released && gamePadState.Buttons.A == ButtonState.Released) { return true; } return false; } private bool GetAllBackReleased() { if (keyboardState.IsKeyUp(Keys.Escape) && gamePadState.Buttons.Back == ButtonState.Released && gamePadState.Buttons.B == ButtonState.Released) { return true; } return false; } private bool GetMenuStartBackReleased() { return (GetAllBackReleased() && GetAllStartReleased()); } private bool IsStartBackInputBlocked() { return blockStartBackInput; } /// /// Set the block start back button input /// /// Block or unblock public void SetBlockStartBackInput(bool block) { blockStartBackInput = block; } /// /// Screen Saver check to see if any button has been pressed /// private void AnyButtonPressed() { if ((modeSwitchInputReleased && attackSwitchInputReleased && jumpKeyInputReleased && zoomInputReleased && fpsKeyInputReleased && consoleKeyInputReleased && menuUpInputReleased && menuDownInputReleased && menuLeftInputReleased && menuRightInputReleased && startInputReleased && backInputReleased) == false) { Statics.SystemSettings.screenSaverTimer.Reset(); Statics.SystemSettings.screenSaverTimer.Start(); } } /// /// Get FPS toggle button /// /// True if it has been reset, else false private bool GetFPSToggleButton() { if (fpsKeyInputReleased == true) { if (playerControllerType == Enums.ControllerType.PC_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (keyboardState.IsKeyDown(Keys.F12)) { fpsKeyInputReleased = false; return true; } } if (playerControllerType == Enums.ControllerType.XBOX_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (gamePadState.Buttons.LeftStick == ButtonState.Pressed) { fpsKeyInputReleased = false; return true; } } } else if (keyboardState.IsKeyUp(Keys.F12) && gamePadState.Buttons.LeftStick == ButtonState.Released) { fpsKeyInputReleased = true; } return false; } /// /// Get Compiler Console toggle button /// /// True if it has been reset, else false private bool GetConsoleToggleButton() { if (consoleKeyInputReleased == true) { if (playerControllerType == Enums.ControllerType.PC_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { if (keyboardState.IsKeyDown(Keys.OemTilde)) { consoleKeyInputReleased = false; return true; } } } else if (keyboardState.IsKeyUp(Keys.OemTilde)) { consoleKeyInputReleased = true; Statics.SystemSettings.enableCompilerConsole = !Statics.SystemSettings.enableCompilerConsole; } return false; } /// /// Gets current key inputs from controllers /// /// Last attack mode which was selected public void Update(Enums.AttackType lastModeSelected) { #if !XBOX360 if (playerControllerType == Enums.ControllerType.PC_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { //We don't want to give mouse/keyboard controls when the window is not in focus if (Statics.SystemSettings.WINDOW_IN_FOCUS) { mouseState = Mouse.GetState(); keyboardState = Keyboard.GetState(); } } #endif if (playerControllerType == Enums.ControllerType.XBOX_ONLY || playerControllerType == Enums.ControllerType.PC_AND_XBOX) { gamePadState = GamePad.GetState(playerControllerIndex); } // If not overriding the controls, update GameInput if (!gameInput.manualOverride) { // Controller check gameInput.gpuGravityButton = GetGPUGravityButton(); gameInput.playerRotation = GetObjectRotation(); gameInput.playerMotion = GetObjectMotion(); gameInput.attackAmount = GetAttackAmount(); gameInput.defendAmount = GetDefendAmount(); gameInput.attack = gameInput.attackAmount - gameInput.defendAmount; gameInput.gpuGravityButton = GetGPUGravityButton(); gameInput.zoomAmount = GetZoomAmount(); gameInput.fpsToggleButton = GetFPSToggleButton(); gameInput.compilerConsoleButton = GetConsoleToggleButton(); // Reset screensaver if any buttons pressed AnyButtonPressed(); //Tweak and integrate these two // controllerInput.terrainModToggle = playerController.GetTerrainModToggle(); gameInput.modeSwitch = GetElementModeSwitching(lastModeSelected); if (gameInput.modeSwitch == Enums.AttackType.TERRAIN && lastModeSelected != Enums.AttackType.TERRAIN) { gameInput.terrainModToggle = true; } else if (gameInput.modeSwitch == Enums.AttackType.NONE) { gameInput.terrainModToggle = false; } else if (gameInput.modeSwitch != Enums.AttackType.TERRAIN && lastModeSelected == Enums.AttackType.TERRAIN) { gameInput.terrainModToggle = true; } else { gameInput.terrainModToggle = false; } gameInput.movementTypeToggle = GetMovementTypeToggle(); gameInput.jump = GetJumpKey(); gameInput.massChangeDelta = GetMassChangeDelta(); gameInput.thermalChangeDelta = GetThermalChangeDelta(); if (gameInput.massChangeDelta != 0 || gameInput.thermalChangeDelta != 0) { Audio.MenuDPad(); } } // Update menu controller menuInput.GetMenuLeft = GetMenuLeft(); menuInput.GetMenuRight = GetMenuRight(); menuInput.GetMenuUp = GetMenuUp(); menuInput.GetMenuDown = GetMenuDown(); menuInput.IsStartBackInputBlocked = IsStartBackInputBlocked(); menuInput.GetStartPressed = GetStartPressed(); menuInput.GetBackPressed = GetBackPressed(); menuInput.GetMenuStartPressed = GetMenuStartPressed(); menuInput.GetMenuBackPressed = GetMenuBackPressed(); menuInput.GetAllStartReleased = GetAllStartReleased(); menuInput.GetAllBackReleased = GetAllBackReleased(); menuInput.GetMenuStartBackReleased = GetMenuStartBackReleased(); } /// /// Checks to see if a new controller has been plugged in /// /// ObjectLibrary public static void CheckForControllers(ObjectLibrary objectLibrary) { int index = -1; Statics.SystemSettings.TOTAL_PLAYERS = 0; for (PlayerIndex i = PlayerIndex.One; i <= PlayerIndex.Four && index + 1 < Statics.GameSettings.numberOfHumansActive; i++) { index++; // Check if our gamepad is connected if (GamePad.GetState(i).IsConnected) { // This player has not been initialized so increment number of players and create the new player. Statics.SystemSettings.TOTAL_PLAYERS++; Renderer.ResetViewports(Statics.SystemSettings.TOTAL_PLAYERS); DarkWynterGame.playerController = new Controller(Enums.ControllerType.XBOX_ONLY, i); // Initialize the player as alive objectLibrary.humans[index].health = 100; objectLibrary.humans[index].manna = 100; } } #if !XBOX360 // This part is to setup the default keyboard player in case there are no controllers connected if (Statics.SystemSettings.TOTAL_PLAYERS == 0) { // We have one player the keyboard player Statics.SystemSettings.TOTAL_PLAYERS++; // Create the player, PlayerIndex.One is passed as a default value and not used Renderer.ResetViewports(Statics.SystemSettings.TOTAL_PLAYERS); // If we are player 1 then we also have pc controls DarkWynterGame.playerController = new Controller(Enums.ControllerType.PC_ONLY, PlayerIndex.One); // Initialize the player as alive objectLibrary.humans[0].health = 100; objectLibrary.humans[0].manna = 100; } // If Player 1 has a controller make sure they are given the keyboard too else if (Statics.SystemSettings.TOTAL_PLAYERS >= 1) { if (DarkWynterGame.playerController.playerControllerType == Enums.ControllerType.XBOX_ONLY) { DarkWynterGame.playerController = new Controller(Enums.ControllerType.PC_AND_XBOX, PlayerIndex.One); } else if (DarkWynterGame.playerController.playerControllerType == Enums.ControllerType.NONE) { // Create the player, PlayerIndex.One is passed as a default value and not used Renderer.ResetViewports(Statics.SystemSettings.TOTAL_PLAYERS); // If we are player 1 then we also have pc controls DarkWynterGame.playerController = new Controller(Enums.ControllerType.PC_ONLY, PlayerIndex.One); // Initialize the player as alive objectLibrary.humans[0].health = 100; objectLibrary.humans[0].manna = 100; } } #endif } /// /// Reset mouse after game returns from Pause /// public void ResetMouse() { //set the mouse cursor to the middle again and set last position #if !XBOX360 Mouse.SetPosition(windowWidth / 2, windowHeight / 2); lastMouseX = windowWidth / 2; lastMouseY = windowHeight / 2; #endif } /// /// Kills the rumble on all controllers /// /// ObjectLibrary public static void StopRumble(ObjectLibrary objectLibrary) { if (objectLibrary != null && objectLibrary.humans != null && objectLibrary.bots != null) { for (int i = 0; i < objectLibrary.humans.Count; i++) { if (objectLibrary.humans[i] != null) { objectLibrary.humans[i].StopRumble(); } } } } } }