Генератор скриптов поддерживает экспорт текстов в FXT архив. Начиная с версии 7.0 есть возможность экспорта сразу в несколько файлов. По умолчанию все тексты будут экспортироваться в файл text.fxt без кодировки.
Добавление текста и конвертация
Для добавления записей существует свойство FXT. Метод add добавляет новую запись в текущий файл:
publicclassTEST:Thread {publicoverridevoidSTART( LabelJump label ) {FXT.add( "KEY_002","This is my text!" );show_text_highpriority( "KEY_002",5000,0 );end_thread(); }}
Метод принимает название GXT-ключа в первый параметр, а во втором параметре указываем сам текст. В этом случае GXT-ключ будет сохранён, что не позволит в текущий файл добавить ещё одну запись с таким же ключом. Сам ключ используется в командах скрипта (например, в show_text_highpriority).
Работа с кодировками
В предыдущем примере мы рассмотрели добавление записей, но они никак не кодируются и записываются как есть. Кириллица в этом случае не будет правильно отображаться в игре (как и многие другие языки, которые не предусмотрены разработчиками). В этом случае нам поможет система кодировок.
Суть кодировок состоит в том, что на месте "правильного" символа в текстах локализации пишется другой, который поддерживается оригинальным набором символов. Каждый локализатор кодирует символы по своему, поэтому их надо знать заранее. Для режима GTA SA генератор скриптов имеет одну встроенную кодировку: SmartLoc. Для её установки надо воспользоваться методом:
Если планируется использовать персональную кодировку, то для этого используется специальный класс — GXTEncoding. Пример установки показан ниже:
usingGTA.Core; // <-- класс "GXTEncoding" для работы с кодировками находится в этом пространстве имёнpublicclassTEST:Thread {publicoverridevoidSTART( LabelJump label ) { // все символы с массива "normal" будут преобразованы в символы "symbol"char[] normal =newchar[] { 'Н','Г','С' };char[] symbol =newchar[] { 'N','G','S' };GXTEncoding newEnc =newGXTEncoding( normal, symbol,false ); // <-- создание новой кодировкиFXT.set_encoding( newEnc ); // <-- установка персональной кодировкиFXT.add( "KEY_002","НГГССНС!" ); // NGGSSGSshow_text_highpriority( "KEY_002",5000,0 );end_thread(); }}
Конструктор класса GXTEncoding принимает 3 параметра, но последний является опциональным. Если передать значение true, то записи будут конвертированы в верхний регистр, что может упростить жизнь с некоторыми кодировками, которые не используют строчные буквы.
Работа с файлами
До этого момента мы работали только с одним файлом. В большинстве случаев этого достаточно, но иногда бывают ситуации, когда надо создать тексты для разных языков или для разных кодировок. Для таким случаем есть метод, который добавляет новый файл:
FXT.set_file( "fileName" );
Все записи, добавленные в коде после метода, будут добавлены в указанный файл. Обратите внимание, что установка нового файла сбрасывает кодировку, поэтому её нужно указать ещё раз. Давайте рассмотрим пример, когда используется 2 файла:
Оба файла будут экспортированы в указанную директорию и Вам останется только предложить конечному пользователю выбрать один из них. Если создавать файлы на одном языке, но с разными кодировками, то нет необходимости дублировать код. Мы можем скопировать все записи, используя метод copy:
Созданные ранее файлы (имена которых не задействованы в скрипте) не будут удалены, как было в старых версиях!
Разное
Для удобства лучше создать отдельный класс, где будут храниться тексты. Это поможет при разработке, так как их не надо будет искать по всему проекту. Пример такого класса:
usingstaticGTA.Core.Script; // <-- нужно для простого доступа к свойству "FXT"publicstaticclassMyTexts {publicstaticvoidInit() {FXT.set_encoding( GXTEncoding.RU_SmartLoc ) .add( "DIALOG1","Привет!" ) .add( "DIALOG2","Я CJ!" ) .add( "DIALOG3","Звук телефона!" ) .add( "DIALOG4","Пока!" ); // тут другие записи... }}// ...publicpartialclassMAIN:Thread {publicoverridevoidSTART( LabelJump label ) {MyTexts.Init(); // <-- создаём тексты только 1 раз // ...create_thread<TEST>(); // ... }}// ...publicpartialclassTEST:Thread {publicoverridevoidSTART( LabelJump label ) {show_text_highpriority( "DIALOG1",5000,0 ); // используемwait( 5000 );show_text_highpriority( "DIALOG2",5000,0 ); // используемwait( 5000 );show_text_highpriority( "DIALOG3",5000,0 ); // используемwait( 5000 );end_thread(); }}