Dark Flame Infinity Compiler IDE Start Page

start page

Infinity Compiler IDE

Данная программа являет собой графическую оболочку для создания, редактирования и компиляции сценариев искусственного интеллекта (далее - AI-скрипт или просто скрипт) для игр, построенных на основе движка Infinity от BioWare Corp.

Если Вы когда-нибудь играли в Baldur's Gate или IceWind Dale, то наверняка знаете, что для каждого члена Вашей партии можно выбрать скрипт, который будет определять поведение этого персонажа в игре. Естественно, последнее слово всегда остается за игроком, однако часто бывает очень удобно смотреть, как члены Вашей группы сами выбирают наиболее опасного противника из группы атакующих и, кроме того, выбирают наиболее подходящее оружие из имеющегося для атаки с учетом дистанции до цели. И это только один аспект применения скриптов. Иногда в пылу боя бывает просто невозможно уследить за всем происходящим, и тогда даже небольшая "интеллектуальность" Ваших персонажей оказывается как нельзя кстати. В общем и целом, скрипты - невероятно полезная вещь, и эта программа значительно облегчает процесс их создания.

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

  • Знакомство с интерфейсом. Краткое описание, что за что отвечает и что означает.
  • Описание окон. Исчерпывающая справочная информация по всем элементам программы.
  • Основные принципы скриптового программирования. Краткое введение в курс дела для тех, кто впервые берется за программирование вообще и за написание скриптов в частности.
  • Обучающий курс. Практическая демонстрация возможностей программы на примере создания скрипта для игры IceWind Dale с разбором большинства деталей и тонкостей, могущих встретиться в процессе разработки.
  • Дополнительная информация. Что делать, если что-то не получается, известные ошибки и неточности в документации, etc.

Wish you good gaming, and let the Force be with you!

Ennor Tiegael, ветеран DOOM'а, почетный герой двух Бехолдеров и член внутреннего круга Секретного Ордена Императора Палпатина в звании "Рука Императора".


Introduction

Введение

В плане внешнего вида программа, по сути, представляет собой MDI-редактор текстовых файлов. В верхней части окна располагается строка меню, посредством которой можно получить доступ ко всему функционалу, предоставляемому программой. Под ней располагается панель инструментов, на которую вынесены наиболее употребительные команды.

В нижней части окна расположена строка состояния, в которой отображается различного рода информация, в основном, касающаяся открытого в данный момент файла.Также, в строке состояния находятся индикаторы даты, времени и состояния клавиатуры: Caps Lock, Num Lock и Insert.

