//-----------------------------------------------------------------------------
        // Overridden methods
        //-----------------------------------------------------------------------------
        // Called when the items button is pressed (A or B).
        public override void OnButtonPress()
        {
            if (!seedTracker.IsEmpty || !HasAmmo())
                return;

            UseAmmo();

            SeedType seedType = CurrentSeedType;

            int direction = Player.UseDirection;
            Player.Direction = direction;

            // Determine the seed spawn position based on player facing direction.
            Vector2F seedPos;
            if (direction == Directions.Up)
                seedPos = Directions.ToVector(direction) * 1;
            else if (direction == Directions.Down)
                seedPos = Directions.ToVector(direction) * 8;
            else
                seedPos = new Vector2F(0, 6) + (Directions.ToVector(direction) * 4);

            // Spawn the main seed projectile.
            SeedProjectile seed = new SeedProjectile(seedType, false);
            Player.ShootProjectile(seed,
                Directions.ToVector(direction) * GameSettings.SLINGSHOT_SEED_SPEED,
                seedPos, 5);
            seedTracker.TrackEntity(seed);

            // Spawn the extra 2 seeds for the Hyper Slingshot.
            if (level == Item.Level2) {
                for (int i = 0; i < 2; i++) {
                    int sideDirection = direction + (i == 0 ? 1 : 3);

                    // Calculate the velocity based on a degree offset.
                    float degrees = direction * GMath.QuarterAngle;
                    if (i == 0)
                        degrees += GameSettings.SLINGSHOT_SEED_DEGREE_OFFSET;
                    else
                        degrees -= GameSettings.SLINGSHOT_SEED_DEGREE_OFFSET;
                    Vector2F velocity = Vector2F.CreatePolar(GameSettings.SLINGSHOT_SEED_SPEED, degrees);
                    velocity.Y = -velocity.Y;

                    // Spawn the seed.
                    seed = new SeedProjectile(seedType, false);
                    Player.ShootProjectile(seed, velocity, seedPos, 5);
                    seedTracker.TrackEntity(seed);
                }
            }

            // Set the tool animation.
            Player.EquipTool(Player.ToolVisual);
            if (level == Item.Level1)
                Player.ToolVisual.PlayAnimation(GameData.ANIM_SLINGSHOT_1);
            else
                Player.ToolVisual.PlayAnimation(GameData.ANIM_SLINGSHOT_2);
            Player.ToolVisual.AnimationPlayer.SubStripIndex = direction;

            // Begin the player busy state.
            Player.BusyState.SetEndAction(delegate(PlayerState playerState) {
                playerState.Player.UnequipTool(playerState.Player.ToolVisual);
            });
            Player.BeginBusyState(10, GameData.ANIM_PLAYER_THROW, GameData.ANIM_PLAYER_MINECART_THROW);
        }
        //-----------------------------------------------------------------------------
        // Internal methods
        //-----------------------------------------------------------------------------
        private void Shoot()
        {
            if (!weapon.SeedTracker.IsMaxedOut && weapon.HasAmmo()) {
                Vector2F[] projectilePositions = new Vector2F[] {
                    new Vector2F(16, 7),
                    new Vector2F(15, -2),
                    new Vector2F(0, -12),
                    new Vector2F(-4, -6),
                    new Vector2F(-9, 7),
                    new Vector2F(-4, 12),
                    new Vector2F(7, 15),
                    new Vector2F(15, 11)
                };

                // Spawn the seed projectile.
                SeedProjectile seed = new SeedProjectile(weapon.CurrentSeedType, true);
                Vector2F spawnOffset = projectilePositions[angle] + new Vector2F(4, 11) - new Vector2F(8, 8);
                int spawnZPosition = 0;

                if (!player.RoomControl.IsSideScrolling) {
                    spawnZPosition = 5;
                }
                else {
                    spawnOffset.Y -= 5.0f;
                    spawnZPosition = 0;
                }

                Player.ShootFromAngle(seed, angle,
                    GameSettings.SEED_SHOOTER_SHOOT_SPEED,
                    spawnOffset, spawnZPosition);
                weapon.SeedTracker.TrackEntity(seed);
                weapon.UseAmmo();

                AudioSystem.PlaySound(GameData.SOUND_SEED_SHOOTER);

                // Begin shooting.
                isShooting = true;
                shootTimer = 0;
            }
            else {
                Player.BeginNormalState();
            }
        }