X3: Reunion

21.06.2006 21:57

Где у него кнопка, Ури? Ты можешь найти кнопку?

х/ф «Приключения Электроника»

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

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

Разрушенные врата. Поставить их в своем собственном секторе — вопрос пары строк кода.

Общая концепция

Для начала разберемся — что такое редактор скриптов, зачем он нужен и как можно поменять игровую вселенную, прибегнув к помощи этого инструмента? Каковы, наконец, подводные камни, ожидающие начинающего скриптописателя на его нелегком, но чрезвычайно увлекательном пути?

Итак, мы имеем дело с полноценным отладчиком пользовательских программных кодов, интегрированный в саму игру. В исходном состоянии, то есть на момент установки игры, редактор не активирован и будет пребывать в спящем состоянии ровно до тех пор, пока игрок не попытается сменить свое игровое имя на специальный код «Thereshallbewings». При этом прежнее игровое имя остается неизменным, зато в нижней области игрового экрана появляется надпись modified, а в меню игрока и объектов игры добавится пункт доступа в скриптовый редактор.

При ближайшем рассмотрении можно заметить, что структура внутреннего логического языка игры подозрительно похожа на элементарный древнейший Basic тех времен, когда умельцы еще не приделали к нему приставку Visual. Новоявленный язык отличается лишь набором специфических команд, служащих для непосредственного управления объектами игры и их свойствами.

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

Именно так встречает игрока скриптовый редактор

Однако не все это будет одобрено компанией EGOSOFT. Любые скриптовые изменения в игре должны быть сертифицированы у компании разработчика на предмет соответствия основной идее проекта. Можно, конечно, пользоваться самодельными скриптами, не прошедшими горнило экспертов Эгософта, но в этом случае игрок будет пользоваться «модифицированной» версией игры, то есть — не такой, как у всех. А раз игра отличается от других, значит, она еретична по природе своей. Очиститься от подобной скверны можно, лишь пройдя сертификацию, убирающую при использовании авторского скрипта позорную надпись modified с нижней части экрана. Кстати, все сертифицированные скрипты имеют шанс попасть в очередное официальное обновление игры. И уж точно «признанный» код попадет в базу данных «благословленных» компанией скриптов, рекомендованных к самостоятельному скачиванию с портала разработчиков игры. Тот, кому удастся пройти сертификацию, может за кружечкой эля небрежно бросить друзьям: «А знаете, парни, я один из тех, кто создавал Х3

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

Функции встроенного редактора

Главное меню редактора.
Пример скрипта

Впервые запустив на своей машине редактор скриптов, игрок сразу же получает уведомление от компании-разработчика. Представляете — летите вы в космосе, и тут на компьютере вдруг появляется сообщение из параллельной вселенной: «Активирован режим ручного управления бортовым компьютером!» По нажатию клавиши Enter можно сразу же попасть в основное меню редактора скриптов. Давайте пройдемся по пунктам меню.

  • Script Editor. Открывает окно скриптов, доступных для редактирования. Самая верхняя строчка списка — Initiate new script — создает пустой файл. Ниже расположен список уже существующих скриптов, в том числе и тех, что были созданы разработчиками. Для различных операций со скриптами в окне редактора есть горячие клавиши (см. таблицу).
Клавиши управления редактором скриптов
Режим просмотра
Загрузить скрипт из папки L
Копировать C
Выполнить R
Удалить Del
Редактировать Enter
Режим редактора
Перемещение по строкам Вверх/вниз
Перемещение между выражениями Влево/вправо
Меню функций Enter
Вставить новую строку Ins
Удалить строку Del
Копировать строку в буфер C
Вырезать строку в буфер X
Вставить строку из буфера V
Закомментировать строку .
Удалить символ комментария ,
Вставить операнд выражения Home
Удалить операнд выражения End
Сохранить и закрыть скрипт Esc
  • Reinit Script Caches. Все скрипты, работающие в игре, находятся в специальном буфере: это заметно повышает скорость их исполнения. Буфер заполняется в момент загрузки игры, и поэтому все изменения вступают в силу только после повторной инициализации. Или же после «ручной» перезагрузки буфера. Также необходимо отметить, что если отредактированный скрипт выполняется в момент перезагрузки, он должен быть остановлен, иначе измененный вариант заработает только после его завершения.
  • Script debugging:(scriptname). Выбор скрипта и режима отладки. Есть всего два варианта режима отладки — отладить в пошаговом режиме (Trace) либо запротоколировать все изменения, произведенные скриптом.
  • Clear debug messages. Удаление данных протокола, созданного во время отладки.
  • Script debugger menu. Выбор этого пункта открывает протокол отладки скрипта, указанного в пункте Script debugging. Отображение самого процесса обусловлено выбранным способом отладки. Если включено протоколирование, игрок получает всю последовательность действий, выполненную скриптом за время его работы в режиме реального времени. Тело отладочной записи начинается с заголовка, где через двоеточие указаны параметры, отображаемые в каждой стоке выполняемого кода (см. «Что значат эти параметры?»).

