//----------------------------------------------------------------------------- // 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(); }
//----------------------------------------------------------------------------- // 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; }