/**
   * Этот метод обновляет игровое поле в соответствии с пришедшим новым пулом <b>pool</b>
   *
   * @param pool новый пул пришедший от сервера
   */
  public void udateGrid(LetterPool pool) {
    // TODO:(danichbloomTOacbelter): сделать так чтобы размер fieldGrid совпадал с получаемым пулом.
    for (int i = 0; i < fieldGrid.getGrid().size(); i++) {
      LOGGER.info("Point i: " + i);
      Pair<Float, Float> point = fieldGrid.getGrid().get(i);
      if (i < pool.size()) {
        Letter newLetter = pool.get(i); // буква из нового пула
        LetterSprite localLetterSprite =
            point.getPointLetter(); // буква-спрайт из поля, которое на экране

        if (newLetter == null) { // Если в новом пуле на месте i нет буквы...
          LOGGER.debug("newLetter == null");
          if (localLetterSprite != null) { // Если на поле в этом месте есть буква-спрайт...
            LOGGER.debug("localLetterSprite != null");
            Letter localLetter = localLetterSprite.getLetter(); // извлекаем букву из спрайта
            if (localLetter
                != null) { // Если это оказывается не пустое место. (кстати сейчас иначе быть не
              // может, мы удаляем саму букву-спрайт)
              LOGGER.debug("deleteing localLetter: " + localLetter);
              gameScene.detachChild(
                  localLetterSprite); // удаляем букву с поля, потому что пришла буква null
              fieldGrid.deleteLetter(localLetterSprite);
              // TODO(danichbloomTOacbelter): Do I remove the letter correctly? Some times when fake
              // opponent picks a letter,
              // game fails with error java.lang.IndexOutOfBoundsException: Invalid index 34, size
              // is 34.
              // FATAL EXCEPTION: GLThread
            }
          }
        } else { // Если в новом пуле на месте i есть буква...
          LOGGER.debug("newLetter != null");
          if (localLetterSprite != null) { // Если на поле в этом месте есть буква-спрайт...
            LOGGER.debug("localLetterSprite != null");
            Letter localLetter = localLetterSprite.getLetter(); // извлекаем букву из спрайта
            if (localLetter
                != null) { // Если это оказывается не пустое место. (кстати сейчас иначе быть не
              // может, мы удаляем саму букву-спрайт)
              LOGGER.debug("localLetter != null");
              if (newLetter.getId()
                  != localLetter
                      .getId()) { // если новопришедная буква отличается от той что там должна
                // стоять
                // новая буква пришла на место старой, хотя старую никто не брал.
                LOGGER.warn("Substitution of a letter in the grid without picking it!");
              }
              continue;
            }
          } else { // Если на поле в этом месте нет буквы-спрайт...
            LOGGER.debug("putting new letter: " + newLetter);
            final LetterSprite newLetterSprite =
                new LetterSprite(
                    newLetter,
                    point.getKey() - SPRITE_SIZE * SCALE / 2,
                    point.getValue() - SPRITE_SIZE * SCALE / 2,
                    texBase);

            newLetterSprite.setScale(0);
            newLetterSprite.registerEntityModifier(
                new ScaleModifier(1.5f, 0, SCALE, EaseBounceOut.getInstance()));

            gameScene.attachChild(newLetterSprite, 0);
            gameScene.registerTouchArea(newLetterSprite);
            point.setPointLetter(newLetterSprite);
            continue;
          }
        }
      }
    }
  }
  @Override
  public Scene onLoadScene() {
    this.mEngine.registerUpdateHandler(new FPSLogger());

    client = new WBClient(host, port, this);

    if (client.ConnectToServer()) {
      client.sendRegitsteringRequestForPlayerName("acbelter");
    } else {
      AlertDialog.Builder builder = new AlertDialog.Builder(this);
      builder
          .setMessage("Can't connect to server")
          .setCancelable(false)
          .setPositiveButton(
              "Exit",
              new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                  WordsBattleActivity.this.finish();
                }
              })
          .setNegativeButton(
              "Close",
              new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                  dialog.cancel();
                }
              });
      AlertDialog alert = builder.create();
      alert.show();
    }

    // TODO(acbelter): Был глюк,что буквы сами появляются на сетке.
    // TODO(acbelter): После разблокировки экрана иногда не работает тачскрин и сцена
    // перезагружается.
    // TODO(acbelter): Причем не работают нажатия только на кнопки в сетке.
    // TODO(acbelter): Иногда неправильное отображение слов.
    // TODO(acbelter): Новые буквы не привязываются к сцене.
    fieldGrid = new CoordinateGrid(CAMERA_WIDTH, CAMERA_HEIGHT, SPRITE_SIZE, SCALE);

    SceneManager.init(this);
    MenuScene.load();
    // TODO(acbelter):Попросить пользователя ввести имя [userName].
    // затем вызвать client.sendRegitsteringRequestForPlayerName(userName);
    // Далее все дело проиходит в вызове реализации IWBClientDelegate в методе
    // UserNameSuccessfullyRegistered(), либо в любое время после.
    // тоесть, когда игрок зарегистрировался, дальше он уже может запрашивать игру. Можешь пока это
    // делать hard кодом, а можешь выдавать окошки,
    // которые будут спрашивать у пользователя имя оппонента.

    // gameScene.setBackground(new ColorBackground(10f/255f, 134f/255f, 7f/255f));
    gameScene = new Scene();
    gameScene.setBackground(new SpriteBackground(new Sprite(0, 0, texBase.getBackgroundTexture())));

    float fieldWidth = CAMERA_WIDTH - leftOffset - rightOffset;
    int wordMaxLength = (int) (fieldWidth / (SPRITE_SIZE * SCALE));

    // Позиции, от которых рисуются слова.
    float wordX = leftOffset + (fieldWidth - wordMaxLength * SPRITE_SIZE * SCALE) / 2;

    float opponentWordY = (upOffset - SPRITE_SIZE * SCALE) / 2;
    float playerWordY =
        CAMERA_HEIGHT - SPRITE_SIZE * SCALE - (downOffset - SPRITE_SIZE * SCALE) / 2;

    final WordSprite opponentWord =
        new WordSprite(wordMaxLength, wordX, opponentWordY, texBase.getPlaceTexture(), false);
    final WordSprite playerWord =
        new WordSprite(wordMaxLength, wordX, playerWordY, texBase.getPlaceTexture(), true);

    myWord = playerWord;

    for (Sprite spr : opponentWord.cells) {
      gameScene.attachChild(spr, 0);
      gameScene.registerTouchArea(spr);
    }

    for (Sprite spr : playerWord.cells) {
      gameScene.attachChild(spr, 0);
      gameScene.registerTouchArea(spr);
    }

    // TODO(acbelter): Разобраться с добавлением новых букв.
    Sprite menuButton =
        new Sprite(
            CAMERA_WIDTH - 2 * SPRITE_SIZE + (SPRITE_SIZE - SPRITE_SIZE * SCALE),
            -(SPRITE_SIZE - SPRITE_SIZE * SCALE) * 0.5f,
            texBase.getMenuButtonTexture()) {
          @Override
          public boolean onAreaTouched(
              final TouchEvent pSceneTouchEvent,
              final float pTouchAreaLocalX,
              final float pTouchAreaLocalY) {
            // TODO(acbelter): Реализовать этот метод.
            // Пока тут будет тест сервера.
            // FieldFiller.fill(gameScene, conn);
            SceneManager.setScene(MenuScene.run());
            return false;
          }
        };

    menuButton.setScale(0);
    menuButton.registerEntityModifier(new ScaleModifier(3, 0, SCALE, EaseBounceOut.getInstance()));

    // fillgrid

    gameScene.attachChild(menuButton);
    gameScene.registerTouchArea(menuButton);

    Sprite submitButton =
        new Sprite(
            CAMERA_WIDTH - 2 * SPRITE_SIZE + (SPRITE_SIZE - SPRITE_SIZE * SCALE),
            CAMERA_HEIGHT - SPRITE_SIZE * SCALE - (SPRITE_SIZE - SPRITE_SIZE * SCALE) * 0.5f,
            texBase.getSubmitButtonTexture()) {
          @Override
          public boolean onAreaTouched(
              final TouchEvent pSceneTouchEvent,
              final float pTouchAreaLocalX,
              final float pTouchAreaLocalY) {
            // String str = conn.checkWord(playerWord.getWord());
            String str = playerWord.getWord().toUpperCase();

            Toast toast = Toast.makeText(getApplicationContext(), str, Toast.LENGTH_SHORT);
            toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
            toast.show();

            return false;
          }
        };

    submitButton.setScale(0);
    submitButton.registerEntityModifier(
        new ScaleModifier(3, 0, SCALE, EaseBounceOut.getInstance()));

    gameScene.attachChild(submitButton);
    gameScene.registerTouchArea(submitButton);

    // TODO: При нажатии на меню нажимается game scene.
    gameScene.setTouchAreaBindingEnabled(false);
    // return gameScene;
    return MenuScene.run();
  }