Что значат эти параметры?

Script
Name:Line:Stackdepth:Prio:PID:TaskID:Command

a.missile.fire:1:0:0:2065911111:0: $ware=Mosquito rocket

a.missile.fire:2:0:0:2065911111:0: $count=10

a.missile.fire:3:0:0:2065911111:0: while $count

a.missile.fire:4:0:0:2065911111:0: = wait 500 ms

a.missile.fire:5:0:0:2065911111:0: dec $count =

a.missile.fire:6:0:0:2065911111:0: $victium = get player tracking aim

a.missile.fire:7:0:0:2065911111:0: = [PLAYERSHIP] -> add 1 units of $ware

a.missile.fire:8:0:0:2065911111:0: = [PLAYERSHIP] -> fire missile $ware on $victium

a.missile.fire:9:0:0:2065911111:0: = wait 500 ms

a.missile.fire:3:0:0:2065911111:0: while $count

a.missile.fire:4:0:0:2065911111:0: dec $count =

Сопоставим данные, выдаваемые в строчку с указанными в шапке параметрами:

  • Script Name — имя скрипта, в нашем случае — a.missile.fire.
  • Line — номер строки в скрипте.
  • Stackdepth — количество скриптов в стеке (отсчет ведется с 0), сейчас — 0.
  • Prio — приоритет выполняемого скрипта. Наш скрипт имеет нулевой приоритет.
  • PID — глобальный идентификатор задачи. Этот параметр сейчас равен 2065911111.
  • TaskID — текущий идентификатор задачи = 0.
  • Command текст исполняемой команды $ware=Mosquito rocket

Как видно из приведенного отрывка, протоколируется каждая исполняемая команда. Если в коде встречается цикл, его тело будет переписано столько раз, сколько витков он прошел, то есть в нашем случае — 10.

Второй способ отладки — пошаговый. Он отличается лишь тем, что интерпретатор команд ждет разрешения перейти к выполнению следующей строчки. В нижней части окна при этом отображается значение всех переменных в формате: Имя переменной: Тип данных: Значение переменной: Числовое значение переменной.

  • Global script tasks. В этом пункте можно просмотреть, какие глобальные (то есть применимые ко всей Вселенной) скрипты выполняются на данный момент. Из этого же раздела ненужные или лишние глобальные скрипты можно удалить вручную.

    Информация здесь представлена в форме: Глобальный идентификатор задачи: Имя скрипта: Текущий объект скрипта.

  • Help. Просто небольшая справка по редактору.
Нижние строчки содержат простой текст, начинающийся с символа «*». Это комментарии автора скрипта. «Звездочка» говорит интерпретатору, что строку нужно пропустить.

Просмотр и редактирование скриптов

Все скрипты, используемые в Х3: Reunion, находятся в папке /scripts, расположенной в установочной директории игры. Там есть три типа файлов — .xml, .pck и единственный файл x2script.xsl, содержащий необходимый набор параметров для просмотра .xml-файлов в интернет-браузере.

Кстати, файлы с расширением .pck — не что иное, как запакованные xml. Распаковать и просмотреть их можно при помощи небольшой утилиты x2tool.exe, лежащей на нашем диске.

Чтобы распаковать файл, достаточно набрать в командной строке следующую строчку:

x2tool -unpack <имя исходного файла>.pck <имя итогового файла>.xml

С помощью той же программы можно произвести обратное действие, то есть — запаковать файлы. Обращение к утилите в этом случае будет таким:

