/// <summary>
    /// Places the ship.
    /// выбрать режим установки корабля на поле
    /// </summary>
    /// <param name="itype">Itype.</param>
    public void PlaceShip(int itype)
    {
        BattleshipsPlacing placing = uiPlacing.GetComponent <BattleshipsPlacing>();

        //если какой то корабль был выбран, убирается с поля
        if (mPlaceShip != null)
        {
            mSelectionLength = 0;
            mShips.Remove(mPlaceShip);
            Destroy(mPlaceShip);

            placing.RefreshButtonsTexts();
        }

        // заполняются параметры - какой корабль нужно поставить
        // и создается объект на поле
        Ship.Type type = (Ship.Type)itype;

        GameObject ship;

        switch (type)
        {
        case Ship.Type.Destroyer:
            ship = (GameObject)Instantiate(DestroyerPrefab, new Vector3(0, 0, 0), Quaternion.identity);
            break;

        case Ship.Type.Cruiser:
            ship = (GameObject)Instantiate(CruiserPrefab, new Vector3(0, 0, 0), Quaternion.identity);
            break;

        case Ship.Type.Battleship:
            ship = (GameObject)Instantiate(BattleshipPrefab, new Vector3(0, 0, 0), Quaternion.identity);
            break;

        case Ship.Type.AircraftCarrier:
            ship = (GameObject)Instantiate(AircraftCarrierPrefab, new Vector3(0, 0, 0), Quaternion.identity);
            break;

        default:
            return;
        }

        ship.AddComponent <Ship>();
        Ship subship = ship.GetComponent <Ship>();

        subship.Init(mFieldStart, new Vector2(mFieldWidth, mFieldHeight), type, true, -1, -1);
        mSelectionLength     = subship.GetShipLength();
        mSelectionHorizontal = true;
        mPlaceShip           = ship;

        mShips.Add(ship);

        placing.RefreshButtonsTexts();
        RefreshRedPlanes();
        RefreshBusyCells();
    }
    /// <summary>
    /// Places the ship.
    /// поставить кораблья на определенной клетке, в определенном положении
    /// </summary>
    /// <param name="itype">Itype.</param>
    /// <param name="horizontal">If set to <c>true</c> horizontal.</param>
    /// <param name="x">The x coordinate.</param>
    /// <param name="y">The y coordinate.</param>
    /// <param name="visible">If set to <c>true</c> visible.</param>
    public void PlaceShip(int itype, bool horizontal, int x, int y, bool visible)
    {
        BattleshipsPlacing placing = uiPlacing.GetComponent <BattleshipsPlacing>();

        Ship.Type type = (Ship.Type)itype;

        GameObject ship;

        switch (type)
        {
        case Ship.Type.Destroyer:
            ship = (GameObject)Instantiate(DestroyerPrefab, new Vector3(0, 0, 0), Quaternion.identity);
            break;

        case Ship.Type.Cruiser:
            ship = (GameObject)Instantiate(CruiserPrefab, new Vector3(0, 0, 0), Quaternion.identity);
            break;

        case Ship.Type.Battleship:
            ship = (GameObject)Instantiate(BattleshipPrefab, new Vector3(0, 0, 0), Quaternion.identity);
            break;

        case Ship.Type.AircraftCarrier:
            ship = (GameObject)Instantiate(AircraftCarrierPrefab, new Vector3(0, 0, 0), Quaternion.identity);
            break;

        default:
            return;
        }

        ship.AddComponent <Ship>();
        Ship subship = ship.GetComponent <Ship>();

        subship.Init(mFieldStart, new Vector2(mFieldWidth, mFieldHeight), type, horizontal, x, y);
        ship.SetActive(visible);

        mShips.Add(ship);
        RefreshBusyCells();
    }
    /// <summary>
    /// Update this instance.
    /// Update is called once per fram
    /// плавное перемещение камеры в точку где должна находится камера
    /// если игра только началась, тогда если текущий игрок - сервер
    /// идет проверка, подключился ли игрок, если еще нет, тогда
    /// отображается надпись "Ожидание игрока"
    /// показываем окно для расстановки кораблей
    /// если все корабли расставленны, тогда появляется кнопка - "Начать игру"
    /// </summary>
    // Update is called once per frame
    void Update()
    {
        // плавное перемещение камеры в точку где должна находится камера
        Quaternion target = Quaternion.Euler(
            mRotations[(int)mCurrentPosition]);

        if (transform.rotation != target)
        {
            transform.rotation =
                Quaternion.Slerp(
                    transform.rotation,
                    target,
                    Time.deltaTime * mSmooth);
        }

        if (transform.position !=
            mPositions[(int)mCurrentPosition])
        {
            transform.position =
                Vector3.Lerp(
                    transform.position,
                    mPositions[(int)mCurrentPosition],
                    Time.deltaTime * mSmooth);
        }

        if (!isPlayersReady && !mAllShipsPlaced)
        {
            // если игра только началась, тогда если текущий игрок - сервер
            // идет проверка, подключился ли игрок, если еще нет, тогда
            // отображается надпись "Ожидание игрока"
            CanvasWaitingForPlayer.SetActive(true);
        }
        else
        {
            CanvasWaitingForPlayer.SetActive(false);

            // показываем окно для расстановки кораблей
            if (!mStartedCanvasLoaded && Time.time - mStartTime > 1.0f)
            {
                CanvasPlaceBattleships.SetActive(true);
                mStartedCanvasLoaded = true;
            }

            if (mCanvasPlacingLoaded)
            {
                GameOrder gameOrder = GameOrder.GetComponent <GameOrder>();

                if (!gameOrder.isGameBegun)
                {
                    FieldOperations field_operations = PlayerField.GetComponent <FieldOperations>();
                    if (field_operations.isAllShipsArePlaced)
                    {
                        //если все корабли расставленны, тогда появляется кнопка - "Начать игру"
                        if (mAllShipsPlaced)
                        {
                            if (Time.time - mAllShipsPlacedTime > 1.0f)
                            {
                                CanvasBeginGame.SetActive(true);
                                CanvasPlacing.SetActive(false);
                            }
                        }
                        else
                        {
                            mAllShipsPlacedTime = Time.time;
                            mAllShipsPlaced     = true;
                        }
                    }
                    else
                    {
                        CanvasBeginGame.SetActive(false);
                        CanvasPlacing.SetActive(true);
                        BattleshipsPlacing placing = CanvasPlacing.GetComponent <BattleshipsPlacing>();
                        placing.RefreshButtonsTexts();
                        field_operations.RefreshRedPlanes();
                        mAllShipsPlaced = false;
                    }
                }
                else
                {
                    CanvasBeginGame.SetActive(false);
                    CanvasPlacing.SetActive(false);
                    CanvasPlaceBattleships.SetActive(false);
                }
            }
        }
    }
    /// <summary>
    /// Update this instance.
    /// Update is called once per frame
    /// если стоит режим выбора ячеек
    /// при нажатии средней кнопки мыши - поворот корабля
    /// просчет попадания в клетку
    /// если расстановка кораблей - проверка, можно ли поставить корабль
    /// перемещение корабля
    /// при нажатии первой кнопки мыши - корабль помещается на поле
    /// скрывается корабль
    /// если идет бой, проверка, можно ли выбрать данную клетку для удара
    /// при нажатии первой кнопки мыши - производится удар
    /// если не выбран кораблья чтоб поставить на поле и нажата вторая кнопка мыши проверяется выбран ли какой то корабль на поле если корабль выбран, то он удаляется
    /// </summary>
    // Update is called once per frame
    void Update()
    {
        foreach (var obj in mLastSelected)
        {
            obj.GetComponent <MeshRenderer>().enabled = false;
        }

        ValidateFireList();

        //если стоит режим выбора ячеек
        if (mSelectionLength > 0)
        {
            Ray        ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            int        cell_x = -1;
            int        cell_y = -1;

            // при нажатии средней кнопки мыши - поворот корабля
            if (Input.GetMouseButtonDown(2))
            {
                mSelectionHorizontal = !mSelectionHorizontal;
            }

            // просчет попадания в клетку
            if (Physics.Raycast(ray, out hit))
            {
                int num = 0;
                foreach (var obj in mPlaneObjects)
                {
                    if (obj == hit.collider.gameObject)
                    {
                        cell_x = num % FieldsHorCount;
                        cell_y = num / FieldsVerCount;

                        if (mSelectionLength % 2 == 0)
                        {
                            if (mSelectionHorizontal && hit.textureCoord.x < 0.5)
                            {
                                cell_x--;
                            }
                            else if (!mSelectionHorizontal && hit.textureCoord.y < 0.5)
                            {
                                cell_y--;
                            }
                        }

                        if (mSelectionLength > 2)
                        {
                            if (mSelectionHorizontal)
                            {
                                cell_x--;
                            }
                            else
                            {
                                cell_y--;
                            }
                        }
                    }

                    num++;
                }

                if (mGame.State == GameOrder.GameState.Placing)
                {
                    //если расстановка кораблей - проверка, можно ли поставить корабль
                    Ship ship = mPlaceShip.GetComponent <Ship>();
                    if (VerifyCell(cell_x, cell_y))
                    {
                        //перемещение корабля
                        ship.Move(mSelectionHorizontal, cell_x, cell_y);

                        //при нажатии первой кнопки мыши - корабль помещается на поле
                        if (Input.GetMouseButtonDown(0))
                        {
                            mSelectionLength = 0;
                            mPlaceShip       = null;
                        }
                    }
                    else
                    {
                        //скрывается корабль
                        ship.Move(mSelectionHorizontal, -1, -1);
                    }
                }
                else if (mGame.State == GameOrder.GameState.PlayerTurn ||
                         mGame.State == GameOrder.GameState.EnemyTurn)
                {
                    //если идет бой, проверка, можно ли выбрать данную клетку для удара
                    if (cell_x >= 0 && cell_x < FieldsHorCount &&
                        cell_y >= 0 && cell_y < FieldsVerCount)
                    {
                        if (!mAttackedCells[cell_x, cell_y])
                        {
                            //клетка помечается как выбранная
                            GameObject plane = mPlaneObjects[cell_x + cell_y * FieldsHorCount];
                            plane.GetComponent <MeshRenderer>().enabled = true;
                            mLastSelected.Add(plane);

                            //при нажатии первой кнопки мыши - производится удар
                            if (Input.GetMouseButtonDown(0))
                            {
                                if (mAimSelectHandler != null)
                                {
                                    mAimSelectHandler(cell_x, cell_y);
                                }
                                mSelectionLength = 0;
                                mPlaceShip       = null;
                            }
                        }
                    }
                }
            }
            else
            {
                //если мышь не находится над клеткой - тогда кораблья скрывается
                if (mGame.State == GameOrder.GameState.Placing)
                {
                    Ship ship = mPlaceShip.GetComponent <Ship>();
                    ship.Move(mSelectionHorizontal, -1, -1);
                }
            }

            //если выбран корабль для помещения на поле, то нажатие второй кнопки мыши
            //убирает корабль
            if (mGame.State == GameOrder.GameState.Placing)
            {
                if (Input.GetMouseButtonDown(1))
                {
                    mSelectionLength = 0;
                    mShips.Remove(mPlaceShip);
                    Destroy(mPlaceShip);

                    BattleshipsPlacing placing = uiPlacing.GetComponent <BattleshipsPlacing>();
                    placing.RefreshButtonsTexts();
                }
            }

            RefreshRedPlanes();
            RefreshBusyCells();
        }
        else if (Input.GetMouseButtonDown(1))
        {
            // если не выбран кораблья чтоб поставить на поле и нажата вторая кнопка мыши
            // проверяется выбран ли какой то корабль на поле
            // если корабль выбран, то он удаляется
            if (mGame.State == GameOrder.GameState.Placing)
            {
                Ray        ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                RaycastHit hit;

                if (Physics.Raycast(ray, out hit))
                {
                    int num = 0;
                    foreach (var obj in mPlaneObjects)
                    {
                        if (obj == hit.collider.gameObject)
                        {
                            int cell_x = num % FieldsHorCount;
                            int cell_y = num / FieldsVerCount;

                            foreach (var ship in mShips)
                            {
                                Ship subship = ship.GetComponent <Ship>();
                                if (subship.HasCell(cell_x, cell_y))
                                {
                                    mShips.Remove(ship);
                                    Destroy(ship);
                                    break;
                                }
                            }

                            BattleshipsPlacing placing = uiPlacing.GetComponent <BattleshipsPlacing>();

                            if (uiPlacing.activeSelf)
                            {
                                placing.RefreshButtonsTexts();
                                RefreshRedPlanes();
                                RefreshBusyCells();
                            }

                            break;
                        }

                        num++;
                    }
                }
            }
        }
    }