public bool Fire()
    {
        if (gameObject.activeSelf)
        {
            if (timer.Next(1 / fireRate))
            {
                float      shipSpeed   = ship.GetComponent <Rigidbody2D>().velocity.magnitude;
                GameObject shellObject = Instantiate(projectile, gameObject.transform.position, transform.rotation);
                shellObject.transform.Translate(fireLocation);

                Shell shell = shellObject.AddComponent <Shell>();
                shell.source        = ship;
                shell.speed         = shell.transform.up * (projectileSpeed + shipSpeed);
                shell.movementLogic = delegate(Shell s, Rigidbody2D rb) { ShellMovementLogic(s, rb); };

                //shell.transform.Translate(shell.transform.up * shipSpeed * Time.deltaTime);

                if (hitscan)
                {
                    if (shell.GetComponent <Collider2D>())
                    {
                        Destroy(shell.GetComponent <Collider2D>());
                    }
                    HitscanShot(shell);
                }
                else
                {
                    shell.collisionLogic = delegate(Shell s, GameObject collided, bool isShip, Collision2D collision) { ShellCollisionLogic(s, collided, isShip, collision); };
                }

                if (particleEffect)
                {
                    particleEffect.Emit(UnityEngine.Random.Range(10, 20));
                }

                if (fireSound)
                {
                    AudioManager.Play(fireSound, transform.position, UnityEngine.Random.Range(0.25f, 0.5f));
                }

                return(true);
            }
        }

        return(false);
    }