x2tool -pack <имя исходного файла>.xml <имя итогового файла>.pck

Код на языке Х3: Reunion при просмотре через интернет-браузер.

Если у разработчика возникает необходимость просматривать скрипты, не находящиеся в папке /scripts, он должен обязательно скопировать туда файл x2script.xsl. Без этого просмотреть скрипт в интернет-браузере не получится. Редактирование скриптов возможно исключительно во встроенном редакторе игры.

Структура скриптового языка

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

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

Пример скрипта преследования

    Script !ship.cmd.follow.pl

Version: 1

for Script Engine Version: 20

Description

Ship Player COMMAND FOLLOW

Arguments

1: target , Var/Ship , 'the target'

Source Text

001 @ = [THIS] -> call script '!ship.cmd.follow.std' : the target=$target follow distance=null

002 return null

signde

Имя

Красота. Этот и другие фоны можно выбрать для собственного сектора.

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

Для начала отметим, что скрипт начинается с символа «!». Это обозначает, что он относится к числу системных и редактированию не подлежит. То есть во встроенном редакторе этот код отображаться не будет. Далее идет слово ship, что указывает на выполнение этого скрипта для кораблей.

В игре существует четыре типа скриптов — init, setup, al и galaxy.

  • Скрипты инициализации. Они начинаются с init или !init. Этот тип скриптов загружается каждый раз, когда загружаются игра либо сейв, еще до загрузки галактики. Изменять родные скрипты Х3 этого класса следует с большой осторожностью, потому что любая ошибка со 100% вероятностью «подвесит» игру.
  • Установочные скрипты, setup, !setup, также как и инит-скрипты загружаются во время старта игры либо загрузки сохранения. Этот тип загружается сразу после инициализации галактики и предназначен для работы с объектами вселенной.

Это важно: если скрипты этих двух классов начинаются с «!» и не имеют цифровой подписи, игра автоматически будет запускаться с пометкой modified. Они же, но без пометки «!», не загружаются официальной версией и используются только в модифицированных играх.

  • Скрипты Artificial Life (искусственной жизни) al.plugin и !al.plugin применяются для регулирования всех процессов, связанных с самостоятельным поведением оппонентов и союзников игрока.
  • Скрипты галактики galaxy инициируют отличную от оригинальной карту галактики.

На заметку: если вы сделали свою карту и хотите разместить заранее оснащенный корабль в некой стартовой точке, необходимо сделать следующее: создать скриптовый файл с именем galaxy.имя_файла.initplayership. Под «именем файла» понимается название того файла, в котором содержится новая карта, но без расширения .xml. В теле скрипта необходимо прописать требуемые координаты и добавить в этом месте корабль игрока командой plship. Наконец, описать трюм корабля, задав все необходимые устройства, установленные на корабле, определить размер кошелька игрока, а затем завершить команду (return plship).

Версия

Следующая строка указывает версию текущего скрипта. Иногда разработчику бывает полезно знать, с какой версией собственного скрипта ему приходится работать на этот раз. Затем указывается номер версии скриптового редактора, в котором был создан скрипт. Все «древние» скрипты понимаются более поздними интерпретаторами, но не наоборот. Кстати, Х3 работает с большинством скриптов, разработанных еще под Х2.

Описание

Здесь автор дает максимально информативное описание механизма действия скрипта.

Аргументы

После этой строки перечисляются все переменные в формате:

Имя переменной; Тип переменной, Описание.

Обыкновенная блок-схема.

Во время составления скрипта на описание переменных стоит обратить особое внимание, так как их использование позволит описывать запросы к игроку. Например, если разработчик опишет переменную, вводимую с клавиатуры и определяющую цель как «the target», игрок во время работы скрипта получит запрос «the target:_?» . Если разработчик забудет описать свою переменную, пользователь навряд ли сообразит, чего добивается от него искусственный интеллект.

Тело скрипта

Собственно набор команд, операторов и переменных, задающих последовательность действий компьютера.

Цифровая подпись

Надпись signed в конце скрипта обозначает, что скрипт одобрен старшими братьями по разуму из компании Эгософт. Подделать эту подпись практически невозможно.

Самое главное правило

