private IEnumerator AnimateReveal()
    {
        float time = 3f;

        CreateSphereCollider();
        GameObject randomPower = null;

        while (randomPower == null) {
            randomPower = GetRandomSpiritPower();
            yield return new WaitForSeconds(1f);
        }
        var rotation = RotateAt45Degrees ? Quaternion.Euler(45f, 0f, 45f) : Quaternion.identity;
        var spiritPowerGO = (GameObject)GameObject.Instantiate(randomPower, AttachedSpiritPowerPosition(), rotation);
        _attachedSpiritPower = spiritPowerGO.GetComponent<CollectableSpiritPower>();
        spiritPowerGO.transform.parent = gameObject.transform;

        //Move up
        TweenParms revealTween = new TweenParms().Prop(
            "position", transform.position + Vector3.up * buryDepth).Ease(
            EaseType.Linear).Delay(0f);
        HOTween.To(gameObject.transform, time, revealTween);

        //Scale power
        var targetScale = spiritPowerGO.transform.localScale;
        spiritPowerGO.transform.localScale = new Vector3(0f, 0f, 0f);

        TweenParms scaleTween = new TweenParms().Prop(
            "localScale", targetScale).Ease(
            EaseType.EaseInOutElastic).Delay(2.5f);
        HOTween.To(spiritPowerGO.transform, 1f, scaleTween);

        yield return new WaitForSeconds(time);
        _active = true;
    }
    private IEnumerator InitiatePowerTransfer(Hero collector)
    {
        gameObject.audio.Stop();
        gameObject.audio.clip = SpiritPowerSound;
        gameObject.audio.Play();

        _transferring = true;
        collector.ExchangingSpiritPower = true;
        float time = 0.5f;

        GameObject shrinePower = _attachedSpiritPower.gameObject;
        Vector3 shrineOrigin = AttachedSpiritPowerPosition();
        Vector3 collectorOrigin = collector.transform.position;
        Vector3 midPoint = (collectorOrigin + shrineOrigin) * 0.5f;
        Vector3 localScalePower = shrinePower.transform.localScale;

        TweenParms shrineParmsFirst = new TweenParms().Prop(
            "position", midPoint).Prop(
            "localScale", localScalePower * 0.7f).Ease(
            EaseType.EaseInExpo).Delay(0f);
        HOTween.To(shrinePower.transform, time * 0.5f, shrineParmsFirst);

        yield return new WaitForSeconds(time * 0.5f);

        //Set power as child of target
        shrinePower.transform.parent = collector.transform;

        TweenParms shrineParmsSecond = new TweenParms().Prop(
            "localPosition", new Vector3(0f, 0f, 0f)).Prop(
            "localScale", localScalePower * 0f).Ease(
            EaseType.EaseOutExpo).Delay(0f);
        HOTween.To(shrinePower.transform, time * 0.5f, shrineParmsSecond);

        yield return new WaitForSeconds(time);
        //Destroy recieved object
        Destroy(shrinePower);

        //Send old back
        collectorOrigin = collector.transform.position + Vector3.up;
        shrinePower = (GameObject) Instantiate(FindSpiritPowerGO(collector.currentSpiritPower), collectorOrigin, Quaternion.identity);
        shrinePower.transform.localScale = new Vector3(0f, 0f, 0f);

        var rotation = RotateAt45Degrees ? Quaternion.Euler(45f, 0f, 45f) : Quaternion.identity;

        TweenParms collectorParms = new TweenParms().Prop(
            "position", AttachedSpiritPowerPosition()).Prop(
            "localScale", new Vector3(0.8f, 0.8f, 0.8f)).Prop(
            "rotation", rotation).Ease(
            EaseType.EaseInOutExpo).Delay(0f);
        HOTween.To(shrinePower.transform, time, collectorParms);

        //Recieve new
        _attachedSpiritPower.Collected(collector);

        //Transfer complete
        _attachedSpiritPower = shrinePower.GetComponent<CollectableSpiritPower>();

        yield return new WaitForSeconds(time);
        collector.ExchangingSpiritPower = false;
        _transferring = false;
    }