Редактор скриптов / X3 Terran Conflict (Земной конфликт)
X3 Terran Conflict / X3 Земной конфликт
 
X3 Terran conflict / Скрипты. Что это и с чем их едят. / Редактор скриптов  
 

На сайте онлайн (человек): 116



 



Редактор скриптов

Автор: Макс aka Malstrime

Скрипты. Что это и с чем их едят.

Редактор скриптов



Часть 1. Общие данные.

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

Для того, чтобы активировать Редактор скриптов, нужно вместо имени пилота ввести Thereshallbewings (T - заглавная буква, остальные строчные; обратите внимание на двойную "l" (эль); Вы не должны быть пристыкованы к станции). Если Вы все ввели правильно, то игра должна чуть-чуть подвиснуть, а имя пилота должно остаться прежним.


Редактор скриптов (далее ScE (от Script Editor)) будет доступен в меню каждого корабля/станции, а также в "Общих командах". Есть небольшая разница в месте, откуда его запускать. Из "Общих команд" он запускается штатно, а при запуске, например, из командного меню корабля, редактор позволяет отлаживать локальные скрипты, запускаемые на этом корабле.

Часть 2. Пункты меню.

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



Script Task Statistics - статистика по всем скриптам, когда либо запущенным за данную игру, ничего особо полезного.
Редактор скриптов - при выборе данного пункта меню, Вы перейдете к списку скриптов, а также сможете создать новый (а Вы думали что-то иное? :).

Reinit Script Caches - перезагрузить кэш скриптов. Для более быстрой работы скрипты помещаются в кэш, поэтому обычно необходимо жмякать по этой кнопке, если Вы модифицировали какой-либо локальный скрипт. Примечание: изменения не будут применены к уже запущенным скриптам, пока они не будут запущены заново.

