Оглавление Сообщение об ошибках Ваше мнение о проекте E-Mail автору

v    Создаем врата.

 

    Итак, сейчас мы будем создавать гиперврата. До Древних нам, конечно, далеко, но редактор скриптов даёт и нам такую возможность.
Как вы уже могли заметить, врата в Х2 всегда существуют попарно. Врата в каком-нибудь секторе обязательно имеют пару где-либо во вселенной Х. Одиночные врата таковыми не являются и не могут нормально функционировать - обычно вы пролетаете их насквозь без какого-либо эффекта.

    Итак, разберём принципы создания врат на примере скрипта KhaakGates. Этот скрипт предназначается для стандартной карты Х2, в которой жёстко задано положение хаакских секторов в галактике - этим мы и воспользуемся. Он будет полезен тем, кто не хочет проходить сюжет Х2 и покупать координаты хаакских секторов, но хочет слетать в гости к хаакам.
Запускаем редактор скриптов, создаём новый скрипт KhaakGates и пишем:

001 @ = wait 2500 ms
002 $k1 = get sector from universe index: x=14, y=11
003 $k2 = get sector from universe index: x=14, y=13
004 $k3 = get sector from universe index: x=16, y=13
005 $k4 = get sector from universe index: x=16, y=11
006 $k5 = get sector from universe index: x=15, y=12


Пауза в начале скрипта позволяет отработать другим скриптам, имеющим дело с картой галактики. После этого мы получаем в переменные $k1-$k5 ссылки на пять хаакских секторов.

007 $chkgate = $k1 -> get north warp gate
008 if $chkgate ==
пусто


    В строке 007 мы пытаемся получить ссылку на северные врата в первом из хаакских секторов. Откуда они могли там взяться, если на оригинальной карте их нет? Врата могли появиться от предыдущего срабатывания нашего скрипта. Если таких врат нет(строка 008), значит, скрипт запущен впервые, и можно приступать к процедуре их создания. Но сначала создадим вспомогательные переменные.

009 $cgate = 45400
010 $ncgate = - $cgate


    Эти две переменные хранят стандартные координаты оригинальных врат Х2 по осям Х или Z, координата по оси Y обычно равна нулю. Мы будем проводить размещение врат по стандартной схеме.
Далее - собственно создание врат.

011 $res = create gate: type=0 addto=Мемориал Антигона gateid=0 dstsecx=14 dstsecy=11 dstgateid=0 x=50000 y=0 z=50000


    Параметры: type - тип врат, возможно пять вариантов(0 - северные, 1 - южные, 2 - западные, 3 - восточные и 4 – разрушенные). Тип 4 для стандартных врат не используется и является простой декорацией, как входящие врата этот тип не работоспособен, однако может быть использован как пункт назначения для других врат. addto - сектор, где будут созданы врата. Указатель на него можно задать либо вручную выбрав сектор на карте галактики, как в данном случае (для этого сектор должен быть разведан игроком), либо опосредованно, через его координаты во вселенной, как сделано в паре строк 002 и 012. dstsecx и dstsecy указывают координаты сектора, в котором находятся или будут находиться врата, связанные с данными вратами гипертуннелем. x, y и z задают положение врат в системе координат внутри сектора.
Особое внимание следует обратить на параметры gateid и dstgateid - именно они связывают между собой конкретную пару врат. Эти два параметра могут принимать любое числовое значение, однако gateid должен быть уникален среди врат в одном секторе, иначе врата не будут созданы. Для врат-визави необходимо указывать те же значения, не забыв поменять их местами. Отмечу ещё, что для стандартных (встроенных в игру) врат gateid совпадает с type.
Функция create gates возвращает в переменную $res указатель на созданные врата или значение null , если врата не были созданы.

012 $res = create gate: type=0 addto=$k1 gateid=0 dstsecx=2 dstsecy=1 dstgateid=0 x=0 y=0 z=$cgate


    Правильность создания врат мы проверять не будем, поэтому указатель на новые врата в первом из хаакских секторов снова запишем в переменную $res. По паре строк 011-012 сложно понять смысл gateid и dstgateid, так как и те и другие врата - северные, а мы пользовались тем же правилом выбора gateid, что и для стандартных врат. Это может показаться неудобным по ряду причин, в том числе названной, поэтому обратите внимание на следующие две строки.

