База модов


Популярные моды




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

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

Во-вторых, этот мануал, можно использовать как справочник. Большая часть этого документа - описание доступных функций. Эта часть написана для человека опытного. Предполагается, что те, кто будет читать ее, уже владеют основами написания скриптов. Однако я попробую привести больше информации, объяснений и типовых примеров, чем оригинальный help, чтобы облегчить вам использование этих функций в своих скриптах. Чтобы найти интересующую вас функцию, используйте предметный указатель в конце этого документа. Если вы столкнетесь с ошибками, вам поможет раздел Устранения ошибок. В Приложение вы найдете удобный список ссылок.

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

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

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

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

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

Возможности TES-скрипта ограниченны, и программировать что-нибудь на нем вне игры уже невозможно. Также, вы не можете использоваться TES-скрипт, чтобы, скажем, написать текстовый процессор. ТES-скрипт, также не является SDK (комплект разработки программного обеспечения), который позволил бы вам изменить исходный код самой игры. Также, вы не сможете использоваться скрипт для того, чтобы добавить новые погодные эффекты. Для этого вы должны быть опытным программистом и уметь изменять исходный код исполняемого файла. Это - интерпретируемый язык не компилируется - код нуждается в отдельной программе (в данном случае Морровинд), чтобы работать, в отличие от компилируемого кода, который мог бы запускаться отдельно, подобно exe-файлу.

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

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

Чего не может скрипт?

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

Скрипты: обучающая программа

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

Давайте начнем! Мы начнем с запуска редактора скриптов: запустите TES Construction Set, откройте в нем файл Morrowind.esm и затем выберите пункт Edit Script из меню Gameplay, чтобы открыть окно редактора.

Окно редактора Итак, вы вошли в редактор скриптов, выбрав в меню Gameplay пункт Edit Scripts, либо щелкая мышкой по иконке с карандашом в панели задач, либо, обращаясь к редактору из меню свойств заскриптованного объекта или NPC, щелкая мышкой на кнопке с тремя точками, справа от опции Script. Основное окно редактора выглядит так:

Давайте посмотрим на кнопки в панели задач, слева направо

Open - позволяет вам выбрать скрипт для редактирования.

Save проверяет текущий скрипт на наличие ошибок и компилирует его, либо собирает информацию об имеющихся ошибках и выдает ее в виде сообщения, обращу внимания на тот факт, что в случае обнаружения ошибки скрипт не сохраняется на диске [Прим. Skeiz: на самом деле автор не совсем прав. В результате сохранения скрипт компилируется, только в том случае, если он уже был предварительно откомпилирован. Для того чтобы откомпилировать новый скрипт, нужно нажать кнопке Recompile all]. При написании больших скриптов рекомендуется чаще сохранять файл плагина с помощью команды в главной панели задач TES CS.

Красные стрелки Forward и Backward отправляют вас к следующему и, соответственно, предыдущему в списке скрипту, которые сортируются по алфавиту. Для удобства сортировки я рекомендую объединять скрипты в группы, добавляя перед его именем некий буквенный код, например AA_Scriptname, т.к. это позволит вам объединить все ваши скрипты в одну группу.

Следующая кнопка Recompile all компилирует все имеющиеся скрипты (действительно ли она нужна? Я не знаю) [Прим. Skeiz: данная опция, во-первых, проверяет ошибки во всех имеющихся скриптах, а их там минимум три или четыре (из стандартных Бетездовских). Во-вторых, она сортирует и обновляет список скриптов, без нее созданный вами скрипт может не добавиться в список скриптов, который вызывается у предметов и NPC].

Кнопка Delete удаляет выбранный скрипт.

Кнопка Exit (красная стрелка в них) - закрывает окно редактора.

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

Вы можете копировать и вставлять в окне редактора текст, используя стандартные сочетания клавиш ctrl+c для копирования, ctrl+v для вставки, ctrl+x для вырезания.

Что мы хотим?