Также, помимо всего вышеперечисленного, в основном окне программы можно отобразить дополнительные элементы управления - панель дерева заголовков (Header's Tree) и список ошибок компиляции (Compilation Log).

Дерево хидеров

Протокол компиляции

Управление отображением этих элементов осуществляется посредством кнопок на панели инструментов либо командами меню. Подробнее об этом см. раздел User's Guide.

Программа позволяет открывать файлы трех типов:

  • исходные тексты скриптов (*.BAF);
  • протоколы компиляции (*.ERR);
  • заголовочные файлы компилятора (*.IDS).

Все три являются, по сути, обычными текстовыми файлами, правда, за одним исключением: в лог-файлах символом разделения строк является не стандартная для Windows комбинация Carriage Return/Line Feed, а только первый из них - Carriage Return (0x0Dh, или 13 в десятичной системе). Поэтому при открытии лога в программе наподобие Блокнота Windows вместо начала новой строки можно будет видеть непонятные символы в виде вертикальных черт, после которых идет строка, по логике долженствуюшая идти отдельно, т.е. ниже. При открытии логов в среде Inifinity Compiler они, тем не менее, отображаются корректно.

Если Вы открываете исходный код скрипта, то с ним Вы можете делать все, что угодно - он откроется в режиме "чтение/запись". Остальные же два типа файлов открываются программой в режиме "только для чтения", поэтому никаких изменений в них Вы сделать не сможете. Объясняется это следующим:

  • Логи генерируются компилятором автоматически при каждом его запуске, поэтому вносить в них какие-либо изменения попросту бессмысленно - при следующей компиляции соотв. скрипта программа их полностью перепишет. Кроме того, имеется специальное средство просмотра этих файлов (протокол компиляции), к тому же предоставляющее дополнительный функционал;
  • Касательно хидер-файлов (от англ. header - заголовок): лично я не в курсе, использует ли компилятор эти файлы при своей работе, т.е. по логике вещей - должен, но есть подозрения, что на самом деле - нет (см. раздел Extras). Тем не менее, эти файлы содержат определения функций и констант, облегчающих написание скриптов, и изменять их вообще-то не рекомендуется. Опять-таки, по аналогии с лог-файлами, в данной программе имеется мощное средство, реализующее весь потенциал заголовков - дерево хидеров, а точнее, его вторая часть.

Чтобы открыть в программе какой-либо файл, необязательно пользоваться командой Open из меню программы - можно сделать это еще двумя способами:

  1. Drag'n'Drop-операция из какого-либо файлового менеджера (напр. Windows Explorer) в основное окно программы (смотрите, не промахнитесь!) приведет к открытию всех этих файлов, а точнее, тех из них, которые имеют расширения, поддерживаемые программой;
  2. Двойной клик мышкой (или нажатие Enter) по файлу, чье расширение зарегистрировано в системе на эту программу, приведет к открытию этого файла. При этом, если один экземпляр Infinity Compiler уже был запущен, то запуска второго экземпляра не произойдет - файл будет открыт в уже запущенном процессе, при этом окно программы будет восстановлено (если оно было свернуто, например) и отображено поверх окон остальных программ. Правда, для использования этого способа, необходимо зарегистрировать файлы для открытия этой программой. Подробнее см. описание Настроек программы в разделе User's Guide.


Setting Up The Program

Перед тем, как приступить к работе...

Infinity Compiler IDE

В данный раздел помещена информация о том, как подготовить программу к работе.

В принципе, набрать обычный текстовый файл можно и в Блокноте, а затем переименовать его, сменив расширение с ".txt" на ".baf". После чего, открыв DOS-окно, вызвать необходимый компилятор с требуемыми параметрами командной строки. В случае каких-либо ошибок в Вашем скрипте смотрится файл с тем же именем, что и скрипт, но с расширением ".err" в каталоге "Errors". После чего вся вышеописанная процедура повторяется снова.

Infinity Compiler берет на себя не только все это, но и кое-что еще. Надо его только правильно настроить.

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

Чтобы указать программе, под какую игру Вы хотите писать скрипты (ибо определенные функции и константы варьируются от игры к игре), откройте окно настроек Infinity Compiler. Сделать это можно, выбрав пункт меню "Options" в разделе "Service". В нем необходимо переключиться на закладку "Installed Compilers":

На приведенном скриншоте в программу уже добавлена информация о двух имеющихся компиляторах. Вам же надо добавить все имеющиеся у Вас компиляторы (ибо работать с ними из командной строки все-таки неудобно).

Нажмите кнопку "Find New...". В открывшемся диалоговом окне выберите компилятор, который хотите добавить. Общее правило здесь таково: если с какой-либо игрой компилятор вообще поставляется (например, так обстоит дело с Baldur's Gate II), то он находится в подкаталоге "Script Compiler" (возможно, что в имени каталога пробела не будет) в основном каталоге, в который установлена игра. В случае же, если компилятор не ставится вместе с игрой (ребята из Black Isle, написавшие IceWind Dale, видимо, экономили на каждом байте дистрибутива, так что для этой игры компилятор приходится скачивать с сайта Interplay отдельно), то при своей инсталляции он все равно захочет быть установленным в соответствующий каталог. На рисунке эта закономерность наглядно продемонстрирована.

После нажатия кнопки "Open" в диалоговом окне открытия файла и закрытия этого самого окна, в поле "Full Path" будет полный путь к исполняемому файлу компилятора. Теперь необходимо ввести его вразумительное описание в поле "Game" (в самом деле, файл компилятора имеет всегда одно и то же имя, не по пути же их отличать!). Учтите, что программе абсолютно параллельно, какое описание Вы ввели - эта информация исключительно для Вас. Единственное требование к описанию - его длина должна быть не меньше 3 символов.

При выполнении всех этих требований кнопка "Apply" (на рисунке она недоступна) автоматически становится доступной, и при ее нажатии в списке появляется указанный Вами компилятор.

После того, как все, что нужно, Вы уже сделали, в этом же самом окне настроек переключитесь на первую закладку, "General".

В выпадающем списке "Default Compiler" выберите тот компилятор, который Вы, скорее всего, будете использовать чаще всего (вот где понадобятся внятные описания!). Выбрали? Тогда все, можно приступать к работе!

Детальное описание этих и других настроек программы см. в разделе User's Guide.


Program Windows

руководство пользователя

В этом разделе дается детальное описание всех элементов пользовательского интерфейса Infinity Compiler. Раздел разбит на две основные части:

  • Описание основного окна.
  • Описание окна настроек.
  • Описание встроенных мастеров.

Также приводится краткое описание отдельных диалоговых окон:

  • Окно поиска и замены;
  • Окно результатов поиска прототипов;
  • Окно "О программе" (тоже мне, нашел, что описывать ;-).


Main MDI Window

основное окно программы

Так выглядит основное окно программы при работе. Ниже приводится перечисление основных элементов с указанием ссылки на их описание. Перечисление будет вестись слева направо и сверху вниз.

  • Строка меню. Отдельного описания нет, команды описываются по ходу;
  • Панель инструментов. Сюда вынесены отдельные, наиболее важные (с моей точки зрения) команды. Все они имеют свои аналоги в меню, поэтому отдельного описания нет;
  • Выпадающий список текущего компилятора. Подробнее см. Панель Выбора Компилятора;
  • Список открытых файлов. Подробнее см. Список Файлов;
  • Дерево заголовков. Подробнее см. Дерево Заголовков;
  • Окно редактирования скрипта. Отдельного описания нет - здесь и так все понятно, текстовый редактор как он есть;
  • Лог компиляции. Подробнее см. Лог Компиляции;
  • Строка состояния программы. Отдельного описания нет, достаточно и краткого, приведенного ниже.

Ниже следуют краткие описания элементов, для которых я не посчитал нужным выделять отдельные страницы.

строка состояния

Строка состояния разбита на 7 панелей. Ниже приводится описание всех этих частей (перечисление - слева направо):

  1. Панель сообщений. Здесь выводятся сообщения программы пользователю об окончании каких-либо действий, например, сообщение об успешном сохранении файла, результаты компиляции, результаты поиска и т.д.;
  2. Текущая позиция каретки в активном документе. Формат: "Линия ХХ; Символ ХХ". При этом первая (самая верхняя) строка скрипта имеет номер 1, то же самое касается и символа;
  3. Текущая дата по часам компьютера. Конкретный формат зависит от региональных настроек операционной системы, на скриншоте - "DD.MM.YY";
  4. Текущее время по часам компьютера. Формат - "HH:mm";
  5. Индикатор Caps Lock. Надпись выводится черным цветом, если на клавиатуре активирован этот режим, и серым в противном случае;
  6. Индикатор Num Lock. Функциональность аналогична;
  7. Индикатор режима оверпринта. Переключается клавишей Insert. Если он включен, символы, вводимые в середину строки будут запечатывать следующие за ними, в противном случае затирания происходить не будет.


Текущий компилятор

панель выбора компилятора

Ну, здесь все довольно просто. В этом выпадающем списке находятся все компиляторы, которые Вы добавили в соответствующий список в окне настроек программы. При старте Infinity Script Compiler текущим компилятором становится тот, который Вы указали как компилятор по умолчанию. Именно компилятор, выбранный в этом списке, будет вызван, когда Вы нажмете Compile на панели инструментов или в меню.

О деталях подключения компиляторов к программе можно почитать, например, в разделе Подготовка к работе.


File Tree

список файлов

В общем и целом можно сказать, что эта часть программы - лишняя. Я оставил ее на месте, тем не менее, ибо удалять что-либо из программы, уже отлаженное и не вызывающее проблем сложнее и дольше, чем просто позволить этому существовать.

Данный элемент программы по своей функциональности идентичен списку окон в меню Windows, с одним небольшим различием: в этом дереве открытые в данный момент файлы дополнительно группируются по своему типу - сырцы, хидеры и логи компиляции. Не забывайте при этом, что последние два открываются программой в режиме "read-only" и не используют Syntax Highlight.

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

Убрать с экрана данный элемент можно, нажав комбинацию клавиш Ctrl+W, либо через меню программы (View->Workspace), либо через всплывающее меню, появляющееся при клике правой кнопкой по заголовку дерева (серая текстурированная панель с надписью "Opened Files").


дерево заголовков

Очень полезная вещь. Настолько полезная, что писать скрипты без нее практически невозможно, особенно поначалу.

Данная панель состоит из двух частей: текстового поля и дерева. Фнкциональность всего этого хозяйства заключается в следущем.

дерево хидеров (headers tree)

Дерево содержит в себе иерархическую структуру всех хидеров, доступных для выбранного компилятора. Корневые узлы - это IDS-файлы, расположенные в том же каталоге, что и компилятор (т.е., %GameRootDir%\ScriptCompiler). Каждый из них, в свою очередь, имеет дочерние узлы, каждый из которых суть отдельная строка в соответствующем файле. В этой строке содержится описание функции, триггера или константы, могущей быть использованной при написании скрипта. Изначально соответствующая строка выглядит примерно так:

...

0x00A6 SpellCastPriest(O:Object*,I:Spell*Spell)

...

В этом примере синтаксис подсвечен, хотя при открытии IDS-файла Вы этого не увидите - подсветка синтаксиса в Infinity Script Compiler реализована только для BAF-файлов. Тем не менее, здесь это использовано для удобства восприятия. Как видно в приведенном примере, такая строка состоит из двух частей: числа в (как правило) шестнадцатиричной форме и прототипа (в данном случае это функция SpellCastPriest(...) ). При анализе файла программа разбивает такую строку на две части и хранит их в этом дереве, но по отдельности друг от друга.

Теперь - о том, как эту информацию можно использовать в процессе программирования. Выберите необходимый компилятор в выпадающем списке активного компилятора (подробнее см., например, Подготовка к работе или описание самого списка). Теперь либо нажмите комбинацию Ctrl+Y, либо выберите пункт меню Edit -> Reload Headers Data. Загрузка и анализ всех этих данных займет некоторое время (не больше неск. секунд), после чего дерево будет заполнено необходимой информацией. Если же Вы хотите очистить этот элемент, то либо нажмите Ctrl+U, либо выберите пункт меню Edit -> Clear Headers Tree.

поле шаблона (header lookup pattern)

В случае, если дерево хидеров заполнено данными из каталога компилятора, это поле играет роль поискового шаблона. Допустим, Вам необходимо найти точное описание функции SetGlobal(). Вы не помните, где именно она описана, не помните, какие у нее параметры и сколько их всего - вы помните только ее имя. Переведите фокус ввода в это поле (либо кликом мыши, либо нажав F2, либо через меню: Edit -> Header Lookup) и вводите последовательность символов, по которой должен будет осуществляться поиск. В нашем примере оптимальным решением будет строка "setglobal" (регистр символов при поиске не учитывается). Можно еще добавить дополнительный символ открывающей скобки, дабы не допустить попадания в результирующую выборку функций типа SetGlobalTimer(...). Набрали? Нажимайте клавишу Enter. После окончания поиска (в большинстве случаев он занимает время, много меньшее одной секунды) появится окно результатов поиска прототипов. В нем перечислены все случаи вхождения заданной подстроки в строках с прототипами. При этом, каждый дочерний элемент дерева будет находиться в том же родительском элементе (имя файла), в котором он находится в оригинальном дереве, так что невнятной мешанины Вы не получите.

NB: Поиск осуществляется только по тексту, содержащемуся в дочерних элементах дерева. Корневые элементы при поиске игнорируются. Таким образом, в окне результатов поиска Вы никогда не увидите пустых корневых элементов. И еще одно замечание: для удобства работы все корневые узлы в окне результатов поиска распахиваются перед отображением окна.

как этим пользоваться

Естественно, мало найти описание функции. Надо скопировать его в скрипт! И Вы таки зря думаете, что я настолько конченый подонок, что заставлю Вас делать это руками. Итак:

  • Двойной клик ЛЕВОЙ кнопкой мыши (клавиатурный эквивалент - Enter) по любому дочернему элементу дерева приведет к его копированию в текущую позицию редактирования активного окна со скриптом. Точнее, не совсем так: этой строкой будет заменен выделенный кусок текста в активном окне редактирования. Дабы не потерять ни единого символа из своего текста, перед копированием убедитесь, что а) текстовый курсор стоит в нужном месте, и б) в окне редактирования не выделен никакой текст. Таким образом, Вы получите в нужном Вам месте копию нужного Вам текста;
  • Одиночный клик ПРАВОЙ кнопкой мыши (клавиатурный эквивалент - Ctrl+Space) приведет к аналогичной операции копирования, только в этом случае скопирован будет не текст элемента (прототип функции/триггера/константы), а его числовой код из исходного IDS-файла. Я не знаю, пригодится ли эта фича кому-либо, но на всякий случай реализовал ее.


