public override void Act(GameObject player, GameObject npc)
    {
        FlagshipBoss flagship = npc.GetComponent <FlagshipBoss>();

        if (flagship)
        {
            // Update transform
            flagship.UpdatePosition();
            flagship.UpdateRotation(player);

            // Use weapons
            if (Time.time >= flagship.NextFireTime)
            {
                // Lasers
                flagship.FireAllLasers();

                // Bubble red
                flagship.weapons[0].fire();
                flagship.StartCoroutine(flagship.delayFire(flagship.weapons[0], 3.0f));
                flagship.StartCoroutine(flagship.delayFire(flagship.weapons[0], 6.0f));

                // Bolt
                flagship.StartCoroutine(flagship.delayAimFire(flagship.weapons[1], player, 2.0f));
                flagship.StartCoroutine(flagship.delayAimFire(flagship.weapons[2], player, 6.0f));
                flagship.StartCoroutine(flagship.delayAimFire(flagship.weapons[3], player, 7.0f));
                flagship.StartCoroutine(flagship.delayAimFire(flagship.weapons[2], player, 8.0f));
                flagship.StartCoroutine(flagship.delayAimFire(flagship.weapons[3], player, 9.0f));

                // Sphere
                flagship.StartCoroutine(flagship.delayAimFire(flagship.weapons[4], player, 4.0f));
                flagship.StartCoroutine(flagship.delayAimFire(flagship.weapons[7], player, 4.25f));
                flagship.StartCoroutine(flagship.delayAimFire(flagship.weapons[5], player, 4.5f));
                flagship.StartCoroutine(flagship.delayAimFire(flagship.weapons[6], player, 4.75f));
                flagship.StartCoroutine(flagship.delayAimFire(flagship.weapons[4], player, 8.0f));
                flagship.StartCoroutine(flagship.delayAimFire(flagship.weapons[7], player, 8.25f));

                // Set next fire time
                float cooldown = 10.0f;
                flagship.NextFireTime = Time.time + cooldown;
            }
        }
        else
        {
            Debug.LogWarning("This state can only handle Flagship.");
        }
    }
    public override void Reason(GameObject player, GameObject npc)
    {
        FlagshipBoss flagship = npc.GetComponent <FlagshipBoss>();

        if (flagship)
        {
            // Drop to low health
            float hpProportion = (float)flagship.health / flagship.maxHealth;
            if (hpProportion < 0.25f)
            {
                flagship.SetTransition(FSMSystem.Transition.LowHealth);
            }
        }
        else
        {
            Debug.LogWarning("This state can only handle Flagship.");
        }
    }