//-----------------------------------------------------------------------------
 // Constructor
 //-----------------------------------------------------------------------------
 public PlayerMinecartState()
 {
     minecartSpeed	= 1.0f;
     minecart		= null;
     trackTile		= null;
     minecartAnimationPlayer = new AnimationPlayer();
 }
        //-----------------------------------------------------------------------------
        // Overridden methods
        //-----------------------------------------------------------------------------
        public override void OnBegin(PlayerState previousState)
        {
            tileLocation	= minecart.TrackTileLocation;
            trackTile		= null;
            direction		= -1;

            if (minecart.TrackTile == null) {
                ExitMinecart(Directions.Reverse(player.Direction));
                return;
            }

            // Remove the miencart from the track.
            minecart.TrackTile.SpawnsMinecart = false;

            // Determine start direction.
            foreach (int dir in minecart.TrackTile.GetDirections()) {
                bool isStop;
                if (MoveInDirection(dir, out isStop))
                    break;
            }

            // Error, no directions available to move in.
            if (direction < 0) {
                ExitMinecart(Directions.Reverse(player.Direction));
                return;
            }

            // No other player states should change these variables while in a minecart.
            player.AutoRoomTransition			= true;
            player.IsPassable					= true;
            player.Physics.CollideWithWorld		= false;
            player.Physics.CollideWithEntities	= false;

            // Play the animations.
            player.MoveAnimation = GameData.ANIM_PLAYER_MINECART_IDLE;
            if (player.CurrentState != player.CarryState)
                player.Graphics.PlayAnimation(GameData.ANIM_PLAYER_MINECART_IDLE);
            minecartAnimationPlayer.Play(GameData.ANIM_MINECART);

            // Setup position.
            moveDistance = 0.0f;
            UpdatePlayerPosition();

            // Destroy the minecart.
            minecart.Destroy();

            // Notify the current player state we have entered a minecart.
            if (player.CurrentState != null)
                player.CurrentState.OnEnterMinecart();
        }
Esempio n. 3
0
        //-----------------------------------------------------------------------------
        // Constructor
        //-----------------------------------------------------------------------------
        public Minecart(TileMinecartTrack minecartTrack)
        {
            this.minecartTrack = minecartTrack;

            // Physics.
            EnablePhysics(PhysicsFlags.Solid);
            Physics.CollisionBox		= new Rectangle2F(-1, 3, 18, 15);
            Physics.SoftCollisionBox	= new Rectangle2F(-1, 3, 18, 15);

            // Graphics.
            Graphics.DepthLayer	= DepthLayer.PlayerAndNPCs;
            Graphics.DrawOffset = new Point2I(0, 0);
            centerOffset		= new Point2I(8, 8);

            // General.
            actionAlignDistance	= 5;
        }
        // Attempt to move along the track in the given direction.
        private bool MoveInDirection(int moveDirection, out bool isStop)
        {
            Point2I nextLocation = tileLocation + Directions.ToPoint(moveDirection);

            // Find the next track tile and check for obstructions.
            int comeFromDirection = Directions.Reverse(moveDirection);
            TileMinecartTrack nextTrackTile;
            if (!FindTrackTile(nextLocation, comeFromDirection, out nextTrackTile, out isStop))
                return false;

            moveDistance	-= GameSettings.TILE_SIZE;
            direction		= moveDirection;
            trackTile		= nextTrackTile;
            tileLocation	= nextLocation;
            minecartAnimationPlayer.SubStripIndex = (Directions.IsHorizontal(direction) ? 0 : 1);

            // Open any minecart doors in the next tile.
            if (player.RoomControl.IsTileInBounds(nextLocation)) {
                for (int i = 0; i < player.RoomControl.Room.LayerCount; i++) {
                    TileMinecartDoor tileDoor = player.RoomControl.GetTile(tileLocation, i) as TileMinecartDoor;
                    if (tileDoor != null && tileDoor.Direction == comeFromDirection)
                        tileDoor.Open();
                }
            }

            return true;
        }
        // Check if it is okay to move to a location with a track tile that has the given direction.
        // Outputs the track tile that was found,
        // And outputs true to isStop if there was a stop-point at the given locatin.
        // Returns true if it is okay to move to the given tile.
        private bool FindTrackTile(Point2I location, int direction, out TileMinecartTrack track, out bool isStop)
        {
            isStop = false;
            track = null;

            if (!player.RoomControl.IsTileInBounds(location))
                return true;

            for (int i = player.RoomControl.Room.LayerCount - 1; i >= 0; i--) {
                Tile tile = player.RoomControl.GetTile(location, i);

                if (tile != null) {
                    TileMinecartTrack trackTile = tile as TileMinecartTrack;

                    if (trackTile != null && trackTile.GetDirections().Contains(direction)) {
                        track = trackTile;
                        return true;
                    }
                    if (tile is TileMinecartStop) {
                        isStop = true;
                        return false;
                    }
                    // Minecart doors are not obstructions, but other solid tiles are.
                    if (tile.IsSolid && !(tile is TileMinecartDoor)) {
                        return false;
                    }
                }
            }

            return false;
        }