//----------------------------------------------------------------------------- // Constructor //----------------------------------------------------------------------------- public GameControl(GameManager gameManager) { this.gameManager = gameManager; this.roomStateStack = null; this.roomControl = null; this.world = null; this.player = null; this.hud = null; this.inventory = null; this.rewardManager = null; this.isAdvancedGame = false; this.updateRoom = true; this.animateRoom = true; this.menuWeapons = null; this.menuSecondaryItems = null; this.menuEssences = null; }
private void CheckLadderCollision(Player player, Tile tile) { Rectangle2F solidBox = tile.Bounds; Rectangle2F entityBoxPrev = player.Physics.PositionedCollisionBox; Rectangle2F entityBox = Rectangle2F.Translate(entityBoxPrev, player.Physics.Velocity); Rectangle2F pollLadderBox = player.Movement.ClimbCollisionBox; Rectangle2F pollLadderBoxPrev = pollLadderBox; pollLadderBox.Point += player.Position + player.Physics.Velocity; pollLadderBoxPrev.Point += player.Position; // Check if this tile is a top-most ladder. Tile checkAboveTile = player.RoomControl.TileManager.GetSurfaceTile(tile.Location - new Point2I(0, 1)); bool isTopLadder = (checkAboveTile == null || !checkAboveTile.IsLadder); // Check if stepping off of a solid object and onto the ladder. // Make sure the player is not on a flat surface aligned with the ladder top. if (!player.Movement.IsOnSideScrollLadder && pollLadderBox.Intersects(solidBox) && player.Physics.PreviousCollisionInfo[Directions.Down].IsColliding && player.Physics.PreviousCollisionInfo[Directions.Down].Tile != tile && !player.Physics.CollisionInfo[Directions.Down].IsColliding && player.Physics.VelocityY >= 0.0f && (!isTopLadder || entityBoxPrev.Bottom > solidBox.Top || player.Physics.PreviousCollisionInfo[Directions.Down].Tile == null || player.Physics.PreviousCollisionInfo[Directions.Down].Tile.Bounds.Top != solidBox.Top)) { player.Movement.IsOnSideScrollLadder = true; return; } // Make sure the player: // - This tile is a top-most ladder. // - The player isn't already climbing a ladder. // - The player is touching the ladder, // - The player was previously above the ladder, // - The player and isn't standing on something else with clipping. if (isTopLadder && !player.Movement.IsOnSideScrollLadder && entityBox.Intersects(solidBox) && entityBoxPrev.Bottom <= solidBox.Top && !player.Physics.ClipCollisionInfo[Directions.Down].IsColliding) { // If holding the [Down] button, then begin climbing the ladder instead. if (player.Movement.AllowMovementControl && Controls.Down.IsDown() && !Controls.Up.IsDown()) { player.Movement.IsOnSideScrollLadder = true; } else { // Collide with the top of the ladder. player.Physics.VelocityY = 0.0f; player.Y = solidBox.Top - player.Physics.CollisionBox.Bottom; player.Physics.MovementCollisions[Directions.Down] = true; if (!player.Physics.CollisionInfo[Directions.Down].IsColliding) player.Physics.CollisionInfo[Directions.Down].SetCollision(tile, Directions.Down); } } }
// Check for climbing off the top of the ladder. private void CheckClimbingOffLadderTop(Player player, Tile ladderTile) { Rectangle2F entityBoxPrev = player.Physics.PositionedCollisionBox; Rectangle2F entityBox = Rectangle2F.Translate(entityBoxPrev, player.Physics.Velocity); Rectangle2F solidBox = ladderTile.Bounds; Rectangle2F pollLadderBoxPrev = player.Movement.ClimbCollisionBox; pollLadderBoxPrev.Point += player.Position; if (pollLadderBoxPrev.Intersects(solidBox) && entityBoxPrev.Bottom > solidBox.Top && entityBox.Bottom <= solidBox.Top) { player.Physics.VelocityY = 0.0f; player.Y = solidBox.Top - player.Physics.CollisionBox.Bottom; player.Physics.MovementCollisions[Directions.Down] = true; if (!player.Physics.CollisionInfo[Directions.Down].IsColliding) player.Physics.CollisionInfo[Directions.Down].SetCollision(ladderTile, Directions.Down); player.Movement.IsOnSideScrollLadder = false; } }
//----------------------------------------------------------------------------- // Begin/end //----------------------------------------------------------------------------- public void Begin(Player player, PlayerState previousState) { this.player = player; this.isActive = true; OnBegin(previousState); }
// Start a new game. public void StartGame() { roomTicks = 0; // Setup the player beforehand so certain classes such as the HUD can reference it player = new Player(); inventory = new Inventory(this); menuWeapons = new MenuWeapons(gameManager); menuSecondaryItems = new MenuSecondaryItems(gameManager); menuEssences = new MenuEssences(gameManager); menuWeapons.PreviousMenu = menuEssences; menuWeapons.NextMenu = menuSecondaryItems; menuSecondaryItems.PreviousMenu = menuWeapons; menuSecondaryItems.NextMenu = menuEssences; menuEssences.PreviousMenu = menuSecondaryItems; menuEssences.NextMenu = menuWeapons; mapDungeon = new ScreenDungeonMap(gameManager); GameData.LoadInventory(inventory, true); inventory.ObtainAmmo("ammo_ember_seeds"); inventory.ObtainAmmo("ammo_scent_seeds"); inventory.ObtainAmmo("ammo_pegasus_seeds"); inventory.ObtainAmmo("ammo_gale_seeds"); inventory.ObtainAmmo("ammo_mystery_seeds"); hud = new HUD(this); hud.DynamicHealth = player.Health; rewardManager = new RewardManager(this); GameData.LoadRewards(rewardManager); dropManager = new DropManager(this); GameData.LoadDrops(dropManager, rewardManager); // Create the script runner. scriptRunner = new ScriptRunner(this); // Create the room control. roomControl = new RoomControl(); gameManager.PushGameState(roomControl); // Load the world. //WorldFile worldFile = new WorldFile(); //world = worldFile.Load("Content/Worlds/temp_world.zwd"); // Begin the room state. if (gameManager.LaunchParameters.Length > 0) { LoadWorld(gameManager.LaunchParameters[0]); if (gameManager.LaunchParameters.Length > 1 && gameManager.LaunchParameters[1] == "-test") { // Launch parameters can define player's start position. int startLevel = Int32.Parse(gameManager.LaunchParameters[2]); int startRoomX = Int32.Parse(gameManager.LaunchParameters[3]); int startRoomY = Int32.Parse(gameManager.LaunchParameters[4]); int startPlayerX = Int32.Parse(gameManager.LaunchParameters[5]); int startPlayerY = Int32.Parse(gameManager.LaunchParameters[6]); player.SetPositionByCenter(new Point2I(startPlayerX, startPlayerY) * GameSettings.TILE_SIZE + new Point2I(8, 8)); player.MarkRespawn(); roomControl.BeginRoom(world.Levels[startLevel].Rooms[startRoomX, startRoomY]); } else { player.SetPositionByCenter(world.StartTileLocation * GameSettings.TILE_SIZE + new Point2I(8, 8)); player.MarkRespawn(); roomControl.BeginRoom(world.StartRoom); } } else { //WorldFile worldFile = new WorldFile(); //world = worldFile.Load("temp_world.zwd"); LoadWorld(GameDebug.CreateTestWorld()); player.SetPositionByCenter(world.StartTileLocation * GameSettings.TILE_SIZE + new Point2I(8, 8)); player.MarkRespawn(); roomControl.BeginRoom(world.StartRoom); } roomStateStack = new RoomStateStack(new RoomStateNormal()); roomStateStack.Begin(this); if (!roomControl.Room.IsHiddenFromMap) lastRoomOnMap = roomControl.Room; AudioSystem.MasterVolume = 0.04f; // The way David likes it. }
public override void OnCollidePlayer(Player player) { player.Hurt(1, position); Destroy(); }
public virtual void OnHitPlayer(Player player) { }
private Vector2F velocityPrev; // The player's velocity on the previous frame. #endregion Fields #region Constructors //----------------------------------------------------------------------------- // Constructors //----------------------------------------------------------------------------- public PlayerMoveComponent(Player player) { this.player = player; // Default settings. autoAccelerate = false; moveSpeedScale = 1.0f; moveCondition = PlayerMoveCondition.FreeMovement; canLedgeJump = true; canJump = true; isStrafing = false; // Internal. allowMovementControl = true; moveAxes = new bool[] { false, false }; motion = Vector2F.Zero; isMoving = false; velocityPrev = Vector2F.Zero; moveAngle = Angles.South; mode = new PlayerMotionType(); // Controls. analogMode = false; analogStick = GamePad.GetStick(Buttons.LeftStick); analogAngle = 0.0f; moveButtons = new InputControl[4]; moveButtons[Directions.Up] = Controls.Up; moveButtons[Directions.Down] = Controls.Down; moveButtons[Directions.Left] = Controls.Left; moveButtons[Directions.Right] = Controls.Right; // Normal movement. moveModeNormal = new PlayerMotionType(); moveModeNormal.MoveSpeed = 1.0f; moveModeNormal.CanLedgeJump = true; moveModeNormal.CanRoomChange = true; // Slow movement. moveModeSlow = new PlayerMotionType(); moveModeSlow.MoveSpeed = 0.5f; moveModeSlow.CanLedgeJump = true; moveModeSlow.CanRoomChange = true; // Ice movement. moveModeIce = new PlayerMotionType(); moveModeIce.MoveSpeed = 1.0f; moveModeIce.CanLedgeJump = true; moveModeIce.CanRoomChange = true; moveModeIce.IsSlippery = true; moveModeIce.Acceleration = 0.02f; moveModeIce.Deceleration = 0.05f; moveModeIce.MinSpeed = 0.05f; moveModeIce.DirectionSnapCount = 32; // Air/jump movement. moveModeAir = new PlayerMotionType(); moveModeAir.IsStrafing = true; moveModeAir.MoveSpeed = 1.0f; moveModeAir.CanLedgeJump = false; moveModeAir.CanRoomChange = false; moveModeAir.IsSlippery = true; moveModeAir.Acceleration = 0.1f; moveModeAir.Deceleration = 0.0f; moveModeAir.MinSpeed = 0.05f; moveModeAir.DirectionSnapCount = 8;//32; // Water/swim movement. moveModeWater = new PlayerMotionType(); moveModeWater.MoveSpeed = 0.5f; moveModeWater.CanLedgeJump = true; moveModeWater.CanRoomChange = true; moveModeWater.IsSlippery = true; moveModeWater.Acceleration = 0.08f; moveModeWater.Deceleration = 0.05f; moveModeWater.MinSpeed = 0.05f; moveModeWater.DirectionSnapCount = 32; mode = moveModeNormal; }
private void OnPlayerJump(Player player) { // Remember the players location upon jumping. playerJumpStartTileLocation = RoomControl.GetTileLocation(player.Position); }
//----------------------------------------------------------------------------- // Methods //----------------------------------------------------------------------------- // Start a new game. public void StartGame() { roomTicks = 0; roomTicks = 0; // Setup the player beforehand so certain classes such as the HUD can reference it player = new Player(); inventory = new Inventory(this); menuWeapons = new MenuWeapons(gameManager); menuSecondaryItems = new MenuSecondaryItems(gameManager); menuEssences = new MenuEssences(gameManager); menuWeapons.PreviousMenu = menuEssences; menuWeapons.NextMenu = menuSecondaryItems; menuSecondaryItems.PreviousMenu = menuWeapons; menuSecondaryItems.NextMenu = menuEssences; menuEssences.PreviousMenu = menuSecondaryItems; menuEssences.NextMenu = menuWeapons; GameData.LoadInventory(inventory, true); inventory.ObtainAmmo("ammo_scent_seeds"); //inventory.ObtainAmmo("ammo_pegasus_seeds"); //inventory.ObtainAmmo("ammo_gale_seeds"); inventory.ObtainAmmo("ammo_mystery_seeds"); hud = new HUD(this); hud.DynamicHealth = player.Health; rewardManager = new RewardManager(this); GameData.LoadRewards(rewardManager); // Create the room control. roomControl = new RoomControl(); gameManager.PushGameState(roomControl); // Create the test world. // Load the world. //WorldFile worldFile = new WorldFile(); //world = worldFile.Load("Content/Worlds/temp_world.zwd"); // Begin the room state. if (gameManager.LaunchParameters.Length > 0) { WorldFile worldFile = new WorldFile(); world = worldFile.Load(gameManager.LaunchParameters[0]); if (gameManager.LaunchParameters.Length > 1 && gameManager.LaunchParameters[1] == "-test") { int startLevel = Int32.Parse(gameManager.LaunchParameters[2]); int startRoomX = Int32.Parse(gameManager.LaunchParameters[3]); int startRoomY = Int32.Parse(gameManager.LaunchParameters[4]); int startPlayerX = Int32.Parse(gameManager.LaunchParameters[5]); int startPlayerY = Int32.Parse(gameManager.LaunchParameters[6]); player.Position = new Point2I(startPlayerX, startPlayerY) * GameSettings.TILE_SIZE + new Point2I(8, 16); roomControl.BeginRoom(world.Levels[startLevel].Rooms[startRoomX, startRoomY]); } else { player.Position = world.StartTileLocation * GameSettings.TILE_SIZE + new Point2I(8, 16); roomControl.BeginRoom(world.StartRoom); } } else { world = GameDebug.CreateTestWorld(); player.Position = world.StartTileLocation * GameSettings.TILE_SIZE + new Point2I(8, 16); roomControl.BeginRoom(world.StartRoom); } roomStateStack = new RoomStateStack(new RoomStateNormal()); roomStateStack.Begin(this); AudioSystem.MasterVolume = 0.06f; }
public override void OnCollidePlayer(Player player) { player.Hurt(damage, Center); }
public virtual void OnCollidePlayer(Player player) { }
public override void OnCollidePlayer(Player player) { player.Hurt(GameSettings.PROJECTILE_ARROW_DAMAGE, Center); Destroy(); }
//----------------------------------------------------------------------------- // Side Scrolling Ladder Collisions //----------------------------------------------------------------------------- // Check the player's side-scrolling ladder collisions. private void CheckPlayerLadderClimbing(Player player) { if (!roomControl.IsSideScrolling) return; bool onLadderPrev = player.Movement.IsOnSideScrollLadder; // Check if the player is touching a ladder, and whether to begin climbing. player.Movement.HighestSideScrollLadderTile = GetHighestLadder(player, player.PreviousPosition); if (player.Movement.HighestSideScrollLadderTile == null) player.Movement.IsOnSideScrollLadder = false; else if (player.Physics.VelocityY >= 0.0f && player.Movement.AllowMovementControl && Controls.Up.IsDown()) player.Movement.IsOnSideScrollLadder = true; // Collide with ladders. Rectangle2F ladderCheckArea = Rectangle2F.Union( Rectangle2F.Translate(player.Physics.CollisionBox, player.Position), Rectangle2F.Translate(player.Physics.CollisionBox, player.Position + player.Physics.Velocity)); foreach (Tile tile in RoomControl.TileManager.GetTilesTouching(ladderCheckArea)) { if (tile.IsLadder) CheckLadderCollision(player, tile); } // Check for climbing off the top of a ladder. if (player.Movement.IsOnSideScrollLadder && player.Movement.HighestSideScrollLadderTile != null) CheckClimbingOffLadderTop(player, player.Movement.HighestSideScrollLadderTile); // Check for climbing to the bottom of a ladder. if (player.Physics.CollisionInfo[Directions.Down].IsCollidingAndNotAutoDodged && player.Movement.AllowMovementControl && Controls.Down.IsDown()) player.Movement.IsOnSideScrollLadder = false; // Check if the player is no longer on a ladder. if (player.Movement.IsOnSideScrollLadder) { player.Movement.HighestSideScrollLadderTile = GetHighestLadder(player, player.Position + player.Physics.Velocity); if (player.Movement.HighestSideScrollLadderTile == null) player.Movement.IsOnSideScrollLadder = false; } // If the player has begun climbing, set his Y-velocity to zero (no gravity). if (!onLadderPrev && player.Movement.IsOnSideScrollLadder) player.Physics.VelocityY = 0.0f; // If the player has stopped climbing, any downwards safe clipping should be // turned into an actual collision now that gravity is affecting the player again. if (onLadderPrev && !player.Movement.IsOnSideScrollLadder) { if (player.Physics.ClipCollisionInfo[Directions.Down].IsAllowedClipping && !player.Physics.CollisionInfo[Directions.Down].IsColliding) { player.Physics.MovementCollisions[Directions.Down] = true; player.Physics.CollisionInfo[Directions.Down].SetCollision( player.Physics.ClipCollisionInfo[Directions.Down].CollidedObject, Directions.Down); } } }
private void OnPlayerLand(Player player) { Point2I playerTileLocation = RoomControl.GetTileLocation(player.Position); // Toggle all tiles that were jumped over (except the one landed on). if (playerJumpStartTileLocation != playerTileLocation) { foreach (TileColorJumpPad tile in markedTiles) { if (tile.Location != playerJumpStartTileLocation) tile.CycleColor(); } markedTiles.Clear(); } }
// Return the top-most ladder the player is colliding with when placed at the given position. private Tile GetHighestLadder(Player player, Vector2F position) { Rectangle2F pollLadderBox = player.Movement.ClimbCollisionBox; pollLadderBox.Point += position; Tile highestLadder = null; foreach (Tile tile in RoomControl.TileManager.GetTilesTouching(pollLadderBox)) { if (tile.IsLadder && (highestLadder == null || tile.Bounds.Top < highestLadder.Bounds.Top)) highestLadder = tile; } return highestLadder; }
private Vector2F velocityPrev; // The player's velocity on the previous frame. #endregion Fields #region Constructors //----------------------------------------------------------------------------- // Constructors //----------------------------------------------------------------------------- public PlayerMoveComponent(Player player) { this.player = player; // Default settings. autoAccelerate = false; moveSpeedScale = 1.0f; moveCondition = PlayerMoveCondition.FreeMovement; canLedgeJump = true; canJump = true; canPush = true; canUseWarpPoint = true; isStrafing = false; isSprinting = false; sprintTimer = 0; sprintSpeedScale = 1.5f; // Internal. allowMovementControl = true; moveAxes = new bool[] { false, false }; motion = Vector2F.Zero; isMoving = false; velocityPrev = Vector2F.Zero; moveAngle = Angles.South; mode = new PlayerMotionType(); jumpStartTile = -Point2I.One; isCapeDeployed = false; doomedToFallInHole = false; holeTile = null; holeDoomTimer = 0; holeSlipVelocity = Vector2F.Zero; fallingInHole = false; isOnColorBarrier = false; isOnSideScrollLadder = false; climbCollisionBox = new Rectangle2F(-1, -7, 2, 9); // Controls. analogMode = false; analogStick = GamePad.GetStick(Buttons.LeftStick); analogAngle = 0.0f; moveButtons = new InputControl[4]; moveButtons[Directions.Up] = Controls.Up; moveButtons[Directions.Down] = Controls.Down; moveButtons[Directions.Left] = Controls.Left; moveButtons[Directions.Right] = Controls.Right; // Normal movement. moveModeNormal = new PlayerMotionType(); moveModeNormal.MoveSpeed = 1.0f; moveModeNormal.CanLedgeJump = true; moveModeNormal.CanRoomChange = true; // Slow movement. moveModeSlow = new PlayerMotionType(moveModeNormal); moveModeSlow.MoveSpeed = 0.5f; // Grass movement. moveModeGrass = new PlayerMotionType(moveModeNormal); moveModeGrass.MoveSpeed = 0.75f; // Ice movement. moveModeIce = new PlayerMotionType(); moveModeIce.MoveSpeed = 1.0f; moveModeIce.CanLedgeJump = true; moveModeIce.CanRoomChange = true; moveModeIce.IsSlippery = true; moveModeIce.Acceleration = 0.02f; moveModeIce.Deceleration = 0.05f; moveModeIce.MinSpeed = 0.05f; moveModeIce.DirectionSnapCount = 32; // Air/jump movement. moveModeAir = new PlayerMotionType(); moveModeAir.IsStrafing = true; moveModeAir.MoveSpeed = 1.0f; moveModeAir.CanLedgeJump = false; moveModeAir.CanRoomChange = false; moveModeAir.IsSlippery = true; moveModeAir.Acceleration = 0.1f; moveModeAir.Deceleration = 0.0f; moveModeAir.MinSpeed = 0.05f; moveModeAir.DirectionSnapCount = 8;//32; // Water/swim movement. moveModeWater = new PlayerMotionType(); moveModeWater.MoveSpeed = 0.5f; moveModeWater.CanLedgeJump = true; moveModeWater.CanRoomChange = true; moveModeWater.IsSlippery = true; moveModeWater.Acceleration = 0.08f; moveModeWater.Deceleration = 0.05f; moveModeWater.MinSpeed = 0.05f; moveModeWater.DirectionSnapCount = 32; mode = moveModeNormal; }