Статья "Мой первый Скрипт" является первым шагом обучения скриптованию в Oblivion, однако она не демонстрирует всех возможностей языка скриптов Oblivion. Это замечательное введение для тех кто никогда не видел раньше языки программирования или скриптования, но более глубокое изучение необходимо, чтобы продолжать знакомить моддеров с этим удивительным редактором.

Эта статья глубже знакомит с написанием скриптов в Oblivion чем статья "Мой первый Скрипт", и предполагает, что Вы уже знакомы с ней. Если Вы не поняли основные пункты этой статьи, Вы можете не ломать голову во второй раз. Если Вы все же освоили, продолжим обучение!

Содержание

  1. Больше информации о скриптовании в Oblivion
    • Что такое скрипт?
    • Что может делать скрипт?
  2. Обучение скриптованию: перед написанием кода
    • Начнем!
    • Окно редактора скриптов
    • Что мы хотим?
    • Написание скрипта
  3. Обучение скриптованию: первые строки
    • Имя скрипта
    • Begin и End
    • Написание текста и запрос решений игрока
    • Как оформляются Объектные скрипты
  4. Обучение скриптованию: первый тест
    • Сохранение и подготавление плагина
    • Скрипт в игре
  5. 5 Обучение скриптованию: выбор игрока, баги, и исправления
    • Позволение игроку выбирать ответ
    • Ваши первые баги и исправления
  6. Обучение скриптованию: добавление ловушек
  7. Как узнать больше
  8. Последние заметки

Больше информации о скриптовании в Oblivion

Что такое скрипт?

Скрипты - это части кода, записанного на специальном языке скриптов (здесь мы будем его называть TES Script). Эти маленькие "программы" будут работать в игре и могут управлять определенными вещеми в игре, на самом деле массой вещей: скрипты инициируют события, управляют временем и пространством, создают вещи и скрывают монстров, добавляют или перемещают, делают сообщения игроку, изменяют статистику, даже изменяют возможности погоды-все невозможное возможно.

TES Script является скриптовым языком, но не используется за пределами TES Construction Set. Хотя язык скриптов имеет определенные ограничения по сравнению с "настоящими" языками программирования, наподобие C++:

Область TES Script ограничена; не ожидайте, что он способен запрограммировать что-нибудь, чего нет в игре. Это не останавливает Вас в создании с помощью скриптов новых и уникальных вещей! Но Вы не можете использовать TES Script, скажем, чтобы создать текстовый редактор.

TES Script - не ПКР (программный комплект разработки), который позволяет Вам действительно работать с исходным кодом Oblivion. Также Вы не можете использовать TES Script, например, для добавления новых погодных эфектов. Это делается где-то в другом месте, и Вы должны обладать дополнительными знаниями, чтобы делать это.

TES Script не регистрозависим. Это означает, что команда "player.getpos z" работает точно так же как и команда "Player.GetPos z", так же как и "PlAyEr.GeTpOs Z", так же как и любая из подобных вариаций. Большинство людей (включая автора), используют второй формат, поскольку он наиболее понятен; остальные предпочитают первый формат, поскольку он использует только нижний регистр.

Что может делать скрипт?

Скрипты Oblivion - позволяют игре динамически реагировать на действия игрока. Вы можете использовать скрипты для управления сложными квестами.  Вы можете использовать скрипты, чтобы создавать ловушки. Вы можете использовать сценарии, чтобы изменять поведение NPC или  монстров. Помните создание персонажей в Oblivion? Им в основном управляет множество сценариев. Выполняли квесты? Они тоже сделаны скриптами. Вот и короткий ответ на поставленный ранее вопрос: многое.

Обучение скриптованию: перед написанием кода

Если Вы новичок в программировании и скриптовании, и даже если Вы прочли статью "Мой первый Скрипт", продуманное использование TES Script могло вызвать небольшой испуг. Вот для чего создана эта статья, она научит вас создавать другие, более сложные, скрипты. Как Вы уже догадались здесь будут описаны основные элементы языка скриптов.

Начнем!