Первое, что должен уяснить для себя разработчик скриптов Х-вселенной, — положительные веяния и тенденции развития современных языков программирования обошли своим вниманием цитадель «Эгософта». Внутренний язык игры не поддерживает принятых сейчас традиций многозадачности. В каждый момент времени в игре выполняется лишь один скрипт. Из этого следует, что скрипт, рассчитанный на продолжительное действие, просто подвесит исполнение всех остальных скриптов. И как следствие — игры в целом. Программисты «Эгософта» полностью отдавали себе отчет, что такая система порочна. Поэтому в структуру языка были внесены два основополагающих принципа: иерархия скриптов и система задержек в их выполнении.

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

Это важно: внутренние скрипты, поставляемые «Эгософтом», уже имеют отлаженную систему приоритетов. Меняя приоритеты выполнения базовых скриптов, разработчик кода рискует наделить Х-вселенную изрядной долей неадекватности.

Помимо приоритета исполнения, скрипты можно поделить на глобальные и локальные. Глобальные скрипты действуют на всю игру в целом. Локальные же, напротив, привязаны к конкретному объекту и будут приостановлены в момент его безвременной кончины.

Рассмотрим и запомним три типа команд, способных задерживать выполнение программного кода:

Тип «wait»

Включает в себя две команды:

  • wait <время задержки> ms.
  • wait randomly from <минимальное время задержки > to <максимальное время задержки > ms.

    Команды этого семейства приостанавливают выполнение скрипта на определенное время.

На заметку:показатель ms — приблизительный. Минимальное время задержки не может быть меньше времени исполнения одного кадра.

Тип «fly»

Сюда входят команды «длительного действия» из числа навигационных. С их помощью кораблю отдается приказ выполнить какое-либо протяженное во времени действие. Однако выполнение этих команд не приведет к остановке системы.

  • fly to homebase — корабль отправляется в порт приписки.
  • fly to station <станция> — корабль отправляется на указанную станцию.
  • fly to sector <сектор> — корабль отправляется в указанный сектор.
  • move to ware object <тип контейнера/ресурса> for collecting : timeout=<время выполнения команды> ms — Сближение с объектом на расстояние захвата в трюм.
  • move around <длительность> ms — бессмысленное шатание объекта по космосу в течение определенного времени.
  • move to position : x=<координата x>, y=<координата y>, z=<координата z>, with precision <погрешность> m — движение в район указанной точки пространства, с остановкой от нее не дальше, чем допускает указанная погрешность.
  • defensive move : type=<int(тип маневра)>, intensity= <int(интенсивность маневра)>, timeout=<время выполнения команды> ms, avoid object=<объект уклонения> — маневр уклонения от указанного объекта в течение указанного времени.
  • follow object <объект> with precision <дистанция следования> m — следование за объектом, с соблюдением указанной дистанции.
  • follow <объект> with precision <дистанция> m : timeout=<время следования> ms — то же, что и предыдущая команда, но с ограничением по времени.
  • escort ship <цель> — сопровождение указанной цели, не включаясь с ней в строй.
  • escort ship < цель> : timeout=<длительность> ms — то же, но с ограничением времени.
  • turn turret <номер турели> to <цель> : timeout=<время выполнения команды> ms — наведение указанной турели на цель в течение указанного времени.
  • attack run on target <цель> : timeout=<время выполнения команды> ms — атакующий маневр в направлении цели за указанное время.

Тип «call script»

Команда вызывает другой скрипт. Может быть вызвана с префиксом START, в этом случае скрипт, в котором находится команда call script, не дожидаясь окончания вызываемого им скрипта, продолжит работу. Прерываемость данной команды условна и подразумевает наличие в вызываемом скрипте команд «@», в противном случае вызываемый скрипт прервать не получится.

Предлагаю рассмотреть небольшой пример, чтобы закрепить теорию практикой.

Все сюжетные ходы в игре «заскриптованы», то есть написаны при помощи такого же редактора. Значит, что игрок может придумать свой собственный сюжет.

Перед нами скрипт, проигрывающий «тревожный» звуковой сигнал 5 раз подряд.

001 $cont = 5

002 while $cont

003 play sample 1114

004 dec $cont =

005 end

006 return null