Прежде, чем начать действовать, надо решить - что же мы хотим получить в результате. Для этой обучающей программы я решил, что мы будем делать Сундук с Загадкой (Riddle Chest): сундук будет задавать загадку и только правильный ответ позволит открыть его. Если игрок выбирает неправильный ответ, срабатывает ловушка, повреждая игрока, не давая возможности открыть крышку.

Написание подобного скрипта - сложный комплексный процесс, но мы пройдем его шаг за шагом.

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

Хорошо, перед вами открытое окно редактора скриптов, щелкните в основной части окна. Здесь вы будете писать ваш скрипт.

Имя скрипта: Begin и End (начало и конец) Сначала, вы должны дать название своему скрипту - каждый скрипт начинается с определения своего имени. Напечатайте следующее:

Begin my_first_script

В окне редактирования. Обратите особое внимание на подчеркивания. Имя вашего скрипта должно представлять собой одно слово. Так же, стоит подчеркнуть тот факт, что язык скриптов не различает прописные и заглавные буквы. Это название, под которым скрипт будет определяться в TES CS. Попробуйте сохранить скрипт, нажав на кнопку Save: вы получите сообщение об ошибке, гласящее "you need to end your script with end scriptname" (вы должны закончить вашу программу командой в конце скрипта). Итак, для того, чтобы редактор определил ваш скрипт, нужно указать окончание скрипта, для этого напечатайте:

End

На новой сточке, под той, на которой располагается имя скрипта. Как вы можете заметить, мы можешь опускать имя скрипта, когда пишем команду, определяющую его конец. Теперь можете снова нажать кнопку Save. После этого, в списке скриптов появится имя вашего скрипта, это означает, что интерпретатор принял вашу программу. Данный пример - это самый короткий скрипт, который можно создать.

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

Затем, нам требуется определение - пробует ли игрок открыть сундук. В TES скриптах мы различаем следующие понятия - Объекты, Функции и Команды.

Объектами являются все предметы в игровом мире, будь-то видимые объекты, существа, NPC или просто звуки.

Функциями являются все "слова" TES скриптов, которые позволяют нам управлять этими объектами или получать информацию о них.

Командами являются те "слова", которые структурируют язык скриптов, но не позволяют оперировать игровыми объектами, например, слово "Begin" - сообщает редактору имя нашего скрипта.

Чтобы сообщить игре, что к данному объекты вы собираетесь применить некую функцию, следует использовать значок "стрелка": -> (дефис и знак "больше, чем"). При этом слева от стрелки вы указываете, какой именно объект вы будете использовать (назовем это - определением объекта), а в правой части указываем функцию:

Object_ID function, [parameters]

Функция может не иметь никаких параметров. Параметрами могут быть ID-других объектов, число и, в некоторых случаях, переменные.

Первое, что нам нужно для создания ящика-загадаки - функция OnActivate: это информативная функция, которая сообщает нам, активизировал ли игрок объект в игре или нет. Эта функция возвращает значение 1 (что означает "true" (правда) в терминологии программистов), если объект был активирован, что означает, что игрок нажал во время игры, кнопку "Использовать", наведя курсор на данный предмет. Дальше там требуется поставить условия, чтобы проверка функции OnActivate "true" в течение всего времени игры. Для этого отредактируйте скрипт следующим образом:

Begin my_first_script

If ( OnActivate == 1 )

; здесь будут описывать события, происходящие в результате попытки открыть сундук

endif

End

Теперь разберем множество новых понятий. "if" - это команда, которая проверяет выполнение условия, и, всякий раз, когда значение, возвращаемой функцией равняется "true" запускаются на выполнение строки кодека указанные ниже, пока не встретиться команда "endif". "==" проверяет, равно ли значение функции (в данном случае функции "OnActivate") в левой части значению выражения в правой части (в данном случае - 1). Если вы забудете написать команду "endif", то редактор выведет вам сообщение об ошибке. Точка с запятой (;) обозначает комментарий - независимо оттого, что вы напишете после нее - это все будет игнорироваться во время выполнения скрипта. Если вы собираетесь писать большие скрипты, вам придется часто использовать эту особенность.

