Руководство по использованию WeiDU: различия между версиями

Материал из AERIE Wiki
м (уточнено описание GAME_IS в связи с обновлением версии WeiDU)
 
(не показана 31 промежуточная версия 3 участников)
Строка 1: Строка 1:
Данная статья - попытка представить перевод на русский язык документации [[WeiDU]] ([http://www.weidu.org/~thebigg/README-WeiDU.html WeiDU Documentation]), включаемой в архив программы, дополненный, по-возможности, комментриями и замечаниями, основанными на личном опыте составителей.
+
Данная статья - попытка представить перевод на русский язык документации [[WeiDU]], включаемой в архив программы, дополненный, по-возможности, комментариями и замечаниями, основанными на личном опыте составителей.
 +
 
 +
'''Оригинальную документацию смотрите [http://www.weidu.org/~thebigg/README-WeiDU.html здесь].'''
  
 
==Краткая информация о [[WeiDU]]==
 
==Краткая информация о [[WeiDU]]==
Строка 5: Строка 7:
 
У [[WeiDU]] есть в Интернете домашняя страница:http://weidu.org/. Рекомендую вам загрузить оттуда самую свежую версию.
 
У [[WeiDU]] есть в Интернете домашняя страница:http://weidu.org/. Рекомендую вам загрузить оттуда самую свежую версию.
  
[[WeiDU]] разработан (уже сложилась практика называть эту программу в мужском роде: он, [[WeiDU]] - прим.перев.) для того, чтобы упростить процесс написания и распространения [[мод]]ификаций (модов) для игр на [[Infinity Engine]]. Он может загружать и производить действия с ресурсами [[Infinity Engine]] в соответствии с инструкциями, которые вы ему напишете. [[WeiDU]] идеален для упаковки [[мод]]ификаций, которые включают диалоги, или таких, которые должны быть совместимы с другими [[мод]]ификациями.
+
[[WeiDU]] разработан ''(уже сложилась практика называть эту программу в мужском роде: он, [[WeiDU]] - прим.перев.)'' для того, чтобы упростить процесс написания и распространения [[мод]]ификаций (модов) для игр на [[Infinity Engine]]. Он может загружать и производить действия с ресурсами [[Infinity Engine]] по инструкциям, которые вы ему напишете. [[WeiDU]] идеален для упаковки [[мод]]ификаций с диалогами, или таких, которые должны быть совместимы с другими [[мод]]ификациями.
  
 
Сразу честно признаюсь: [[WeiDU]] поначалу кажется сложнее в использовании, чем другие подобные программы. Однако, большинство пользователей сходятся во мнении, что: во-первых, альтернативные программы не могут удовлетворить их из-за отсутствия функций, которые в [[WeiDU]] имеются, и, во-вторых, к [[WeiDU]] быстро привыкаешь.
 
Сразу честно признаюсь: [[WeiDU]] поначалу кажется сложнее в использовании, чем другие подобные программы. Однако, большинство пользователей сходятся во мнении, что: во-первых, альтернативные программы не могут удовлетворить их из-за отсутствия функций, которые в [[WeiDU]] имеются, и, во-вторых, к [[WeiDU]] быстро привыкаешь.
  
Вы можете смело использовать эту программу для разработки и распространения своих собственных [[мод]]ов на [[Infinity Engine]]. На [[WeiDU]] распространяется действие GNU (General Public License), но, в расширение ее, вы имеете право, если пожелаете, свободно включать в состав [[мод]]а исполняемый файл WeiDU.EXE (в неизмененном виде и без исходного кода).
+
Вы можете смело использовать эту программу для разработки и распространения своих собственных [[мод]]ов на [[Infinity Engine]]. На [[WeiDU]] распространяется действие GNU (General Public License), но, в расширение ее, вы имеете право, если пожелаете, свободно включать в состав [[мод]]а бинарный исполняемый файл WeiDU.EXE (в неизмененном виде и без исходного кода).
  
Я решил написать свои собственную утилиту для работы с [[DLG]] и [[TLK]] в [[Infinity Engine]], потому что не смог добиться от [[TeamBG DLG Editor]] и [[Mass Converter]] правильной работы. Эти программы не анализируют строки или могут испортить текст или могут вдруг зависнуть ... где ни ткни, везде плохо. К тому же все они основаны на GUI (графическом интерфейсе). Будучи воспитанным на unix, я обожаю программы, работающие в командной строке, а как дипломированный PL-специалист (специалист по языкам программирования, - прим.перев.), я люблю разрабатывать всякие языки и компиляторы. [[WeiDU]] изначально состоял из нескольких маленьких программочек с ничего не говорящими названиями: DC, DD и TP. Более привлекательный термин "WeiDU" (который рифмуется с "IDU"  - сокращение от interface data unit, интерфейсный блок данных, прим.перев. - и "Eye-Dee-You" - не очень понятное сочетание; наверное наиболее интересным является созвучность с "we do", мы делаем, -  прим.перев.) придумали Джейсон Комптон (Jason Compton) и Грейфэйн (Ghreyfain) - выдающиеся авторы [[мод]]ов для [[BGII]].
+
Я решил написать свою собственную утилиту для работы с [[DLG]] и [[TLK]] в [[Infinity Engine]], потому что не смог добиться от [[TeamBG DLG Editor]] и [[Mass Converter]] правильной работы. Эти программы не анализируют строки, или могут испортить текст, или могут вдруг зависнуть ... где ни ткни, везде что-нибудь да не так. К тому же, все они основаны на GUI (графическом интерфейсе). Будучи воспитанным на unix, я обожаю программы, работающие в командной строке, а как дипломированный PL-специалист ''(специалист по языкам программирования, - прим.перев.)'', я люблю разрабатывать всякие языки и компиляторы. [[WeiDU]] изначально состоял из нескольких маленьких программочек с ничего не говорящими названиями: DC, DD и TP. Более привлекательный термин "WeiDU" (который рифмуется с "IDU"  - ''сокращение от interface data unit, интерфейсный блок данных, прим.перев.'' - и "Eye-Dee-You" - ''не очень понятное сочетание; наверное наиболее интересным является созвучность с "we do", мы делаем, -  прим.перев.'') придумали Джейсон Комптон (Jason Compton) и Грейфэйн (Ghreyfain) - выдающиеся авторы [[мод]]ов для [[BGII]].
  
 
==Без паники!==
 
==Без паники!==
 
Пошаговое руководство к [[WeiDU]] для новичков:  
 
Пошаговое руководство к [[WeiDU]] для новичков:  
Без паники. Многие из вас - дети эры графических пользовательских интерфейсов (GUI). Но программы, которые работают в командной строке, тоже могут быть вашими друзьями, и, по большому счету, они работают гораздо быстрее, а использовать их, на самом деле, гораздо проще.
 
  
Наилучший способ научиться писать код в формате [[WeiDU]] - формате [[D-файл|D]] - прочитать код, написанный в формате [[WeiDU]] - формате [[D-файл|D]]. Начните с декомпиляции уже существующих игровых файлов DLG, которые вы хорошо знаете, и прочитайте полученные файлы. Сравните то, как они выглядят в [[WeiDU]] и то, как они выглядят в других редакторах, с которыми вы, возможно, лучше знакомы (например, [[Near Infinity]] и [[Infinity Explorer]]).
+
1. Без паники. Многие из вас - дети эры графических пользовательских интерфейсов (GUI). Но программы, которые работают в командной строке, тоже могут быть вашими друзьями, и, по большому счету, они работают гораздо быстрее, а использовать их, на самом деле, гораздо проще.  
  
Наилучший способ научиться писать код в формате [[WeiDU]] - формате [[D-файл|D]] - прочитать код, написанный в формате [[WeiDU]] - формате [[D-файл|D]], часть 2. Все больше аддонов к BG2 создаются при помощи [[WeiDU]]. Список можно найти здесь: http://www.pocketplane.net/modlist/. Они помогут вам понять, как использовать более сложные функции [[WeiDU]], такие как добавление диалогов, работа со скриптами и 2DA-файлами, а также вещами (item), заклинаниями (spells) и существами (creature), которые используются непосредственно в игре. Поставьте себе такую задачу: скачать определенный мод и разобраться КАК ИМЕННО он работают.
+
2. Лучший способ научиться писать код в формате [[WeiDU]] - ''прочитать'' код, написанный в этом формате (то есть, в формате [[D-файл|D]]). Начните с декомпиляции уже существующих игровых файлов DLG, которые вы хорошо знаете, и прочитайте полученные файлы. Сравните то, как они выглядят в [[WeiDU]] и то, как они выглядят в других редакторах, с которыми вы, возможно, лучше знакомы (например, [[Near Infinity]] и [[Infinity Explorer]]).
  
Посмотрите некоторые примеры в этом документе. Есть замечательное руководство к [[WeiDU]] (написанное Japheth): http://forums.pocketplane.net/index.php?topic=55.0 (русский перевод [http://alina.aerie.ru/tutorial_rus.htm здесь]). Если чувствуете, настоящее руководство для вас слишком сложно, зайдите сначала туда. Там также объясняется как установить утилиту. Ghreyfain написал туториал "как создать NPC при помощи [[WeiDU]]" http://forums.pocketplane.net/index.php?topic=52.0 (русский перевод [http://alina.aerie.ru/npc_translation.htm здесь] )
+
3. Лучший способ научиться писать код в формате [[WeiDU]] - ''прочитать'' код, написанный в этом формате, часть 2. При помощи [[WeiDU]] создается все больше [[мод]]ов для [[BG2]]. Список можно найти, например, здесь: http://www.pocketplane.net/modlist/. Они помогут вам понять, как использовать более сложные функции [[WeiDU]], такие как добавление диалогов, работа со скриптами и 2DA-файлами, а также вещами (item), заклинаниями (spells) и существами (creature), которые используются непосредственно в игре. Поставьте себе такую задачу: скачать определенный мод и разобраться КАК ИМЕННО он работают.
  
Есть специальный форум для обсуждения [[WeiDU]]: http://forums.pocketplane.net/index.php?board=50.0. Для того, чтобы получить ответ на повросы по использованию [[WeiDU]] (и по разработке модов тоже), этот форум - самое подходящее место.
+
4. Посмотрите примеры в этом документе. Есть замечательное руководство к [[WeiDU]] (написанное Japheth): http://forums.pocketplane.net/index.php?topic=55.0 (русский перевод [http://alina.aerie.ru/tutorial_rus.htm здесь]). Если чувствуете, настоящее руководство для вас слишком сложно, зайдите сначала туда. Там также объясняется как установить утилиту. Ghreyfain написал туториал "как создать NPC при помощи [[WeiDU]]" http://forums.pocketplane.net/index.php?topic=52.0 (русский перевод [http://alina.aerie.ru/npc_translation.htm здесь] )
  
Ну, и наконец, если Вы используете Mac и собираетесь пользоваться [[WeiDU]], посетите http://weidu.org/Mac.html  - там содержится информация по созданию копии [[WeiDU]], работающей под OS X.
+
5. Есть специальный форум для обсуждения [[WeiDU]]: http://forums.pocketplane.net/index.php?board=50.0. Для того, чтобы получить ответ на вопросы по использованию [[WeiDU]] (и по разработке модов тоже), этот форум - самое подходящее место.
 +
 
 +
6. Ну, и, наконец, если Вы используете Mac и собираетесь пользоваться [[WeiDU]], посетите http://weidu.org/Mac.html  - там содержится информация по созданию копии [[WeiDU]], работающей под OS X.
  
 
==Концепция [[D-файл|D]] и [[DLG-файл]]ов==
 
==Концепция [[D-файл|D]] и [[DLG-файл]]ов==
Строка 50: Строка 53:
 
   BEGIN ~SCSARLES~
 
   BEGIN ~SCSARLES~
 
   //////////////////////////////////////////////////
 
   //////////////////////////////////////////////////
   // WARNING: this file contains non-trivial WEIGHTs (ВНИМАНИЕ: данный файл содержит нестантартные "веса", прим.перев.)
+
   // WARNING: this file contains non-trivial WEIGHTs (ВНИМАНИЕ: данный файл содержит нестандартные "веса", прим.перев.)
 
   //////////////////////////////////////////////////
 
   //////////////////////////////////////////////////
 
    
 
    
Строка 75: Строка 78:
 
   END
 
   END
  
описывает шаг (более детально см. ниже). Когда игрок начитает общение с НПС (NPC), движок игры сканирует все шаги в [[DLG-файл]]е этого NPC в порядке, определяемом их "весом" (WEIGHT), и выбирает один не являющийся пустым и проверка "Изначальное условие" которого выдает ПРАВДА (true). Если таких шагов не найдено, то игра выдает сообщение: "Нечего вам сказать". Про порядок определения "весов" не думайте - это пока не нужно.
+
описывает один ''шаг'' (state) (более детально см. ниже). Когда игрок начитает общение с НПС ([[NPC]]), движок игры сканирует все шаги в [[DLG-файл]]е этого NPC в порядке, определяемом их "весом" (WEIGHT), и выбирает один не являющийся пустым и проверка "Изначальное условие" которого выдает ПРАВДА (true). Если таких шагов не найдено, то игра выдает сообщение: "Нечего вам сказать" ''(в окне сообщений выдается имя НПС и строка #32092 ~ has nothing to say to you.~, - прим.перев.)''. Про порядок определения "весов" не думайте - это пока не нужно.
  
Итак, если шаг найден, говорящий (в данном случае, Сэр Сарльз) говорит то, что указано после SAY. В строках REPLAY приводятся возможные ответы игрока. Если проверка "Условие для ответа" выдает ПРАВДА, то игроку дается возможность сказать фразу "Текст ответа" и перейти к другому шагу диалога (где Сарльз, возможно, скажет что-нибудь еще).
+
Итак, если шаг найден, говорящий (в данном случае, Сэр Сарльз) говорит то, что указано после SAY. В строках REPLY приводятся возможные ответы игрока. Если проверка "Условие для ответа" выдает ПРАВДА, то игроку дается возможность сказать фразу "Текст ответа" и перейти к другому шагу диалога (где Сарльз, возможно, скажет что-нибудь еще).
  
запомните: SAY - это то, что говорит НПС, а REPLAY - то, что ему отвечает игрок. Если обратить внимание, то легко заметить, что абсолютно все диалоги в играх на [[Infinity Engine]] построены таким образом.
+
Запомните: SAY - это то, что говорит НПС, а REPLY - то, что ему отвечает игрок. Если обратить внимание, то легко заметить, что абсолютно все диалоги в играх на [[Infinity Engine]] построены таким образом.
  
 
В условиях используется тот же синтаксис, что и в триггерах [[скрипт]]ов BCS в  [[Infinity Engine]]. Хорошо бы, конечно, вам изучить написание [[скрипт]]ов в [[Infinity Engine]] - это отдельная большая тема. Строки заключаются справа и слева в тильды (~), знаки процентов (%) или кавычки (") - на ваш выбор - по умолчанию же [[WeiDU]] использует тильды. После SAY, или REPLY, или JOURNAL можно, вместо одной, давать две строки (string): первая используется для DIALOG.TLK, а вторая - для DIALOGF.TLK (версия диалога, когда главный персонаж женского пола  - для иностранных языков, в которых такое различие существенно). Если вы указываете только одну строку, то предполагается, что в обоих случаях текст будет одинаковым ''(если имеется DIALOGF.TLK, то в него всегда заносится текст - две строки указано или одна, - прим.перев.)''.
 
В условиях используется тот же синтаксис, что и в триггерах [[скрипт]]ов BCS в  [[Infinity Engine]]. Хорошо бы, конечно, вам изучить написание [[скрипт]]ов в [[Infinity Engine]] - это отдельная большая тема. Строки заключаются справа и слева в тильды (~), знаки процентов (%) или кавычки (") - на ваш выбор - по умолчанию же [[WeiDU]] использует тильды. После SAY, или REPLY, или JOURNAL можно, вместо одной, давать две строки (string): первая используется для DIALOG.TLK, а вторая - для DIALOGF.TLK (версия диалога, когда главный персонаж женского пола  - для иностранных языков, в которых такое различие существенно). Если вы указываете только одну строку, то предполагается, что в обоих случаях текст будет одинаковым ''(если имеется DIALOGF.TLK, то в него всегда заносится текст - две строки указано или одна, - прим.перев.)''.
Строка 85: Строка 88:
 
Можно также использовать цифры, перед которыми стоит знак "#" (например, #1234) - так указывается прямая ссылка на номер строки в DIALOG.TLK. Это удобно, когда изменяется уже имеющийся диалог (скажем, Духа судьбы в ТОБ), в этом случае, если диалог будет инсталлировать иностранный пользователь, то в тех строках, которые не изменялись, будет использоваться текст из его игры и их не надо будет переводить. Обычно ссылки на номера строк указываются сразу за SAY, а сам текст помещается в комментарии. Ключ командной строки  --text, наоборот, позволяет в комментариях номера строк.
 
Можно также использовать цифры, перед которыми стоит знак "#" (например, #1234) - так указывается прямая ссылка на номер строки в DIALOG.TLK. Это удобно, когда изменяется уже имеющийся диалог (скажем, Духа судьбы в ТОБ), в этом случае, если диалог будет инсталлировать иностранный пользователь, то в тех строках, которые не изменялись, будет использоваться текст из его игры и их не надо будет переводить. Обычно ссылки на номера строк указываются сразу за SAY, а сам текст помещается в комментарии. Ключ командной строки  --text, наоборот, позволяет в комментариях номера строк.
  
''(продолжение следует, - прим.перев.)''
+
Сразу нужно сказать про звуковые файлы (WAV/WAVC) - они присоединяются к нужной строке в виде имени ресурса (не более 8 символов), заключенного в [квадратные скобки] после текста ''(не забудьте пробел после тильды, - прим.перев.)'', вот так:
 +
 
 +
  SAY ~Привет~ [HELLO]
 +
 
 +
Комментарии делаются аналогично принятому в C/C++: все, что идет после // и до конца строки - это комментарий, так же, как и все, что /* находится между слэшами со звездочкой */. Комментарии WeiDU игнорирует - они только для вашего удобства. Пример:
 +
 
 +
  SAY ~Привет~ [HELLO]  // это все идет комментарий        ... аж до сюда!
 +
  IF /* здесь тоже комментарий */ ~~ THEN EXIT
 +
 
 +
Ответы (REPLY) могут также содержать и действия (указание делается ключевым словом DO) - практически, точно такие же, как скриптовые действия (script actions BCS) в Infinity Engine. Кроме того, в ответах можно добавлять записи журнала (Journal entries), завершать диалог (EXIT) или даже переключаться на диалог другого НПС (EXTERN).
 +
 
 +
Примеры:
 +
 
 +
  IF ~~ THEN BEGIN 2 // from: 0.1 (комментарий формирует по умолчанию сам WeiDU, поэтому он оставлен непереведенным, - прим.перев.)
 +
 
 +
Вышеприведенная строка означает, что в диалоге начался шаг 2. Комментарий поясняет, что этот шаг может быть доступен после ответа-перехода 1 в шаге 0.
 +
 
 +
  IF ~~ THEN REPLY ~Мои извинения. Я оставлю тебя твоим раздумьям.~ // #28656
 +
      GOTO 1
 +
 
 +
Данный ответ будет доступен всегда ''(поскольку условие не задано - ~~, - прим.перев.)'' и в окне сообщений будет выведена строка: "Мои извинения...". Номер строки, соответствующей этому тексту -  28656. Если персонаж игрока ''([[PC]] - player character)'' выбирает данный ответ, происходит переход к шагу 1. ''(Пример несколько отличается от содержимого SCSARLES.DLG, полученного ранее, - текст строки указан частью программы диалога, а не в комментарии, - данный вид обычно имеют классические, жестко закодированные, диалоги модов, что и объясняет выбор примера, - прим.перев.)''
 +
 
 +
Наконец, переход может выглядеть следующим образом:
 +
 
 +
  COPY_TRANS имя_файла ярлык
 +
 
 +
Во время исполнения диалога, COPY_TRANS будет заменен переходами, взятыми из шага "ярлык" файла имя_файла. Копирование происходит до начала выполнения других команд диалога (D-actions).
 +
 
 +
==Формат [[D-файл]]а диалога ([[D-формат]])==
 +
 
 +
Формат [[D-файл]]а ([[D-формат]]) - это способ описания диалогов Infinity Engine и их порядка модифицирования в компактном, легко читаемом виде. Он поддерживает перевод на разные языки и позволяет вам указать переходы к диалогам, которые уже имеются в игре, без приведения содержимого этих диалогов. Все это позволяет вам создавать моды, которые будут работать с другими модами, написанными другими людьми.
 +
 
 +
Описание формата [[D-файл]]ов представлено здесь с использованием расширенной контекстно-свободной грамматики ''(extended context-free grammar notation)''. Если термин CFG ни о чем вам не говорит, загляните на http://www.wikipedia.com/wiki/Context-free_grammar, http://cs.wpi.edu/~kal/PLT/PLT2.1.2.html или http://www.cs.rochester.edu/users/faculty/nelson/courses/csc_173/grammars/cfg.html. Впрочем, досконально разбираться в CFG не обязательно.
 +
 
 +
Чтобы разобраться, как это все работает, с помощью [[WeiDU]] создайте для себя JAHEIRA.D и смотрите его в текстовом редакторе. Не лишним будет просмотр и тестирование примеров, которые прилагаются к [[WeiDU]] ''(в папке examples, - прим.перев.)''.
 +
 
 +
Все ''ключевые слова'' синтаксиса даны в ВЕРХНЕМ РЕГИСТРЕ. Остальные ''ключевые слова'' символические ''(призваны интуитивно подсказывать, чем их в реальности заменять, - прим.перев.)''. Запомните, что:
 +
* "''list''" после выражения означает "''далее, если нужно, могут быть еще такие же выражения''" или "''0, 1 или более выражений''";
 +
* "'''['''''выражение в квадратных скобках''''']'''" означает "''не обязательное выражение" или "0 или 1 выражение''";
 +
* ''многоточие'' (...) после выражения означает "''можно повторить выражение столько раз, сколько захочется''".
 +
* ''под термином "выражение" подразумевается ''ключевое слово'', то есть часть команды, отделенная о других знаками пробела, - прим.перев.''
 +
 
 +
 
 +
{|width=96% align = center style="font-size: 100%; text-align: left" border=1 cellpadding=4 cellspacing=0
 +
|-
 +
! valign=top width=10% | '''[[D-файл]]''' || valign=top width=20% |  || valign=top width=70% | [[D-файл]] - это текстовый файл, который содержит определенный набор '''[[D-действие|D-действий]]''' (D Action). [[D-файл]]ы указывают [[WeiDU]], каким образом создавать и изменять [[DLG-файл]]ы, используемые движком [[Infinity Engine]].
 +
|-
 +
| valign=top | ''это''
 +
| valign=top | '''[[D-действие]]''' ''list''
 +
| valign=top | [[D-файл]] - это список [[D-действие|D-действий]]. В принципе, только одна - BEGIN - указывает на создание нового диалога. Остальные [[D-действие|D-действия]] используются для изменения существующих диалогов.
 +
|-
 +
| colspan=3 | 
 +
|-
 +
! valign=top align=left| [[D-действие]] ||  || D-действия указывают [[WeiDU]], каким образом создавать и изменять [[DLG-файл]]ы, используемые движком [[Infinity Engine]].
 +
|-
 +
| valign=top | ''это''
 +
| valign=top | '''BEGIN''' имя_файла [ '''nonPausing''' ] [[шаг]] ''list''
 +
| valign=top | BEGIN указывает [[WeiDU]], что вы собираетесь создать с помощью программы новый [[DLG-файл]]. [[DLG-файл]] с аналогичным именем будет заменен создаваемым. Новый файл будет содержать только те [[шаг]]и, которые вы укажете. Если зададите переменной nonPausing значение, отличное от нуля, то во время диалога время останавливаться не будет. По умолчанию же во время диалога игра встает на паузу.
 +
|-
 +
| valign=top | ''или''
 +
| valign=top | '''APPEND''' [ '''IF_FILE_EXISTS''' ] имя_файла [[шаг]] ''list'' '''END'''
 +
| valign=top | Данная команда указывает [[WeiDU]] добавить указанные [[шаг]]и в конец уже существующего файла имя_файла.DLG. Если указан параметр IF_FILE_EXISTS, а файла в игре не существует, то действие не выполняется.
 +
|-
 +
| colspan=3 |  ''переведено не полностью - смотрите [http://www.weidu.org/~thebigg/README-WeiDU.html#htoc19 первоисточник]''
 +
|-
 +
| colspan=3 | 
 +
|-
 +
! valign=top align=left| [[переход]] (transition) ||  || Переходы определяют порядок следования частей диалога
 +
|-
 +
| valign=top | ''это''
 +
| valign=top | IF transTriggerString  [ THEN  ] transFeature  list transNext
 +
| valign=top | If the transTriggerString evaluates to true or is empty, this transition is viable. If it contains no replyText within its transFeature list, it is immediately taken. Otherwise, the replyText is presented as an option to the user. If the transition is taken, any actions in the transFeature list are performed and the dialogue flows to the point indicated by the transNext. transitions are evaluated in "reverse order". That is, the "bottom" or "last" response for a state is checked first. If its transTriggerString evaluates to true and it has no REPLY text, that transition is immediately taken. See SAREV25A state 1 for an example of a state with all kinds of transitions.
 +
|-
 +
| valign=top | ''или''
 +
| valign=top | +  [ [[условие_перехода]]  ] + [[текст_ответа]] [[опции_перехода]]  list [[после_перехода]]
 +
| valign=top | Это сокращенный синтаксис для наиболее часто используемых [[переход]]ов - с ответами ([[REPLY]]). Позволяет сэкономить время и силы, в остальном полностью соответствует стандартному варианту, приведенному выше. (''Прим.перев: Команды [[IF]], [[REPLY]], а также [[GOTO]] заменены знаками +, THEN опущено. Пример сокращенного форматирования начала диалога SCSARLES.DLG:''
 +
 
 +
BEGIN ~SCSARLES~<br>
 +
 
 +
IF ~NumTimesTalkedTo(0)~ THEN BEGIN 0<br>
 +
SAY #28655<br>
 +
++ #28656 + 1<br>
 +
++ #28657 + 2<br>
 +
END
 +
 
 +
''сравните с оригиналом, приведенным в начале статьи.'')
 +
|-
 +
| valign=top | ''или''
 +
| valign=top | COPY_TRANS filename stateLabel
 +
| valign=top | This instructs WeiDU to copy all of the transitions from the state with the given stateLabel in filename.DLG. This copying takes place before all other D Actions. For example, this is a valid transition list:
 +
 
 +
IF ~Before()~ THEN GOTO my_state
 +
 
 +
COPY_TRANS PLAYER1 33
  
==5.1 Команды, не указанные в разделе "Command Line Options" документации [[WeiDU]]==
+
IF ~After()~ THEN EXTERN SOLA 55
 +
|-
 +
| colspan=3 | ''переведено не полностью - смотрите [http://www.weidu.org/~thebigg/README-WeiDU.html#htoc19 первоисточник]''
 +
|}
 +
 
 +
==Специальные ключи для использользования в командной строке (Command Line Options)==
 
{|width=96% align = center style="font-size: 100%; text-align: left" border=1 cellpadding=4 cellspacing=0
 
{|width=96% align = center style="font-size: 100%; text-align: left" border=1 cellpadding=4 cellspacing=0
 
|-
 
|-
! colspan=2 align=center| Translation Options
+
! colspan=2 align=center| Компилирование и декомпилирование (Compiling And Decompiling)
 +
|-
 +
| width=13% | FILE.[[D-файл|D]] || width=87% | Компилировать FILE в [[DLG-файл]] (dialogue file - ''файл диалога, используемый движком игры, прим.перев.'').
 +
|-
 +
|| FILE.[[DLG-файл|DLG]] || Декомпилировать файл FILE в [[D-файл]] (dialogue text file - ''файл диалога в текстовом виде, прим.перев.'').
 +
|-
 +
|| ''число'' || При декомпилировании [[DLG-файл]]а в [[D-файл]] вывести только шаг с определенным номером. Вы можете использовать это несколько раз и будут выведены только те шаги диалога, которые вы указали.
 +
|-
 +
|| ''числоA''-''числоB'' || При декомпилировании [[DLG-файл]]а в [[D-файл]] вывести только шаги с номерами, начиная с ''числаА'' и заканчивая ''числомB'' (включительно). Вы можете использовать это несколько раз и будут выведены только те шаги диалога, которые вы указали.
 +
|-
 +
|| FILE.[[BAF-файл|BAF]] || Компилировать файл FILE в [[BCS-файл]] (script file - ''файл скрипта в бинарном виде, используемый в игре, прим.перев.'').
 +
|-
 +
|| FILE.[[BCS-файл|BCS]] || Декомпилировать файл FILE в [[BAF-файл]] (script text file - ''файл скрипта в текстовом виде, прим.перев.'').
 +
|-
 +
|| '''--script-style''' X || Использовать для [[BAF-файл|BAF]]/[[BCS-файл|BCS]] указанный тип скриптов. Допустимые значения X: BG, BG2, PST, IWD, IWD1 или IWD2.
 +
|-
 +
|| '''--transin''' X || Использовать файл FILE в качестве источника текстовых строк при работе с [[D-файл|D]] и [[BAF-файл]]ами.
 +
|-
 +
|| FILE.[[TRA-файл|TRA]] || Равнозначно '''--transin''' FILE.TRA
 +
|}
 +
 
 +
===Команды, не указанные в разделе "Command Line Options" документации [[WeiDU]]===
 +
{|width=96% align = center style="font-size: 100%; text-align: left" border=1 cellpadding=4 cellspacing=0
 +
|-
 +
! colspan=2 align=center| Ключи для перевода (Translation Options)
 
|-
 
|-
 
|| '''--traify-comment''' || добавляет в [[D-файл]] содержимое строк, на которые даны ссылки, в виде комментариев, используется с командой --traify
 
|| '''--traify-comment''' || добавляет в [[D-файл]] содержимое строк, на которые даны ссылки, в виде комментариев, используется с командой --traify
 
|}
 
|}
  
==6 Примеры использования==
+
==Примеры использования==
 
===Декомпилирование из [[DLG-файл]]ов в [[D-файл]]ы===
 
===Декомпилирование из [[DLG-файл]]ов в [[D-файл]]ы===
 
Пример команды:
 
Пример команды:
Строка 232: Строка 357:
 
         ...
 
         ...
  
На экране будет отражена строка #123, все строки, содержащие слово "understudy", а также все строки содержимое соответствующие регулярному выражению "acid.*rows". Обратите внимение, что регистр букв не имеет значения.
+
На экране будет отражена строка #123, все строки, содержащие слово "understudy", а также все строки содержимое соответствующие регулярному выражению "acid.*rows". Обратите внимание, что регистр букв не имеет значения.
  
 
===Изменение DIALOG.TLK вручную===
 
===Изменение DIALOG.TLK вручную===
Строка 284: Строка 409:
 
   [.\SPERMEL.ITM] 890 bytes, created from [.\data\25Items.bif]
 
   [.\SPERMEL.ITM] 890 bytes, created from [.\data\25Items.bif]
 
    
 
    
При выполнении данной команды производился поиск в игре всех вещей ''(items, файлов с расширением .itm - прим.перев.)'', в названии которых используется "spear" и предполагалось, что игра установлена в ту же директорию, из которой запускалась команда. Обратите внимание, что ключ --biff-get использует регулярные выражения (regexp), но не групповые символы, которые используются в DOS. Также обратите внимание, что --biff-get не производит поиск в папдиректории override ''(обычно, там не должно быть [[BIFF-файл]]ов, - прим.перев.)''. И наконец, если вы используете Mac (или работаете под unix), можете без сомнений заключать регулярное выражение в кавычки, вот так:
+
При выполнении данной команды производился поиск в игре всех вещей ''(items, файлов с расширением .itm - прим.перев.)'', в названии которых используется "spear" и предполагалось, что игра установлена в ту же директорию, из которой запускалась команда. Обратите внимание, что ключ --biff-get использует регулярные выражения (regexp), но не групповые символы, которые используются в DOS. Также обратите внимание, что --biff-get не производит поиск в директории override ''(обычно, там не должно быть [[BIFF-файл]]ов, - прим.перев.)''. И наконец, если вы используете Mac (или работаете под unix), можете без сомнений заключать регулярное выражение в кавычки, вот так:
 
   C:\Program Files\Black Isle\BGII - SoA\> weidu --biff-get "sper.*itm"
 
   C:\Program Files\Black Isle\BGII - SoA\> weidu --biff-get "sper.*itm"
 
это предусмотрено.
 
это предусмотрено.
Строка 343: Строка 468:
 
Один нюанс: из-за команды --transitive [[WeiDU]] может легко впасть в бесконечный цикл. Ничего не поделаешь, прошу извинить.
 
Один нюанс: из-за команды --transitive [[WeiDU]] может легко впасть в бесконечный цикл. Ничего не поделаешь, прошу извинить.
  
==7.9  Преобразование "жестко закодированного" [[D-файл]]а в пару D/TRA (последнее обновление: v200)==
+
==Инструкции по использованию [[WeiDU]]==
 +
Данный раздел включает отдельные описания различных функций [[WeiDU]]. Многие из них составлены такими же пользователями, как и вы.
 +
 
 +
===7.9  Преобразование "жестко закодированного" [[D-файл]]а в пару D/TRA (последнее обновление: v200)===
 
Материал любезно предоставил Джейсон Комптон (Jason Compton).
 
Материал любезно предоставил Джейсон Комптон (Jason Compton).
  
Строка 363: Строка 491:
 
Однако, те пользователи [[WeiDU]], которые для удобства или им просто не приходила в голову идея о переводе, и они использовали "жестко закодированные" диалоги, а теперь изменили свое решение, могут воспользоваться командой --traify, которая преобразует весь текст в командах SAY, REPLY и записи JOURNAL в формат, удобный для перевода ''(трафицированный формат - прим.перев.)'' Команда --traify также может быть использована для [[TP2-файл]]ов.
 
Однако, те пользователи [[WeiDU]], которые для удобства или им просто не приходила в голову идея о переводе, и они использовали "жестко закодированные" диалоги, а теперь изменили свое решение, могут воспользоваться командой --traify, которая преобразует весь текст в командах SAY, REPLY и записи JOURNAL в формат, удобный для перевода ''(трафицированный формат - прим.перев.)'' Команда --traify также может быть использована для [[TP2-файл]]ов.
  
Чтобы преобразовать "жестко-закодированный" [[D-файл]] FWKI.d в комбинацию из новых файлов [[D-файл|D]] и [[TRA-файл|TRA]]''(трафицировать - прим.перев.)'', используйте команды --traify и --out, чтобы указать исходные и конечные имена файлов соответственно:
+
Чтобы преобразовать "жестко-закодированный" [[D-файл]] FWKI.d в комбинацию из новых файлов [[D-файл|D]] и [[TRA-файл|TRA]]''(трафицировать - прим.перев.)'', указать исходные и конечные имена файлов соответственно можно командами --traify и --out:
 
   C:\Program Files\Black Isle\BGII - SoA\> weidu --traify fwki.d --out fwki-new.d
 
   C:\Program Files\Black Isle\BGII - SoA\> weidu --traify fwki.d --out fwki-new.d
  
Строка 417: Строка 545:
 
''(Прим.перев.: во всех практических примерах в оригинале вместо --traify-old-tra использовалось отсутствующее в списке ключей командной строки --traify-tra, очевидно, ошибочно - исправлено.)''
 
''(Прим.перев.: во всех практических примерах в оригинале вместо --traify-old-tra использовалось отсутствующее в списке ключей командной строки --traify-tra, очевидно, ошибочно - исправлено.)''
  
==7.11  ALTER_TRANS (последнее обновление: v204)==
+
===7.11  ALTER_TRANS (последнее обновление: v204)===
  
 
Настоящее руководство любезно предоставил CamDawg.
 
Настоящее руководство любезно предоставил CamDawg.
Строка 435: Строка 563:
 
   END
 
   END
  
Здесь проблема в переходе (transition) 3 (нумерация начинается с 0, - прим.перев.): в начале проверки должно быть указано OR(4), а уже за потом проверки PartyHasItem. Без ALTER_TRANS, наименее неудобным способом составленное исправление выглядело бы так:
+
Здесь проблема в переходе (transition) 3 ''(нумерация начинается с 0, - прим.перев.)'': в начале проверки должно быть указано OR(4), а уже за потом проверки PartyHasItem. Без ALTER_TRANS, наименее неудобным способом составленное исправление выглядело бы так:
  
 
   ADD_TRANS_TRIGGER DOGHMA 9 ~False()~ DO 3
 
   ADD_TRANS_TRIGGER DOGHMA 9 ~False()~ DO 3
Строка 465: Строка 593:
 
* TRIGGER: Условие триггера, используемого для перехода, пример: "TRIGGER" ~Global("foo","GLOBAL",0)~
 
* TRIGGER: Условие триггера, используемого для перехода, пример: "TRIGGER" ~Global("foo","GLOBAL",0)~
 
* ACTION: Действие, выполняемое, если выбран данный переход, пример: "ACTION" ~SetGlobal("foo","GLOBAL",1)~
 
* ACTION: Действие, выполняемое, если выбран данный переход, пример: "ACTION" ~SetGlobal("foo","GLOBAL",1)~
* REPLY: Ответ игрока, если он требуется, пример: "REPLY" ~REPLY #57922~
+
* REPLY: Ответ игрока, если он требуется, пример (''начиная с версии 207 для номера строки [http://forums.pocketplane.net/index.php/topic,25437.0.html можно использовать префикс @ или #], - прим.перев.''): "REPLY" ~#57922~
* JOURNAL: Можно добавить или изменить запись журнала, пример: "JOURNAL" ~JOURNAL @100~
+
* JOURNAL: Можно добавить или изменить запись журнала, пример: "JOURNAL" ~@100~ (''прим.перев.: можно также: "JOURNAL" ~#100~'')
 
* SOLVED_JOURNAL: То же, что и JOURNAL, только для записей, указываемых в разделе "сделано".
 
* SOLVED_JOURNAL: То же, что и JOURNAL, только для записей, указываемых в разделе "сделано".
 
* UNSOLVED_JOURNAL: То же, что и JOURNAL, только для записей, указываемых в разделе "не сделано".
 
* UNSOLVED_JOURNAL: То же, что и JOURNAL, только для записей, указываемых в разделе "не сделано".
Строка 479: Строка 607:
 
   END
 
   END
  
Как видите, во втором переходе указание на заключительное действие содержит ошибку (в EXTERN не указан диалог, - прим.перев.). Раньше это пришлось бы исправлять таким образом:
+
Как видите, во втором переходе указание на заключительное действие содержит ошибку ''(в EXTERN не указан диалог, - прим.перев.)''. Раньше это пришлось бы исправлять таким образом:
  
 
   ADD_TRANS_TRIGGER BVICONI 103 ~False()~ DO 1
 
   ADD_TRANS_TRIGGER BVICONI 103 ~False()~ DO 1
Строка 490: Строка 618:
 
   ALTER_TRANS BVICONI BEGIN 103 END BEGIN 1 END BEGIN "EPILOGUE" ~GOTO 368~ END
 
   ALTER_TRANS BVICONI BEGIN 103 END BEGIN 1 END BEGIN "EPILOGUE" ~GOTO 368~ END
  
Дополнение: пожалуйста, обратите особое внимание на то, что флаги (например, REPLY или EPILOGUE)нужно заключать в кавычки, тильды или знаки процентов.
+
Дополнение: пожалуйста, обратите особое внимание на то, что флаги (например, REPLY или EPILOGUE) нужно заключать в кавычки, тильды или знаки процентов.
 +
 
 +
Еще одно дополнение: пустая срока после REPLY, JOURNAL и остальных флагов удаляет соответствующие действия, вместо того, чтобы, например, добавлять пустую строку в журнал (''прим.перев.: добавлено в версии 207'')
 +
 
 +
Пример (''прим.перев.: взято из [http://forums.pocketplane.net/index.php/topic,25339.msg311981.html#msg311981 обсуждения на форуме WeiDU]'') :
 +
 
 +
  ALTER_TRANS BVICONI
 +
  BEGIN 103 END
 +
  BEGIN 1 END
 +
  BEGIN
 +
    "JOURNAL" ~~ //пустая строка после флага удаляет команду на добавления записи в журнал
 +
  END
 +
 
 +
==Компоновка мода: [[TP2-файл]]ы (Module Packaging: TP2 Files)==
 +
{|width=96% align = center style="font-size: 100%; text-align: left" border=1 cellpadding=4 cellspacing=0
 +
|-
 +
! valign=top width=10% | [[TP2-файл]] || valign=top width=20% |  || valign=top width=70% | [[TP2-файл]] - это текстовый файл, в котором имеется одна или несколько компонентов (''компоненты - Components - так называется основная часть [[TP2-файл]]а, см.ниже, названия разделов, использующиеся в качестве команд, оставлены без перевода - прим.перев.'') мода . [[TP2-файл]]ы указывают [[WeiDU]], как инсталлировать различные части мода на компьютере пользователя.
 +
|-
 +
| valign=top | ''это''
 +
| valign=top | '''BACKUP''' ''имя_директории''
 +
'''AUTHOR''' ''адрес_email''
 +
 
 +
'''[[TP2-флаг]]''' ''list''
 +
 
 +
'''Language''' ''list''
 +
 
 +
'''Компонент''' ''list''
 +
| valign=top | [[TP2-файл]] - это необходимое вступление перед списком Компонентов. BACKUP указывает [[WeiDU]], куда поместить резервные копии файлов, которые будут перезаписаны, с тем, чтобы их можно было потом восстановить. Соответствующая директория, если потребуется, будет создана автоматически. AUTHOR служит для информирования пользователя об адресе, куда нужно обращаться с проблемами установки и багами. [[WeiDU]] устанавливает переменной '''TP2_AUTHOR''' значение ''адрес_email'', а переменной '''TP2_FILE_NAME''' - имя данного [[TP2-файл]]а. [[TP2-флаг]]и устанавливают глобальные настройки (global options). В секции Language (язык) описываются все языки, доступные для данного мода. И, наконец, секция Компоненты содержит собственно сам мод. Различные компоненты могут устанавливаться и удаляться независимо друг от друга, но все, что внутри компонента, рассматривается, как единое целое.
 +
|-
 +
| colspan=3 | 
 +
|-
 +
! valign=top align=left| [[TP2-флаг]] ||  || [[TP2-флаг]] содержит определенные общие настройки, которые использются [[WeiDU]] во время работы с конкретным [[TP2-файл]]ом.
 +
|-
 +
| valign=top | ''это''
 +
| valign=top | '''AUTO_TRA''' ''путь''
 +
| valign=top | Флаг AUTO_TRA используется вместе с инструкцией COMPILE TP2. Он указывает автоматически загрузить [[TRA-файл]]ы, соответствующие [[D-файл]]ам ''(соответствие подразумевает совпадение имен до расширения; [[TRA-файл]]ы загружаются из указанного пути, в котором может использоваться переменная '''%s''', которую [[WeiDU]] заменяет на указанную пользователем директорию языка, - прим.перев.).''
 +
|-
 +
| colspan=3 |  ''переведено не полностью - смотрите [http://www.weidu.org/~thebigg/README-WeiDU.html#htoc19 первоисточник]''
 +
|-
 +
! valign=top align=left| '''value''' ||  || Выражение, принимающее целое числовое значение (integer). См. --debug-value.
 +
|-
 +
| valign=top | ''это''
 +
| valign=top | integer
 +
| valign=top | Абсолютная ссылка или величина. Допускаются следующие форматы: десятичный (decimal), шестнадцати- (hex) и восьмеричный (octal), а также бинарный (binary). Для шестнадцатеричного используйте 0x, для восьмеричного - 0o, для бинарного - 0b.
 +
|-
 +
| colspan=3 |  ''переведено не полностью - смотрите [http://www.weidu.org/~thebigg/README-WeiDU.html#htoc19 первоисточник]''
 +
|-
 +
| valign=top | ''или''
 +
| valign=top | '''GAME_IS''' String
 +
| valign=top | Возвращает ИСТИНА, если переменная IE game принимает значения из списка (String), иначе - ЛОЖЬ. Список - это перечень определенных значений, разделенных пробелами. Значения могут быть следующие (регистр не различается): bg2=soa, tob, iwd2, pst, bg1, totsc, iwd=iwd1, how,  tolm=totlm, tutu, tutu_totsc, bgt (''все это устоявшиеся сокращения, обозначающие игры [[Infinity Engine]], прим.перев.''). Указания типа bg2=soa означают синонимы: bg2 - это синоним soa. Обратите внимание, проверяется именно точное соответствие игры: например, bg2 проверяет наличие именно [[Baldur's Gate II: Shadows of Amn]], без установленного [[Trone of Bhaal]], или [[tutu]], а bgt проверяет наличие [[TOB]] (и отсутствие [[TOSC]]) и установленного мода [[Baldur's Gate Trilogy]] (''такой порядок действует с версии 210, прим.перев.''). Соответственно, если для [[мод]]а требуется установленная SOA и tutu, то в нем должна быть следующая проверка: REQUIRE_PREDICATE GAME_IS ~bg2 tob tutu tutu_totsc~.
 +
|}
  
 
==11 Распространение [[WeiDU]] с модулями ([[мод]]ами) в виде: Setup-MyMod.exe==
 
==11 Распространение [[WeiDU]] с модулями ([[мод]]ами) в виде: Setup-MyMod.exe==
Если переименовать WeiDU.EXE так, чтобы получилось нечто похожее на Setup-MyMod.exe, то запуск этой программы будет соответстовать запуску WeiDU.EXE с такими аргументами командной строки:
+
Если переименовать WeiDU.EXE так, чтобы получилось нечто похожее на Setup-MyMod.exe, то запуск этой программы будет соответствовать запуску WeiDU.EXE с такими аргументами командной строки:
 
* --tlkout DIALOG.TLK
 
* --tlkout DIALOG.TLK
 
* --ftlkout DIALOGF.TLK (если имеется DIALOGF.TLK)
 
* --ftlkout DIALOGF.TLK (если имеется DIALOGF.TLK)
Строка 499: Строка 677:
 
* Setup-MyMod.tp2
 
* Setup-MyMod.tp2
 
* MyMod.tp2
 
* MyMod.tp2
''(эта функция призвана способствовать упрощению организации процедуры установки модов, но часто используется разработчиками как предлог для оптимизации архивов модов - в них вообще не включается EXE-файл и подразумевается, что пользователь должен самостоятельно переименовать WeiDU.EXE в вид, соответствующий [[TP2-файл]]у [[мод]]а, а при необходимости, - скачать и сам архив [[WeiDU]], - прим.перев.)''
+
''Примечания переводчика:''
 +
#''эта функция призвана способствовать упрощению организации процедуры установки модов, но часто используется разработчиками как предлог для оптимизации архивов модов - в них вообще не включается EXE-файл и подразумевается, что пользователь должен самостоятельно переименовать WeiDU.EXE в вид, соответствующий [[TP2-файл]]у [[мод]]а, а при необходимости, - скачать и сам архив [[WeiDU]];''
 +
#''хоть это не указано, однако, нижеследующие аргументы также подразумеваются при запуске Setup-MyMod.exe:''
 +
* MyMod/Setup-MyMod.tp2
 +
* MyMod/MyMod.tp2
 +
''они полезны, т.к. позволяют размещать все файлы мода в одном месте - папке мода, а не отягощать ими основной каталог игры (в нем от мода остаются только EXE и DEBUG-файлы).''
  
 
==11.2  Значения, которые возвращает [[WeiDU]]==
 
==11.2  Значения, которые возвращает [[WeiDU]]==
Строка 508: Строка 691:
 
* 2. Ошибка авто-обновления.
 
* 2. Ошибка авто-обновления.
 
* 3. Повторная попытка авто-обновления. WeiDU.exe успешно обновлен, нужно запустить WeiDU.exe еще раз.
 
* 3. Повторная попытка авто-обновления. WeiDU.exe успешно обновлен, нужно запустить WeiDU.exe еще раз.
* 4. Неверный ключ коммандной строки.  
+
* 4. Неверный ключ командной строки.  
  
 
[[Категория:Алфавитный указатель]] [[Категория:Разработка модов]]
 
[[Категория:Алфавитный указатель]] [[Категория:Разработка модов]]

Текущая версия на 01:01, 12 января 2009

Данная статья - попытка представить перевод на русский язык документации WeiDU, включаемой в архив программы, дополненный, по-возможности, комментариями и замечаниями, основанными на личном опыте составителей.

Оригинальную документацию смотрите здесь.

Содержание

Краткая информация о WeiDU[править]

У WeiDU есть в Интернете домашняя страница:http://weidu.org/. Рекомендую вам загрузить оттуда самую свежую версию.

WeiDU разработан (уже сложилась практика называть эту программу в мужском роде: он, WeiDU - прим.перев.) для того, чтобы упростить процесс написания и распространения модификаций (модов) для игр на Infinity Engine. Он может загружать и производить действия с ресурсами Infinity Engine по инструкциям, которые вы ему напишете. WeiDU идеален для упаковки модификаций с диалогами, или таких, которые должны быть совместимы с другими модификациями.

Сразу честно признаюсь: WeiDU поначалу кажется сложнее в использовании, чем другие подобные программы. Однако, большинство пользователей сходятся во мнении, что: во-первых, альтернативные программы не могут удовлетворить их из-за отсутствия функций, которые в WeiDU имеются, и, во-вторых, к WeiDU быстро привыкаешь.

Вы можете смело использовать эту программу для разработки и распространения своих собственных модов на Infinity Engine. На WeiDU распространяется действие GNU (General Public License), но, в расширение ее, вы имеете право, если пожелаете, свободно включать в состав мода бинарный исполняемый файл WeiDU.EXE (в неизмененном виде и без исходного кода).

Я решил написать свою собственную утилиту для работы с DLG и TLK в Infinity Engine, потому что не смог добиться от TeamBG DLG Editor и Mass Converter правильной работы. Эти программы не анализируют строки, или могут испортить текст, или могут вдруг зависнуть ... где ни ткни, везде что-нибудь да не так. К тому же, все они основаны на GUI (графическом интерфейсе). Будучи воспитанным на unix, я обожаю программы, работающие в командной строке, а как дипломированный PL-специалист (специалист по языкам программирования, - прим.перев.), я люблю разрабатывать всякие языки и компиляторы. WeiDU изначально состоял из нескольких маленьких программочек с ничего не говорящими названиями: DC, DD и TP. Более привлекательный термин "WeiDU" (который рифмуется с "IDU" - сокращение от interface data unit, интерфейсный блок данных, прим.перев. - и "Eye-Dee-You" - не очень понятное сочетание; наверное наиболее интересным является созвучность с "we do", мы делаем, - прим.перев.) придумали Джейсон Комптон (Jason Compton) и Грейфэйн (Ghreyfain) - выдающиеся авторы модов для BGII.

Без паники![править]

Пошаговое руководство к WeiDU для новичков:

1. Без паники. Многие из вас - дети эры графических пользовательских интерфейсов (GUI). Но программы, которые работают в командной строке, тоже могут быть вашими друзьями, и, по большому счету, они работают гораздо быстрее, а использовать их, на самом деле, гораздо проще.

2. Лучший способ научиться писать код в формате WeiDU - прочитать код, написанный в этом формате (то есть, в формате D). Начните с декомпиляции уже существующих игровых файлов DLG, которые вы хорошо знаете, и прочитайте полученные файлы. Сравните то, как они выглядят в WeiDU и то, как они выглядят в других редакторах, с которыми вы, возможно, лучше знакомы (например, Near Infinity и Infinity Explorer).

3. Лучший способ научиться писать код в формате WeiDU - прочитать код, написанный в этом формате, часть 2. При помощи WeiDU создается все больше модов для BG2. Список можно найти, например, здесь: http://www.pocketplane.net/modlist/. Они помогут вам понять, как использовать более сложные функции WeiDU, такие как добавление диалогов, работа со скриптами и 2DA-файлами, а также вещами (item), заклинаниями (spells) и существами (creature), которые используются непосредственно в игре. Поставьте себе такую задачу: скачать определенный мод и разобраться КАК ИМЕННО он работают.

4. Посмотрите примеры в этом документе. Есть замечательное руководство к WeiDU (написанное Japheth): http://forums.pocketplane.net/index.php?topic=55.0 (русский перевод здесь). Если чувствуете, настоящее руководство для вас слишком сложно, зайдите сначала туда. Там также объясняется как установить утилиту. Ghreyfain написал туториал "как создать NPC при помощи WeiDU" http://forums.pocketplane.net/index.php?topic=52.0 (русский перевод здесь )

5. Есть специальный форум для обсуждения WeiDU: http://forums.pocketplane.net/index.php?board=50.0. Для того, чтобы получить ответ на вопросы по использованию WeiDU (и по разработке модов тоже), этот форум - самое подходящее место.

6. Ну, и, наконец, если Вы используете Mac и собираетесь пользоваться WeiDU, посетите http://weidu.org/Mac.html - там содержится информация по созданию копии WeiDU, работающей под OS X.

Концепция D и DLG-файлов[править]

В этом разделе описано, как в принципе устроены DLG-файлы в Infinity Engine. Для начала, давайте воспользуемся WeiDU, чтобы создать SCSARLES.D, и посмотрим на диалог Сэра Сарльза (Sir Sarles).

WeiDU можно устанавливать где угодно, но мой вам совет - лучше разместите его в директории, куда установлена игра Baldur’s Gate 2. Впрочем, WeiDU использует реестр Windows чтобы обнаружить, куда установлена игра BG2.

Итак, чтобы сделать намеченное (создать SCSARLES.D, - прим.перев.), откройте режим командной строки DOS, перейдите в директорию (пользуясь командами DOS: буква с двоеточием - C: - для смены диска, и CD Program Files\Black Isle\BGII - SoA, как в примере, для перехода в нужную директорию, прим.перев.), куда установлена игра BGII, и затем, напечатайте нижеприведенный текст:

 C:\Program Files\Black Isle\BGII - SoA\>weidu SCSARLES.DLG

В текущей директории будет создан текстовый файл SCSARLES.D. Откройте его в Блокноте, или в Microsoft Word, или любым другим текстовым редактором. Вы увидите - это обычный текстовый файл, в котором определенным образом подробно расписан диалог игры.

Вы увидите примерно следующее (приведен пример начала файла диалога, выдаваемого версией 204, с дополнительными комментариями, не указанными в оригинальном руководстве- прим.перев.):

 // creator  : c:\bgate\WeiDU\weidu.exe
 // argument : SCSARLES.DLG
 // game     : C:\Program Files\Black Isle\BGII - SoA
 // source   : C:\Program Files\Black Isle\BGII - SoA\data\Dialog.bif
 // dialog   : C:\Program Files\Black Isle\BGII - SoA\DIALOG.TLK
 // dialogF  : (none)
 
 BEGIN ~SCSARLES~
 //////////////////////////////////////////////////
 // WARNING: this file contains non-trivial WEIGHTs (ВНИМАНИЕ: данный файл содержит нестандартные "веса", прим.перев.)
 //////////////////////////////////////////////////
 
 IF WEIGHT #1 /* Triggers after states #: 34 even though they appear after this state */
 ~NumTimesTalkedTo(0)
 ~ THEN BEGIN 0 // from:
   SAY #28655 /* ~Кто это? Могу я спросить, зачем вы прервали мои размышления? Муза моего творчества должна пробуждаться нежно, а ваше топанье просто ничего не даст.~ [SARLES02] */
   IF ~~ THEN REPLY #28656 /* ~Мои извинения. Я оставлю тебя твоим раздумьям.~ */ GOTO 1
   IF ~~ THEN REPLY #28657 /* ~Я прошу прощения, но мне нужен твой талант для выполнения важной работы.~ */ DO ~SetGlobal("TalkedToSarles","GLOBAL",1)
 ~ GOTO 2
 END
 
 IF ~~ THEN BEGIN 1 // from: 0.0
   SAY #28661 /* ~Тогда я забуду, что вы вообще здесь были. На самом деле это будет изумительно легко сделать.~ */
   IF ~~ THEN DO ~SetNumTimesTalkedTo(0)
 ~ EXIT
 END

Диалоги в играх на Infinity Engine работают, как конечные автоматы (finite state machine, FSM - термин, обозначающий вычислительную модель с определенным числом состояний, переход к которым осуществляется управляющими командами на основании внешних данных, - прим.перев.). Если вы не имеете ни малейшего представления о том, что такое конечные автоматы, загляните на http://whatis.techtarget.com/definition/0,,sid9_gci213052,00.html или на http://www.c3.lanl.gov/mega-math/workbk/machine/mabkgd.html. Каждый блок, имеющий вид:

 IF ~Изначальное условие~ THEN BEGIN шаг1
   SAY ~Что-нибудь~
   IF ~Условие для ответа~ THEN REPLY ~Текст ответа~ GOTO шаг2
 END

описывает один шаг (state) (более детально см. ниже). Когда игрок начитает общение с НПС (NPC), движок игры сканирует все шаги в DLG-файле этого NPC в порядке, определяемом их "весом" (WEIGHT), и выбирает один не являющийся пустым и проверка "Изначальное условие" которого выдает ПРАВДА (true). Если таких шагов не найдено, то игра выдает сообщение: "Нечего вам сказать" (в окне сообщений выдается имя НПС и строка #32092 ~ has nothing to say to you.~, - прим.перев.). Про порядок определения "весов" не думайте - это пока не нужно.

Итак, если шаг найден, говорящий (в данном случае, Сэр Сарльз) говорит то, что указано после SAY. В строках REPLY приводятся возможные ответы игрока. Если проверка "Условие для ответа" выдает ПРАВДА, то игроку дается возможность сказать фразу "Текст ответа" и перейти к другому шагу диалога (где Сарльз, возможно, скажет что-нибудь еще).

Запомните: SAY - это то, что говорит НПС, а REPLY - то, что ему отвечает игрок. Если обратить внимание, то легко заметить, что абсолютно все диалоги в играх на Infinity Engine построены таким образом.

В условиях используется тот же синтаксис, что и в триггерах скриптов BCS в Infinity Engine. Хорошо бы, конечно, вам изучить написание скриптов в Infinity Engine - это отдельная большая тема. Строки заключаются справа и слева в тильды (~), знаки процентов (%) или кавычки (") - на ваш выбор - по умолчанию же WeiDU использует тильды. После SAY, или REPLY, или JOURNAL можно, вместо одной, давать две строки (string): первая используется для DIALOG.TLK, а вторая - для DIALOGF.TLK (версия диалога, когда главный персонаж женского пола - для иностранных языков, в которых такое различие существенно). Если вы указываете только одну строку, то предполагается, что в обоих случаях текст будет одинаковым (если имеется DIALOGF.TLK, то в него всегда заносится текст - две строки указано или одна, - прим.перев.).

Можно также использовать цифры, перед которыми стоит знак "#" (например, #1234) - так указывается прямая ссылка на номер строки в DIALOG.TLK. Это удобно, когда изменяется уже имеющийся диалог (скажем, Духа судьбы в ТОБ), в этом случае, если диалог будет инсталлировать иностранный пользователь, то в тех строках, которые не изменялись, будет использоваться текст из его игры и их не надо будет переводить. Обычно ссылки на номера строк указываются сразу за SAY, а сам текст помещается в комментарии. Ключ командной строки --text, наоборот, позволяет в комментариях номера строк.

Сразу нужно сказать про звуковые файлы (WAV/WAVC) - они присоединяются к нужной строке в виде имени ресурса (не более 8 символов), заключенного в [квадратные скобки] после текста (не забудьте пробел после тильды, - прим.перев.), вот так:

 SAY ~Привет~ [HELLO]

Комментарии делаются аналогично принятому в C/C++: все, что идет после // и до конца строки - это комментарий, так же, как и все, что /* находится между слэшами со звездочкой */. Комментарии WeiDU игнорирует - они только для вашего удобства. Пример:

 SAY ~Привет~ [HELLO]   // это все идет комментарий        ... аж до сюда!
 IF /* здесь тоже комментарий */ ~~ THEN EXIT

Ответы (REPLY) могут также содержать и действия (указание делается ключевым словом DO) - практически, точно такие же, как скриптовые действия (script actions BCS) в Infinity Engine. Кроме того, в ответах можно добавлять записи журнала (Journal entries), завершать диалог (EXIT) или даже переключаться на диалог другого НПС (EXTERN).

Примеры:

 IF ~~ THEN BEGIN 2 // from: 0.1 (комментарий формирует по умолчанию сам WeiDU, поэтому он оставлен непереведенным, - прим.перев.)

Вышеприведенная строка означает, что в диалоге начался шаг 2. Комментарий поясняет, что этот шаг может быть доступен после ответа-перехода 1 в шаге 0.

 IF ~~ THEN REPLY ~Мои извинения. Я оставлю тебя твоим раздумьям.~ // #28656
     GOTO 1

Данный ответ будет доступен всегда (поскольку условие не задано - ~~, - прим.перев.) и в окне сообщений будет выведена строка: "Мои извинения...". Номер строки, соответствующей этому тексту - 28656. Если персонаж игрока (PC - player character) выбирает данный ответ, происходит переход к шагу 1. (Пример несколько отличается от содержимого SCSARLES.DLG, полученного ранее, - текст строки указан частью программы диалога, а не в комментарии, - данный вид обычно имеют классические, жестко закодированные, диалоги модов, что и объясняет выбор примера, - прим.перев.)

Наконец, переход может выглядеть следующим образом:

 COPY_TRANS имя_файла ярлык

Во время исполнения диалога, COPY_TRANS будет заменен переходами, взятыми из шага "ярлык" файла имя_файла. Копирование происходит до начала выполнения других команд диалога (D-actions).

Формат D-файла диалога (D-формат)[править]

Формат D-файла (D-формат) - это способ описания диалогов Infinity Engine и их порядка модифицирования в компактном, легко читаемом виде. Он поддерживает перевод на разные языки и позволяет вам указать переходы к диалогам, которые уже имеются в игре, без приведения содержимого этих диалогов. Все это позволяет вам создавать моды, которые будут работать с другими модами, написанными другими людьми.

Описание формата D-файлов представлено здесь с использованием расширенной контекстно-свободной грамматики (extended context-free grammar notation). Если термин CFG ни о чем вам не говорит, загляните на http://www.wikipedia.com/wiki/Context-free_grammar, http://cs.wpi.edu/~kal/PLT/PLT2.1.2.html или http://www.cs.rochester.edu/users/faculty/nelson/courses/csc_173/grammars/cfg.html. Впрочем, досконально разбираться в CFG не обязательно.

Чтобы разобраться, как это все работает, с помощью WeiDU создайте для себя JAHEIRA.D и смотрите его в текстовом редакторе. Не лишним будет просмотр и тестирование примеров, которые прилагаются к WeiDU (в папке examples, - прим.перев.).

Все ключевые слова синтаксиса даны в ВЕРХНЕМ РЕГИСТРЕ. Остальные ключевые слова символические (призваны интуитивно подсказывать, чем их в реальности заменять, - прим.перев.). Запомните, что:

  • "list" после выражения означает "далее, если нужно, могут быть еще такие же выражения" или "0, 1 или более выражений";
  • "[выражение в квадратных скобках]" означает "не обязательное выражение" или "0 или 1 выражение";
  • многоточие (...) после выражения означает "можно повторить выражение столько раз, сколько захочется".
  • под термином "выражение" подразумевается ключевое слово, то есть часть команды, отделенная о других знаками пробела, - прим.перев.


D-файл D-файл - это текстовый файл, который содержит определенный набор D-действий (D Action). D-файлы указывают WeiDU, каким образом создавать и изменять DLG-файлы, используемые движком Infinity Engine.
это D-действие list D-файл - это список D-действий. В принципе, только одна - BEGIN - указывает на создание нового диалога. Остальные D-действия используются для изменения существующих диалогов.
D-действие D-действия указывают WeiDU, каким образом создавать и изменять DLG-файлы, используемые движком Infinity Engine.
это BEGIN имя_файла [ nonPausing ] шаг list BEGIN указывает WeiDU, что вы собираетесь создать с помощью программы новый DLG-файл. DLG-файл с аналогичным именем будет заменен создаваемым. Новый файл будет содержать только те шаги, которые вы укажете. Если зададите переменной nonPausing значение, отличное от нуля, то во время диалога время останавливаться не будет. По умолчанию же во время диалога игра встает на паузу.
или APPEND [ IF_FILE_EXISTS ] имя_файла шаг list END Данная команда указывает WeiDU добавить указанные шаги в конец уже существующего файла имя_файла.DLG. Если указан параметр IF_FILE_EXISTS, а файла в игре не существует, то действие не выполняется.
переведено не полностью - смотрите первоисточник
переход (transition) Переходы определяют порядок следования частей диалога
это IF transTriggerString [ THEN ] transFeature list transNext If the transTriggerString evaluates to true or is empty, this transition is viable. If it contains no replyText within its transFeature list, it is immediately taken. Otherwise, the replyText is presented as an option to the user. If the transition is taken, any actions in the transFeature list are performed and the dialogue flows to the point indicated by the transNext. transitions are evaluated in "reverse order". That is, the "bottom" or "last" response for a state is checked first. If its transTriggerString evaluates to true and it has no REPLY text, that transition is immediately taken. See SAREV25A state 1 for an example of a state with all kinds of transitions.
или + [ условие_перехода ] + текст_ответа опции_перехода list после_перехода Это сокращенный синтаксис для наиболее часто используемых переходов - с ответами (REPLY). Позволяет сэкономить время и силы, в остальном полностью соответствует стандартному варианту, приведенному выше. (Прим.перев: Команды IF, REPLY, а также GOTO заменены знаками +, THEN опущено. Пример сокращенного форматирования начала диалога SCSARLES.DLG:

BEGIN ~SCSARLES~

IF ~NumTimesTalkedTo(0)~ THEN BEGIN 0
SAY #28655
++ #28656 + 1
++ #28657 + 2
END

сравните с оригиналом, приведенным в начале статьи.)

или COPY_TRANS filename stateLabel This instructs WeiDU to copy all of the transitions from the state with the given stateLabel in filename.DLG. This copying takes place before all other D Actions. For example, this is a valid transition list:

IF ~Before()~ THEN GOTO my_state

COPY_TRANS PLAYER1 33

IF ~After()~ THEN EXTERN SOLA 55

переведено не полностью - смотрите первоисточник

Специальные ключи для использользования в командной строке (Command Line Options)[править]

Компилирование и декомпилирование (Compiling And Decompiling)
FILE.D Компилировать FILE в DLG-файл (dialogue file - файл диалога, используемый движком игры, прим.перев.).
FILE.DLG Декомпилировать файл FILE в D-файл (dialogue text file - файл диалога в текстовом виде, прим.перев.).
число При декомпилировании DLG-файла в D-файл вывести только шаг с определенным номером. Вы можете использовать это несколько раз и будут выведены только те шаги диалога, которые вы указали.
числоA-числоB При декомпилировании DLG-файла в D-файл вывести только шаги с номерами, начиная с числаА и заканчивая числомB (включительно). Вы можете использовать это несколько раз и будут выведены только те шаги диалога, которые вы указали.
FILE.BAF Компилировать файл FILE в BCS-файл (script file - файл скрипта в бинарном виде, используемый в игре, прим.перев.).
FILE.BCS Декомпилировать файл FILE в BAF-файл (script text file - файл скрипта в текстовом виде, прим.перев.).
--script-style X Использовать для BAF/BCS указанный тип скриптов. Допустимые значения X: BG, BG2, PST, IWD, IWD1 или IWD2.
--transin X Использовать файл FILE в качестве источника текстовых строк при работе с D и BAF-файлами.
FILE.TRA Равнозначно --transin FILE.TRA

Команды, не указанные в разделе "Command Line Options" документации WeiDU[править]

Ключи для перевода (Translation Options)
--traify-comment добавляет в D-файл содержимое строк, на которые даны ссылки, в виде комментариев, используется с командой --traify

Примеры использования[править]

Декомпилирование из DLG-файлов в D-файлы[править]

Пример команды:

 C:\Program Files\Black Isle\BGII - SoA\> weidu bodhi.dlg --log log.txt

(ключ --log log.txt добавлен здесь и далее в командах для возможности сохранения протокола работы команды в файле log.txt и возможности его просмотра после завершения работы WeiDU, - прим.перев.)

Результат (см. файл log.txt - прим.перев.):

 [C:\Program Files\Black Isle\BGII - SoA\chitin.key] 182 BIFFs, 41793 resources
 [C:\Program Files\Black Isle\BGII - SoA\DIALOG.TLK] 84458 string entries
 [C:\Program Files\Black Isle\BGII - SoA\data\Dialog.bif] 2729 file entries
 [BODHI.DLG] loaded
 [.\BODHI.D] created from [BODHI.DLG]

Данная команда загружает файл BODHI.DLG (первый обнаруженный - прим.перев.), производя поиск по стандартному пути (то есть в текущей директории, папке override и, наконец, в BIFF-файлах игры) и создает из него файл BODHI.D (поскольку не задан ключ --out, файл будет помещен в текущую директорию, - прим.перев.).

Декомпилирование DLG-файлов в удобный для перевода формат[править]

Пример команды:

 C:\Program Files\Black Isle\BGII - SoA\> weidu bodhi.dlg --trans --log log.txt

Результат (см.файл log.txt - прим.перев.):

       ...
 [.\BODHI.TRA] created as translation file
 [.\BODHI.D] created from [BODHI.DLG]

Данная команда, так же как и предыдущая, создает файл BODHI.D, но также создает еще и файл перевода - BODHI.TRA (этот файл, TRA-файл, представляет собой перечень всех текстовых строк из BODHI.D, что удобно для перевода и проверки ошибок) (WeiDU игнорирует совпадающие строки, в том числе и при создании TRA-файлов - повторения строк не будут выведены, даже если D-файл ссылается на разные строки DIALOG.TLK с одинаковым содержанием, - прим.перев.). В файле BODHI.D будут сделаны специальные ссылки на строки из файла BODHI.TRA.

Это довольно удобно, особенно при конвертировании в формат WeiDU модификаций, созданных ранее с помощью других утилит, например IDU. Одновременно создается и D-файл для WeiDU и TRA-файл, содержащий все необходимые ссылки, и к тому же, удобный для перевода.

Некоторые опции при декомпилировании DLG-файлов[править]

Пример команды:

 C:\Program Files\Black Isle\BGII - SoA\> weidu --nofrom bodhi.dlg --out foozle.d --text --log log.txt

Результат (см.файл log.txt - прим.перев.):

       ...
 [.\foozle.d] created from [BODHI.DLG]

Данная команда создает файл foozle.d (а не BODHI.D, как в предыдущем примере), но не указывает в нем комментарии "// from:" (такие комментарии WeiDU создает по умолчанию - они указывают на взаимосвязь веток диалога - прим.перев.). Текстовые строки в команде SAY (и всех других тоже, - прим.перев.) также не заменяются. То есть будет создано:

SAY ~Hello~ /* #1 */ 

вместо

SAY #1 /* ~Hello~ */

Декомпилирование нескольких DLG-файлов[править]

Пример команды:

 C:\Program Files\Black Isle\BGII - SoA\> weidu bodhi.dlg jaheira.dlg --out test --log log.txt

Результат (см.файл log.txt - прим.перев.):

       ...
 [test\JAHEIRA.D] created from [JAHEIRA.DLG]
 [test\BODHI.D] created from [BODHI.DLG]

Данная команда загружает из игры (согласно стандартному пути поиска, - прим.перев.) файлы BODHI.DLG и JAHEIRA.DLG и создает из них файлы BODHI.D and JAHEIRA.D соответственно. Дополнительный аргумент --out test указывает WeiDU записать получившиеся файлы в директорию test.

Компилирование D-файла[править]

Пример команды:

 C:\Program Files\Black Isle\BGII - SoA\> weidu bodhi.d --log log.txt

Результат (см.log.txt - прим.перев.):

       ...
 [bodhi.d] parsed
 [BODHI.DLG] saved       135 states, 259 trans, 16 strig, 66 ttrig, 54 actions

Эта команда загружает bodhi.d, анализирует его, а затем исполняет все указанные в нем инструкции. В результате из вашего bodhi.d будет создан BODHI.DLG (далее речь идет о ссылках на номера строк в DIALOG.TLK, следовательно, имеется в виду тот bodhi.d, который был создан командой из предыдущего примера - без ключа --trans, - прим.перев.). Если в bodhi.d содержатся строки, которые отсутствуют в DIALOG.TLK, то DLG-файл будет создан с неправильными ссылками на строки.

Компилирование D-файла, в котором имеется новый текст[править]

Пример команды:

 C:\Program Files\Black Isle\BGII - SoA\> weidu bodhi.d --tlkout new-DIALOG.TLK --log log.txt

Результат (см.log.txt - прим.перев.):

       ...
 [bodhi.d] parsed
 [BODHI.DLG] saved       135 states, 259 trans, 16 strig, 66 ttrig, 54 actions
 [new-DIALOG.TLK] created, 84459 string entries

Данная команда загружает bodhi.d, анализирует его, а затем исполняет все указанные в нем инструкции. В результате из вашего bodhi.d будет создан BODHI.DLG. Если в bodhi.d содержатся какие либо строки, отсутствующие в DIALOG.TLK, то будет создана его новая версия, new-DIALOG.TLK, в которую они будут добавлены.

Компилирование нескольких D-файлов[править]

Пример команды:

 C:\Program Files\Black Isle\BGII - SoA\> weidu ppworker.d bodhi.d --out test --log log.txt

Результат (см.log.txt - прим.перев.):

       ...
 [bodhi.d] parsed
 [ppworker.d] parsed
 [BODHI.DLG] saved       135 states, 259 trans, 16 strig, 66 ttrig, 54 actions
 [PPWORKER.DLG] saved    33 states, 81 trans, 4 strig, 12 ttrig, 10 actions

Эта команда создает в директории test файлы BODHI.DLG и PPWORKER.DLG на основании инструкций, указанных в файлах bodhi.d и ppworker.d соответственно. Если в этих файлах имеется новый текст, используйте команду --tlkout для создания нового DIALOG.TLK.

Компилирование D-файла с получением нескольких DLG-файлов[править]

Пример команды (здесь предполагается, что установлен мод Солафейн, если нет - команды работать не будут, прим.перев.):

 C:\Program Files\Black Isle\BGII - SoA\> weidu examples/sola/solae1.d --log log.txt

или

 C:\Program Files\Black Isle\BGII - SoA\> weidu examples\sola\solae1.d --log log.txt

Результат (см.log.txt - прим.перев.):

       ...
 [examples/sola/solae1.d] parsed
 [SOLA.DLG] loaded
 [SOLA.DLG] saved        336 states, 401 trans, 64 strig, 18 ttrig, 125 actions
 [SOLAE1.DLG] saved      36 states, 49 trans, 1 strig, 11 ttrig, 1 actions
 [SOLAE2.DLG] saved      3 states, 3 trans, 0 strig, 0 ttrig, 0 actions
 [SOLAE3.DLG] saved      2 states, 2 trans, 0 strig, 0 ttrig, 0 actions
 [SOLAE4.DLG] saved      3 states, 3 trans, 1 strig, 0 ttrig, 0 actions
 [SOLAE5.DLG] saved      2 states, 2 trans, 0 strig, 0 ttrig, 0 actions
 [SOLAE6.DLG] saved      4 states, 5 trans, 0 strig, 2 ttrig, 0 actions
 

Происходит следующее: solae1.d добавляет (с помощью команды APPEND, - прим.перев.) текст в файл SOLA.DLG и создает файлы SOLAE1.DLG, SOLAE1.DLG, SOLAE3.DLG, ..., SOLAE6.DLG. Вы можете сразу положить их все в директорию override командой --out override. Для разделения директорий можно пользоваться и косой чертой (/) и обратной (\) (прямой и обратный слэш, - прим.перев.). Если известно, что в этих файлах имеется новый текст, используйте команду --tlkout для создания нового DIALOG.TLK.

Компилирование D-файла, который использует TRA-файл[править]

Пример команды (здесь предполагается, что установлен мод Солафейн, если нет - команды работать не будут, прим.перев.):

 C:\Program Files\Black Isle\BGII - SoA\> weidu examples/sola/solafoe.d --transin examples/sola/solafoe.tra --log log.txt

или

 C:\Program Files\Black Isle\BGII - SoA\> weidu examples/sola/solafoe.d examples/sola/solafoe.tra --log log.txt

Результат (см.log.txt - прим.перев.):

       ...
 [examples/sola/solafoe.tra] parsed (15 translation strings)
 [examples/sola/solafoe.d] parsed
 [SOLA.DLG] loaded
 [SOLA.DLG] saved        336 states, 401 trans, 65 strig, 18 ttrig, 124 actions
 [SOLAFOE.DLG] saved     11 states, 14 trans, 1 strig, 2 ttrig, 1 actions


Происходит следующее: solafoe.d использует 15 строк из файла перевода (TRA-файла), дописывает командой APPEND кусок к SOLA.DLG, а также создает SOLAFOE.DLG. Чтобы указать TRA-файл, можете использовать ключ --transin (как в первом примере команды, - прим.перев.) или просто укажите его в командной строке (если он, как и положено, имеет расширение TRA, как во втором примере команды, - прим.перев.). Если вы указываете несколько TRA-файлов, то для подстановки берется первая найденная строка с нужным номером, причем поиск начинается с последнего указанного файла - достаточно или нет строк в TRA-файлах не имеет значения. Если добавляется текст, используйте ключ --tlkout.

Отображение строковых ссылок[править]

(String References, строковые ссылки или просто строки - это нумерованные ссылки на строки в файле DIALOG.TLK, - прим.перев.) Пример команды:

 C:\Program Files\Black Isle\BGII - SoA\> weidu --string 123 --strfind understudy --strfind acid.*rows

(результат будет возможно увидеть только на экране - ключ --out здесь не работает, - прим.перев.)

       ...
 [C:\Program Files\Black Isle\BGII - SoA\chitin.key] 182 BIFFs, 41793 resources
 [C:\Program Files\Black Isle\BGII - SoA\DIALOG.TLK] 84458 string entries
 String #123 is ~Haer' Dalis, all of you, stop them!~
 String #6763 is ~Acid Arrows~
 String #11662 is ~Biff The Understudy~
       ...

На экране будет отражена строка #123, все строки, содержащие слово "understudy", а также все строки содержимое соответствующие регулярному выражению "acid.*rows". Обратите внимание, что регистр букв не имеет значения.

Изменение DIALOG.TLK вручную[править]

Пример команды: C:\Program Files\Black Isle\BGII - SoA\> weidu --strapp ANewString --tlkout happy.tlk --log log.txt

Результат (см.log.txt - прим.перев.):

 [C:\Program Files\Black Isle\BGII - SoA\DIALOG.TLK] 84458 string entries
 [.\happy.tlk] created, 84459 string entries

Комментарий простой: в файле happy.tlk теперь есть строка #84459 с текстом “ANewString”.

Получение списка содержимого BIFF-файла[править]

Пример команды: C:\Program Files\Black Isle\BGII - SoA\> weidu --biff data/dialog.bif --out res.txt (ключ --out res.txt добавлен здесь и далее в командах для возможности сохранения результата работы команды в файле res.txt и возможности его просмотра после завершения работы WeiDU, - прим.перев.)

Результат обработки (см.файл res.txt, - прим.перев.):

       ...
 [data\Dialog.bif] contains    ABELA.DLG at index 0
 [data\Dialog.bif] contains    ACHEN.DLG at index 1
       ...

Это список всех ресурсов (то есть, ACHEN.DLG - это "ресурс"), которые запакованы в файле data/Dialog.bif.

Извлечение содержимого BIFF-файлов с помощью регулярных выражений (Regular Expressions, regxp)[править]

Пример команды:

 C:\Program Files\Black Isle\BGII - SoA\> weidu --biff-get sper.*itm --log log.txt

Результат обработки (см.файл log.txt, - прим.перев.)

 [.\chitin.key] loaded, 590551 bytes
 [.\chitin.key] 182 BIFFs, 41793 resources
 [.\DIALOG.TLK] loaded, 10154904 bytes
 [.\DIALOG.TLK] 77666 string entries
 [.\data\Items.bif] loaded, 659688 bytes
 [.\data\Items.bif] 1990 file entries
 [.\SPER01.ITM] 266 bytes, created from [.\data\Items.bif]
 [.\SPER02.ITM] 314 bytes, created from [.\data\Items.bif]
 [.\SPER03.ITM] 362 bytes, created from [.\data\Items.bif]
 [.\SPER04.ITM] 322 bytes, created from [.\data\Items.bif]
 [.\SPER05.ITM] 266 bytes, created from [.\data\Items.bif]
 [.\SPER06.ITM] 266 bytes, created from [.\data\Items.bif]
 [.\SPER07.ITM] 554 bytes, created from [.\data\Items.bif]
 [.\SPER08.ITM] 314 bytes, created from [.\data\Items.bif]
 [.\SPER09.ITM] 314 bytes, created from [.\data\Items.bif]
 [.\SPER10.ITM] 362 bytes, created from [.\data\Items.bif]
 [.\data\25Items.bif] loaded, 222370 bytes
 [.\data\25Items.bif] 479 file entries
 [.\SPER11.ITM] 314 bytes, created from [.\data\25Items.bif]
 [.\SPER12.ITM] 1610 bytes, created from [.\data\25Items.bif]
 [.\SPERMEL.ITM] 890 bytes, created from [.\data\25Items.bif]
 

При выполнении данной команды производился поиск в игре всех вещей (items, файлов с расширением .itm - прим.перев.), в названии которых используется "spear" и предполагалось, что игра установлена в ту же директорию, из которой запускалась команда. Обратите внимание, что ключ --biff-get использует регулярные выражения (regexp), но не групповые символы, которые используются в DOS. Также обратите внимание, что --biff-get не производит поиск в директории override (обычно, там не должно быть BIFF-файлов, - прим.перев.). И наконец, если вы используете Mac (или работаете под unix), можете без сомнений заключать регулярное выражение в кавычки, вот так:

 C:\Program Files\Black Isle\BGII - SoA\> weidu --biff-get "sper.*itm"

это предусмотрено.

Поиск внутри BIFF-файлов[править]

Пример команды:

 C:\Program Files\Black Isle\BGII - SoA\> weidu --biff-type CRE --biff-str SPWI911 --out res.txt

Результат обработки (см.файл res.txt, - прим.перев.)

       ...
 LICH01.CRE in [data\Creature.bif] matches
 HLKANG.CRE in [data\Creature.bif] matches
       ...

Данная команда находит все CRE-файлы, в которых содержится "SPWI911", что соответствует поиску всех оппонентов-магов, которые могут воспользоваться заклинанием "Шторм метеоров" (которое, как раз и называется "SPWI911"). Можете попробовать также вот такую команду:

 C:\Program Files\Black Isle\BGII - SoA\> weidu --biff-type BCS --biff-str Terminsel --out res.txt

Результат обработки (см.файл res.txt, - прим.перев.)

       ...
 AR0300.BCS in [data\Scripts.bif] matches
 AR0308.BCS in [data\Scripts.bif] matches
 JAHEIRA.BCS in [data\Scripts.bif] matches
       ...

чтобы найти в игре все скрипты, использующие переменную с именем, включающим "Terminsel" (на самом деле, производится обычный поиск в тексте скриптов, просто, кроме переменных, данное поисковое слово нигде встретиться не может - прим.перев.). Как вы, возможно, и ожидали, Джахейра была найдена. Обратите внимание, что такие поиски требуют определенного времени (например, на поиск всех скриптов уходит около 20 секунд).

Отображение перекрестных диалогов в одном с помощью --transitive[править]

(Banter - перешучивание, - прим.перев.) Пример команды:

 C:\Program Files\Black Isle\BGII - SoA\> weidu --nocom --text --transitive banomen.dlg

Флаг --transitive указывает WeiDU при формировании D-файле следовать по ссылкам EXTERN. Таким образом файл BANOMEN.D, получившийся в результате выполнения команды, будет содержать примерно следующее:

 IF WEIGHT #31 ~InParty("Edwin")
 See("Edwin")
 Gender("Edwin",FEMALE)
 !StateCheck("Edwin",STATE_SLEEPING)
 Global("BAnomen1","LOCALS",0)~ THEN BEGIN 10
   SAY ~Hey, Edwina!  I shall be your champion at the next tournament that
   we come to if only you give me a piece of your robe, uh, that is, dress
   to adorn my shield.~ [ANOMEN49] 
   IF ~~ THEN DO ~SetGlobal("BAnomen1","LOCALS",1)~ EXTERN ~BEDWIN~ 104
 END
 
 IF ~~ THEN BEGIN BEDWIN 104
   SAY ~(My condition draws fools like flies to honey).  Silence, you idiot!
   You've a death wish that is larger than your swollen head.~ [EDWINW39]
   IF ~~ THEN GOTO 11
 END
 
 IF ~~ THEN BEGIN 11
   SAY ~Fair Edwina, I am truly bereft by your non-acceptance.  It is tragic
   when a knight has no fair maiden to moon over.  Heh he he...~
   IF ~~ THEN EXIT
 END

Обратите внимание, что присутствуют строки D-файлов и Эдвина и Аномена. Такой формат D-файла, конечно, не правильный и WeiDU не сможет его далее интерпретировать, но зато в нем видны все перекрестные диалоги, которые иначе пришлось бы искать в других файлах.

Один нюанс: из-за команды --transitive WeiDU может легко впасть в бесконечный цикл. Ничего не поделаешь, прошу извинить.

Инструкции по использованию WeiDU[править]

Данный раздел включает отдельные описания различных функций WeiDU. Многие из них составлены такими же пользователями, как и вы.

7.9 Преобразование "жестко закодированного" D-файла в пару D/TRA (последнее обновление: v200)[править]

Материал любезно предоставил Джейсон Комптон (Jason Compton).

D и TP2-файлы позволяют указывать текст либо прямо в программе (такой способ называется "жестко закодированный" - прим.перев.):

 // Greeting.d
 SAY ~Привет.~

либо с помощью дополнительного TRA-файла (от translation - перевод, прим.перев.), что позволяет, кроме прочего, использовать несколько языков:

 // Greeting.d
 SAY @1
 // Greeting.tra
 @1 = ~Привет.~

Суть в том, что для перевода, например, на французский, достаточно сделать Greeting.tra на французском:

 // French-Greeting.tra
 @1 = ~Bonjour.~

Однако, те пользователи WeiDU, которые для удобства или им просто не приходила в голову идея о переводе, и они использовали "жестко закодированные" диалоги, а теперь изменили свое решение, могут воспользоваться командой --traify, которая преобразует весь текст в командах SAY, REPLY и записи JOURNAL в формат, удобный для перевода (трафицированный формат - прим.перев.) Команда --traify также может быть использована для TP2-файлов.

Чтобы преобразовать "жестко-закодированный" D-файл FWKI.d в комбинацию из новых файлов D и TRA(трафицировать - прим.перев.), указать исходные и конечные имена файлов соответственно можно командами --traify и --out:

 C:\Program Files\Black Isle\BGII - SoA\> weidu --traify fwki.d --out fwki-new.d

Через несколько секунд будут созданы файлы fwki-new.d и fwki-new.tra.

После выполнения команды --traify исходный код в файле fwki.d:

 APPEND J#KLSYJ
   IF ~~ THEN BEGIN KelseySAHPR4
     SAY ~Urk. Who was the lucky donor?~
     IF ~~ THEN EXTERN SAHPR2 10
   END
 END 

в файле fwki-new.d выглядит так:

 APPEND J#KLSYJ
   IF ~~ THEN BEGIN KelseySAHPR4
     SAY @0
     IF ~~ THEN EXTERN SAHPR2 10
   END
 END 

а во вновь созданном fwki-new.tra, будет соответственно:

 @0    = ~Urk. Who was the lucky donor?~

и теперь это диалог готов для перевода.

--traify выполняется для всего D-файла от начала до конца и нумерует строки, начиная с @0. Никакие уже имеющиеся строки НЕ пропускаются, даже если они и будут найдены под каким-либо номером (@x), поэтому, если ваш D-файл уже был частично трафицирован, то лучше дополнительно использовать ключ --traify-old-tra.

Поскольку, по умолчанию --traify начинает нумерацию с @0 и игнорирует любые имеющиеся в D-файле ссылки на строки типа @x, если Вы уже пытались трафицировать диалог вручную, скорее всего, Ваши ссылки @x будут конфликтовать с результатами команды --traify.

Другими словами, если у вас уже есть трафицированный кусок

 IF ~~ THEN BEGIN blah
   SAY @0
   IF ~~ THEN EXIT
 END

--traify не пропустит ссылку @0 и у Вас будет две ссылки с одинаковым номером @0, хотя вы намеревались использовать две различные строки, и это, как Вы понимаете, плохо.

Чтобы избежать такой проблемы, добавьте ключ (аргумент) --traify-old-tra, чтобы указать, что файл уже частично трафицирован:

 C:\Program Files\Black Isle\BGII - SoA\> weidu --traify fwki.d --traify-old-tra fwki.tra --out fwki-new

будут сохранены имеющиеся ссылки на номера строк и добавлены новые - на строки из нового файла fwki-new.tra.

Наконец, учтите, что --traify работает также и с BAF-файлами.

Замечание: Можно было бы посоветовать воспользоваться в этом случае ключом --traify#. Но, если вы не хотите, чтобы нумерация строк начиналась с какого-то определенного номера, используйте ключ --traify-old-tra.

Во всех случаях, возможно, Вы найдете полезным использование в командной строке также ключа --traify-comment, поскольку это позволит добавить в D-файл содержимое строк, на которые даны ссылки, но уже в виде комментариев (чтобы легче было редактировать его в будущем):

 C:\Program Files\Black Isle\BGII - SoA\> weidu --traify fwki.d --traify-old-tra fwki.tra --out fwki-new --traify-comment

Один нюанс: используя вместе ключи --traify-comment и --traify-old-tra, можно добавить в комментарии D-файла отсутствующие расшифровки строк. (Смысл фразы оригинала уточнен практической проверкой - отсутствующие комментарии, действительно, появляются в D-файле, так же, как отсутствующие строки-расшифровки в TRA-файле, прим.перев.)

(Прим.перев.: во всех практических примерах в оригинале вместо --traify-old-tra использовалось отсутствующее в списке ключей командной строки --traify-tra, очевидно, ошибочно - исправлено.)

7.11 ALTER_TRANS (последнее обновление: v204)[править]

Настоящее руководство любезно предоставил CamDawg.

ALTER_TRANS - это более удобный способ чтобы вносить изменения в переходы существующих диалогов. Лучше всего показать на примере; возьмем шаг (state) 9 из doghma.dlg игры BG2:

 IF ~~ THEN BEGIN 9 SAY #45751
   IF ~~ THEN REPLY #45752 GOTO 2
   IF ~GlobalLT("chapter","GLOBAL",4)~ THEN REPLY #45753 GOTO 5
   IF ~~ THEN REPLY #45754 GOTO 4
   IF ~Global("RevealUmar","GLOBAL",1)
       PartyHasItem("miscbl")
       PartyHasItem("miscbm")
       PartyHasItem("miscbn")
       PartyHasItem("miscbo")~ THEN REPLY #57922 GOTO 10
  IF ~~ THEN REPLY #45755 GOTO 1
 END

Здесь проблема в переходе (transition) 3 (нумерация начинается с 0, - прим.перев.): в начале проверки должно быть указано OR(4), а уже за потом проверки PartyHasItem. Без ALTER_TRANS, наименее неудобным способом составленное исправление выглядело бы так:

 ADD_TRANS_TRIGGER DOGHMA 9 ~False()~ DO 3
 EXTEND_BOTTOM DOGHMA 9
 IF ~Global("RevealUmar","GLOBAL",1)
 OR(4)
 PartyHasItem("miscbl")
 PartyHasItem("miscbm")
 PartyHasItem("miscbn")
 PartyHasItem("miscbo")~ THEN REPLY #57922 GOTO 10
 END

Из этого сразу вытекает несколько условий совместимости. Во-первых, если другой мод уже изменял этот переход (например, было добавлено новое действие с помощью ADD_TRANS_ACTION), то изменения будут потеряны. Также изменится порядок вывода на экран ответов - это не имеет большого значения для переходов, связанных с ответами, а вот для переходов без ответов - имеет - там где они идут в определенной последовательности. Кроме того, другие моды, использующие данный переход, потеряют эту возможность, так как False() фактически отключает его. Теперь используем ALTER_TRANS:

 ALTER_TRANS DOGHMA // имя файла
 BEGIN 9 END // номер шага (может быть несколько)
 BEGIN 3 END // номер перехода (может быть несколько)
 BEGIN // перечень изменений, описание флагов см.ниже
   "TRIGGER" ~Global("RevealUmar","GLOBAL",1)
            OR(4)
              PartyHasItem("miscbl")
              PartyHasItem("miscbm")
              PartyHasItem("miscbn")
              PartyHasItem("miscbo")~
 END

Есть девять флагов, которые вы можете использовать в перечне изменений. Если вы не используете какой-либо флаг, то будет сохранено старое значение, содержащееся в переходе (то есть, если флаг не указан флаг ACTION, то старые действия меняться не будут). Вот перечень флагов:

  • TRIGGER: Условие триггера, используемого для перехода, пример: "TRIGGER" ~Global("foo","GLOBAL",0)~
  • ACTION: Действие, выполняемое, если выбран данный переход, пример: "ACTION" ~SetGlobal("foo","GLOBAL",1)~
  • REPLY: Ответ игрока, если он требуется, пример (начиная с версии 207 для номера строки можно использовать префикс @ или #, - прим.перев.): "REPLY" ~#57922~
  • JOURNAL: Можно добавить или изменить запись журнала, пример: "JOURNAL" ~@100~ (прим.перев.: можно также: "JOURNAL" ~#100~)
  • SOLVED_JOURNAL: То же, что и JOURNAL, только для записей, указываемых в разделе "сделано".
  • UNSOLVED_JOURNAL: То же, что и JOURNAL, только для записей, указываемых в разделе "не сделано".
  • EPILOGUE: Указывает заключительное действие перехода (GOTO, EXTERN, или EXIT), пример: EPILOGUE" ~EXTERN BVICONI 0~
  • FLAGS: Используется для того, чтобы вручную устанавливать флаги в переходе, хотя я не представляю себе, для чего это нужно.

Давайте посмотрим последний пример. Это bviconi.dlg, шаг 103:

 IF WEIGHT #22 ~Global("LoveTalk","LOCALS",46)~ THEN BEGIN 103 SAY #10537
   IF ~~ THEN REPLY #10538 GOTO 367
   IF ~~ THEN REPLY #10539 EXTERN ~~ 0
 END

Как видите, во втором переходе указание на заключительное действие содержит ошибку (в EXTERN не указан диалог, - прим.перев.). Раньше это пришлось бы исправлять таким образом:

 ADD_TRANS_TRIGGER BVICONI 103 ~False()~ DO 1
 EXTEND_BOTTOM BVICONI 103
 IF ~~ THEN REPLY #10539 GOTO 368
 END

Теперь, используя ALTER_TRANS, это сделать значительно проще:

 ALTER_TRANS BVICONI BEGIN 103 END BEGIN 1 END BEGIN "EPILOGUE" ~GOTO 368~ END

Дополнение: пожалуйста, обратите особое внимание на то, что флаги (например, REPLY или EPILOGUE) нужно заключать в кавычки, тильды или знаки процентов.

Еще одно дополнение: пустая срока после REPLY, JOURNAL и остальных флагов удаляет соответствующие действия, вместо того, чтобы, например, добавлять пустую строку в журнал (прим.перев.: добавлено в версии 207)

Пример (прим.перев.: взято из обсуждения на форуме WeiDU) :

 ALTER_TRANS BVICONI
 BEGIN 103 END
 BEGIN 1 END
 BEGIN
   "JOURNAL" ~~ //пустая строка после флага удаляет команду на добавления записи в журнал
 END

Компоновка мода: TP2-файлы (Module Packaging: TP2 Files)[править]

TP2-файл TP2-файл - это текстовый файл, в котором имеется одна или несколько компонентов (компоненты - Components - так называется основная часть TP2-файла, см.ниже, названия разделов, использующиеся в качестве команд, оставлены без перевода - прим.перев.) мода . TP2-файлы указывают WeiDU, как инсталлировать различные части мода на компьютере пользователя.
это BACKUP имя_директории

AUTHOR адрес_email

TP2-флаг list

Language list

Компонент list

TP2-файл - это необходимое вступление перед списком Компонентов. BACKUP указывает WeiDU, куда поместить резервные копии файлов, которые будут перезаписаны, с тем, чтобы их можно было потом восстановить. Соответствующая директория, если потребуется, будет создана автоматически. AUTHOR служит для информирования пользователя об адресе, куда нужно обращаться с проблемами установки и багами. WeiDU устанавливает переменной TP2_AUTHOR значение адрес_email, а переменной TP2_FILE_NAME - имя данного TP2-файла. TP2-флаги устанавливают глобальные настройки (global options). В секции Language (язык) описываются все языки, доступные для данного мода. И, наконец, секция Компоненты содержит собственно сам мод. Различные компоненты могут устанавливаться и удаляться независимо друг от друга, но все, что внутри компонента, рассматривается, как единое целое.
TP2-флаг TP2-флаг содержит определенные общие настройки, которые использются WeiDU во время работы с конкретным TP2-файлом.
это AUTO_TRA путь Флаг AUTO_TRA используется вместе с инструкцией COMPILE TP2. Он указывает автоматически загрузить TRA-файлы, соответствующие D-файлам (соответствие подразумевает совпадение имен до расширения; TRA-файлы загружаются из указанного пути, в котором может использоваться переменная %s, которую WeiDU заменяет на указанную пользователем директорию языка, - прим.перев.).
переведено не полностью - смотрите первоисточник
value Выражение, принимающее целое числовое значение (integer). См. --debug-value.
это integer Абсолютная ссылка или величина. Допускаются следующие форматы: десятичный (decimal), шестнадцати- (hex) и восьмеричный (octal), а также бинарный (binary). Для шестнадцатеричного используйте 0x, для восьмеричного - 0o, для бинарного - 0b.
переведено не полностью - смотрите первоисточник
или GAME_IS String Возвращает ИСТИНА, если переменная IE game принимает значения из списка (String), иначе - ЛОЖЬ. Список - это перечень определенных значений, разделенных пробелами. Значения могут быть следующие (регистр не различается): bg2=soa, tob, iwd2, pst, bg1, totsc, iwd=iwd1, how, tolm=totlm, tutu, tutu_totsc, bgt (все это устоявшиеся сокращения, обозначающие игры Infinity Engine, прим.перев.). Указания типа bg2=soa означают синонимы: bg2 - это синоним soa. Обратите внимание, проверяется именно точное соответствие игры: например, bg2 проверяет наличие именно Baldur's Gate II: Shadows of Amn, без установленного Trone of Bhaal, или tutu, а bgt проверяет наличие TOB (и отсутствие TOSC) и установленного мода Baldur's Gate Trilogy (такой порядок действует с версии 210, прим.перев.). Соответственно, если для мода требуется установленная SOA и tutu, то в нем должна быть следующая проверка: REQUIRE_PREDICATE GAME_IS ~bg2 tob tutu tutu_totsc~.

11 Распространение WeiDU с модулями (модами) в виде: Setup-MyMod.exe[править]

Если переименовать WeiDU.EXE так, чтобы получилось нечто похожее на Setup-MyMod.exe, то запуск этой программы будет соответствовать запуску WeiDU.EXE с такими аргументами командной строки:

  • --tlkout DIALOG.TLK
  • --ftlkout DIALOGF.TLK (если имеется DIALOGF.TLK)
  • --log MyMod.DEBUG
  • Setup-MyMod.tp2
  • MyMod.tp2

Примечания переводчика:

  1. эта функция призвана способствовать упрощению организации процедуры установки модов, но часто используется разработчиками как предлог для оптимизации архивов модов - в них вообще не включается EXE-файл и подразумевается, что пользователь должен самостоятельно переименовать WeiDU.EXE в вид, соответствующий TP2-файлу мода, а при необходимости, - скачать и сам архив WeiDU;
  2. хоть это не указано, однако, нижеследующие аргументы также подразумеваются при запуске Setup-MyMod.exe:
  • MyMod/Setup-MyMod.tp2
  • MyMod/MyMod.tp2

они полезны, т.к. позволяют размещать все файлы мода в одном месте - папке мода, а не отягощать ими основной каталог игры (в нем от мода остаются только EXE и DEBUG-файлы).

11.2 Значения, которые возвращает WeiDU[править]

Завершение работы WeiDU.exe (или Setup-MyMod.exe) заканчивается установкой величины, называемой "возвращаемое значение" (или “код завершения”, или “код состояния”, или “уровень ошибки”), которая зависит от успеха или неудачи определенных операций. В зависимости от Вашей операционной системы, можно использовать эту величину в программных скриптах или исполняемых фалах, которые запускают WeiDU. По общему правилу, WeiDU возвращает 0 в случае успеха. Значение, отличное от 0 означает сбой. Вот список возвращаемых значений:

  • 0. Общий успех. Ошибок, указанных ниже, не отмечено.
  • 1. Установить компонент TP2 невозможно. В результате ошибки установки выводится одна из следующих строк: “Stopping installation because of error” (Установка прекращена из-за ошибки), “ERROR Installing [Component], rolling back to previous state” (Ошибка при установке указанного компонента, возврат к предыдущему состоянию), “PLEASE email the file SETUP-MYMOD.DEBUG to AUTHOR” (Пожалуйста, отправьте файл SETUP-MYMOD.DEBUG разработчику), “ERROR Re-Installing [MyMod] component 1” (Переустановка компонента такого-то мода [MyMod] вызвала ОШИБКУ).
  • 2. Ошибка авто-обновления.
  • 3. Повторная попытка авто-обновления. WeiDU.exe успешно обновлен, нужно запустить WeiDU.exe еще раз.
  • 4. Неверный ключ командной строки.