/// <summary> /// Generates weapons for the player's use /// </summary> /// <param name="ship">Player ship</param> private void GeneratePlayerWeapons(RRShip ship) { SoundEffect WeaponFire = LoadSoundEffect("Shot"); SoundEffect WeaponFireLarge = LoadSoundEffect("LargeShot"); // Primary Weapon (Plasma Cannon): all-purpose //Upgrade levels. Same for each weapon for now double pwSizeMultiplier = ((pwArsenalUpgrades[0] >= 1) ? (2) : (1)); double pwFireBonusMultiplier = 1 + (2 * ((pwArsenalUpgrades[0] >= 3) ? (1) : (0))); double pwDamageBonusMultiplier = 1 + (1.5 * ((pwArsenalUpgrades[0] >= 2) ? (1) : (0))); primaryWeapon = new RRWeapon(5, 10, true, PLAYER_WEAPONPOWER, PLAYER_FIRERATE * pwFireBonusMultiplier, new RRProjectileGenerator(14 * pwSizeMultiplier, 14 * pwSizeMultiplier, 0.1, new Color(55, 255, 128, 128), 10 * pwDamageBonusMultiplier)); primaryWeapon.Position += new Vector(0, 30); primaryWeapon.projectileGenerator.projectileShape = Shape.Diamond; primaryWeapon.projectileGenerator.defaultCollisionIgnoreGroup = 3; primaryWeapon.projectileGenerator.defaultTag = "PP"; primaryWeapon.projectileGenerator.canRotate = false; primaryWeapon.projectileGenerator.shotSound = WeaponFire; primaryWeapon.Color = new Color(0, 0, 0, 0); primaryWeapon.Angle += Angle.FromDegrees(90); // Secondary Weapon (Laser Blaster): laser, pierces smaller enemies double swSizeMultiplier = ((pwArsenalUpgrades[1] >= 1) ? (2) : (1)); double swFireBonusMultiplier = 1 + (2 * ((pwArsenalUpgrades[1] >= 2) ? (1) : (0))); double swDamageBonusMultiplier = 1 + (2.2 * ((pwArsenalUpgrades[1] >= 3) ? (1) : (0))); secWeapon = new RRWeapon(5, 10, true, PLAYER_WEAPONPOWER / 2, PLAYER_FIRERATE * 10 * swFireBonusMultiplier, new RRProjectileGenerator(80 * swSizeMultiplier, 3 * swSizeMultiplier, 0.01, new Color(233, 111, 111, 128), 0.85 * swDamageBonusMultiplier)); secWeapon.Position += new Vector(0, 60); secWeapon.projectileGenerator.defaultCollisionIgnoreGroup = 3; secWeapon.projectileGenerator.ignoresCollisionResponse = true; secWeapon.projectileGenerator.defaultTag = "LP"; secWeapon.projectileGenerator.canRotate = false; secWeapon.projectileGenerator.shotSound = WeaponFire; secWeapon.Color = new Color(0, 0, 0, 0); secWeapon.Angle += Angle.FromDegrees(90); // Third Weapon (Minigun): inaccurate but powerful double triSizeMultiplier = ((pwArsenalUpgrades[2] >= 1) ? (2) : (1)); double triFireBonusMultiplier = 1 + (5.2 * ((pwArsenalUpgrades[2] >= 3) ? (1) : (0))); double triDamageBonusMultiplier = 1 + (4.2 * ((pwArsenalUpgrades[2] >= 2) ? (1) : (0))); triWeapon = new RRWeapon(5, 10, true, PLAYER_WEAPONPOWER, PLAYER_FIRERATE * 5 * triFireBonusMultiplier, new RRProjectileGenerator(9 * triSizeMultiplier, 9 * triSizeMultiplier, 0.1, new Color(222, 222, 11, 128), 2.25 * triDamageBonusMultiplier)); triWeapon.Position += new Vector(0, 35); triWeapon.projectileGenerator.defaultCollisionIgnoreGroup = 3; triWeapon.projectileGenerator.defaultTag = "PP"; triWeapon.projectileGenerator.canRotate = false; triWeapon.projectileGenerator.shotSound = WeaponFire; triWeapon.Color = new Color(0, 0, 0, 0); triWeapon.Angle += Angle.FromDegrees(90); triWeapon.setBaseAngle(triWeapon.Angle); triWeapon.randomizedAngleSlate = 14 + pwArsenalUpgrades[2].Value*10.9; // Bomb: special weapon, deals extreme damage and clears all enemy bullets from the screen for its duration. Access the explosion's parameters from BombExplosion, under the region Colliders. double bombSizeMultiplier = ((pwArsenalUpgrades[3] >= 1) ? (2) : (1)); double bombFireBonusMultiplier = 1 + (1 * ((pwArsenalUpgrades[3] >= 3) ? (1) : (0))); double bombDamageBonusMultiplier = 1 + (3 * ((pwArsenalUpgrades[3] >= 2) ? (1) : (0))); bomb = new RRWeapon(30, 30, true, PLAYER_WEAPONPOWER * 2, PLAYER_FIRERATE / 10 * bombFireBonusMultiplier, new RRProjectileGenerator(30 * bombSizeMultiplier, 30 * bombSizeMultiplier, 0.2, new Color(111, 111, 111, 128), 50 * bombDamageBonusMultiplier)); bomb.projectileGenerator.projectileShape = Shape.Circle; bomb.projectileGenerator.defaultCollisionIgnoreGroup = 3; bomb.projectileGenerator.defaultTag = "BOMB"; bomb.projectileGenerator.canRotate = false; bomb.projectileGenerator.shotSound = WeaponFireLarge; bomb.Color = new Color(0, 0, 0, 0); bomb.Angle += Angle.FromDegrees(90); bomb.countInWeaponArsenal = false; this.playerWeaponArsenal = new RRWeaponArsenal(primaryWeapon); //rP = primaryWeapon; this.playerWeaponArsenal.ProjectileCollision = playerCollisionHandler; this.playerWeaponArsenal.addNewWeapon(secWeapon); this.playerWeaponArsenal.addNewWeapon(triWeapon); this.playerWeaponArsenal.addNewWeapon(bomb); ship.Add(playerWeaponArsenal); CreateWeaponMeter(); }
/// <summary> /// Creates controls for the player depending on the chosen control method. /// </summary> /// <param name="player">The player to be moved</param> /// <param name="controllerType">The current control type</param> /// <param name="primaryWeapon">The player's weapon</param> private void CreateControls(PhysicsObject player, ControllerType controllerType, RRWeaponArsenal primaryWeapon) { ClearControls(); vibrateEnabled = (controllerType == ControllerType.Xbox); switch (controllerType) { case ControllerType.Keyboard: Keyboard.Listen(Key.Up, ButtonState.Down, MovePlayer, null, PLAYER_SPEED_Y, player); Keyboard.Listen(Key.Up, ButtonState.Released, MovePlayer, null, Vector.Zero, player); Keyboard.Listen(Key.Down, ButtonState.Down, MovePlayer, null, -PLAYER_SPEED_Y, player); Keyboard.Listen(Key.Down, ButtonState.Released, MovePlayer, null, Vector.Zero, player); Keyboard.Listen(Key.Left, ButtonState.Down, MovePlayer, null, -PLAYER_SPEED_X, player); Keyboard.Listen(Key.Left, ButtonState.Released, MovePlayer, null, Vector.Zero, player); Keyboard.Listen(Key.Right, ButtonState.Down, MovePlayer, null, PLAYER_SPEED_X, player); Keyboard.Listen(Key.Right, ButtonState.Released, MovePlayer, null, Vector.Zero, player); Keyboard.Listen(Key.P, ButtonState.Pressed, delegate { PauseMenu(player, controllerType, primaryWeapon); }, null); Keyboard.Listen(Key.Z, ButtonState.Down, FireWeapon, null, primaryWeapon); Keyboard.Listen(Key.X, ButtonState.Pressed, triggerBomb, null); Keyboard.Listen(Key.LeftShift, ButtonState.Pressed, shiftWeapons, null); break; case ControllerType.Xbox: ControllerOne.Listen(Button.DPadUp, ButtonState.Down, MovePlayer, null, PLAYER_SPEED_Y, player); ControllerOne.Listen(Button.DPadUp, ButtonState.Released, MovePlayer, null, Vector.Zero, player); ControllerOne.Listen(Button.DPadDown, ButtonState.Down, MovePlayer, null, -PLAYER_SPEED_Y, player); ControllerOne.Listen(Button.DPadDown, ButtonState.Released, MovePlayer, null, Vector.Zero, player); ControllerOne.Listen(Button.DPadLeft, ButtonState.Down, MovePlayer, null, -PLAYER_SPEED_X, player); ControllerOne.Listen(Button.DPadLeft, ButtonState.Released, MovePlayer, null, Vector.Zero, player); ControllerOne.Listen(Button.DPadRight, ButtonState.Down, MovePlayer, null, PLAYER_SPEED_X, player); ControllerOne.Listen(Button.DPadRight, ButtonState.Released, MovePlayer, null, Vector.Zero, player); ControllerOne.ListenAnalog(AnalogControl.LeftStick, 0.1, movePlayerAnalog, null, player); ControllerOne.Listen(Button.Start, ButtonState.Pressed, delegate { PauseMenu(player, controllerType, primaryWeapon); }, null); ControllerOne.Listen(Button.RightTrigger, ButtonState.Down, FireWeapon, null, primaryWeapon); ControllerOne.Listen(Button.Y, ButtonState.Pressed, shiftWeapons, null); break; default: break; } }
/// <summary> /// A pause menu that pops up if the pause button is pressed. /// </summary> /// <param name="controllerType">The type of controls being used.</param> /// <param name="player">The player.</param> /// <param name="primaryWeapon">The player's weapon.</param> public void PauseMenu(PhysicsObject player, ControllerType controllerType, RRWeaponArsenal primaryWeapon) { ClearControls(); showArsenalLabels(); MediaPlayer.Pause(); Pause(); ES.isPaused = true; switch (controllerType) { case ControllerType.Keyboard: Keyboard.Listen(Key.Escape, ButtonState.Pressed, delegate { Pause(); ResetGame(); }, null); Keyboard.Listen(Key.P, ButtonState.Pressed, delegate { Unpause(player, controllerType, primaryWeapon); }, null); Keyboard.Listen(Key.Q, ButtonState.Pressed, triggerUpdateKeys, null, 0); Keyboard.Listen(Key.W, ButtonState.Pressed, triggerUpdateKeys, null, 1); Keyboard.Listen(Key.E, ButtonState.Pressed, triggerUpdateKeys, null, 2); Keyboard.Listen(Key.R, ButtonState.Pressed, triggerUpdateKeys, null, 3); break; case ControllerType.Xbox: ControllerOne.Listen(Button.Back, ButtonState.Pressed, delegate { Pause(); ResetGame(); }, null); ControllerOne.Listen(Button.Start, ButtonState.Pressed, delegate { Unpause(player, controllerType, primaryWeapon); }, null); break; } }
/// <summary> /// Unpauses the game and resumes music. /// </summary> /// <param name="controllerType">The type of controls being used.</param> /// <param name="player">The player.</param> /// <param name="primaryWeapon">The player's weapon.</param> public void Unpause(PhysicsObject player, ControllerType controllerType, RRWeaponArsenal primaryWeapon) { ClearControls(); MediaPlayer.Resume(); Pause(); hideArsenalLabels(); CreateControls(player, controllerType, primaryWeapon); // Informs RREnemySpawner that the game is paused ES.isPaused = false; }
/// <summary> /// Fires the primary weapon of the player. /// </summary> /// <param name="weapon">The weapon to be fired</param> public void FireWeapon(RRWeaponArsenal weapon) { //TODO - Clean up FireWeapon, and the superflous "weapon" clause. PhysicsObject projectile = playerWeaponArsenal.Shoot(); }