Создание текстовых сообщений и получение ответов от игрока

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

MessageBox "Voiceless it cries, wingless flutters, toothless bites, mouthless mutters. What is it?", "Bat", "Old woman", "Wind", "Wraith"

Первый текст, выделенный кавычками - это, собственно, и есть вопрос, который будет задавать наш сундук-головоломка, далее идут варианты ответов, из которых надо будет выбрать правильный.

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

Как выполняется скрипт?

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

while (Object is in active Cell)

[Your script code]

endwhile

По этой причине, следующий скрипт будет непрерывно выводить вам сообщение, будучи активированным (например, присоединенным к NPC или объекту):

Begin Message_script
MessageBox "Thousands of useless Messages"
End Message_script

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

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

Begin my_first_script
Short controlvar
If ( OnActivate == 1 )
If ( controlvar == 0)
MessageBox "Voiceless it cries, wingless flutters, toothless bites, mouthless mutters. What is it?", "Bat", "Old woman", "Wind", "Wraith"
Set controlvar to 1
endif
endif
End

(Пожалуйста, обратите внимание, что команду MessageBox со всеми текстами должна занимать ОДНУ строку)

Short controlvar - объявляет новую переменную, которую я назвал controlvar типа short. Это означает, что переменная будет принимать значения только целых чисел (положительных или отрицательных). Переменная "placeholder" может принимать различные значения. Команда if, которую мы уже знаем и новая команда Set - устанавливают условие проверки значения нашей переменной 0 или 1. Выглядит это так, в случае, если (if) объявленная переменная имеет значение равное нулю ( controlvar == 0 ), то выполняется условие do-once, согласно которому запускается строка, в которой прописана команда MessageBox (MessageBox "Voiceless it cries, wingless flutters, toothless bites, mouthless mutters. What is it?", "Bat", "Old woman", "Wind", "Wraith"), после выполнения которой, значение переменной становится равным единице (Set controlvar to 1). Таким образом, обеспечивается условие однократного срабатывания данного скрипта. Теперь наш скрипт полностью управляем, и мы можем его запустить для теста:

Сохраните скрипт и закройте окно редактора скриптов. В TES Сonstruction Set выберите закладку Object, выберете пункт container и откройте предмет "chest_small_01". Измените ID сундуку на "tutorial_chest" В ниспадающем меню выбора скриптов выберите my_first_script Сохраните объект, как новый объект, сохраните мод, и выйдите из TES CS. Запустите Морровинде и загрузите сохраненную игру. Вызовите консоль (обычно клавиша ~ (тильда), находится слева от клавиши 1) и введите следующую команду:

PlaceAtPC tutorial_chest 1,1,1

Теперь сделайте шаг назад (т.е., сделайте так, чтобы вам персонаж отошел назад); перед собой вы должны увидеть небольшой сундук. Кликните на него, после этого перед вами должно появиться сообщение, которое мы с вами набирали:

Щелчок мышкой по любой из кнопок закроет окно сообщений и дальнейшие попытки использовать сундук ни к чему, ни приведут. Если все пройдет именно так, значит скрипт был написан правильно и, это означает, что мы правильно задали условия его работы.

Хорошо, покиньте Морровинд, вернитесь в редактор и снова загрузите ваш плагин.

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

Функция Activate открывая нашу сундук, фактически, она просто исполняет стандартное действие, как, например, если вы использовали выбранный объект, например, открылась бы дверь, NPC начал бы диалог и т.д.

Следующие изменения нашего скрипта продемонстрируют, как надо использовать переменные, чтобы заставить Морровинд обрабатывать функции одну за другой в рамках игры: просто увеличим контрольную переменную и проведем серию тестов с утверждениями if - elseif. Это самый безопасный путь скриптования для MW, возможно не все шаги необходимы, но так вы будет застрахованы от ошибок.

