Мир скриптов TES 4: Oblivion, часть 3

Мир скриптов TES 4: Oblivion, часть 3

Мастерская — Мир скриптов TES 4: Oblivion, часть 3
...без них Обливион мертв. Чтобы модостроители могли оживлять свои творения, разработчики встроили в TES Construction Set (набор утилит для создания модификаций на движке Oblivion) скриптовый язык. В сегодняшней статье мы рассмотрим базовые принципы его р
Игроманияhttps://www.igromania.ru/
Мастерская
Мир скриптов TES 4: Oblivion, часть 3

Представьте себе такую картину: в мрачных подземельях 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 )

* * *

Скриптовый язык The Elder Scrolls 4: Oblivion похож на C++, изучить его — все равно что пройти краткий курс программиста. Полученных знаний вам хватит для создания довольно сложных модификаций.

Если у вас возникнут вопросы, шлите по адресу gamedev@igromania.ru, и мы ответим на них в рубрике «Горячая линия: Игрострой».

Комментарии
Загрузка комментариев