Представьте себе такую
картину: в мрачных
подземельях TES 4: Oblivion
стройными рядами стоят
неподвижные монстры. Входит
игрок, недоуменно глядит на
могучих страшилищ, тычет в
них посохом, недовольно
пинает ногой. Но зверюги даже
носом не ведут, им все равно,
что происходит вокруг. Рядом
со входом в подземелье
притаились в засаде твари
поменьше. Они должны были
нашинковать героя стрелами,
когда он выйдет на свет, но
отчего-то забыли, как
натягивать лук и спускать
тетиву. Городские обитатели —
купцы, лавочники,
старьевщики — не желают
продавать персонажу ничего, а
на просьбу дать хоть какое-то
задание молчат, словно воды в
рот набрали. Что случилось? Да
ничего особенного, просто из
игры удалили все скрипты. А
без них Обливион мертв.
Чтобы модостроители могли
оживлять свои творения,
разработчики встроили в TES
Construction Set (набор утилит
для создания модификаций на
движке Oblivion) скриптовый
язык. В сегодняшней статье мы
рассмотрим базовые
принципы его работы (как
делать локации, мы уже
рассказывали в прошлых
номерах «Игромании»).
Синтаксис редактора
Первым делом изучим
анатомию скриптового
редактора. Запустите TES
Construction Set (мы снова
выкладываем его на наш DVD)
и подгрузите в него мастер-
файл Oblivion.esm. Щелкните
мышью по кнопке с
изображением карандаша на
панели инструментов — на
экране появится форма с
заголовком Script Edit. Это и
есть редактор скриптов.
Большую
часть
подпрограммы
занимает
текстовое
поле
(пока
оно
серого
цвета),
где
мы
и
будем
писать свои собственные и
редактировать уже
встроенные в игру скрипты.
Обратите внимание на панель
инструментов — на нее
вынесены только самые
необходимые функции; если
вам понадобится что-то еще,
придется путешествовать по
менюшкам: перетащить на
панель нужный инструмент, к
сожалению, нельзя.
Чтобы писать рабочие скрипты,
необходимо разобраться в
базовых принципах их
построения. Изучим синтаксис
на примере простейшего кода
из четырех строк. Создайте
новый документ, выбрав пункт
меню Script/New, и
напечатайте в текстовом окне
следующий текст:
ScriptName Igromania
Begin OnAdd
Message "Igromania — the
computer magazine", 24
end
Любой скрипт должен иметь
свое уникальное название. В
нашем случае это Igromania.
Если название вашего скрипта
будет состоять из нескольких
слов, то писать их надо слитно,
например, IgromaniaTest1.
Следующий неотъемлемый
элемент любого скрипта —
последняя строка, содержащая
всего одно слово end. Этот
операнд завершит работу
кода.
Между первой и последней
строками разместились два
ряда команд (их может быть
существенно больше). Команда
Begin OnAdd сообщает игре,
что весь нижеследующий код
начнет работу сразу после того,
как игрок возьмет какой-то
объект. Команда Message
"Igromania — the computer
magazine", 24 выводит на
экран сообщение (текст
которого указан в кавычках).
Цифра 24 задает время, в
течение которого сообщение
будет оставаться на экране.
Запомните очень важное
правило — каждая новая
операция должна начинаться с
новой строки! Если вы хотите
сделать какую-либо пометку
внутри скрипта, например,
«Скрипт игростроевца», то вам
необходимо вписать в нужном
месте символ ; (точка с
запятой), после чего поставить
сам комментарий:
; Скрипт игростроевца
«Ну и что нам теперь делать с
этой кучей команд?» —
спросите вы. Кликните по
значку с изображением
дискеты на инструментальной
панели для сохранения
скрипта. После этого перейдите
на окно объектов в категорию
Items и создайте новый
элемент (или отредактируйте
уже существующий). В окне
свойств объектов отыщите
метку Script и в списке
напротив выберите созданный
скрипт Igromania. Нажмите
кнопку Ok, разместите новый
элемент на карте и сохраните
плагин. Можно тестировать
разработку в игре.
Если все сделано правильно, то
когда вы найдете в игре новый
объект и возьмете его, на
экране появится сообщение
«Igromania — the computer
magazine».
Оператор Описание
== Равно
!= Не равно
> Больше
>= Больше или равно
< Меньше
<= Меньше или равно
События
Основы синтаксиса мы изучили,
теперь копнем чуть глубже.
Вернемся к команде Begin,
определяющей, при каком
событии активируется скрипт.
В первом скрипте значение
этой команды было OnAdd, но
есть и другие варианты.
begin OnMurder ActorID
(optional)
В данном случае скрипт начнет
работу после того, как будет
убит персонаж с
идентификационным
значением ActorID (его можно
посмотреть в меню свойств
NPC).
begin OnStartCombat
TargetActorRefID (optional)
begin OnStartCombat player
Первый скрипт активируется,
когда заданный персонаж
вступит в бой. Если вы хотите,
чтобы блок работал, когда
драться начинает главный
герой, используйте второй
вариант.
begin OnLoad
С помощью данной команды
можно проверить, все ли
области мира загружены.
begin OnHit ActorID (optional)
Блок стартует, когда персонаж
с идентификатором ActorID
нанесет герою повреждение.
Вариант:
begin OnHit BaurusRef
Значений у команды Begin
очень много, мы разобрали
только наиболее
используемые. Полный список
значений вы можете взять с
нашего DVD.
Арифметика и
условные переходы
Перейдем к объявлению
переменных. Они используются
в игре для указания
промежуточных значений,
которые присваиваются
конечной функции,
определенной разработчиками
игры. Чтобы было понятней,
рассмотрим конкретный
пример. Например, вы создали
мод «Кто хочет стать
миллионером». За первый тур
игрок заработал сумму в 100
условных единиц. Во втором
раунде он выиграл еще 5000
золотых, и далее по
нарастающей. В конечном
счете, все эти переменные
(соответствующие деньгам,
заработанным за каждый
раунд) суммируются, и
образуется одна общая
переменная. И уже из нее
информация о выигрыше
передается функции
добавления денег игроку.
В TES 4 три вида переменных:
short Variable
Variable здесь и далее — имя
переменной. Значение в
данном случае малая величина,
диапазон — от -32.768 до
32.767.
long Variable
Длинная переменная,
диапазон — -2.147.483.648 до
2,147.483.647.
float Variable
Параметр с плавающей точкой.
Радиус охвата — 1.18E-38 до
3.40E38.
Переменные заданы, но как
присвоить им определенные
значения? Как сложить,
вычесть? Разберемся по
порядку.
Чтобы присвоить той или иной
переменной определенное
значение, воспользуйтесь
следующей командой:
set Variable to 5
В данном случае 5 — значение
переменной.
Вы можете складывать,
вычитать, делить и умножать
переменные, которым
присвоили некоторые
значения.
set var_proizvedenie to
mnogitel_a*mnogitel_b
var_proizvedenie —
переменная, которой будет
присвоено значение, равное
произведению переменных
mnogitel_a и mnogitel_b.
Сложение, деление и
вычитание проводятся так
же — нужно всего лишь
заменить знак умножения в
описанной команде на +, —
или /, соответственно. Для
закрепления материала
рассмотрим небольшой
пример, демонстрирующий
объявление переменных и
действия над ними.
short
Variable_1
short
Variable_2
short
Variable_3
set
Variable1
to
5
set Variable2 to 10
set Variable3 to (Variable_1 +
Variable_2)/5
Для вывода результата на
экран воспользуемся
следующей командой:
message " Variable_3 =%.0f"
Variable_3
В нашем случае будет выведен
текст, информирующий о том,
что Variable_3 = 3.
Перейдем к постановке
условий, необходимых для
контроля действий игрока и
изменения различных величин
в игре. Рассмотрим пример
самого сложного условия:
if (Var1 == 50 && my Var == 50)
|| myVar2 == 1000
В данном условии два
оператора — && и ||. Первый
из них (логическое «и»)
отвечает за одновременное
выполнение двух условий, в
нашем случае — за то, что
переменные Var1 и Var2 равны
50. Второй оператор — ||
(логическое «или») сообщает о
том, что выход возможен,
когда параметр Var2 равен
1000. Упрощенный вариант
условия может выглядеть
следующим образом:
if (Var1 == 50)
Рассмотрим остальные
операторы. Оператор ==
(двойное равенство)
позволяет проверить — равно
ли значение той или иной
переменной конкретному
значению (if Var1 == 50). Если
заменить символ двойного
равенства на знак > (больше),
то скрипт будет проверять,
больше ли значение
переменной указанного числа,
например:
if Var1 > 50
Мы составили таблицу
операторов сравнения с
кратким описанием, вы
можете ознакомиться с ней на
отдельном текстовом блоке.
Условие поставлено, остается
решить задачу — что делать,
если оно выполняется или не
выполняется? После того как
мы задали само условие,
следующей строкой
необходимо прописать
команду или ряд команд,
которые будут исполнены, если
условие выполняется. А затем
(тоже отдельной строкой)
добавить ключевое слово else
и указать еще ряд команд,
которые запустятся, если
условие не выполняется,
например:
if (Var1 > 50)
set Variable2 to 1
else
set Variable2 to 2
В конце блока нужно вписать
операнд endif, который
завершит работу проверки.
Функции
В завершение разговора о
скриптах рассмотрим ряд
полезных функций, которые
понадобятся вам при создании
больших квестов. Хотите
отобрать у игрока золото,
краденые вещи и поместить
его в ближайшую темницу?
Тогда вам пригодится команда
GoToJail. Чтобы проверить,
находится ли персонаж в
какой-либо ячейке игрового
мира, воспользуйтесь
командой GetInCell CellName.
CellName определит название
любой локации, например,
Chorrol. Если требуется
проверить, ведет ли игрок
сражение с кем-либо,
пропишите функцию
IsInCombat (во время боя
функция вернет ответ 1).
Возможно, вы захотите сделать
читерский плагинчик, который
добавляет герою золото (если
его не хватает). Это довольно
просто: используете команду
GetGold для получения
информации о материальном
положении игрока,
организуете проверку — если
значение параметра GetGold
меньше указанного вами, то
добавляете немного наличных.
ScriptName
Igrostroi_money_grab
Begin Gamemode
if (GetGold<= 1000)
player.additem gold_001 5000
Message "Думаю, хватит?", 24
else
Message "Много хочешь, но
ничего не получишь", 12
Endif
End
Напоследок рассмотрим одну
довольно интересную идею,
реализовать которую вам
придется самостоятельно. Мы
лишь подскажем, как сделать
все в общих чертах и какие
команды использовать.
Попробуйте обыграть такую
ситуацию — игрок активирует
тот или иной объект (для
старта скрипта необходимо
использовать разновидность
команды Begin OnActivate,
также не забудьте присвоить
этот скрипт активируемому
объекту и разместить элемент
на карте). На экране появляется
меню, в заголовке которого
указан текст вашей загадки, а
под ним располагается
несколько возможных
вариантов ответов. Если герой
разгадал загадку, он получит
немного денег, повышение
скиллов, а если ошибется, то
лишится всего золота и
попадет в темницу. Меню
выводится на экран
посредством следующей
команды:
MessageBox "Текст загадки",
"Вариант ответа1", "Вариант
ответа 2", "Вариант ответа3",
"Вариант ответа4"
Для того чтобы определить,
какой же элемент выбрал
игрок, объявите переменную:
Short Punkt_menu
Set Punkt_menu to
GetButtonPressed
Проверку организуйте,
используя команду:
If ( Punkt_menu == 1 )