Длинные-предлинные железнодорожные составы, гравитационные игры, спидометры и прочие датчики, возможность проигрывания своих любимых MP3-композиций... И все это, вы не поверите, в GTA: SA. Да-да, вы не ослышались. Все перечисленное на самом деле можно реализовать в GTA: SA при помощи свежеиспеченного редактора скриптов и миссий, в частности — крайне шустрой и компактной утилиты с кодовым названием Sanny Builder (аббревиатура — SB). SB — это вам не SAMB, который вот уже как полтора года не обновляется, а мощный программный комплекс, позволяющий полностью раскрыть потенциал игрового движка GTA: San Andreas. В сегодняшней статье мы изучим синтаксис SB, а также познакомимся с уникальной библиотекой CLEO, с появлением которой стало возможным создание автономных скриптовых модификаций для GTA: SA. Данный материал призван в первую очередь помочь «билдерщикам» перейти с SAMB на новую платформу, т.е. на SB. Синтаксис и пунктуация При написании любой скриптовой конструкции в SB необходимо соблюдать ряд элементарных, но вместе с тем очень и очень важных правил. В противном случае компилятор, встроенный в SB, не поймет, что же вы хотели сказать, и откажется переводить модифицированный вами scm-файл в формат, понятный игре. Так вот. При объявлении новых переменных в SB вовсе не обязательно указывать так называемые опкоды, как в SAMB: 0004: $var = 0. Можно переписать данную запись в более простом и читабельном виде: $var = 0 Где $ — значок, обозначающий тип переменной, var — название переменной, а 0 — ее значение. Хорошим тоном при объявлении переменных в SB является указание их типа — целые, вещественные, короткие и т.д. Все дело в том, что в некоторых случаях компилятору не удается распознать тип заданной вами переменной, а следовательно — скомпилировать SCM-файлы. Дабы помочь программе распознать тип заданной вами переменной, старайтесь использовать следующую конструкцию: var $parameter1: Integer $parameter2: Float end Из этого примера нетрудно заметить, что переменная $parameter1 объявлена в виде целочисленной, а $parameter2 — в качестве дробной или вещественной. Так, что у нас там дальше по списку? Точно — массивы. Напомним, что создание записей такого типа в SAMB было практически невозможным: сложно, долго, не всегда и не у всех работает. То ли дело SB — в данной среде объявление массивов практически не отличается от инициализации одиночных переменных: Var <array_name>: array <size> of <type> End Т.е. также задаем имя массива (<array_name>), число переменных (<size>) и тип структуры (<type>), например: Var $Igromania_array: array 7 of Float End Для обращения к элементам массива в SB используется команда вида: <Name> [<element>] += 100.0 Где <Name> — название массива, в нашем случае $Igromania_array, <element> — порядковый номер элемента массива, скажем 5. При необходимости вы можете присвоить какое-либо значение элементу массива и при помощи следующей команды: f<name> [number] = 5 Здесь f — указатель на тип массива (f — в случае, если массив представляет собой совокупность вещественных переменных, i — целых, s — строковых), <name> — имя массива, скажем $Igromania_array, number — порядковый номер элемента массива, 5 — присваиваемое значение. Далее по списку — объявление различных констант. Останавливаться на этом пункте мы, пожалуй, не будем — приведем лишь пример инициализации простейшей константы в редакторе миссий: CONST <name> = <value> Из этого примера нетрудно заметить, что любая константа должна заключаться между строк CONST и END. <name> — имя константы, например Igrostroy, <value> — ее значение, скажем 170. Движемся дальше. Давайте теперь посмотрим, как происходит постановка различных условий и проверка их выполнения в SB. Помнится, в SAMB для объявления какого-либо условия нужно было внедрить в определенном месте конструкцию следующего вида: 00D6: if 21 8118: NOT actor $my_act dead 8119: NOT car $my_car wrecked 004D: jump if false JJBlock1 0002: jump JJNext Согласитесь, не очень удобно. Sanny Builder же предлагает несколько способов постановки условий. Наиболее простой и удобный из них: if $var1 > 0 jf @LabelX Первый операнд указывает на то, что выполняется постановка условия. Важное примечание. Если вам нужно, чтобы одновременно выполнялось несколько условий, — скажем, два, три или все 99, — просто добавьте к ключевому слову if через пробел слово and. Например, конструкция с проверкой на 3 условия будет выглядеть следующим образом: if and $var1 > 0 $var2 < 0 $var3 > 0 jf @LabelX При желании вы можете поэкспериментировать с использованием условных операторов IF..THEN..END и IF..THEN..ELSE..END. Помимо условного оператора if, в SB реализована поддержка и других операторов цикла — скажем, for, while, repeat. Прямо, как и во всех серьезных языках программирования высокого уровня. Приведем примеры использования каждого из них: FOR $MyCounter = 1 to $final $value+= 30 End Поясним действие данной связки команд. Для значения $MyCounter, равного 1, до цифрового значения, заключенного в переменную с кодовым названием $final, прибавить к параметру $value цифру 30. Понятное дело, цикл будет повторяться до тех пор, пока значение атрибута $MyCounter не станет равным $final. Аналогичным образом производится организация цикла с употреблением оператора while: $var = 4 While $var<10 inc($var) end Данный фрагмент кода приложения будет работать по следующей схеме — до тех пор, пока значение $var<10, будет выполняться команда inc($var) и цикл будет повторяться. Ну и при помощи оператора Repeat...until можно сконструировать цикл, тело которого выполнится хотя бы один раз, независимо от наложенных условий: REPEAT wait 10 07F5: car 4@ control_hydraulics 0.0 0.0 1000.0 1000.0 $Timer -= 1 UNTIL $Timer <= 1 В данном примере программа сначала выполнит команду 07F5: car 4@ control_hydraulics 0.0 0.0 1000.0 1000.0, а лишь затем — проверку условия. Итак. С объявлением переменных и констант разобрались, массивы инициализировать научились, по циклам и условиям пробежались. Далее на повестке дня — комментирование фрагментов кода. В SAMB для вставки своего авторского комментария требовалось внедрить в нужном месте символ «;» и после него напечатать произвольный текст. В SB же комментирование блоков выполнено на манер профессиональных языков программирования. Т.е. для блокировки целой строки вам нужно вбить в самом ее начале два «слэша» вида //, например: // Игроманский мод 2007. Best of the best. Если вы хотите вмонтировать свой комментарий, например, посередине строки между какими-то командами, просто заключите текст подписи между фигурными скобками , скажем: car 153@ Игрострой — формат C: stopped Примечательно то, что, используя второй способ комментирования, можно «вывести из игры» не только одну строку, но и какую-либо цельную скриптовую конструкцию. Для этого всего лишь нужно поставить открывающую фигурную скобку в начале одной строки, а закрывающую — в конце какой-либо из нижестоящих строк, например: :COPCAR_16679 if 81AF: not car 153@ sphere 0 in_sphere 150@ 151@ 152@ radius 4.0 4.0 4.0 else_jump @COPCAR_16742 Car.StorePos(153@, 150@, 151@, 152@) 154@ = 0 Из других правил скриптописания в SB. Не нужно ставить символ точки с запятой в конце строки, как в SAMB, где выполнение данного действия (т.е. постановки символа ; в конце строки) было жизненно необходимо. При объявлении потока (мода), а также в различных переходах в SB вместо символа английского фунта JJ необходимо использовать литеру @, например: create_thread_wb @X_thread jump @Label1 gosub @Mod2 Далее. Все локальные переменные содержат значок @ в конце, а не в самом начале, как в SAMB. Ну и, наконец, ключевые слова... Что, уже догадались? Совершенно верно — все типовые команды (опкоды, ответственные за создание авто, персонажей на карте, расстановку чекпойнтов, вооружения, команды для создания взрывов, затемнения экрана и далее, и далее) в SB можно прописывать по тексту без указания кода команды. Т.е, скажем, вместо команды 0001: wait 0 ms в SB вы можете написать просто — wait 0 ms. Минусов у такого подхода нет вовсе, а вот сколько плюсов! Главное достоинство такой записи команд — нет необходимости запоминать различные циферки, нужные лишь компилятору. CLEO — ключ к независимости Ключевая особенность SB — возможность создания обособленных (читай: внешних) скриптовых дополнений благодаря уникальной библиотеке CLEO третьего поколения. Это означает, что конечному пользователю, т.е. геймеру, больше не придется заменять оригинальные файлы, начинать игру сначала и все в таком духе. Достаточно всего лишь положить файл со скриптовым модом или миссией в специальный каталог с игрой! В Sanny Builder предусмотрено несколько способов создания CLEO-скриптов. Мы рассмотрим наиболее простой из них. Первым делом щелкните левой копкой мышки по кнопке CLEO в строке состояния в нижней части редактора для установки необходимых компонентов. В открывшемся окне внимательно ознакомьтесь с текстом лицензионного соглашения, после чего щелкните по кнопке инсталляции библиотеки CLEO 3. Далее создайте новый документ в SB и вживите в самое начало файла следующую директиву: $CLEO. Наконец, наберите в текстовом поле программы произвольный скрипт и скомпилируйте файл при помощи горячей клавиши F6 на клавиатуре. SB автоматически сохранит ваш скриптовый мод в виде независимого дополнения в директорию \CLEO установленной GTA: San Andreas. Вам лишь останется опробовать свежеиспеченную модификацию непосредственно в игре. Внимание, внимание! При написании автономных миссий в Sanny Builder, использующих библиотеку CLEO (прим. — которая, к слову, была разработана создателем SB — Seemann'ом), указывайте в начале файла директиву $CLEO .cm вместо $CLEO. * * * Время подводить итоги. Сегодня мы рассмотрели синтаксис Sanny Builder, а также научились создавать автономные или независимые скриптовые моды при помощи уникальной библиотеки компонентов CLEO третьего поколения. Полученных знаний вам вполне хватит, чтобы с легкостью перейти на данную «платформу» со сдавшего свои позиции SAMB или же освоить SB с чистого листа. Ну а если возникнут вопросы — как и всегда, пишите на почтовый ящик gamedev@igromania.ru, который работает 24 часа в сутки, семь дней в неделю, 365 дней в году.
Источник: http://хз |