Jump to content
  • Новые материалы

  • Мой второй скрипт


    Ed_MSL

    Введение

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

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

    Информация о написании скриптов в Oblivion


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

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

    Скриптовый язык TES уникален, но он не может быть использован вне TES Construction Set. Как скриптовый язык он имеет некоторые ограничения, в отличие от "настоящих" языков программирования, например C++:

    • Область применения скриптов TES ограничена; не надо ждать, что можно запрограммировать что-то, так или иначе не включенное в игру. Это совсем не означает, что вы не сможете достичь новых и необычных результатов! Но вы не сможете использовать скрипты TES, например, для программирования текстового процессора.
    • Скрипты TES не похожи на SDK (комплект разработки программного обеспечения – сокр. с англ. software development kit), который действительно позволяет работать и изменять исходные коды игры. Вот почему вы не сможете использовать скрипты TES, например, для добавления новых погодных эффектов. Они прописаны в другом месте и нужно обладать дополнительными знаниями, чтобы сделать это.
    • Данный язык интерпретируемый, а не компилируемый – коду для работы нужна отдельная программа (в данном случае Oblivion.exe), в отличие от компилированного кода, который может работать сам по себе, как .exe-приложение.

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

    Что могут скрипты?

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

    Чего не могут скрипты

    Скриптовый язык TES ограничен в своих возможностях – в нем большое количество функций, которые вы можете использовать, но иногда возможные варианты использования будут не все, которых бы вам хотелись. В большинстве случаев опытные скриптологи смогут найти специфику для очевидных ограничений, но не стоит ожидать чуда. Многие вещи запрограммированы и скрипты на них влияния не оказывают, а если и оказывают, то лишь косвенно.

    Учебник скриптов: до написания кода

    Если вы новичок в скриптах и в программировании разбираетесь лишь в общих чертах, даже если уже ознакомились с учебником "Мой первый скрипт", углубленное скриптонаписание с использованием скриптов TES может немного напугать. Вот почему здесь представлен развернутый учебник, который постепенно подведет вас к созданию более сложного скрипта. По мере изучения вы получите объяснения основных элементов скриптового языка. Вам встретятся разнообразные пояснения, но ключевые инструкции и важная информация будут выделены жирным шрифтом.

    Начинаем!

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

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

    Открыть окно редактора скриптов можно несколькими способами: выбрав Gameplay –> Edit Scripts; нажатием на кнопку редактора скриптов (карандаш) в правом верхнем углу панели инструментов; или в меню Object или NPC, активировав кнопку [...], расположенную за редактируемым полем с названием скрипта.

    Script window.JPG

    Давайте посмотрим на кнопки, расположенные на панели инструментов, слева направо:

    • Открыть - позволяет выбрать скрипт для редактирования.
    • Сохранить - проверяет текущий скрипт и компилирует его или выдает сообщения об ошибках. Примечание: в это время реального сохранения плагина на диск не происходит. При написании больших скриптов после сохранения скрипта вы должны периодически использовать команду "сохранить плагин" в главном окне TES CS, на случай "падения" конструктора.

    Также если при редактировании скрипта вы вдруг нажмете "сохранить плагин", изменения в скрипте при этом сохранены НЕ будут. Сначала вы должны сохранить вручную сам скрипт. Также, если просто закрыть скриптовое окно, это не значит, что скрипт сохранится. Вы должны позаботиться о его сохранении сами.

    • Стрелки Вперед и Назад открывают следующий или предыдущий скрипт соответственно (в алфавитном порядке). Если вы присвоите своим скриптам общее обозначение в начале их названий, то это облегчит переход между скриптами и их поиск в вашем проекте. Например, мой псевдоним - Grundulum, и он стоит в начале каждого моего скрипта "GR_ShortReferencetoProject_", а последующие две или три буквы образуют аббревиатуру для конкретного мода; это заставит все скрипты, над которыми вы работаете, расположиться аккуратно и по порядку.
    • Скомпилировать все – перекомпилирует все скрипты (для чего это нужно? Ни я, ни GhanBuriGhan не знаем). Это также добавит каждый скрипт из Oblivion в ваш мод - таким образом вы получите двухмегабайтный esp-файл, конфликтующий практически со всем, с чем только можно. Используйте эту кнопку осторожно.
    • Удалить – удаляет скрипт,
    • И, наконец, кнопка "Стрелка вниз" закрывает скриптовое окно.

    В правом верхнем углу панели инструментов можно найти ниспадающий список под названием Тип Скрипта. Данный блок позволяет выбрать один из трех типов скриптов, под который подпадает ваш скрипт:

    • Объект
    • Квест
    • Магический Эффект.

    Подробнее об этом позже, но в рамках введения - Объектные скрипты – это скрипты, привязанные к объектам игрового мира (также, как и к предметам или NPC), Квестовые скрипты – скрипты, контролирующие выполнение квестов (как генерация персонажа), и Магические скрипты – скрипты, контролирующие все особые магические эффекты (в особенности, cкриптовые эффекты).

    Что мы хотим?

    Перед тем, как мы приступим к написанию нашего учебного скрипта, мы сначала должны решить, что мы хотим, чтобы он делал!

    Для этого учебника мы собираемся создать:

    Шкаф с Загадкой: шкаф загадывает загадку и открывается только в случае правильного ответа. Если игрок отвечает неправильно – срабатывает ловушка и ранит игрока, а шкаф остается закрытым.

    Это довольно сложное задание, но мы будем выполнять его шаг за шагом и в конце станет очевидно, что не все так страшно.

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

    После открытия скриптового окна, нажмите Script -> New... Вы должны заметить, что Тип Скрипта – "Объект", что нам как раз и нужно. Нажмите в главном окне, которое из серого теперь стало белым. Здесь вы будете писать скрипт.

    Учебник скриптов: первые строки


    Называем скрипт

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

    ScriptName RiddleChestScript

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

    Попробуйте сохранить свой скрипт, используя кнопку «Сохранить» на панели задач. Ничего очевидного не случится, но если вы нажмете на кнопку «Открыть», то сможете увидеть название вашего скрипта в перечне скриптов Oblivion.

    Нажмите на «X» в верхнем правом углу окна выбора скриптов, чтобы закрыть его и вернуться в окно редактирования. RiddleChestScript сейчас самый короткий скрипт в Oblivion, но он ничего не делает. Давайте это исправим.

    Команды "Begin" и "End"

    Команды "Begin" и "End" определяют начало и конец блоков скрипта – отдельных участков кода, которые будут выполняться при определенных условиях. Например, "Begin GameMode" определят начало выдачи текстового блока, который будет запускаться в каждом фрейме до тех пор, пока игрок не откроет меню. Для наших целей нам нужен тип-блок "OnActivate": он запустится только тогда, когда наш шкаф будет активирован (утомительно отвечать на загадку в каждом фрейме или всякий раз, как NPC умрет, обе этих вариации возможны с использованием других вариантов типов блоков Begin!).

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

    ScriptName RiddleChestScript 
    Begin OnActivate 
         ; Здесь мы напечатаем, что случится, когда шкаф будет открыт 
    End

    Опять нажмите "Сохранить". Скрипт все еще ничего не делает, но, по крайней мере, теперь мы определили условия, при которых он будет работать. Также здесь нужно отметить пару вещей. Первое - мы закрыли текущий блок перед тем, как начали новый – это не так важно, когда в скрипте один блок, но как только скрипт станет более сложным, нам понадобятся составные блоки. Выражаясь в более технических терминах – блоки Begin/End не вкладываемые.

    Вторая вещь, которую надо отметить, это точка с запятой ";" на линии 4. Точка с запятой отмечает остальную часть строки как комментарий. Все напечатанное после точки с запятой на этой строке при компилировании скрипта будет проигнорировано. Комментарии используются, чтобы объяснить код, это поможет вам и другим быстро понять, что происходит в скрипте на определенных строках. Если вы хотите написать более чем одну строку с комментарием, то точку с запятой нужно ставить в начале каждой строки.

    Выдача текстового сообщения и получение ответа от игрока.

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

    MessageBox "Безголосый, но плачет. Бескрылый, но парит. Беззубый, но кусает. Безротый, но бормочет. Что это?", "Летучая мышь", "Старуха", "Ветер", "Привидение"

    Первая строка (текст между первой парой кавычек) – текст, действительно отображаемый в окне сообщения; остальной текст, разделенный запятыми, сообщает игре, чтобы она сделала "кнопки" по одному выражению для каждой.

    Но как нам сделать, чтобы загадка задавалась только при первой попытке открыть шкаф, а не постоянно? Теперь мы переходим к центральной теме: использование одноразовых условий и переменных состояния. Самая распространенная из проблем, с которой сталкиваются начинающие в написании скриптов для Oblivion, берет свои корни в непонимании того, как на самом деле выполняются и, соответственно, должны быть оформлены скрипты. Так что обратим внимание на эту важную деталь.

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

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

    до тех пор пока (объект в активной ячейке) 
         [код скрипта] 
    завершение

    Вот почему представленный ниже скрипт будет плеваться непрерывным потоком сообщений (если приложен к объекту или NPC в той же ячейке, где и игрок). Проверьте сами, если хотите:

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

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

    Вот почему конструкции с использованием "Do Once" так существенны и часто используются при написании скриптов для Oblivion. Так что давайте продолжим написание нашего учебного скрипта - нам нужно применить переменную, чтобы наше сообщение выдавалось только один раз.

    Измените свой скрипт как указано ниже:

    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". Сейчас вам достаточно знать, что данная переменная будет содержать целые (целые положительные или отрицательные числа).

    Переменная - это "метка-заполнитель", которая может принимать различные значения. Команда "Set" для вас тоже новая, но достаточно простая – она устанавливает значение нашей переменной с 0 на 1 (все переменные начинают с нулевого значения). Это в сочетании с командой "If ( controlvar == 0 )" обеспечивает одноразовое условие – в следующем фрейме скрипт будет выполняться после того, как переменной будет присвоено значение 1, условие "If" будет неверно и текстовое сообщение больше выдаваться не будет.

    Учебник скриптов: первый тест


    Сохранение и подготовка модификации.

    Наш скрипт уже способен работать, так что давайте его проверим:

    • Сохраните скрипт и закройте окно редактора скриптов.
    • Посмотрите в окно объектов и проследуйте по директориям WorldObjects > Container > Clutter пока не найдете объект с Editor ID: CupboardFoodLower.
    • Теперь или щелчком с зажатой правой кнопкой мыши выберите Edit, или просто щелкните два раза по объекту, чтобы открыть его свойства.
    • Затем в ниспадающем списке скриптов выберите только что сделанный нами RiddleChestScript.
    • Нажмите ОК, сохраните мод и выйдите из TES CS.

    Примечание: обратите внимание на то, что мы только что сделали. Редактирование объекта без присвоения ему нового id - опасное занятие! Никогда так не делайте, если вы не уверены в том, что вы делаете!

    Скрипт в игрe

    • Теперь используйте "Файлы данных", чтобы активировать мод, запустить игру и загрузить сохранение.
    • Когда игра загрузится, активируйте консоль (обычно это кнопка «~» (тильда), слева от клавиши «1» на основной клавиатуре) и в консоли напечатайте:
    player.coc "AleswellInn" 
    и нажмите Enter.
    • Вы появитесь в Алесвельской таверне, где вас сразу поприветствует группа невидимых людей. Это не имеет отношения к моду, просто данная ячейка использовалась автором для тестирования (она находится сверху в списке интерьеров, поэтому ее очень легко находить). Щелкайте, пока не сможете двигаться, и подойдите к шкафу слева от вас.

    Scripttut2 testing1.JPG

    При активировании шкафа должно появляться окно сообщений, как на картинке ниже.

    Scripttut2 testing2.JPG

    Нажатие на один из вариантов ответа закроет окно и, если попытаться активировать шкаф опять, ничего больше произойти не должно – это хорошо, т.к. значит, что наша проверка состояния работает, как мы и хотели. (Шкаф не открывается потому, что мы еще не включили в скрипт команду Activate, мы сделаем это позже.)

    Выключите Oblivion и загрузите свою модификацию в TES CS. Бедным людям из Алесвельской таверны придется дождаться следующего раза, чтобы вернуть свою видимость, но такова жизнь NPC в видеоигре.

    Учебник скриптов: выбор игрока, ошибки и исправления.


    Выбор игроком варианта ответа

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

    Функция "Activate" заставит наш шкаф открыться; фактически, эта функция просто инициирует стандартное действие, которое должно выполняться, когда вы "используете" объект со скриптом: дверь откроется, NPC начнет диалог и т.п. Следующие изменения в скрипте также демонстрируют, как можно использовать управляющую переменную, чтобы заставить Oblivion обрабатывать функции одну после другой, хотя законченный скрипт обрабатывается каждый фрейм игры: просто увеличьте управляющую переменную и проверьте его в серии операторов If–ElseIf. Это очень безопасный способ скриптонаписания для Oblivion. Это может быть не всегда нужно, но безопасно.

    Пожалуйста, измените свой скрипт, как указано ниже:

    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

    Обратите внимание на новый блок - "GameMode", который начинается с "If (controlvar == 1)". Мы устанавливаем "controlvar" в 1 как только шкаф будет активирован. Но "OnActivate" только запускает скрипт в том фрейме, в котором объект будет активирован. Поэтому нам необходимо использовать блок "GameMode", чтобы продолжить проверку выбора игрока, и далее проверка будет выполняться в каждом фрейме. Теперь проверим нажатие кнопок. А сделаем мы это с помощью присвоения новой переменной "button" величины, возвращаемой "GetButtonPressed". Скрипт работает, даже когда игра останавливается в ожидании вашего решения. Сначала мы проверим ситуацию, когда ни одна кнопка не была нажата – в этом случае команда "return" сообщает игровому движку остановить выполнение скрипта в текущем фрейме.

    Правильный ответ - "Ветер"; он соответствует кнопке номер два – при нажатии этой кнопки нам нужно известить игрока, что он дал правильный ответ, и позволить функции "Activate" открыть шкаф обычным способом. Все значения, соответствующие остальным кнопкам, означают, что игрок выбрал неправильный ответ, так что здесь мы можем использовать команду "Else". В этом случае мы сообщим игроку, что он глупый и шкаф не будет активирован.

    Теперь посмотрите на небольшое дополнение в верхней части скрипта:

    Begin OnActivate 
         If ( controlvar == 0 ) 
             MessageBox "Безголосый, но плачет. Бескрылый, но парит. Беззубый, но  кусает. Безротый, но бормочет. Что это?", "Летучая мышь", "Старуха", "Ветер", "Привидение" 
             Set controlvar to 1 
         ElseIf ( controlvar > 1 ) 
             Activate 
         EndIf 
     End 

    Это означает, что если шкаф будет активирован в будущем, он откроется только если "controlvar" будет больше 1. Вспомним последний абзац: если игрок дает неправильный ответ на загадку, "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  

    Видите, как мы переместили команду "Activate" в секцию, которая проверяет "controlvar == 2"? Это обеспечивает четкую последовательность событий, предотвращая одновременное открытие двух блоков, а как было упомянуто выше, четкая последовательность может быть очень важна при написании скриптов для Oblivion – всегда старайтесь избегать делать слишком много вещей сразу! Сохраните, запустите и проверьте скрипт.

    Замечательно! Теперь инвентарь открывается как надо, но что это? Мы не можем его закрыть! Посмотрите выше: переменной "controlvar" была присвоена 2, и она и далее остается с таким значением, поскольку мы ее больше не изменяем. Следовательно, игра теперь получает непрерывные команды "Activate" всякий раз, как выполняется скрипт (в каждом фрейме)! Вот почему мы не можем закрыть инвентарь – он мгновенно открывается снова. Поэтому измените следующую часть скрипта вот так:

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

    Заново протестируйте мод: теперь все работает так, как мы хотели. Надеюсь, вас не смутило вышеуказанное отклонение в процессе отладки, но это очень важная вещь – вам постоянно придется продумывать свои скрипты и испытывать различные способы, чтобы добиться успеха.

    Что мы пропустили? Ловушку, конечно!

    Учебник скриптов: добавляем ловушку.

    Если игрок неправильно ответит на загадку, наш шкаф наложит на него проклятье. Сначала выберите заклинание, которым хотите поразить игрока: щелчок на значок "+" рядом с Magic, еще раз нажмите на "+" рядом со вкладкой Spell, наконец, выберите подпункт "Заклинание". Выбор здесь довольной большой, но для наших целей мы используем заклинание Mg05FingerSpell15.

    Выбрав это болезненное наказание, нужно применить его к игроку, когда он даст неправильный ответ. Отредактируйте скрипт следующим образом:

    Else 
        MessageBox "Неправильный ответ." 
        Cast Mg05FingerSpell15 Player 
        Set controlvar to -1 
    EndIf  

    Отметьте, что мы использовали функцию "Cast". (Дополнительная информация: для работы функции "Cast" необходим объект вызова. Мы не включили его в наш скрипт, потому что это объектный скрипт, и он будет привязан к игровому объекту. Следовательно, функция будет действовать относительно данного объекта.)

    Теперь ваш скрипт должен выглядеть так:

    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

    Вот и все, ваш скрипт готов. Поздравляем! Если хотите, можете поэкспериментировать со скриптом, используя другие функции.

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

    После прочтения этого учебника вы можете спросить себя, как продолжить изучение написания скриптов? Хороший способ – это просмотр примеров из учебника или скриптов игры (как написанные Bethesda, так и из модов). Попробуйте найти скрипт, схожий с тем, что вы хотите создать, скопируйте его и измените под ваши нужды. Почитайте общую информацию по функциям и описания функций, которые могут понадобиться вам для осуществления задуманного.

    Классификация функций в функциональные типы должна помочь вам в поиске нужного. И, наконец, официальные форумы - отличное место для поиска информации (используйте функцию поиска) или для получения помощи по конкретной проблеме. А остальное – практика, практика и еще раз практика.

    Заключительные строки

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

    И, наконец, хочу объявить огромную благодарность GhanBuriGhan`y за его фантастическое "Руководство по скриптам Morrowind для чайников" (Morrowind Scripting for Dummies), в котором содержится прототип этого учебника. Я не смог с ним связаться, чтобы получить разрешение на его использование; но если у него есть какие-либо вопросы насчет данного руководства, то он вправе убрать его из WIKI или же отредактировать его.


    Данная статья взята с неработающего ныне сайта tiarum wiki. Статья является переводом данной статьи http://cs.elderscrolls.com/index.php?title=Scripting_Tutorial:_My_First_Script за авторством Grundulum. Переводчик Eugene (OSFM team).


    User Feedback

    Recommended Comments

    There are no comments to display.



    Create an account or sign in to comment

    You need to be a member in order to leave a comment

    Create an account

    Sign up for a new account in our community. It's easy!

    Register a new account

    Sign in

    Already have an account? Sign in here.

    Sign In Now

×
×
  • Create New...