Esempio n. 1
0
 //-----------------------------------------------------------------------------
 // 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;
 }
Esempio n. 2
0
        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);
                }
            }
        }
Esempio n. 3
0
        // 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;
            }
        }
Esempio n. 4
0
 //-----------------------------------------------------------------------------
 // Begin/end
 //-----------------------------------------------------------------------------
 public void Begin(Player player, PlayerState previousState)
 {
     this.player = player;
     this.isActive = true;
     OnBegin(previousState);
 }
Esempio n. 5
0
        // 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();
 }
Esempio n. 7
0
 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);
 }
Esempio n. 10
0
        //-----------------------------------------------------------------------------
        // 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);
 }
Esempio n. 12
0
 public virtual void OnCollidePlayer(Player player)
 {
 }
Esempio n. 13
0
 public override void OnCollidePlayer(Player player)
 {
     player.Hurt(GameSettings.PROJECTILE_ARROW_DAMAGE, Center);
     Destroy();
 }
Esempio n. 14
0
        //-----------------------------------------------------------------------------
        // 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();
            }
        }
Esempio n. 16
0
 // 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;
        }