013 $res = create gate: type=1 addto=$k1 gateid=$a dstsecx=14 dstsecy=13 dstgateid=$b x=0 y=0 z=$ncgate
014 $res = create gate: type=0 addto=$k2 gateid=$b dstsecx=14 dstsecy=11 dstgateid=$a x=0 y=0 z=$cgate


    Здесь тоже создаётся связанная пара врат. В качестве gateid и dstgateid выступают две переменные, $a и $b. Строго говоря, их числовые значения не определены, но для наших целей это и не важно. Главное, что это тоже работает и намного понятнее.
Остальные врата создаются подобным же образом. Попробуйте уловить схему их расположения, ориентируясь по type и координатам.

015 $res = create gate: type=3 addto=$k2 gateid=$a dstsecx=16 dstsecy=13 dstgateid=$b x=$cgate y=0 z=0
016 $res = create gate: type=2 addto=$k3 gateid=$b dstsecx=14 dstsecy=13 dstgateid=$a x=$ncgate y=0 z=0
017 $res = create gate: type=0 addto=$k3 gateid=$a dstsecx=16 dstsecy=11 dstgateid=$b x=0 y=0 z=$cgate
018 $res = create gate: type=1 addto=$k4 gateid=$b dstsecx=16 dstsecy=13 dstgateid=$a x=0 y=0 z=$ncgate
019 $res = create gate: type=2 addto=$k4 gateid=$a dstsecx=15 dstsecy=12 dstgateid=$b x=$ncgate y=0 z=0
020 $res = create gate: type=0 addto=$k5 gateid=$b dstsecx=16 dstsecy=11 dstgateid=$a x=0 y=0 z=0


    А вот подсказка: Врата создаются по спирали, обегая все сектора с первого по четвёртый против часовой стрелки и завершаясь в центральном пятом секторе выходом в центре сектора. 

021 write to player logbook 'Gate to Unknown Enemy Sector appeared in Antigone Memorial'
022 = speak text: page=13 id=20 priority=0
023 end


О создании врат необходимо сообщить игроку, поэтому в строке 021 мы пишем записку в журнал, а на строке 022 компьютер скажет приятным женским голосом: "Получено сообщение". Этим завершается блок, выполняющийся при первом срабатывании скрипта. При повторных запусках все строки с 009 по 022 будут пропущены, и врата повторно создаваться не будут.

024 return пусто


Скрипт закончен. Теперь если переименовать его в !setup.KhaakGates.xml, не забыв произвести соответствующие изменения в двух местах внутри файла, скрипт будет автоматически запущен при создании новой или загрузке старой игры. Обратите внимание: ПОСЛЕ создания галактики, что важно для его корректной работы. Изменения будут сохранены при записи игры и будут присутствовать на карте галактики, даже если удалить !setup.KhaakGates.xml, так как карта сохраняется внутри сейва.

Однако мы были бы плохими скриптерами, если бы не предусмотрели возможности отката сделанных нами изменений. В данном случае задача облегчается тем, что изменения производятся однократно и в строго заданных точках. Поэтому особой сложности написание скрипта, производящего обратные изменения, не представляет и может быть оставлено в качестве домашнего задания. Подсказка: воспользуйтесь командами поиска врат в секторе, например, <RetVar>=<sector> get north warp gate и командой удаления секторальных объектов <object> destruct: show no explosion=[TRUE]|[FALSE]. Для удобства использования можно также переименовать скрипт к виду !setup.RemoveKhaakGates.xml. Тогда деинсталляцию нужно будет проводить так:

  1. Удалить из папки scripts файл !setup.KhaakGates.xml
  2. Поместить в папку scripts файл !setup.RemoveKhaakGates.xml
  3. Загрузить изменённую игру и сохранить её после того, как компьютер произведёт обратные изменения
  4. Удалить из папки scripts файл !setup.RemoveKhaakGates.xml

 

 


Оглавление Сообщение об ошибках Ваше мнение о проекте E-Mail автору
Сайт создан в системе uCoz