Compilation Log

лог компиляции

Эта часть окна программы предназначена для отображения результатов компиляции скрипта. Функционирует все это барахло следующим образом.

Когда компилятор заканчивает обработку Вашего скрипта, он генерирует список встретившихся ему ошибок. Естественно, если никаких ошибок нет, то и разговор вести не о чем - соответствующий файл будет пуст. Однако, если они все-таки есть, то такой файл протокола содержит краткое описание ошибки вкупе с номером строки, в которой она (эта ошибка) находится. Файл лога имеет то же имя, что и скрипт, расширение .ERR и располагается в каталоге %GameRootDir%\ScriptCompiler\errors.

После каждой компиляции скрипта Infinity Script Compiler проверяет соответствующий ему лог. Если файл имеет нулевую длину, то все в порядке, ошибок нет. Если же там что-то есть, то производится разбор этого файла с разбитием его на строки и вычленением номеров ошибочных строк исходного скрипта. После чего получившийся список отображается в этом окне. При этом в строке состояния программы выводится надпись "Some errors occured. Check log for details".

В случае, если в настройках Infinity Script Compiler установлена опция "Autoshow error log after compile", это окно автоматически появится в нижней части основного окна программы. Если же эта опция снята, то, дабы просмотреть список ошибок, необходимо его отобразить. Для этого либо нажмите кнопку "Toggle Log" на панели инструментов, либо нажмите клавиши Ctrl+G, либо выберите пункт меню View -> Log Window.

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


Options Window: General Tab

закладка основных настроек

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

Auto show error log after compile - определяет, будет ли лог компиляции автоматически отображаться на экране в случае наличия ошибок в скомпилированном скрипте. Примечание: если в результате компиляции ошибок не обнаружено, то лог не будет появляться даже при включенной опции. В то же время, его можно в любой удобный момент отобразить/убрать вручную.

Auto load headers data for selected compiler - определяет, должна ли программа автоматически загружать/обновлять дерево хидеров при смене текущего компилятора. Процесс довольно длительный (ну, по крайней мере, не мгновенный), так что по умолчанию опция отключена.

Automatically copy compiled script into Scripts directory (ignored in BCS mode) - определяет, должна ли программа автоматически копировать только что скомпилированный скрипт в каталог %GameRootDir%\Scripts, в котором игра сможет его обнаружить. Если Вы компилируете обычный скрипт для использования персонажами Вашей партии, то эту опцию рекомендуется включить.

Automatically maximize child windows - управляет автоматическим распахиванием дочерних окон (редактирования) при их создании.

Auto-Indent - управляет режимом автоотступа.

Ignore Override folder - определяет, будет ли учитываться содержимое хидеров в каталоге Override (буде такие найдутся) при заполнении дерева хидеров. В связи с тем, что компилятор не видит хидеры, расположенные в этом каталоге, рекомендуется использовать мастер синхронизации IDS-файлов, после чего этот флаг можно спокойно устанавливать. По умолчанию отключено.

MRU List Size - задает размер списка последних использовавшихся файлов. Минимум - 0 (список не создается вообще), максимум - 26. Расположенная рядом кнопка Clear MRU List предназначена для очистки этого самого списка.

Default compiler - определяет компилятор по умолчанию. Этот компилятор будет установлен как текущий при каждом запуске Infinity Script Compiler.

