void __thiscall A0_DrawTextToPcx16_sub_4B51F0(_Fnt_ *this, const char *text, _Pcx16_ *Pcx16, int x, int y, int width, int height, int color, int align, signed int a10)
{
  const char *text_i; // edx@1
  _Fnt_ *this_v11; // ebx@1
  int string_symbol_off_v12; // esi@1
  unsigned int Str_len_v13; // kr00_4@2
  int color_v14; // eax@4
  int text_height_v15; // ecx@9
  int height_v16; // edi@9
  int align_v18; // eax@16
  int v18; // eax@16
  int symbols_width_v19; // ecx@25
  const char Curr_symbol_v20; // al@26
  unsigned __int8 symbol_v21; // al@29
  int i; // edi@39
  const char curr_symbol_v23; // al@40
  int char_right_v24; // eax@45
  const char last_string_symbol_v25; // dl@48
  const char curr_symbol_v26; // al@52
  const char *text_v27; // edx@52
  const char curr_symbol_v28; // al@59
  int X_Add_v29; // eax@65
  int symbols_width_v30; // [sp+Ch] [bp-18h]@48
  int Last_symb_offset_v31; // [sp+10h] [bp-14h]@2
  int last_good_symbol_v32; // [sp+14h] [bp-10h]@48
  int string_height_v33; // [sp+18h] [bp-Ch]@9
  int string_height_v34; // [sp+18h] [bp-Ch]@23
  int Curr_string_first_symbol_off_v35; // [sp+1Ch] [bp-8h]@25
  int Y_Addition_v36; // [sp+20h] [bp-4h]@2
  text_i = text;
  string_symbol_off_v12 = 0;
  this_v11 = this;
  if ( text )
  {
    Y_Addition_v36 = 0;
    Str_len_v13 = strlen(text);
    Last_symb_offset_v31 = Str_len_v13 - 1;
    if ( Str_len_v13 == 1 )                     // 1 символ
    {
      if ( a10 != -1 )
      {
        color_v14 = color;
        if ( BYTE1(color_v14) & 1 )
          BYTE1(color_v14) &= 0xFEu;
        else
          color_v14 = color + 9;
        A0_Fnt_DrawSymbol_sub_4B4F00(this_v11, '_', (signed int)Pcx16, x, y, color_v14);
      }
    }
    else                                        // Несколько символов
    {
      if ( align & 4 )                          // Выравнивание по центру
      {
        align &= 0xFFFFFFFBu;
        string_height_v33 = this_v11->string_height;
        text_height_v15 = this_v11->string_height * A0_Fnt_GetTextStringsCount_sub_4B5580(this_v11, text, width);
        height_v16 = height;
        if ( text_height_v15 >= height )        // Если текст не влезает
        {
          if ( height < 2 * string_height_v33 ) // Если влезает не более одной строки, центруем её
            Y_Addition_v36 = (height - string_height_v33) / 2;
          text_i = text;
        }
        else
        {
          text_i = text;
          Y_Addition_v36 = (height - text_height_v15) / 2;// Центруем текст
        }
      }
      else
      {
        height_v16 = height;
      }
      if ( align & 8 )                          // Выранивание по низу
      {
        v18 = align;
        LOBYTE(v18) = align & 0xF7;
        align = v18;
        align_v18 = this_v11->string_height * A0_Fnt_GetTextStringsCount_sub_4B5580(this_v11, text_i, width);
        if ( align_v18 < height_v16 )           // Если текст влезает
          Y_Addition_v36 = height_v16 - align_v18;// опускаем его вниз
        text_i = text;
      }
      if ( Last_symb_offset_v31 > 0 )           // Текст есть
      {
        while ( text_i[string_symbol_off_v12] ) // Идём до конца текста
        {
          string_height_v34 = this_v11->string_height;
          if ( Y_Addition_v36 + string_height_v34 > height_v16 )// Если строка не в начале и не влезет - прерываемся
          {
            if ( Y_Addition_v36 )
              break;
          }
          symbols_width_v19 = 0;
          Curr_string_first_symbol_off_v35 = string_symbol_off_v12;// Смещение текущей строки
          while ( 1 )                           // До первого неуправляющего символа
          {
            Curr_symbol_v20 = text_i[string_symbol_off_v12];
            if ( Curr_symbol_v20 != '{' )
            {
              if ( Curr_symbol_v20 != '}' )
                break;
            }
            ++string_symbol_off_v12;
          }
          symbol_v21 = text_i[string_symbol_off_v12];// Текущий символ в строке
          if ( symbol_v21 )
          {                                     // Отрицательное смещение 1 символа игнорируется
            if ( *((_DWORD *)&this_v11->v_table + 3 * (symbol_v21 + 5)) < 0 )// fnt->char_sizes[symbol].width
              symbols_width_v19 = -*((_DWORD *)&this_v11->v_table + 3 * ((char)symbol_v21 + 5));// fnt->char_sizes[symbol].width
            for ( text_i = text; symbol_v21; symbol_v21 = text[string_symbol_off_v12++ + 1] )// Проход по строке
            {
              if ( symbol_v21 == '\n' )         // Следующая строка
                break;
              if ( symbols_width_v19 > width )  // Не влезло - переходим на следующую строку
                break;
              if ( symbol_v21 != '{' )
              {
                if ( symbol_v21 != '}' )        // Добавляем к ширине строки данные символа
                  symbols_width_v19 += *((_DWORD *)&this_v11->v_table + 3 * (symbol_v21 + 5))// fnt->char_sizes[symbol].width
                                     + *(_DWORD *)&this_v11->name[12 * (symbol_v21 + 5)]// fnt->char_sizes[symbol].left
                                     + *(_DWORD *)&this_v11->name[12 * (symbol_v21 + 5) + 4];// fnt->char_sizes[symbol].right
              }
            }
          }
          for ( i = string_symbol_off_v12 - 1; ; --i )// Проход назад по уже пройденным символам
          {
            curr_symbol_v23 = text_i[i];
            if ( curr_symbol_v23 != '{' )
            {
              if ( curr_symbol_v23 != '}' )
                break;
            }
            if ( i <= Curr_string_first_symbol_off_v35 )
              break;
          }                                     // Нашли последний неуправляющий символ
          if ( string_symbol_off_v12 > 0 )
          {
            char_right_v24 = this_v11->char_sizes[(unsigned __int8)text_i[i]].right;
            if ( char_right_v24 < 0 )           // Игнорируем отрицательный правый отступ в конце строки
              symbols_width_v19 -= char_right_v24;
          }
          if ( symbols_width_v19 > width )      // Если символы в результате вылезли за ширину...
          {
            last_string_symbol_v25 = text_i[i];
            symbols_width_v30 = symbols_width_v19;
            last_good_symbol_v32 = 0;
            if ( this_v11->char_sizes[(unsigned __int8)last_string_symbol_v25].right < 0 )// Возвращаем правый отступ последнего символа
              symbols_width_v19 += this_v11->char_sizes[last_string_symbol_v25].right;
            string_symbol_off_v12 = i;          // Последний символ
            if ( last_string_symbol_v25 != ' ' )// Последний символ - не пробел
            {
              while ( string_symbol_off_v12 >= Curr_string_first_symbol_off_v35 )// Если символ - не первый в строке
              {
                text_v27 = text;
                curr_symbol_v26 = text[string_symbol_off_v12];
                if ( curr_symbol_v26 != '{' && curr_symbol_v26 != '}' )// Если текущий символ - не управляющий
                {
                  symbols_width_v19 -= *((_DWORD *)&this_v11->v_table// Отнимаем текущий символ от строки
                                       + 3 * ((unsigned __int8)text[string_symbol_off_v12] + 5))// fnt->char_sizes[symbol].width
                                     + *(_DWORD *)&this_v11->name[12// fnt->char_sizes[symbol].left
                                                                * ((unsigned __int8)text[string_symbol_off_v12] + 5)]
                                     + *(_DWORD *)&this_v11->name[12
                                                                * ((unsigned __int8)text[string_symbol_off_v12] + 5)// fnt->char_sizes[symbol].right
                                                                + 4];
                  if ( Y_Addition_v36 + 2 * string_height_v34 > height && symbols_width_v19 < width )// Если строка влезает по-горизонтали, но следующая не влезет по-вертикали
                    goto END_CANCEL_SYMBOLS_L61;
                  if ( !last_good_symbol_v32 )
                  {
                    if ( symbols_width_v19 < width )
                      last_good_symbol_v32 = string_symbol_off_v12;
                  }
                }
                curr_symbol_v28 = text[string_symbol_off_v12-- - 1];// Берём текущий символ и переходим к следующему
                if ( curr_symbol_v28 == ' ' )   // Если перенесли целое слово, завершаем перенос
                  break;
              }
            }
            text_v27 = text;
END_CANCEL_SYMBOLS_L61:
            if ( string_symbol_off_v12 <= Curr_string_first_symbol_off_v35 )// Если перенесли всё до первого символа в строке...
            {
              string_symbol_off_v12 = last_good_symbol_v32;// Берём последний подходящий символ и всю ширину
              symbols_width_v19 = symbols_width_v30;
            }
            if ( text_v27[string_symbol_off_v12] == ' ' )// Последний символ - пробел - просто игнорируем его существование
              symbols_width_v19 -= this_v11->char_sizes[32].width
                                 + this_v11->char_sizes[32].left
                                 + this_v11->char_sizes[32].right;
          }
          X_Add_v29 = 0;
          if ( align )
          {
            if ( align == 1 )                   // Выравнивание по центру - центрируем
            {
              X_Add_v29 = (width - symbols_width_v19) / 2;
            }
            else
            {
              if ( align == 2 )                 // Выравнивание по правому краю - выравниваем
                X_Add_v29 = width - symbols_width_v19;
            }
          }
          else
          {                                     // Выравнивание по левому краю
            X_Add_v29 = 0;
          }
          A0_Fnt_DrawString_To_Pcx16_sub_4B4FC0(
            this_v11,
            (int)&text[Curr_string_first_symbol_off_v35],// Первый символ
            string_symbol_off_v12++ - Curr_string_first_symbol_off_v35,// Кол-во символов (+ переходим к первому символу следующей строки)
            Pcx16,
            x + X_Add_v29,
            Y_Addition_v36 + y,
            color,
            x,
            y,
            width,
            height,
            a10);
          Y_Addition_v36 += this_v11->string_height;// Вертикаль следующей строки
          if ( string_symbol_off_v12 >= Last_symb_offset_v31 )// Если вывели все символу - завершаем
            break;
          height_v16 = height;
          text_i = text;
        }
      }
    }
  }
}