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