Явно не хватает оператора @, то есть задержки. Во первых, обрабатывая данный код, система попытается пять раз проиграть фрагмент за номером 1114 из звуковой базы данных игры. А ведь фрагмент имеет определенную длину, измеряемую долями секунды. В итоге процесс затянется на срок, больший максимально допустимого, что чревато «вылетом» игры.

Изменим тело скрипта так:

001 $cont = 5

002 while $cont

003 @ = wait 100 ms

004 play sample 1114

005 dec $cont =

006 end

007 return null

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

Итак, команды семейства @ должны стать верными друзьями разработчика скриптов. Паузы стоит вставлять везде, где это позволительно. В конце концов, язык программирования — это скорее разводной ключ, а не инструмент литературного творчества.

В первых строках автор спешит поделиться с читателем многословной монографией на тему «Зачем я это написал».

Семейства операторов

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

Семейство script

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

Вся совокупность команд и функций этого семейства позволяет разработчику создавать скрипты, управляющие скриптами, то есть строить своего рода скелет большого программного продукта, состоящего из десятков более мелких «кирпичиков».

Фрагмент серьезного торгового скрипта, написанного германским пилотом.

Семейство логических операторов

Естественно, редактор скриптов Х3 поддерживает все основные логические операторы. Речь идет и об условном ветвлении IF-THEN-ELSE-ELSE IF, и о булевых AND, OR и NOT.

Семейство команд массивов

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

Навигационные команды

Помимо перечисленных в предыдущей главе команд семейства fly, способных передавать управление другим скриптам, есть и более сложные. Мало того что корабль можно заставить лететь к указанной цели, можно также потребовать от него лететь именно по такой траектории, какую задумал оператор. Скрипт будет контролировать поворот каждой турели на корабле, вести его в бой и заставлять уклоняться от выстрелов

Это интересно: в игре существует несколько видов логики, по одному для каждой из существующих рас. Редактор скриптов позволяет подключать к объектам любую расовую логику. Хотите группу аргонских «Открывашек», летящих как рой хааков? Без проблем!

Торговые команды

Такая группа пиратов может разнести М4 в щепки, но не атакует. Пиратский интеллект говорит им, что я для них — не добыча.

Это семейство команд регламентирует все, что так или иначе связано товаром. Торговля, производство, потребности станции. Торговые команды делятся на три группы — команды кораблей, команды станций и смешанные команды. Последняя группа описывает сходные операции для обоих классов. В качестве примера рассмотрим команду <объект> get amount of ware <товар> in cargo bay. Она возвращает число единиц указанного товара в трюме. Сфера ее применения весьма обширна. Например, разработчик решил создать сложный торговый скрипт. Для этого ему нужно заставить корабль самостоятельно покупать батарейки, если их количество в трюме корабля опустилось ниже определенного.

Галактические команды

Служат для галактической навигации, позволяя получить количество и расположение прыжковых ворот в секторе, список всех кораблей со всеми основными характеристиками. Также можно, допустим, выяснить, известен ли игроку данный сектор. Эта команда, <сектор> is sector known by the player, будет полезна при создании скрипта авторазведки.

Команды объектов

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

Переменные [THIS],[SHIP],[STATION]

Для облегчения труда программистов в скриптовый язык Х-Вселенной были внесены несколько удобных переменных. Первая из них, несомненно, [THIS]. Она указывает на выбранный игровой объект. Набрав [THIS] -> ... программист тем самым дает команду текущему объекту выполнить определенное действие. Не следует, разве что, отдавать заведомо невыполнимых команд, как то: астероиду — прыгнуть в соседний сектор — или же лазерной башне начать продавать товары по максимальным ценам.

Команды [SHIP] и [STATION] аналогичны предыдущей, но более конкретизированы. С их помощью приказы отдаются кораблю или станции.

Синтаксис скриптового языка

Начинать написание своего скрипта нужно с объявления переменных. Все делается мышкой и только мышкой. Если нужно использовать переменную, скриптописец должен выбрать ее среди списка объявленных в специальном меню. Конечно, зачастую у программиста будет возникать необходимость объявить новую переменную уже в процессе написания тела скрипта. Это не беда. Пер

 

2024 © "wot-force.ru". Все права защищены. Карта сайта | Написать письмо