Запускаем окно редакторов скриптов: Запустите TES Construction Set, открывайте мастер-файл Oblivion.esm затем выберите Edit Scripts из меню Gameplay, чтобы открыть окно редактора скриптов.

Окно редактора скриптов

Вы выводите редактор скриптов выбирая Gameplay -> Edit Scripts из меню; щелкая кнопку "Edit Scripts"(карандаш) справа на панели задач; или щелкая кнопку [...] около области "Script", находящуюся в окне редактирования NPC.

Давайте бегло ознакомимся с кнопками на панели задач, слева направо: "Open" позволяет Вам выбрать скрипт из списка, чтобы редактировать. "Save" сохраняет, проверяя скрипт и выдавая сообщения об ошибках по результатам проверки. Примечание: на самом деле плагин еще не сохранен на диске. При написании больших скриптов чаще сохраняйтесь в главном окне программы после сохранения в редакторе, это на случай вылета TES CS. Также, если Вы просто закроете окно редактора, это не означает, что скрипт будет сохранен. Вы должны позаботиться об этом сами.

Стрелки Влево и Вправо открывают последующий или предыдущий скрипт соответственно (в алфавитном порядке). Если давать своим сценариям имя с общей пометкой, это поможет вам легче переходить между ними. Например, мой ник - Fatal1ty, и я начинаю каждый скрипт с "FT_Script_",  так скрипты будут объединены в аккуратные группы. Compile all скомпилировать все. Она также добавляет все скрипты Oblivion в ваш плагин, так что esp-файл даже пустого плагина будет весить около 2 Мб. Старайтесь реже пользоваться этой кнопкой. Наконец, кнопка Delete удаляет скрипт, и последняя кнопка в виде стрелки вниз закрывает окно Редактора.

Далее справа Вы увидите выпадающий список "Script Type". Он позволяет Вам выбрать один из трех типов, Под который Ваш скрипт подходит: Object, Quest и Magic Effect. Посредством скриптов Object управляются объекты мира(например, NPC), скрипты Quest управляют квестами (как например генерация персонажа), и скрипты Magic Effect управляют специальными волшебными эффектами.

Что мы хотим?

Прежде чем писать скрипт выясним, что мы от него хотим? В этой статье мы напишем скрипт, который создаст Буфет-Загадку: буфет спросит загадку и только правильный ответ откроет его. Если игрок ответит неправильно - сработает ловушка, ранящая игрока, а останется закрытым. Это довольно сложный скрипт но постепенно мы его напишем.

Написание скрипта

Когда открыто окно Script Edit, кликните Script -> New.... Script Type сейчас "Object",  что нам и нужно. Кликните на основную часть окна, которая изменила цвет с серого на белый. Это то место где пишутся скрипты.

Обучение скриптованию: первые строки

Имя скрипта

Прежде всего мы должны дать нашему скрипту имя. Каждый скрипт должен начинаться с указания имени. В редактироемой области наберите:

ScriptName RiddleChestScriptNote

