В этих статьях я попытаюсь объяснить, как создавать cleo-скрипты в среде Sanny Builder 3... Последнюю версию всегда можно скачать с сайта http://sannybuilder.com/.
В первой статье я попытаюсь дать базовые понятия о том, что такое переменная, какие бывают типы данных... Тут не буде ничего нового для тех, кто имеет базовые знания о языках программирования. Такие люди могут благополучно закончить на этом чтение этой статьи, но им следует обратить внимание, что здесь существуют типы данных, с которыми они еще нигде не встречались...
Примеры рельных программ и более детальную информацию можно узнать в справке СБ (вызывается нажатием F12)[/off] [cut=Для всех же остальных...]Начну я с того, что такое переменная. Традиционно, переменную представляют в виде «ящика», в который «кладется» некоторое значение. Строго говоря, переменная имеет свой (всегда уникальный) идентификатор и значение (то что «кладут»). По идентификатору происходит обращение к этой переменной, а значение в ней может перезаписываться… Эти значения бывают разных типов. Когда говорят о типе переменной, подразумевают тип значения в этой переменной.
Какие есть типы данных в скриптинге GTA:
Целочисленные (Integer). Принимают, как не трудно догадаться, положительные и отрицательные целые значения.
Вещественные (Float). Числа с дробной частью, дробная часть отделяется от целой точкой: например, 5.624.
Строковые (String). Значения строковых переменных представляют собой последовательность символов, отделяются двойными кавычками (строка переменной длины variable-length string) или одинарными (строка фиксированной длины fixed-length string – содержит до 15 символов, - если символов меньше, остаток заполняется символами NULL). Например, “STRING” или ‘STRING’.
Так называемые хэндлы (Handle): обобщают в себе переменные, ссылающиеся на классы: актеров (Actor), машины (Car), объекты (Object), игрока (Player)…
Переменные описанных выше типов объявлять не обязательно, но вы можете это сделать конструкцией:
Code
Var
<идентификатор переменной> : <ее тип>
End
Нажатие ctrl + space в Sanny Builder’е отображает список всех типов.[/off]
Массивы (Array). Содержат в себе несколько значений одного и того же типа. Обращение к этим переменным происходит по идентификатору массива и номера значения в нем.. Объявление массива в Sanny Builder'е обязательно:
Code
Var
<идентификатор массива> : Array XX of <тип>
End
*XX здесь – количество значений содержащихся в массиве. Проще всего к значениям в массиве обращаться следующим образом:
, здесь 0 – это номер элемента в массиве. Вместо ноля может стоять любое другое целое число, а также переменная целочисленного типа. В последнем случае обращение происходит к элементу массива под номером, равным значению в этой переменной.
Строго говоря, в СБ не существует типа массив... Это производный тип. Когда мы обращаемся к элементу массива,
Компилятор оперирует им как отдельной переменной... Скриптеру во время использования массивов следует это иметь ввиду. Использование массивов в написании скриптов облегчает работу с большим количеством однотипных элементов...
логический (или булев) тип данных (Boolean). Может принимать всего 2 значения - True или False (соответсвенно "правда" или "ложь"). Значение булева типа True заменяется единицей, False - нулем.
Code
Player.CanMove($PLAYER_CHAR) = True
Игрок получает способность двигаться.
Часто этот тип используется в качестве флага для некоторых опкодов.
Code
02AB: set_actor 2@ immunities BP 0 FP 0 EP 1 CP 1 MP 0
Здесь в качестве последних пяти параметров стоят флаги, определяющие наличие иммунитета актера к определенным видам воздействия.
В этом типе данных следует обратить внимание на существование булевых (или логических) операторов: 1) оператор коньюнкции (логическое "И", and), 2) оператор дизьюнкции (логическое "ИЛИ", or), 3) оператор отрицания (логическое "НЕ", not).
Эти операторы используются с двумя или более значениями булева типа, и в конструкции с ними тоже возвращают значение True или False Например, в импликации (конструкции условия)
Code
if and
<condition 1>
>condition 2>
...
<condition N>
jf @label
условие будет выполнено тогда и только тогда, когда будут выполнены все условия, входящие в импликацию (т.е оператору If будет возвращено значение True). Пока можете особо не зацикливаться на этом типе данных, если не понимаете, - все станет намного яснее, когда я буду объяснять о практическом его использовании в условиях и циклах. Вот, вроде и все типы данных, используемые в скриптинге... Что важно здесь уяснить - работать с переменными определенного типа надо как с переменными определенного типа, четко понимая, чего вы хотите добиться. Можно не уделять даже внимания умным словам, которые я тут понаписал - я их дал чисто для ликбеза (ликвидации безграмотности)...[/off]
Идем дальше...
Все переменные в скриптинге GTA делятся на локальные и на глобальные. Что важно, использование глобальных переменных в cleo приводит к конфликтам, поэтому, по меньшей мере, не рекомендуется использовать их при написании cleo-скрипта.
Обращение к локальным переменным происходит следующим образом:
0@, 1@, 2@,...
Как видите, идентификатор состоит из цифр и отделяется знаком @... Локальные переменные действуют только в пределах одного потока (в нашем случае – cleo-скрипта). В скриптах с расширением .cs число локальных переменных ограничено: от 0@ до 33@. Если вы хотите использовать больше переменных, сохраняйте скрипт в формате Custom Mission (с расширением .cm).
К слову, напишу как сохранять скрипт в формате CLEO. Делается это просто – при помощи директив: нужно в шапке скрипта (то есть в самом начале, первой строчкой) написать
Code
{$CLEO <расширение файла>}
Например:
или
Все - компилятор прочтет эту директиву и сохранит ваш скрипт в нужном формате...
Подробнее о директивах потом…
Обращение к глобальным переменным:
$var_1
Идентификатор может состоять из букв латинского алфавита, цифр и знака подчеркивания. Обратите внимание, что знак доллара (говорящий программе что это не что иное как глобальная переменная) ставится в начале идентификатора. Когда мы вводим этот знак $ с клавиатуры, Sanny Builder выводит список всех использовавшихся в некоторой окрестности скрипта глобальных переменных. Эта окрестность небольшая - так что не удивляйтесь если в этом списке вдруг не окажется нужная вам переменная. Как уже говорилось, использование глобальных переменных в CLEO приводит к конфликтам (если кто-то хочет подробнее узнать, почему это так - идем сюда или сюда), но ничто не мешает использовать глобальные переменные, описанные в файле CustomVariables.ini или цифровые, если вы точно знаете на что ссылаются эти переменные в main.scm. В первую очередь это относится к переменным:
$ONMISSION - значение этой переменной равно 1, если игрок выполняет какую-либо миссию, и 0 - если нет (при этом когда $ONMISSION равна 1, запрещено сохраняться и начинать новые миссии)
$PLAYER_ACTOR - в эту переменную записан актер - Карл
$PLAYER_CHAR - а в этой игрок (не путать с предыдущим - игрок и актер - разные типы переменных)
ну, и некоторые другие..