When Tab key pressed - определяет поведение программы при нажатии клавиши Tab в окне редактирования. Доступные варианты:

  • Keep Tabs - оставляет все как есть (в файл пишется символ табуляции);
  • Insert Spaces - каждое нажатие клавиши табуляции приводит к вставке в текущую позицию курсора указанного Вами в расположенном рядом поле редактирования количества пробелов. По умолчанию принят типографский стандарт: 1 Tab = 5 Spaces.

Syntax Highlight Engine - эта группа опций на данный момент (версия 1.1 билд 3) реализована не полностью. Опишу то, что работает:

Action to re-highlight script text - задает действие пользователя, по которому будет запускаться движок подсветки синтаксиса. Возможные установки:

  • Do not use syntax highlight at all - полностью отключает подсветку синтаксиса;
  • On 'Esc' key (user's choice) - запускает раскраску ВСЕГО скрипта (что может занять заметное время) при нажатии пользователем клавиши Escape. Не рекомендуется вследствие своей неотлаженности (иногда самопроизвольно начинает работать в построчном режиме, исправление ошибок займет некоторое время);
  • On text line change (optimal) - построчный режим, наиболее оптимален и полностью отлажен. Работает так: Когда Вы начинаете редактирование какой-либо строки, она тут же полностью красится черным цветом (в смысле шрифт, а не фон). Когда же Вы заканчиваете ее редактирование и переводите курсор на любую другую строку, эта строка автоматически подсвечивается. Поведение алгоритма в этом случае полностью имитирует среду разработки Visual Basic;
  • On every text change (not recommended) - отключено вследствие глючности и большого времени работы алгоритма. Возможно, в будущих версиях этот пункт будет полностью удален.

Automatically disable Syntax Highlight if script file exceeds ... Kb - не реализовано.

NB: В любой удобный для Вас момент Вы можете запустить подсветку всего скрипта, нажав клавишу F9 либо выбрав пункт меню Edit -> Rehighlight text. Но учтите, что для этого опция "Do not use syntax highlight at all" не должна быть выбрана.


Options Window: Editor Tab

закладка свойств редактора

На этой закладке собраны опции, относяшиеся к редактированию текста, а также некоторые настройки, касающиеся движка Syntax Highlight.

Editor Font - позволяет задать параметры шрифта, который будет использоваться в окне редактирования. Устанавливаемые параметры:

  • Typeface - Гарнитура (название шрифта);
  • Size - Кегль шрифта (размер в точках, точка = 1/72 дюйма в системе PostScript);
  • Bold - полужирный шрифт;
  • Italic - курсив;
  • Underlined - подчеркнутый шрифт.

Теперь что касается списка с типами подсветки. Когда Вы выделяете элемент в списке, в контроле снизу цветовое поле принимает соответствующий цвет, а ползунки занимают соответствующее положение. Манипулируя подзунками, Вы можете изменить цвет выделенной позиции.

Список доступных категорий:

  1. Comment - комментарий. Начинается с двух слэшей - //;
  2. Constant - константа. Ограничивается квадратными скобками;
  3. Error - ошибка. Если в какой-либо строке имеется ошибка (скобка не закрыта, например), то она вся красится этим цветом;
  4. Identifier - идентификатор. Имя функции, триггера и т.д.;
  5. Keyword - Ключевое слово. Имеются в виду следующие слова: IF, THEN, RESPONSE #, END;
  6. Literal - строка. Ограничивается двойными либо одинарными кавычками (" или '), а также (по просьбе Talen'a) тильдами (~). Внимание: оригинальные компиляторы скриптов не поддерживают тильду в качестве пограничного элемента строк;
  7. Number - число. Может быть в десятичной или шестнадцатиричной форме. Во втором случае используется формат языка С.


Options Window: Compilers Tab

список компиляторов

На этой закладке представлены компиляторы скриптов, известные Infinity Script Compiler. Здесь Вы можете добавить компилятор (например, при установке новой игры на движке Infinity, или при первом запуске программы), отредактировать его описание (поле Game) или удалить запись о каком-либо компиляторе (например, после снесения игры или перед снесением программы). Кратко опишу, что за что отвечает.

Find New... - кнопка открывает диалоговое окно Open, в котором Вы можете указать расположение файла компилятора (AICompile.exe);

Edit - кнопка позволяет отредактировать сведения, касающиеся выделенного в основном списке компилятора (в основном, требуется редактирование только поля Path);

Delete - кнопка позволяет удалить выделенный компилятор;

Info - информация о выделенном компиляторе (путь к исполняемому файлу и псевдоним)

  • Full Path - полный путь к компилятору;
  • Game - псевдоним компилятора. Рекомендуется вводить в это поле название игры, дабы избежать путаницы;
  • Clear Fields - кнопка очищает поля Full Path и Game;
  • Apply - становится доступной только при следующих двух условиях: а) Вы вошли в режим редактирования (нажав кнопку Edit) и б) Вы сделали какие-либо изменения в информации о компиляторе. Применяет изменения.

Детальное описание процесса добавления записи о новом компиляторе см. Подготовка к работе.


Options Window: File Associations Tab

закладка "file associations"

На этой закладке вы можете установить или снять файловые ассоциации для тех типов файлов, которые поддерживаются Infinity Script Compiler. Установка соответствующих ассоциаций приведет к следующему:

  1. Файл будет иметь иконку, идентичную использованной в этом списке;
  2. При двойном клике по файлу в Windows Explorer он будет открыт в Infinity Script Compiler.


Options Window: Confirmations Tab

закладка подтверждений

На этой закладке собраны настройки различного рода подтверждений, запрашиваемых Infinity Script Compiler у пользователя в тот или иной момент по ходу работы.

When closing a file - группа опций, позволяющих задать поведение программы в момент закрытия файла. Доступные варианты:

  • Discard changes and don't save - не сохранять файл при его закрытии. Все изменения, сделанные с момента последнего сохранения, будут утеряны;
  • Ask about saving - запросить пользователя, если файл был изменен с момента последнего сохранения;
  • Auto save if file isn't opened in Read-Only mode - автоматически сохранять файл в случае наличия изменений.

Don't show "Save As" dialog if file was just created and isn't saved at all - опция становится доступной для изменения только при установленном режиме автосохранения. Работает она следующим образом: если Вы создали новый документ, что-то в нем сделали и решили не сохранять ничего, то при закрытии диалоговое окно "Save As" отображено не будет. Полезная фича для тех, кто всегда знает, что он делает.

Confirm when opening/closing files in read-only mode - определяет запрос подтверждения при открытии файла в режиме "только чтение";

Auto discard non-supported files' types on drag-and-drop and command string - автоматически отбрасывает файлы с неиспользуемыми расширениями при операции перетаскивания или из командной строки. В случае отключения будет выдаваться нотификация;

Confirm when clearing most recently used (MRU) list - запрос подтверждения перед очисткой списка последних использовавшихся документов;

Confirm when (un)registering files' types - запрос подтверждения перед (де)регистрацией файловых ассоциаций;

Notify if MRU link is invalid - выдача уведомления в случае некорректной ссылки в списке последних использовавшихся документов.


