Руководство по использованию WeiDU: различия между версиями
Vit MG (обсуждение | вклад) (убраны номера разделов при совпадении нумерации + начало раздела 3) |
Vit MG (обсуждение | вклад) |
||
Строка 39: | Строка 39: | ||
В текущей директории будет создан текстовый файл SCSARLES.D. Откройте его в Блокноте, или в Microsoft Word, или любым другим текстовым редактором. Вы увидите - это обычный текстовый файл, в котором определенным образом подробно расписан диалог игры. | В текущей директории будет создан текстовый файл SCSARLES.D. Откройте его в Блокноте, или в Microsoft Word, или любым другим текстовым редактором. Вы увидите - это обычный текстовый файл, в котором определенным образом подробно расписан диалог игры. | ||
− | Вы увидите примерно следующее (приведен пример начала файла диалога, выдаваемого версией 204, с дополнительными комментариями, не указанными в оригинальном руководстве- прим.перев.): | + | Вы увидите примерно следующее ''(приведен пример начала файла диалога, выдаваемого версией 204, с дополнительными комментариями, не указанными в оригинальном руководстве- прим.перев.)'': |
// creator : c:\bgate\WeiDU\weidu.exe | // creator : c:\bgate\WeiDU\weidu.exe | ||
Строка 52: | Строка 52: | ||
// WARNING: this file contains non-trivial WEIGHTs (ВНИМАНИЕ: данный файл содержит нестантартные "веса", прим.перев.) | // WARNING: this file contains non-trivial WEIGHTs (ВНИМАНИЕ: данный файл содержит нестантартные "веса", прим.перев.) | ||
////////////////////////////////////////////////// | ////////////////////////////////////////////////// | ||
− | + | ||
IF WEIGHT #1 /* Triggers after states #: 34 even though they appear after this state */ | IF WEIGHT #1 /* Triggers after states #: 34 even though they appear after this state */ | ||
~NumTimesTalkedTo(0) | ~NumTimesTalkedTo(0) | ||
Строка 68: | Строка 68: | ||
END | 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. Каждый блок, имеющий вид: | + | Диалоги в играх на [[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 | IF ~Изначальное условие~ THEN BEGIN шаг1 | ||
Строка 81: | Строка 81: | ||
запомните: SAY - это то, что говорит НПС, а REPLAY - то, что ему отвечает игрок. Если обратить внимание, то легко заметить, что абсолютно все диалоги в играх на [[Infinity Engine]] построены таким образом. | запомните: SAY - это то, что говорит НПС, а REPLAY - то, что ему отвечает игрок. Если обратить внимание, то легко заметить, что абсолютно все диалоги в играх на [[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, то в него всегда заносится текст - две строки указано или одна, - прим.перев.)''. |
Можно также использовать цифры, перед которыми стоит знак "#" (например, #1234) - так указывается прямая ссылка на номер строки в DIALOG.TLK. Это удобно, когда изменяется уже имеющийся диалог (скажем, Духа судьбы в ТОБ), в этом случае, если диалог будет инсталлировать иностранный пользователь, то в тех строках, которые не изменялись, будет использоваться текст из его игры и их не надо будет переводить. Обычно ссылки на номера строк указываются сразу за SAY, а сам текст помещается в комментарии. Ключ командной строки --text, наоборот, позволяет в комментариях номера строк. | Можно также использовать цифры, перед которыми стоит знак "#" (например, #1234) - так указывается прямая ссылка на номер строки в DIALOG.TLK. Это удобно, когда изменяется уже имеющийся диалог (скажем, Духа судьбы в ТОБ), в этом случае, если диалог будет инсталлировать иностранный пользователь, то в тех строках, которые не изменялись, будет использоваться текст из его игры и их не надо будет переводить. Обычно ссылки на номера строк указываются сразу за SAY, а сам текст помещается в комментарии. Ключ командной строки --text, наоборот, позволяет в комментариях номера строк. | ||
''(продолжение следует, - прим.перев.)'' | ''(продолжение следует, - прим.перев.)'' | ||
− | |||
==5.1 Команды, не указанные в разделе "Command Line Options" документации [[WeiDU]]== | ==5.1 Команды, не указанные в разделе "Command Line Options" документации [[WeiDU]]== |
Версия 10:23, 30 марта 2008
Данная статья - попытка представить перевод на русский язык документации WeiDU (WeiDU Documentation), включаемой в архив программы, дополненный, по-возможности, комментриями и замечаниями, основанными на личном опыте составителей.
Содержание
- 1 Краткая информация о WeiDU
- 2 Без паники!
- 3 Концепция D и DLG-файлов
- 4 5.1 Команды, не указанные в разделе "Command Line Options" документации WeiDU
- 5 6 Примеры использования
- 5.1 Декомпилирование из DLG-файлов в D-файлы
- 5.2 Декомпилирование DLG-файлов в удобный для перевода формат
- 5.3 Некоторые опции при декомпилировании DLG-файлов
- 5.4 Декомпилирование нескольких DLG-файлов
- 5.5 Компилирование D-файла
- 5.6 Компилирование D-файла, в котором имеется новый текст
- 5.7 Компилирование нескольких D-файлов
- 5.8 Компилирование D-файла с получением нескольких DLG-файлов
- 5.9 Компилирование D-файла, который использует TRA-файл
- 5.10 Отображение строковых ссылок
- 5.11 Изменение DIALOG.TLK вручную
- 5.12 Получение списка содержимого BIFF-файла
- 5.13 Извлечение содержимого BIFF-файлов с помощью регулярных выражений (Regular Expressions, regxp)
- 5.14 Поиск внутри BIFF-файлов
- 5.15 Отображение перекрестных диалогов в одном с помощью --transitive
- 6 7.9 Преобразование "жестко закодированного" D-файла в пару D/TRA (последнее обновление: v200)
- 7 7.11 ALTER_TRANS (последнее обновление: v204)
- 8 11 Распространение WeiDU с модулями (модами) в виде: Setup-MyMod.exe
- 9 11.2 Значения, которые возвращает 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 для новичков: Без паники. Многие из вас - дети эры графических пользовательских интерфейсов (GUI). Но программы, которые работают в командной строке, тоже могут быть вашими друзьями, и, по большому счету, они работают гораздо быстрее, а использовать их, на самом деле, гораздо проще.
Наилучший способ научиться писать код в формате WeiDU - формате D - прочитать код, написанный в формате WeiDU - формате D. Начните с декомпиляции уже существующих игровых файлов DLG, которые вы хорошо знаете, и прочитайте полученные файлы. Сравните то, как они выглядят в WeiDU и то, как они выглядят в других редакторах, с которыми вы, возможно, лучше знакомы (например, Near Infinity и Infinity Explorer).
Наилучший способ научиться писать код в формате WeiDU - формате D - прочитать код, написанный в формате WeiDU - формате D, часть 2. Все больше аддонов к BG2 создаются при помощи WeiDU. Список можно найти здесь: http://www.pocketplane.net/modlist/. Они помогут вам понять, как использовать более сложные функции WeiDU, такие как добавление диалогов, работа со скриптами и 2DA-файлами, а также вещами (item), заклинаниями (spells) и существами (creature), которые используются непосредственно в игре. Поставьте себе такую задачу: скачать определенный мод и разобраться КАК ИМЕННО он работают.
Посмотрите некоторые примеры в этом документе. Есть замечательное руководство к WeiDU (написанное Japheth): http://forums.pocketplane.net/index.php?topic=55.0 (русский перевод здесь). Если чувствуете, настоящее руководство для вас слишком сложно, зайдите сначала туда. Там также объясняется как установить утилиту. Ghreyfain написал туториал "как создать NPC при помощи WeiDU" http://forums.pocketplane.net/index.php?topic=52.0 (русский перевод здесь )
Есть специальный форум для обсуждения WeiDU: http://forums.pocketplane.net/index.php?board=50.0. Для того, чтобы получить ответ на повросы по использованию WeiDU (и по разработке модов тоже), этот форум - самое подходящее место.
Ну, и наконец, если Вы используете 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
описывает шаг (более детально см. ниже). Когда игрок начитает общение с НПС (NPC), движок игры сканирует все шаги в DLG-файле этого NPC в порядке, определяемом их "весом" (WEIGHT), и выбирает один не являющийся пустым и проверка "Изначальное условие" которого выдает ПРАВДА (true). Если таких шагов не найдено, то игра выдает сообщение: "Нечего вам сказать". Про порядок определения "весов" не думайте - это пока не нужно.
Итак, если шаг найден, говорящий (в данном случае, Сэр Сарльз) говорит то, что указано после SAY. В строках REPLAY приводятся возможные ответы игрока. Если проверка "Условие для ответа" выдает ПРАВДА, то игроку дается возможность сказать фразу "Текст ответа" и перейти к другому шагу диалога (где Сарльз, возможно, скажет что-нибудь еще).
запомните: SAY - это то, что говорит НПС, а REPLAY - то, что ему отвечает игрок. Если обратить внимание, то легко заметить, что абсолютно все диалоги в играх на Infinity Engine построены таким образом.
В условиях используется тот же синтаксис, что и в триггерах скриптов BCS в Infinity Engine. Хорошо бы, конечно, вам изучить написание скриптов в Infinity Engine - это отдельная большая тема. Строки заключаются справа и слева в тильды (~), знаки процентов (%) или кавычки (") - на ваш выбор - по умолчанию же WeiDU использует тильды. После SAY, или REPLY, или JOURNAL можно, вместо одной, давать две строки (string): первая используется для DIALOG.TLK, а вторая - для DIALOGF.TLK (версия диалога, когда главный персонаж женского пола - для иностранных языков, в которых такое различие существенно). Если вы указываете только одну строку, то предполагается, что в обоих случаях текст будет одинаковым (если имеется DIALOGF.TLK, то в него всегда заносится текст - две строки указано или одна, - прим.перев.).
Можно также использовать цифры, перед которыми стоит знак "#" (например, #1234) - так указывается прямая ссылка на номер строки в DIALOG.TLK. Это удобно, когда изменяется уже имеющийся диалог (скажем, Духа судьбы в ТОБ), в этом случае, если диалог будет инсталлировать иностранный пользователь, то в тех строках, которые не изменялись, будет использоваться текст из его игры и их не надо будет переводить. Обычно ссылки на номера строк указываются сразу за SAY, а сам текст помещается в комментарии. Ключ командной строки --text, наоборот, позволяет в комментариях номера строк.
(продолжение следует, - прим.перев.)
5.1 Команды, не указанные в разделе "Command Line Options" документации WeiDU
Translation Options | |
---|---|
--traify-comment | добавляет в D-файл содержимое строк, на которые даны ссылки, в виде комментариев, используется с командой --traify |
6 Примеры использования
Декомпилирование из 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 может легко впасть в бесконечный цикл. Ничего не поделаешь, прошу извинить.
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: Ответ игрока, если он требуется, пример: "REPLY" ~REPLY #57922~
- JOURNAL: Можно добавить или изменить запись журнала, пример: "JOURNAL" ~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)нужно заключать в кавычки, тильды или знаки процентов.
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
(эта функция призвана способствовать упрощению организации процедуры установки модов, но часто используется разработчиками как предлог для оптимизации архивов модов - в них вообще не включается EXE-файл и подразумевается, что пользователь должен самостоятельно переименовать WeiDU.EXE в вид, соответствующий TP2-файлу мода, а при необходимости, - скачать и сам архив WeiDU, - прим.перев.)
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. Неверный ключ коммандной строки.