Script Debugging: <Объект> - инструмент для отладки локальных скриптов. Объект, локальные скрипты которого будут отлаживаться, зависит от того, через меню какого корабля/станции в этот раз был запущен редактор скриптов (чуть выше я писал об этом). Переключатель может быть в трех состояниях:
  • Off - отладка выключена.
  • Log - вся последовательность действий (исполняемых команд) будет записана логом.  Картинка.
  • Trace - отладка "на лету", т.е. пошаговая (прежде чем исполнить следующую команду, будет запрошено разрешение; также в этом режиме указаны текущие (на момент исполнения каждой команды) значения всех локальных переменных). Картинка.

    Script Name – имя скрипта, команда которого была выполнена в данной строке.
    Line – номер строки в скрипте Script Name.
    Stackdepth – глубина стек в котором выполняется задача (количество скриптов в стеке отсчет ведется с 0)
    Prio – приоритет выполняемого скрипта
    PID –  глобальный идентификатор задачи
    TaskID – Идентификатор задачи
    Command – исходный текст команды



    Script Debugging: Additional Information - отвечает за отображение доп. информации (отношение к расам, запущенные локальные скрипты) в инфо о корабле/станции. Два положения выключателя - on и off.

    Clear Debug Messages - очистить лог отладки (см. Script Debugging).

    Script Debugger Menu - или лог, или пошаговая отладка (см. Script Debugging).

    Global Script Task - список исполняющихся глобальных скриптов. Вооружившись кнопкой Delete, можно смотреть на глобальные скрипты, как на... ну вы понЕли.

    Помощь - без комментариев.

    Часть 3. Среда разработки.


    Итак, открыв Редактор скриптов и выбрав пункт <Новый скрипт> Вы попадете непосредственно в место, где можете начать творить. Вот как в целом выглядит встроенный интерфейс создания/редактирования скриптов:



    Пойдем по порядку.

    1. Первый блок очевиден и, я считаю, не требует комментариев.

    2. Блок "Параметры". Зачем он нужен? Представим, что у нас есть стиральная машина. Чтобы её правильно запустить требуется ввести правильные данные, в зависимости от вещей, которые Вы в неё загрузили, так как сама она понятия не имеет, что Вы туда загрузили и загрузили ли вообще. Тип белья, время стирки, дополнительные функции - это и есть эти самые "параметры", если стиральная машина - это исполняемый скрипт, а бельё - это то, с чем мы будем взаимодействовать. Есть скрипты, которым не требуются какие-либо параметры. Обычно они запускаются единожды и носят статус глобальных, но есть и исключения. Например, команда "Ожидать", когда корабль просто слоняется по сектору, в котором была отдана эта команда.
    Максимальное кол-во параметров в скрипте неограниченно, как и кол-во переменных. Параметры задаются, когда запускается скрипт и записываются в заданные Вами переменные. Если во время ввода параметра, Вы нажмете Escape, то ввод параметра будет прекращен, в переменную вернется null, а Вы перейдете к вводу следующего параметра.
    Обратите внимание на то, что если скрипт не подразумевает ручного ввода параметров, и параметров больше пяти (почему именно 5 - узнаете дальше), то рекомендуется передавать значения с помощью массива. Или нескольких массивов, чтобы было удобнее :)

    3. Блок "Код". Это место, где Вы начинаете Творить. Да, именно творить, ведь скрипты - это в первую очередь произведения искусства :)
    Любым скриптам доступно использование любых команд, за исключением команд вызова других скриптов при кое-каких условиях (но об этом опять же потом). Описание всех команд будет изложено позже, а также будут расписаны некоторые аспекты их исполнения.

    Часть 4. Типы переменных.


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

    Тип переменнойОписание
    DATATYP_NULLТо, что изначально содержит незаданная переменная - "null".
    DATATYP_UNKNOWNНеизвестный ScE тип данных.
    DATATYP_VARВ переменной содержится переменная ссылка на другую переменную (зачастую - на массив).
    DATATYP_CONSTКонстанта.
    DATATYP_INTКакое-либо целочисленное значение.
    DATATYP_STRINGКакой-либо текст, набор символов, цифр.
    DATATYP_SHIPПеременная-ссылка на корабль вместе с его свойствами (см. выше).
    DATATYP_STATIONАналогично тому, что выше, только вместо корабля - станция.
    DATATYP_SECTORПеременная-ссылка на сектор.
    DATATYP_WAREПеременная-ссылка на какой-либо тип товара.
    DATATYP_RACEКакая-либо раса.
    DATATYP_STATIONSERIALСерийный номер станции. Греческий алфавит от Альфа до Омега.
    DATATYP_OBJCLASSТип объекта.
    DATATYP_TRANSPORTCLASSКласс груза. От S до ST.
    DATATYP_RELATIONОтношение. Враг, нейтрал, друг.
    DATATYP_OP???
    DATATYP_EXPRЛогическое выражение, принимающее либо истину, либо ложь.
    DATATYP_OBJECTСсылка на какой-либо объект. Используется для таких объектов, как, например, астероид.
    DATATYP_OBJCOMMANDКоманда/Сигнал объекту (объект - корабль или станция).
    DATATYP_FLRETСемейство FLRET. Более подробно будет расписано позже.
    DATATYP_DATATYPПеременные этого типа содержат данные, которые содержат в себе переменные, которые содержат.... То есть Тип данных, то о чем сейчас и идет речь. С переменными этого типа взаимодействуют лишь две команды :)
    DATATYP_ARRAYМассив. Дело, однако, в том, что такая переменная вовсе не является массивом. Она лишь является ссылкой на него (поинтер).
    DATATYP_QUESTПеременная-миссия. Честно говоря, с ней мне еще не приходилось сталкиваться.


    Воспользовавшись моментом, добавлю таблицу с используемыми скриптами данными (то есть то, что нужно скрипту от переменной в зависимости от текста (кривовато сказал, но, думаю, Вы меня поняли :)).

    По-английскиПо-русскиОписание
    <RetVar><ВозврПерем>Переменная, в которую возвращается результат выполнения (или невыполнения, если данные заданы некорректно) команды.
    <RetVar/IF><Возвр/IF>То же, что и выше, но плюсом возможность выбрать один из операторов. Принцип - команда становится логическим выражением (которое-таки исполняется) и, если результат ненулевой (не "0" и и не "null"), принимащим истинное значение, в противном случае - ложное.
    <RetVar/IF/START><Возвр/IF/START>Тоже, что и выше, но с возможностью выбора префикса START. Используется только в командах вызова скриптов. Внимание! Если Вы запустите в локальном скрипте команду с данным префиксом, то игра повиснет!

    Вообще, этот префикс дает возможность запустить какой-либо скрипт по принципу "запустил и забыл", т.е. основному скрипту глубоко пофиг, как отработает запущенный им с данным префиксом скрипт.
    <Expression><Выражение>Логическое выражение, принимающее значение либо Истина (1), либо Ложь (0).
    <Var/String><Перем/Текст>Текст, либо переменная, которая его содержит. Внимание! Число НЕ является текстом, также как и Текст НЕ является Числом. Для конвертирования текста в число, используйте команду <RetVar> = string <Var/String> to integer, для обратной операции <RetVar> = convert number <Var/Number> to string.
    <Var/Number><Перем/Число>Какое-либо число, либо переменная его содержащее.
    <RefObj><РеферОбъект>Объект, с которым взаимодействует команда. Либо переменная, содержащая этот объект (к слову говоря, все значения, используемые командами гораздо разумнее (да и есть возможность) хранить в переменных, поэтому далее не буду затрагивать этот момент).
    <Value><Значение>Применение ситуативно и зависит от команды.

    Остальное, я думаю, понятно, и описывать это нет смысла.


    Часть 5. Немного о массивах.


    Итак, что же такое массив? Можно почитать на википедии. Вкратце, это упорядоченный набор данных. Каждый элемент имеет свой порядковый номер, причем нумерация начинается с нуля. То есть элементы массива, состоящего из 5 элементов, имеют индексы 0, 1, 2, 3, 4. Кроме того, ничего не мешает содержать в массиве несколько вложенных массивов (вложенность также неограниченна).

    Чтобы создать массив, можно использовать команды <RetVar> = array alloc: size=<Var/Number> и <RetVar> = create new array, arguments=<Value>, <Value>, <Value>, <Value>, <Value> (обе команды создают массив "с нуля"). Также некоторые команды возвращают в переменную массив, уже содержащий в себе некоторые значения, например <RetVar> = <RefObj> -> get array of missiles aiming to me возвращает массив ракет, наведенных на Ваш корабль.
    Стоит обратить внимание на то, что переменные никоим образом не содержат в себе массив. Они лишь ссылаются на него. То есть допустим у нас есть переменная $array1, которая является ссылкой на массив, и мы хотим скопировать этот массив, чтобы работать уже с двумя массивами. В данном случае команда "$array2 == $array1" лишь скопирует поинтер (читай: ссылку) на массив. Для того, чтобы скопировать массив есть команда <RetVar> = clone array <Var/Array>: index <Var/Number1> ... <Var/Number2>, где <Var/Array> - копируемый массив, а <RetVar> - его копия, начиная с элемента с индексом <Var/Number1>, заканчивая элементом с индексом <Var/Number2>.

    Чем нам полезны массивы? Тем, что иногда мы не знаем, с каким кол-вом объектов будем взаимодействовать. Допустим, у нас есть команда $array = $sector -> get ship array from sector/ship/station, она возвращает массив кораблей, находящихся в секторе $sector (или кол-во кораблей пристыкованных к кораблю/станции, все зависит от типа данных, содержащегося в переменной). И этих кораблей может быть хоть ноль, хоть 10, хоть 100 и так далее.
    Как нам работать с массивом? С помощью соответствующих команд, и, если требуется обработать/проверить каждый элемент массива, циклов.

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

    1 вариант - когда важна последовательность обработки элементов от элементов с более низким индексом к элементам с более высоким.
    1. $c = 0        // здесь требуется указать, с какого элемента следует обрабатывать массив.
    2. $sz = get size of array $array
    3. $sz = $sz + $c
    4. while $c < $sz
    5.   $element = $array [ $c ]      //извлекает массива $array элемент по индексу $c в переменную $element
    6.   <кусок кода, который взаимодействует с элементом $element, находящимся по индексу $c>
    7.   = wait 1 ms       //можно не добавлять, если размер массива и вышеидущий код небольшие, но крайне рекомендуется в больших циклах, и когда элементов в массиве много или даже примерно неизвестно.
    8.   inc $c         //аналогично $c = $c + 1
    9. end


    2 вариант - когда важна последовательность обработки элементов не важна.
    1. $sz = get size of array $array
    2. while $sz
    3.   $element = $array [ $sz ]
    4.   <кусок кода, который взаимодействует с элементом $element, находящимся по индексу $sz>
    5.   = wait 1 ms
    6.   dec $sz         //аналогично $sz = $sz - 1
    7. end


  • Скрипты. Что это и с чем их едят.

    Автор: Макс aka Malstrime
    Добавил(а): Макс aka Malstrime
    Создано: 31.08.2011
    Изменено: 16.09.2011
    Количество изменений: 9
    Просмотров: 50766

    Оценка: 3,9
    Голосов: 42

    Ссылка на эту страницу:
    <a href="https://x3tc.net/redaktor-skriptov_120.html">Редактор скриптов</a>

    BBCode:
    [url=https://x3tc.net/redaktor-skriptov_120.html]Редактор скриптов[/url]

    Список игр