Wizards: Overview

встроенные мастера

В этом разделе приводится описание встроенных в программу мастеров. Как правило, назначение их весьма специфично и частого использования не подразумевает. Тем не менее, задачи, выполняемые ими, весьма актуальны.

  • Мастер синхронизации IDS-файлов.


Wizards: IDS Synchronize

Мастер синхронизации IDS-файлов

Разделы:

  • Предисловие
  • Описание
  • Использование
Предисловие

Этот мастер был создан для исправления небольшого бага от Биовары. Дело в том, что оригинальный компилятор скриптов, поставляемый с играми, видит хидеры, расположенные только в том же каталоге, что и он сам. Поскольку для игр периодически выходят патчи и/или обновления, содержимое хидеров, равно как и их количество, периодически растет. Только вот одна проблема: механизм движка Infinity таков, что нет нужды искать во всех файлах какой-нибудь скрипт или описание заклинания, чтобы старый стереть, а новый записать на его место. Достаточно соответствующий файл положить в специальный каталог Override, находящийся в корневом каталоге игры, и соответствующие изменения будут учтены при следующем запуске игры.

Как я уже упоминал, AICompile.exe видит хидеры (и, соответственно, функции), расположенные в том же каталоге, что и он сам. Получается некрасивая ситуация: игра может использовать функции, определенные в новых хидерах (находящихся в каталоге Override), а компилятор - нет.

На практике это приводит к невозможности корректной компиляции скриптов, предназначенных для использования в собственных локациях, диалогах и т.д. - проще говоря, BCS-скриптов. В принципе, на бинарном уровне эти два вида скриптов не отличаются ничем, кроме одной буквы в расширении файла - BS / BCS. Другое дело, что в последнем случае часто используется подмножество функций и триггеров, предназначенных исключительно для внутренних скриптов самой игры. Например, LeaveAreaLUAPanicEntry(S:Area*,S:Entry*,P:Point*,I:Face*) - очень распространенная функция в скриптах локаций. Можно найти и другие примеры, только вот искать лень. Одно могу сказать точно - эти примеры существуют.

Данный мастер исправляет эту несправедливость, позволяя грамотно скопировать новые хидеры в каталог компилятора и при необходимости производя автоматический бэкап оригинальных файлов.

Описание

Ниже приводится описание визуальных элементов и их функционал.

"Override Folder" - список содержит в себе перечень всех IDS-файлов, содержащихся в каталоге Override выбранной игры (при запуске мастера выбранной игрой считается та, к которой относится компилятор, выбранный в данный момент в списке компиляторов). Установка галочки (отметка) файла в этом списке приведет к тому, что соответствующий файл будет скопирован в целевой каталог (каталог с компилятором). Также, в этом списке (файлов, а не компиляторов) используется следующая цветовая гамма:

  • Красный цвет шрифта - файл имеет более раннее (или совпадающее) время создания/модификации, нежели тот, на место которого его долженствовало бы скопировать. Копирование такого файла не рекомендуется, изначально отметка снята, и при попытке установить ее выдается предупреждающее сообщение;
  • Синий цвет шрифта - файла с таким именем нет в каталоге с компилятором. Такие файлы настоятельно рекомендуется копировать, изначально отметка установлена и при попытке снять ее с такого файла выдается предупреждающее сообщение;
  • Черный цвет шрифта (по умолчанию) - файл с таким именем существует в каталоге с компилятором, но имеет более раннее время создания/модификации. Стандартная ситуация.

"ScriptCompiler folder" - список содержит в себе перечень всех IDS-файлов, содержащихся в каталоге текущего компилятора. Отметка файла в этом списке приведет к тому, что он будет переименован по схеме: "*.IDS" -> "*.IDS.BAK ".

Кнопки "Select All" (2 штуки, по одной на каждый список) - нажатие приводит к отмечанию в соответствующем списке всех файлов. При этом файлы, помеченные красным цветом шрифта в списке "Override folder", не отмечаются.

Кнопки "Clear All" (2 штуки, по одной на каждый список) - нажатие приводит к снятию в соответствующем списке отметок со всех файлов. При этом с файлов, помеченных синим цветом шрифта в списке "Override folder", отметки не снимаются.

Кнопка "Refresh" - нажатие приводит к перезаполнению списков и сбросу всех отметок на значения по умолчанию.

Флаг "Use smart backup" - очень полезная штука, настоятельно рекомендуется к использованию и поэтому по умолчанию установлена. Включение этого флага приводит к следующему:

  • При нажатии кнопки "Select All" для списка "Override folder" отметки устанавливаются не только на все файлы в этом списке с целью их копирования (кроме красных, разумеется), но и на все соответствующие файлы в каталоге компилятора с целью их бэкапа;
  • Аналогично, нажатие кнопки "Clear All" для списка "Override folder" также снимает отметки со всех соответствующих файлов в каталоге компилятора;
  • Любое отдельное снятие/выделение файла в исходном каталоге приводит к соответствующей операции с целевым файлом. Также, список целевого каталога автоматически прокручивается так, чтобы "свежеотмеченный" файл был виден.

Кнопка "Synchronize" - нажатие приводит к запуску механизма копирования/бэкапа с указанными установками.

Кнопка "Close" - нажатие приводит к выходу из мастера без произведения каких-либо изменений в каталогах.

Использование