Заметьте, что в имени скрипта нет никаких пробелов и подчеркиваний. Имя сценария долно писаться одним словом, так что Вы не можете использовать пробелы. Также, Oblivion игнорирует подчеркивания в алфавитном списке сценариев; Вы можете использовать подчеркивания, чтобы делать названием более ясным для себя, но Вы не увидите их когда будете открывать сценарий позже. (Заметка: Oblivion допускает сокращения в TES Script, когда вы заменяете полное имя команды более короткой версией. Например, "ScriptName" можно заменить на "scn", или "ForceActorValue" на "ForceAV". Мы не сокращения в этой статье, но не удивляйся когда увидите скрипты, которые используют их. Помните, что TES Script не регистрозависим; Вы можете записать "scriptname" как "ScriptnamE", и это будет тоже правильный вариант.

Попытайтесь сохранить ваш скрипт используя кнопку "Save" на панели задач. С виду ничего не произошло, но если Вы нажмете кнопку "Open", здесь вы должны найти имя вашего скрипта в списке. Кликните X в правом верхнем углу окна Select Form, чтобы закрыть это окно и вернуться в окно Script Edit. RiddleChestScript - это самый короткий скрипт в Oblivion, но ведь и Москва не сразу строилась. Давайте исправим это.

Begin и End

Команды Begin и End определяют начало и конец кода, который будут выполнен при определенных условиях. Для наших целей, мы хотим использовать условие OnActivate: скрипт будет активирован когда игрок активирует что-либо(в нашем случае попытается открыть ящик).

ScriptName RiddleChestScript
Begin OnActivate
; Здесь мы введем код, выполняющийся когда ящик открыт.
End

Нажмите кнопку "Save". Скрипт еще ничего не делает, но по крайней мере теперь мы определили при каком условии он будет работать. Есть пара моментов которые стоит разъяснить. Уведомление - точка с запятой ";" в строке 4. Точка с запятой выделяет остальную часть строки как комментарий. Все, что Вы напишите после точки с запятой будет проигнорировано когда скрипт будет скомпилирован.  Для того, чтобы написать две и более строки комментариев ставьте точку с запятой на каждой строке .

Написание текста и запрос решений игрока

Теперь мы напишем код, при котором Буфет задает игроку загадку. Для этого мы используем функцию MessageBox, с которой Вы уже ознакомились в статье "Мой первый скрипт". MessageBox отображает на экране текст и также несколько вариантов выбора. К несчастью Oblivion (так же как и до этого Morrowind), не имеет функции, при которой игроку дается возможность заносить свой вариант ответа, значит мы должны сделать несколько вариантов. Строка кода:

MessageBox "Наша Таня громко плачет, уронила в речку...", "Ножик", "Мячик", "Вставную челюсть", "Сашу"

Текст между первой парой кавычек, - текст отображаемый в сообщении; все остальные слова, разделенные запятыми, выводятся в виде кнопок с возможностью выбора.

Как оформляются Объектные скрипты

Каждый скрипт, который приложен к объекту или NPC (сценарий Объекта), выполняется каждый раз, когда локация с этим объектом активна (в помещениях активна только локация с определенным интерьером, а на открытом воздухе активны все смежные локации). Следовательно эти скрипты выполняются 10-60 раз в секунду, это зависит только от скорости вашего компьютера! Это все равно что зациклить скрипт:

while (Object is in active Cell)
[Your script code]
Endwhile

В этом случае скрипт будет выполнен всего один раз, а в противном случае скрипт будет выполнятся  непрерывным потоком. Если не верите попробуйте это:

ScriptName HorribleMessageScript
Begin GameMode 
MessageBox “Тысячи бесполезных сообщений!”
End

Это сравнительно безвредный скрипт добавляющий сообщение, но представьте себе, если бы этот скрипт добавлял вещ в инвентарь или чудовище около игрока!

Давайте продолжим работу с нашим скриптом к: нам нужно объявить переменную и использовать ее, чтобы убедится что скрипт выполняется единожды. Измените скрипт:

ScriptName RiddleChestScript
Short controlvar
Begin OnActivate
If ( controlvar == 0 )
MessageBox "Наша Таня громко плачет, уронила в речку...",
"Ножик", "Мячик", "Вставную челюсть", "Сашу"
Set controlvar to 1
EndIf
End

и сохранитесь снова. Заметьте, что команда MessageBox записывается в одну строку! Не прерывайте ее!

И снова нужно отметить несколько вещей. Команда "If" проверяет выполняется ли условие зписанное в скобках, если выполняется, то будет выполнен код записанный до команды"EndIf". "==" означает, что выражение слева (в нашем случае переменная controlvar), приравневается к выражению справа (в нашем случае 0). Если Вы забудите "EndIf"  после "If" , редактор пожалуется на ошибку когда Вы пытаетесь сохранить.

"Short controlvar" объявляет новую переменную, которую мы назовем "controlvar". На данный момент достаточно будет знать, что переменная типа "Short"-переменная, содержащая целые (положительные или отрицательные) числа. Команда Set также новая, она присваевает переменной, которая имела величину 0 (все переменные в начале приравниваются к нулю), значение 1. Так как код выполняется с "If ( controlvar == 0 )", а после выполнения условия переменной присваевается значение 1, следовательно условие выполняется только единажды и сообщение не отобразится снова.

Обучение скриптованию: первый тест

Сохранение и подготавление плагина

Теперь наш скрипт уже способный работать, так что его можно тестировать:  Сохраните скрипт и закройте окно Script Editor.
Обратите внимание на Object Window и найдите в WorldObjects > Container > Clutter  объект с ID "CupboardFoodLower".
Теперь кликните по нему дважды и из выпадающего списка "Script" выберите  скрипт, который мы только что сделали "RiddleChestScript".

Нажмите OK, сохраняйте плагин и закрывайте TESCS.

Скрипт в игре

Теперь активизирйте свой плагин, запускайте игру и загружайте Ваш сейв.
В игре откройте консоль (обычно "~"(тильда)) и наберите:
player.coc "AleswellInn"

Вы появитесь в локации Aleswell Inn, с вами поздороваются невидимые люди, это не имеет отношения к плагину -- эта локация -выбор автора. Слева от себя вы увидите буфет подойдите к нему и активируйте его.
Когда Вы активизируете шкаф, Вы должны увидеть, как наше сообщение появилось на экране.
Щелчок на любом из ответов должен закрывать сообщение, при повторной активации Вы не увидите не какой реакции.

Покиньте Oblivion и откройте TESCS, загрузите наш плагин. Те бедные люди в Aleswell Inn должны еще подождать, Вы восстановите их видимость в другой раз, ничего тут недоделаешь такова уж учесть NPC в видео игре.

Обучение скриптованию: выбор игрока, баги и исправления

Позволение игроку выбирать ответ

Теперь нам нужно отследить какой ответ выбрал игрок, и прописать реакцию на них. Функция, отслеживающая выбранный ответ - GetButtonPressed. Эта функция присваивает каждой кнопке свое число "0" для первой кнопки ("Ножик" в нашем случае) и 1, 2, 3, и т.п. для следующих кнопок, в заказе Вы указали им в команде MessageBox.

Отредактируйте скрипт, чтобы он был похож на следующее:

ScriptName RiddleChestScript
Short controlvar
Short button
Begin OnActivate
If ( controlvar == 0 )
MessageBox "Наша Таня громко плачет, уронила в речку...",
"Ножик", "Мячик", "Вставную челюсть", "Сашу"
Set controlvar to 1
ElseIf ( controlvar > 1 )
Activate
EndIf
End

Begin GameMode
If ( controlvar == 1 )
Set button to GetButtonPressed
If ( button == -1 )
Return
ElseIf ( button == 2)
MessageBox " Гордись, ты дал правильный ответ."
Activate
Set controlvar to 2
Else
MessageBox " Ответ неправильный."
Set controlvar to -1
EndIf
EndIf
End

Правильный ответ был "Вставную челюсть", который назначался на кнопку 2, и если эта кнопка была нажата, то буфет открывался. И если была нажата любая другая кнопка, то выводилось сообщение о неправильном ответе и буфет остается закрытым.

Теперь немного изменим скрипт:

Begin OnActivate
If ( controlvar == 0 )
MessageBox "Наша Таня громко плачет, уронила в речку...",
"Ножик", "Мячик", "Вставную челюсть", "Сашу"
Set controlvar to 1
ElseIf ( controlvar > 1 )
Activate
EndIf
End

Это означает, что в будущем ящик будет открыт только в случае если controlvar больше, чем 1. Учитывая это условие, игрок никогда не сможет открыть ящик, если он даст неправильный ответ. Но при правильном ответе переменной controlvar будет присвоено значение 2, значит, игрок сможет спокойно открывать ящик, когда ему это заблагорассудится, но только при правильном ответе. Сохраняйте и тестируйте ваш плагин.

Ваши первые баги, и исправления

Если вы протестировали плагин, то заметили, что не все идет, как запланировано. Неправильный ответ закрывает буфет навсегда, а если ответ правильный сообщение возникает снова. Сообщение должно быть убрано, а буфет открыт!

Давайте попробуем следующее (измените соответствующую секцию скрипта):

If ( controlvar == 1 )
Set button to GetButtonPressed
If ( button == -1 )
Return
ElseIf ( button == 2)
MessageBox "Гордись, ты дал правильный ответ."
Set controlvar to 2
Else
MessageBox "Ответ неправильный."
Set controlvar to -1
EndIf
ElseIf ( controlvar == 2 )
Activate
EndIf

Мы разместили активационную команду, которая срабатывает при controlvar == 2, а при правильном ответе controlvar приравнивается к 2! Сохраняем, запускаем, тестируем.

Отлично, теперь буфет открыт как мы и хотели, но что это? Мы не можем его закрыть! Посмотрите выше: controlvar был установлен на 2 и остается с таким значением. Следовательно, игра теперь получает непрерывные команды "Активизации" всякий раз, когда скрипт обработан! Значит, мы должны сделать так, чтобы буфет мог закрываться. Измените следующую часть скрипта:

ElseIf ( controlvar == 2 )
Activate
Set controlvar to 3
EndIf

Тестируем плагин снова: теперь все работает, как мы хотели. 

Что делать теперь? Ловушку, конечно!

Обучение скриптованию: добавление ловушек

Наш буфет теперь должен насылать проклятия на игрока, если он неправильно отвечает на загадку. Теперь нам нужно выбрать из списка спеллов заклинание. В Oblivion довольно большой выбор, но в нашей статье мы используем спелл Mg05FingerSpell15.

Теперь нужно, чтобы игроку наносился урон при неправильном ответе. Отредактируйте скрипт:

ElseMessageBox "Ответ неправильный."
Cast Mg05FingerSpell15
Player Set controlvar to -1
EndIf

Здесь мы использовали функцию Cast. Эта функция позволяет выстрелить заклинанием в указанного человека синтаксис Cast Id спелла Id персонажа (Player для игрока)

Теперь Ваш скрипт должен быть похож на это:

ScriptName RiddleChestScript
Short controlvar
Short button
Begin OnActivate
If ( controlvar == 0 )
MessageBox "Наша Таня громко плачет, уронила в речку...", "Ножик",
"Мячик", "Вставную челюсть", "Сашу"
Set controlvar to 1
ElseIf ( controlvar > 1 )
Activate
EndIf
End

Begin GameMode
If ( controlvar == 1 )
Set button to GetButtonPressed
If ( button == -1 )
Return
ElseIf ( button == 2)
MessageBox «Гордись, ты дал правильный ответ."
Set controlvar to 2
Else
MessageBox "Ответ неправильный."
Cast Mg05FingerSpell15 Player
Set controlvar to -1
EndIf
ElseIf ( controlvar == 2 )
Activate
Set controlvar to 3
EndIf
End

Поздравляю, мы закончили наш скрипт! Поэкспериментируйте с ним, используя разные функции TES Script.

Как узнать больше

После того, как Вы проработали эту статью, у Вас может появится вопрос: как узнать о скриптовании больше? Отличный способ - рассматривание готовых скриптов (из самой игры или из плагинов). Используйте этот сценарий, изменяя его под свои потребности. Прочитайте список функций, чтобы найти те функции, которые Вам нужны. Форумы также являются очень хорошим местом для получения информации. Ну и, наконец, практикуйтесь, практикуйтесь, практикуйтесь.

Последние заметки

Учтите, что круглые скобки вокруг условий не необходимы. Я включил их в эту статью, поскольку я думаю, что они помогут более аккуратно оформить скрипт, чтобы его можно было легче понять.

Автор перевода: Fatal1ty

6

Комментарии

Есть ли список скриптовых команд для TEC? Если есть, дайте ссылку, пожалуйста.

Mixail_Rumeus, Никто не поделился ссылкой?
Мне бы для CS морры все команды

Спасибо за перевод, и спасибо человеку который написал эту статью.

Авторизуйтесь, чтобы оставить новый комментарий. Или зарегистрируйтесь.