// 플로어 키가 위에서 내려온다.
    protected void create_floor_key()
    {
        this.key_instance_name = key_item_name + "." + this.player.getAcountID();

        ItemManager.get().createItem(key_item_name, this.key_instance_name, PartyControl.get().getLocalPlayer().getAcountID());
        ItemManager.get().setPositionToItem(this.key_instance_name, WeaponSelectLevelSequence.getKeyStayPosition());

        ItemController item_key = ItemManager.get().findItem(this.key_instance_name);

        item_key.behavior.beginFall();
    }
    // 매 프레임 호출.
    public override void            execute()
    {
        // ---------------------------------------------------------------- //
        // 다음 상태로 전환할지 체크.

        switch (this.step.do_transition())
        {
        // 무아저씨 등장 데모.
        case STEP.DEMO0:
        {
            if (EventRoot.get().getCurrentEvent() == null)
            {
                this.step.set_next(STEP.SELECT_WEAPON);
            }
        }
        break;

        // 무기 아아템을 선택할 때까지.
        case STEP.SELECT_WEAPON:
        {
            // 무기 아이템을 선택했으면 다음으로 .
            if (this.player.getShotType() != SHOT_TYPE.EMPTY)
            {
                // 선택되지 않은 무기 아이템 삭제.
                List <ItemController> shot_items = ItemManager.get().findItems(x => x.name.StartsWith("shot"));

                foreach (var item in shot_items)
                {
                    ItemManager.get().deleteItem(item.name);
                }

                this.select_done_players[this.player.getGlobalIndex()] = true;

                // 무기 아이템의 스포트 라이트를 지우고 열쇠 위치에 스포트 라이트.
                this.spotlight_items[0].setPosition(WeaponSelectLevelSequence.getKeyStayPosition().Y(4.0f));
                this.spotlight_items[1].SetActive(false);

                this.step.set_next(STEP.PICKUP_KEY);
            }
        }
        break;

        // 열쇠를 주을 때까지.
        case STEP.PICKUP_KEY:
        {
            if (ItemManager.get().findItem(this.key_instance_name) == null)
            {
                this.spotlight_items[0].SetActive(false);
                this.step.set_next(STEP.ENTER_DOOR);
            }
        }
        break;

        // 문으로 들어갈 때까지.
        case STEP.ENTER_DOOR:
        {
            TransportEvent ev = EventRoot.get().getCurrentEvent <TransportEvent>();

            if (ev != null)
            {
                ev.setEndAtHoleIn(true);

                this.step.set_next(STEP.TRANSPORT);
            }
        }
        break;

        // 플로어 이동 이벤트.
        case STEP.TRANSPORT:
        {
            TransportEvent ev = EventRoot.get().getCurrentEvent <TransportEvent>();

            if (ev == null)
            {
                // 초기 장비의 동기화 대기 쿼리를 발행 .
                var query = new QuerySelectFinish(this.player.control.getAccountID());

                // 쿼리의 타임아웃을 연장.
                query.timeout = 20.0f;

                QueryManager.get().registerQuery(query);


                // 선택한 무기를 게임 서버에 알림.
                if (this.m_network != null)
                {
                    CharEquipment equip = new CharEquipment();

                    equip.globalId = GlobalParam.get().global_account_id;
                    equip.shotType = (int)this.player.getShotType();

                    Debug.Log("[CLIENT] Send equip AccountID:" + equip.globalId + " ShotType:" + equip.shotType);

                    EquipmentPacket packet     = new EquipmentPacket(equip);
                    int             serverNode = this.m_network.GetServerNode();
                    this.m_network.SendReliable <CharEquipment>(serverNode, packet);
                }
                else
                {
                    query.set_done(true);
                    query.set_success(true);
                }

                this.step.set_next(STEP.WAIT_FRIEND);
            }
        }
        break;

        // 다른 플레이어 기다림.
        case STEP.WAIT_FRIEND:
        {
            // 던전으로 이동하는 신호 기다림.
            if (this.select_scene_finish)
            {
                // 만약을 위해 선택 완료가 되지 않은 아이콘을 강제로 선택 완료로 표시.
                // 해버린다.
                foreach (var icon in this.selecting_icons)
                {
                    if (icon.step.get_current() == SelectingIcon.STEP.HAI)
                    {
                        continue;
                    }
                    icon.beginHai();
                }

                this.step.set_next_delay(STEP.FINISH, 2.0f);
            }
        }
        break;
        }

        // ---------------------------------------------------------------- //
        // 상태 전환 시 초기화

        while (this.step.get_next() != STEP.NONE)
        {
            switch (this.step.do_initialize())
            {
            // 무아저씨 등장 데모.
            case STEP.DEMO0:
            {
                EventRoot.get().startEvent <EventWeaponSelect>();
            }
            break;

            // 열쇠 줍기.
            case STEP.PICKUP_KEY:
            {
                // 플로어 열쇠가 외위에서 떨어진다.
                this.create_floor_key();
            }
            break;

            // 문에 들어갈 때까지.
            case STEP.ENTER_DOOR:
            {
                this.spotlight_key.SetActive(true);
            }
            break;

            // 플로어 이동 이벤트.
            case STEP.TRANSPORT:
            {
                this.kabusan.onBeginTransportEvent();
            }
            break;

            // 다른 플레이어 기다림.
            case STEP.WAIT_FRIEND:
            {
                // 다른 플레이어의 상황을 나타내는 아이콘을 표시.
                foreach (var icon in this.selecting_icons)
                {
                    icon.setVisible(true);
                }
            }
            break;

            case STEP.FINISH:
            {
                GameRoot.get().setNextScene("GameScene");
            }
            break;
            }
        }

        // ---------------------------------------------------------------- //
        // 각 상태에서의 실행 처리.

        switch (this.step.do_execution(Time.deltaTime))
        {
        // 다른 플레이어 기다림.
        case STEP.WAIT_FRIEND:
        {
            foreach (var icon in this.selecting_icons)
            {
                if (icon.step.get_current() == SelectingIcon.STEP.UUN)
                {
                    continue;
                }
                if (this.select_done_players[icon.player_index])
                {
                    icon.beginHai();
                }
            }
        }
        break;
        }

        // ---------------------------------------------------------------- //

        this.spotlight_player.setPosition(this.player.control.getPosition().Y(4.0f));
        this.spotlight_kabusan.setPosition(this.kabusan.control.getPosition().Y(8.0f));

        this.update_queries();
    }