Скажу сразу: этот мастер не предназначен для ежедневного использования. Запускать его имеет смысл только в двух типах случаев:

  1. После установки игры. Для некоторых игр (например, Baldur's Gate I) каталог Override оказывается непустым, что называется, без единого патча. Имеет смысл сразу предоставить компилятору последние версии хидеров, чтобы потом больше не париться на эту тему;
  2. После установки патча и/или дополнения. В этом случае использование мастера настоятельно рекомендуется.

Для запуска мастера выберите пункт меню Service->Tools->IDS Synchronize Wizard. Появится окно, показанное на скриншоте вверху этой страницы. Списки заполняются автоматически при открытии окна, поэтому кнопка "Refresh" особого смысла не имеет. Поскольку флаг "Use smart backup" по умолчанию установлен, то можно сразу нажать кнопку "Select All" для списка "Override folder". Отметятся все файлы, подходящие для копирования, отметятся все соответствующие им файлы для бэкапа. В принципе, после этого можно спокойно нажимать кнопку "Synchronize" и наслаждаться результатами работы программы.

Замечание: После успешного окончания работы мастера в случае, если Вы скопировали все подходящие файлы, рекомендуется установить флаг "Ignore Override folder" в окне настроек программы. Также, если Вы обработали хотя бы один файл, следует после этого перезаполнить список "Headers Data" в дереве хидеров.


Окно поиска и замены

поиск и замена

Окно предназначено для поиска и замены текста в файлах скриптов. Поведение и назначение элементов в большинстве своем аналогично тому, что обычно реализуется в текстовых редакторах.

Ниже приводится описание каждого элемента в отдельности.

  • Поле Search Pattern - строка в файле скрипта, которую необходимо найти;
  • Поле Replace With - строка, на которую будет замещена искомая в случае использования механизма замены;
  • Группа Search - выбор диапазона поиска:
    • This Script (по умолчанию выбран) - поиск в пределах активного окна;
    • All Opened Scripts - поиск по всем открытым в данный момент в среде Infinity Compiler скриптам;
    • Selected Text - поиск в тексте, выделенном в активном окне Infinity Compiler.
  • Выпадающий список Direction - выбор направления поиска относительно текущего положения курсора:
    • All (по умолчанию выбран) - поиск от начала до конца указанного диапазона;
    • Up - поиск от начала указанного диапазона до позиции курсора;
    • Down - поиск от позиции курсора до конца указанного диапазона.
  • Переключатель Find Whole Word Only - управляет режимом поиска слов (фраз) по их части;
  • Переключатель Match Case - определяет, будет ли поиск производиться с учетом регистра символов или нет;
  • Переключатель Don't Highlight Results - управляет режимом выделения результатов поиска;
  • Кнопка Find Next - производит поиск строки из поля Search Pattern в указанном диапазоне;
  • Кнопка Replace - производит поиск строки из поля Search Pattern в указанном диапазоне и замену ее на строку из поля Replace With в случае ее нахождения;
  • Кнопка Replace All - производит поиск и замену строки из поля Search Pattern в указанном диапазоне во всех случаях ее нахождения;
  • Кнопка Close - закрывает диалоговое окно поиска;
  • Кнопка Help - вызов справки (эта страница).


Header Lookup Results

окно результатов поиска

В этом окне отображаются результаты поиска по дереву хидеров. На приведенном выше скриншоте показаны результаты поиска по слову "enemy". Естественно, все не вместилось в один экран.

Функциональность дерева в этом окне практически идентична таковой у самого дерева хидеров. Подробнее см. "Дерево Заголовков". Единственное отличие заключается в следующем: у этого дерева есть возможность синхронизации выделенного элемента с основным деревом хидеров. Для этого выделите какой-либо элемент (не корневой!) и нажмите СРЕДНЮЮ кнопку мыши. В результате в основном дереве хидеров текущим элементом станет соответствующий указанному Вами элемент. При этом, если его родитель свернут, то программа его развернет; если элемент находится за пределами клиентской области дерева, то программа прокрутит содержимое дерева так, чтобы этот элемент стал виден. Короче говоря: Вы его увидите.

Для отображения этого окна, находясь в основном окне программы, нажмите клавишу F3 либо пункт меню "Lookup Results" в меню "Edit". Чтобы его закрыть, нажмите либо кнопку "Close", либо клавишу Escape.

Окно автоматически отображается после окончания поиска заданной последовательности символов в дереве заголовков. В случае же, если поиск не дал никаких результатов, окно не появляется, а в строке состояния выводится надпись "No matches found".


About

окно "о программе"

Это, пожалуй, самое бесполезное окно во всей программе ;) . Единственное, что здесь можно найти - версию сборки. В случае же, если у Вас вместо номера версии выводится надпись "Developer Version", значит, Вы где-то ухитрились достать бета-билд программы. Чем отличается такая сборка от релизной (по крайней мере, на момент версии, приведенной на рисунке):

  • Отключен вызов справки непосредственно из программы;
  • Программа в целом может работать менее стабильно, т.к. в некоторых местах может отключаться перехват ошибок.

Больше здесь приводить, в общем-то, нечего.


basic principles of script programming

В данном разделе приведена информация ознакомительного характера, могущая помочь в освоении скриптового языка Infinity Engine. Большая ее часть была взята из руководства по скриптовому программированию для игр Icewind Dale I и Baldur's Gate II.

Раздел состоит из следующих частей:

  1. Обзор синтаксиса. Определения.
  2. Иерархия объектных идентификаторов.
  3. <Пока ничего>


Programming Basics: #1

Обзор синтаксиса

Пример скелета скрипта:

IF

Condition1

THEN

RESPONSE #weight

Response1

RESPONSE #weight

Response2

END

IF

Condition2

THEN

RESPONSE #weight

Response3

RESPONSE #weight

Response4

END

…

Определения основных терминов

Creature (Создание): Создания включают в себя все объекты, так или иначе способные к действию. Сюда включаются также и терсонажи игрока.

Trigger (Триггер): Триггер посылается созданию при определенном событии. Триггер включает в себя информацию о причинах, ставших причиной его возникновения.

Condition (Условие): Комбинация триггеров, соединенных посредством логического "И".

Action (Действие): Определенная реакция на условие. Действие требует информации о том, к кому (или к чему) оно должно быть применено.

Response (Реакция): Комбинация действий, выполняемых последовательно. Эта последовательность может быть прервана.

Response Set (Набор реакций): Комбинация реакций, каждая с весом от 1 до 100 включительно. Вес используется для того, чтобы определить, какая именно из реакций в данный момент исполняется. Определение осуществляется произвольно, т.е. "от балды".


Programming Basics: #2

Идентификация созданий и объектов

Идентификация объектов и созданий производится посредством класса ObjectType. Класс ObjectType описан ниже:

BYTE EnemyAlly

Диапазон от членов партии до вражеских NPC. Создания могут занимать любое положение в этом диапазоне.

BYTE General

Определяет базовые характеристики создания (Humanoid, animal, object и т.д.).

BYTE Race

Раса создания (Elf, Dwarf …).

BYTE Class

Информация о классе (Mage, fighter …). Может также использоваться для большего уточнения (например, Drow более специфичное определение, нежели Elf).

BYTE Specifics

Идентификация особенных NPC.

LONG Instance

Уникален для каждого создания в игре. В принципе, не должен использоваться в AI-скриптах, но будет известен, например, в случае выбора цели.

BYTE SpecialCase

Определяет, использовать какую-либо специальную информацию или нет. В настоящий момент используется только в случаях LAttacked и LTargetted.

Protecting, Protector и Myself должны располагаться отдельно, чтобы можно было указывать, например, Protecting.LAttacked. Чтобы указать все подтипы как допустимые, необходимо уточняющие признаки указать как 0. Например, чтобы определить всех вражеских дварфов, нужно установить General, Class, Specifics и Instance равными 0 - [ENEMY.0.DWARF].


Programming Basics: #3


Scripting Tutorial

scripting tutorial start page

Признаюсь честно: я не умею писать скрипты. В течение примерно полугода я безуспешно пытался реализовать то, чего я хотел. Сначала для Icewind Dale, потом - для Baldur's Gate II. В конечном итоге получились примитивнейшие скрипты из 2-3 секций. Они, по крайней мере, работали как надо, хотя этого было неимоверно мало. И все равно это было больше, чем ничего (равно как и то, что предлагается как Default).