Пожалуйста, отредактируйте скрипт следующим образом:

Begin my_first_script
Short controlvar
Short button
If ( OnActivate == 1 )
If ( controlvar == 0)
MessageBox "Voiceless it cries, wingless flutters, toothless bites, mouthless mutters. What is it?", "Bat", "Old woman", "Wind", "Wraith"
Set controlvar to 1
elseif controlvar > 1
activate
endif
endif
if (controlvar == 1)
set button to GetButtonPressed
if ( button == -1 )
return
elseif ( button == 2)
MessageBox "The answer was correct"
Activate
set controlvar to 2
else
MessageBox "The answer was wrong"
set controlvar to -1
endif
endif
End

Посмотрите на часть кода, которая начинается с выражения if (controlvar == 1). Мы установили, что значение переменой controlvar станет равное 1, как только сундук попытаются открыть. Затем мы проверяем, какую кнопку нажимал игрок. Делаем это посредством ввода новой переменной button, которой присваивается значение функции GetButtonPressed. Так как скрипт работает все время, пока вы выбираете вариант, мы сначала, должны проверить условие, когда не была нажата ни одна кнопка - функция return говорит игровому движку, что надо прекратить обработку дальнейшей части кода и вернуться в начало скрипта.

Правильный вариант ответа wind соответствует кнопке под номером два – если эта кнопка будет нажата, скрипт скажет игроку, что ответ правильный и activate откроет сундук обычным способом.

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

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

If ( OnActivate == 1 )
If ( controlvar == 0)
MessageBox "Voiceless it cries, wingless flutters, toothless bites, mouthless mutters. What is it?", "Bat", "Old woman", "Wind", "Wraith"
Set controlvar to 1
elseif controlvar >= 1
activate
endif
endif

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

Ваш первый баг

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

if (controlvar == 1)
set button to GetButtonPressed
if ( button == -1 )
return
elseif ( button == 2 )
MessageBox "The answer was correct"
set controlvar to 2
else
MessageBox "The answer was wrong"
set controlvar to -1
endif
elseif ( controlvar == 2 )
Activate
endif

Посмотри, как я переместил команду activate поближе к секции, которая проверяет, равна ли переменная controlvar двум. Это изменение обеспечивает более стройную последовательность событий, поскольку, выше я уже писал, что при написании скриптов для Морровинда всегда надо избегать делать много вещей сразу. Хорошо, теперь запустим его и проверим.

Отлично, теперь инвентарь открывается, как мы и хотели, но что мы видим там? Курсор двигается настолько медленно, что не можем закрыть инвентарь! Посмотрим выше - значение переменной controlvar равняется двум и не изменяется, мы не можем изменить ее, поэтому игра зацикливается, непрерывно выполняя команду activate. Именно поэтому мы не можем закрыть инвентарь - он немедленно открывается снова и снова. Теперь измените следующую часть скрипта:

elseif ( controlvar == 2 )
Activate
Set t controlvar to 3
endif

Попробуем снова: теперь все работает так, как мы задумывали. Надеюсь, что я не смутил вас подобным процессом отладки, но это очень важная часть работы, поэтому вы должны знать ее. Вы постоянно будете переделывать ваши скрипты, опробывая каждый раз новые способы, чтобы добиться успешной работы. Что же мы забыли. Ну конечно же, эффект ловушки.

Действие заклинания на игрока

Наш сундук должен скастовать проклятие на игрока, если тот не сможет отгадать загадку.

Сначала зайдите в закладку создания заклинания (spellmaking), щелкните правой кнопкой мышки и в контекстном меню выберите опцию "new". Задайте заклинанию ID "Frost_Curse", имя "Холодное проклятие" и выберите тип - "curse", затем задайте величину урона, наносимого этим заклинанием, например 1 - 5. Результат должен быть примерно таким, как на картинке ниже:

