private IEnumerator StateLogic()
        {
            while (GlobalState.ScreenTransition)
            {
                yield return(null);
            }

            GlobalState.Dialogue = DialogueManager.GetDialogue("arthur", "alone", 0);

            while (!GlobalState.LastDialogueFinished)
            {
                yield return(null);
            }

            while (!(_collided && offset.X < 0.5f))
            {
                _hurtTimer += GameTimes.DeltaTime;

                offset.X = shadow.offset.X = -3 * (float)Math.Sin((_hurtTimer / HurtTimerMax) * 6.28);

                yield return(null);
            }

            offset.X = shadow.offset.X = 0;
            Play("fall_1");

            SoundManager.PlaySoundEffect("fall_1");

            while (offset.Y > 0)
            {
                offset.Y -= GameTimes.DeltaTime * 30 * (1 + 3 * ((80 - offset.Y) / 80));

                shadow.UpdateShadow(offset.Y / 80);

                yield return(null);
            }

            _dustPillow.Play("poof");
            SoundManager.PlaySoundEffect("dustpoof");
            Play("stunned");

            GlobalState.PUZZLES_SOLVED++;

            GlobalState.screenShake.Shake(0.01f, 0.2f);
            shadow.visible = false;

            while (_waitTimer < WaitTimerMax)
            {
                _waitTimer += GameTimes.DeltaTime;

                yield return(null);
            }

            GlobalState.Dialogue = DialogueManager.GetDialogue("arthur", "alone", 1);

            while (!GlobalState.LastDialogueFinished)
            {
                yield return(null);
            }

            Play("walk_d");

            while (!MathUtilities.MoveTo(ref Position.Y, _initPos.Y + 32, 60))
            {
                yield return(null);
            }

            Play("walk_l");

            while (!_parabola.Tick())
            {
                yield return(null);
            }

            while (!MathUtilities.MoveTo(ref Position.X, _initPos.X - 40, 60))
            {
                yield return(null);
            }

            _preset.Alive = false;
            exists        = false;

            yield break;
        }