Проблема, как всегда, в недостатке документации - если бы Bioware задокументировала свой шедевр как следует, да при этом еще и простым смертным (вроде нас с Вами) эту документацию предоставила бы, да при этом не открещивалась бы от компиляторов и документации к ним, как черт от ладана... Можно долго продолжать говорить в сослагательном наклонении, да только делу это не поможет. Поэтому я решил не изобретать велосипед, и просто перевел на понятный русский обучалку по скриптовому программированию, включенную в описание языка для Icewind Dale I. В некоторых местах я кое-что добавлял от себя, в других - кое-что выкинул как не относящееся к делу, но в общем это не более, чем просто перевод.

Вообще, ребята из Black Isle здорово постарались - эта версия изрядно переработана и отличается от оригинала (Baldur's Gate) в лучшую сторону. Судите сами:

  • Функция SetBestWeapon(O:Object*,I:Range*) - устанавливает оружие, наиболее подходящее в зависимости от расстояния (I:Range*) до указанного объекта (O:Object*). Если расстояние меньше либо равно указанному, то выбирается оружие для рукопашного боя, если больше - метательное/стрелковое.
  • Функция IsWeaponRanged(O:Object*) - определяет, является ли текущее оружие у указанного объекта метательным или нет.

Список наверняка можно было бы продолжить, но эти два примера наглядно демонстрируют, насколько проще писать скрипты под эту игру. Кроме того, в мануале имеется пример написания скрипта, чего в помине нет в BG.

Итак, приступим! Ниже приводится список тем, на которые разбито обучение:

  1. Initial Planning. Определяемся, чего мы, собственно, хотим;
  2. Preparations. Как мы сможем реализовать в коде то, что задумано;
  3. Programming. Непосредственно программирование;
  4. Compiling. Этот раздел полностью переписан, т.к. наличие Infinity Compiler полностью избавляет от необходимости пользоваться Блокнотом Windows, командной строкой и т.д.


Tutorial #1: Initial Planning

tutorial step #1: initial planning

В данном разделе мы поговорим о том, что скрипт может и чего - не может. Также, надо разобраться в том, что именно мы от него хотим. Не стоит с первого же раза пытаться создать что-то наподобие "серебряной пули" - скрипта на все случаи жизни. Все равно не получится - это я для себя уже выяснил, теперь пытаюсь довести сию истину до Вас. Ведь, если Вы читаете этот раздел, значит, собственного опыта у Вас еще нет или, по крайней мере, недостаточно. Ну, ладно, приступим.

Начнем с возможностей скрипта. Истина в первой инстанции гласит: "То, что Вы можете написать, скомпилировать и назначить членам своей партии, должно быть БОЕВЫМ скриптом". Проще говоря - как, кого и чем гасить. Как, от кого и чем защищаться. И т.д.

Что ж, попробуем для начала что-нибудь попроще. Допустим, нам нужна следующая модель поведения:

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

Стандартным пограничным расстоянием для рукопашного боя считаются 4 клетки. Если враг атакует Вас с этой или меньшей дистанции, значит, атака будет рукопашной, если с большей - дистанционной. Можете быть уверены, скрипт Вашего компьютерного врага переключит его на оружие, соответствующее текущей ситуации. Никто и никогда не пойдет к Вам впритык, чтобы потом стрелять в Вас. Объясняется же вся эта котовасия очень просто: если у Вас в руках стрелковое оружие, а на Вас нападают в рукопашной, то каждый атакующий бросок противника будет выполняться с бонусом 4 на THAC0 до тех пор, пока у Вас в руках стрелковое оружие. При этом кулаки считаются оружием ближнего боя, а вот насчет всяких там Energy Blades - не спрашивайте, не знаю.

NB: Учтите, что двуручное оружие имеет эффективный радиус действия больше 4 клеток. Я обычно для верности беру 6-8, хотя это может быть и не так.

Следующий шаг

Вступление


Tutorial #2: Preparations

tutorial step #2: preparations

В этом разделе описываются действия, необходимые для подготовки к работе.

Прежде всего, запустите Infinity Compiler. Создайте новый скрипт, после чего (на всякий случай) сохраните его в каталог, в котором хранятся исходные коды скриптов. Называется этот каталог Source, и находится следующим образом:

Допустим, корневым каталогом для игры является "D:\IWD". В этом случае каталог, в который необходимо поместить исходник, будет таков: "D:\IWD\ScriptCompiler\source".

NB: В случае других игр в названии папки с компилятором может быть пробел, как, например, это имеет место для Baldur's Gate II - "D:\BG2\script compiler". Пусть Вас это не смущает.

Теперь давайте определимся, какими средствами мы будем добиваться реализации необходимой модели поведения. Можно, конечно, долго рыть описания, и в конечном итоге даже выучить их наизусть, но в данном случае этого не требуется. Вот перечень необходимых нам функций:

  • AttackedBy(O:Object*,I:Style*AStyles) - событийный триггер. Возвращает TRUE в случае наличия факта атаки владельца скрипта объектом, указанным в параметре O:Object*, при этом должно также выполняться условие стиля атаки - [DEFAULT], [MELEE] или [RANGED]. В случае, если проверка производится с [DEFAULT], то стиль атаки не учитывается.
  • Range(O:Object*,I:Range*) - условный триггер. Возвращает TRUE в случае выполнения некоего условия на момент проверки, а именно: расстояние от владельца скрипта до объекта O:Object* не должно превышать I:Range* клеток.
  • RunAwayFrom(O:Creature*,I:Time*) - функция. Заставляет владельца скрипта выполнить некое действие, в данном случае - убегать от объекта O:Creature* в течение I:Time* единиц времени. В случае этой функции второй параметр выражается в 15-х долях секунды (в документации к IWD, кстати, сказано, что тут должны быть целые секунды).
  • EquipRanged() - функция. Как видно из определения, параметров не принимает. Назначение очевидно из названия.
  • Attack(O:Target*) - функция. Заставляет владельца скрипта атаковать объект O:Target* до тех пор, пока он (в смысле объект) не умрет, либо владелец скрипта не сделает то же самое, либо игрок не переопределит действия персонажа.

Следующий шаг

Вступление


Tutorial #3: Programming

tutorial step #3: programming

Ну, здесь все довольно просто. Исходный текст будет выглядеть примерно так:

IF

AttackedBy([ANYONE],[DEFAULT])

Range(LastAttackerOf(Myself),4)

THEN

RESPONSE #100

RunAwayFrom(LastAttackerOf(Myself),45)

END

IF

!Range(LastAttackerOf(Myself),4)

THEN

RESPONSE #100

EquipRanged()

Attack(LastAttackerOf(Myself))

END

Теперь попробую объяснить то, что здесь написано.

Если меня (этим местоимением я буду обозначать владельца скрипта, т.е. персонажа, которому назначен этот скрипт) атакует кто-либо, причем неважно как, и при этом расстояние от меня до него соответствует расстоянию рукопашной схватки, т.е. 4 клетки (весь экран составляет примерно 30 клеток, правда, в оригинале не сказано, по какому именно измерению - ширине или высоте), то я убегаю от того, кто нападал на меня последним, причем делаю это в течение 3 секунд (второй параметр функции RunAwayFrom() выражен в 1/15 секунды).

Если же расстояние от меня до нападающего на меня не позволяет ему пустить в ход меч, булаву или что-либо подобное, то я переключаюсь на стрелковое оружие и начинаю по нему работать, пока он не умрет.

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

Следующий шаг

Вступление


tutorial step #4: compilation

Теперь сохраняем все это хозяйство и компилируем.

Скрипт должен быть сохранен в соотв. папке (см. Шаг 2) и иметь имя, не превышающее 8 символов в длину (не считая расширения, разумеется). Это ограничение не моей программы, это ограничение самого компилятора (точнее, всего движка Infinity).

Когда все это будет проделано, останется только скомпилировать файл. Для этого либо нажмите кнопку "Compile" на панели инструментов, либо выберите пункт меню "Save & Compile" из меню "Service", либо нажмите F5 на клавиатуре.

После этого смотрите на строку состояния. Если там будет выведена надпись "Script was compiled successfully", значит, все в порядке, ошибок нет. Если же какие-либо ошибки все-таки есть, то программа сама подцепит соответствующий .ERR-файл и отобразит список ошибок в логе компиляции. В случае, если в настройках Infinity Compiler установлена опция "Autoshow Error Log After Compile" (по умолчанию она установлена), то лог отобразится автоматически.

Скомпилированный скрипт имеет то же имя, что и исходный файл, но расширение у него другое - .BS. После компиляции он помещается в подкаталог Compiled. После этого его остается только скопировать в каталог Scripts, находящийся в корневом каталоге игры. Если же у Вас в настройках Infinity Compiler установлена опция "Automatically copy compiled script into Scripts directory" (по умолчанию установлена), то и это программа сделает сама.

Все! Остается только запустить игру и назначить персонажам этот скрипт.

Удачного Вам программирования!

Вступление


Additional Information

дополнительная информация: история версий

Долгое время я не знал, чем заполнить эту страницу. Перечислять глюки и ошибки в документации Bioware как-то ломало, а ничего другого в голову не приходило. Однако теперь здесь будет размещена история версий программы. Раньше в этом не было нужды за отсутствием вышеозначенной истории, однако теперь такая необходимость появилась. Перечисление будет вестись снизу вверх, т.е. описание новых версий будет помещаться над предыдущими.

Итак, поехали, если, конечно, Вам интересно все это барахло. Сразу хочу предупредить, что версия сборки мало что значит - в основном играют роль старшая и младшая версии релиза, как показатели каких-либо заметных изменений в программе. О таких же вещах, как исправление глюков даже и писать не буду, иначе эта страница очень быстро превратится в самую объемную во всей справке. Могу сказать только одно - глюки ищутся и исправляются.

Содержание списка

  • Версия 1.3
  • Версия 1.2
  • Версия 1.1
  • Версия 1.0 - Первый релиз программы.

Версия 1.3

Добавлена возможность прямой компиляции в BCS-формат. Кнопка "Save & Compile" теперь имеет выпадающее меню, в котором можно выбрать режим компиляции:

  • Compile to BS (обычный режим)
  • Compile to BCS

Также, при выборе BCS-режима компиляции, флаг "Automatically copy compiled script into Scripts directory" игнорируется независимо от своего значения.

Для корректной компиляции BCS-скриптов рекомендуется скопировать все IDS-файлы из каталога Override в каталог ScriptCompiler. Для этого рекомендуется пользоваться мастером синхронизации IDS-файлов.

Наверх

Версия 1.2

Добавлена обработка каталога Override. Соответственно, в настройках программы на закладке General появилась дополнительная опция - "Ignore Override folder" (по умолчанию отключено).

Изменена библиотека Syntax Highlight (DF_SHE.dll) - требуется ее обновление и перерегистрация в системе.

Панель инструментов Editor дополнена следующими командами:

  • Comment/Uncomment (2 кнопки) - позволяют комментировать / убрать комментирование выделенных строк кода;
  • Indent/Outdent (2 кнопки) - позволяют увеличить/уменьшить отступ от левого края выделенных строк кода;
  • Insert Script Block - нажатие этой кнопки приводит к вставке в начало текущей строки (или к замене выделенных строк, если такие имеются) следующего кода:

    IF

    // TODO: Condition

    THEN

    RESPONSE #100

    // TODO: Response Set

    END

Наверх

Версия 1.1

Добавлен движок Syntax Highlight для скриптов. Реализуется посредством библиотеки DF_SHE.dll.

Наверх

Версия 1.0

Первый релиз программы. Кроме меня да, пожалуй, Talen'a, его никто толком и не видел. :)

Наверх


по поводу глюков...

Программа предназначена для работы под ОС Microsoft® Windows. На настоящий момент программа протестирована на следующих системах:

  • Microsoft® Windows™ 2000 Server SP2
  • Microsoft® Windows™ XP Pro SP1
  • Microsoft® Windows™ Me

Также, для работы программы требуется наличие на клиентской машине Microsoft® Internet Explorer 4.0 или выше (для вышеупомянутых операционных систем это условие выполняется автоматически).

Проблемы, могущие возникнуть при установке и/или использовании программы:

  • В Windows 2000 рекомендуется предварительно установить сервис-пак 2 или выше, иначе попытка установки программы может закончиться неудачей или вызвать проблемы с версиями компонентов;
  • Были замечены некоторые проблемы с отрисовкой и позиционированием под Windows 98. Тем не менее, на общую работоспособность программы это влияния не оказывает.

Проверка работоспособности под остальными ОС семейства Windows на момент выпуска программы была невозможна и проведена не была. Так или иначе:

В случае обнаружения чего-либо, что кажется Вам глюком, просьба направить автору программы e-mail по адресу tiegael@yandex.ru с темой "InfComp Bug". В письме настоятельно рекомендуется помимо описания ошибки привести следующие данные:

  1. название ОС и сервис-пака, если таковой установлен;
  2. язык локализации ОС;
  3. дополнительная информация, могущая помочь в выяснении причин ошибки.

Я что-нибудь придумаю.

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

P.S. То же самое касается и предложений по улучшению программы и добавлению функциональности.


Опции командной строки

В программе доступны следующие ключи командной строки:

  • /NOSPLASH - Ключ отключает показ заставки (splash screen) при загрузке программы.

Все ключи следует набирать с ведущим слэшем (/), тире не поддерживается. Между слэшем и ключом не должно быть пробелов. Имя ключа может быть набрано в любом регистре, в том числе и смешанном.


Об Авторе

Программа разработана в 2001 - 2003 году группой Dark Flame.

Ennor Tiegael - Проектирование, дизайн, разработка и тестирование приложения.

Отдельное спасибо:

Коллектив разработчиков из Bioware Corp. - за свое поистине гениальное творение;

Dmitry Jemerov - за замечательную утилиту Infinity Explorer, оказавшую мне неоценимую помощь в работе над этой программой;

Коллектив A.E.R.I.E. Team и лично Talen - за моральную поддержку и дополнительное тестирование.