Теперь нам требуется скастовать это заклятие на игрока. Для этого используем функцию AddSpell. После определенного времени мы удалим проклятие, используя функцию RemoveSpell, однако для этого мы должны создать таймер. Давайте снова отредактируем наш скрипт.

Begin my_first_script
Short controlvar
Short button
Float timer
If ( OnActivate == 1 )
If ( controlvar == 0)
MessageBox "Voiceless it cries, wingless flutters, toothless bites, mouthless mutters. What is it?", "Bat", "Old woman", "Wind", "Wraith"
Set controlvar to 1
elseif controlvar > 1
activate
endif
endif
if (controlvar == 1)
set button to GetButtonPressed
if ( button == -1 )
return
elseif ( button == 2)
MessageBox "The answer was correct"
Activate
set controlvar to 2
else
MessageBox "The answer was wrong"
Player -> AddSpell, "Frost_Curse"
set controlvar to –1
Endif
elseif ( controlvar == 2 )
Activate
Set controlvar to 3
elseif ( controlvar == -1 )
Set timer to ( timer + GetSecondsPassed )
if timer > 10
Player -> RemoveSpell, "Frost_Curse"
set controlvar to -2
endif
endif
End

Давайте изучим внесенные изменения. Строка Player -> AddSpell, "Frost_Curse" кастуете проклятие, которое мы создали ранее, на игрока. Обратите внимание, что мы должны использовать конструкцию Player ->, чтобы удостовериться, что заклинание будет действовать именно на игрока. Иначе мы наложили бы наше проклятие на сундук (на которого по умолчанию действует скрипт, т.к. он приаттачен именно к этому сундуку), что совершенно не имело бы никакого смысла...

Теперь эта часть:

Float timer
Set timer to ( timer + GetSecondsPassed )
if timer > 10

...именно так Вы можете сделать таймер в Морровинде. GetSecondsPassed - функция, которая возвращает время в секундах, которое прошло, начиная с последней выполненной команды. Так как, обычно, этот интервал измеряется в долях секунды, следовательно, мы нуждаемся в плавающей переменной, т.е. переменной, которая может хранить числа с десятичными значениями. Теперь, когда таймер насчитал 10 секунд, мы удаляем проклятие и удостоверяемся, что это будет сделано только один раз:

Player -> RemoveSpell, "Frost_Curse"
set controlvar to –2

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

If ( MenuMode == 1 )
Return
Endif

Помните, функция return сообщает игре, что надо прекратить обрабатывать скрипт. Хорошо, теперь у нас есть рабочий скрипт. Поздравляю! Если хотите, можете поэкспериментировать побольше с этим скриптом. Поместите сундук в игровую локацию и закройте его. Затем, попробуйте отпереть (функция Unlock) скриптом активизирующим его. Попробуйте добавить звук, когда загадка успешно решена (например, PlaySound3D, "skillraise"). Попробуйте использовать функцию Cast, вместо AddSpell.

Финальный вариант скрипта:

Begin my_first_script
Short controlvar
Short button
Float timer
If ( MenuMode == 1 )
Return
Endif
If ( OnActivate == 1 )
If ( controlvar == 0 )
MessageBox "Voiceless it cries, wingless flutters, toothless bites, mouthless mutters. What is it?", "Bat", "Old woman", "Wind", "Wraith"
Set controlvar to 1
elseif controlvar > 1
activate
endif
endif
if ( controlvar == 1 )
set button to GetButtonPressed
if ( button == -1 )
return
elseif ( button == 2 )
MessageBox "The answer was correct"
Activate
set controlvar to 2
else
MessageBox "The answer was wrong"
Player -> AddSpell, "Frost_Curse"
set controlvar to –1
Endif
elseif ( controlvar == 2 )
Activate
Set controlvar to 3
elseif ( controlvar == -1 )
Set timer to ( timer + GetSecondsPassed )
if timer > 10
Player -> RemoveSpell, "Frost_Curse"
set controlvar to -2
endif
endif
End
Wayne
Посетители
Всего материалов: 12
9 561
55
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.