• Добро пожаловать, Гость. Войдите или зарегистрируйтесь.

Автор Тема: Учебник "OSFM v1.0"  (Прочитано 69284 раз)

Описание:

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Garin

  • *
  • Сообщений: 1564
  • Репутация: 5
  • Пол: Мужской
    • ICQ клиент - 244260055
    • Просмотр профиля
    • tiarum.com
Учебник "OSFM v1.0"
« : 05 Декабрь, 2006, 00:14:03 »
0
Скрипты TES 4 Oblivion для модмейкеров
Oblivion Scripting for Modmaker
OSFM v1.0





Базовый курс скриптинга TES 4 Oblivion



OSFM Team
2006
Награды За огромный вклад в развитие Румора

Оффлайн Garin

  • *
  • Сообщений: 1564
  • Репутация: 5
  • Пол: Мужской
    • ICQ клиент - 244260055
    • Просмотр профиля
    • tiarum.com
Учебник "OSFM v1.0"
« Ответ #1 : 05 Декабрь, 2006, 00:30:36 »
0
Оглавление

1. Предисловие к первому изданию
2. Введение
    2.1 Как использовать это руководство.
    2.2 Что такое скрипт?
    2.3 Что могут скрипты?
    2.4 Чего не могут скрипты?
    2.5 Основные отличия в скриптинге TES 3 и TES 4
3. Обучающий курс
    3.1 С чего начинать?
    3.2 Редактор скриптов (Edit Scripts)
       3.2.1. Основные сведения.
       3.2.2. Пункт меню Script.
       3.2.3. Пункт главного меню Edit.
       3.2.4. Пункт главного меню Help.
       3.2.5. Панель инструментов.
    3.3 Назначение и главная цель вашего скрипта
    3.4 Ваш первый скрипт
4. Основы скриптинга
    4.1 Общая информация
    4.2 Типы скриптов
       4.2.1 Общие сведения о типах скриптов
       4.2.2 Как часто обрабатываются скрипты (Script Processing)
    4.3 Команды (Commands)
       4.3.1 Общие сведения о командах (Commands)
       4.3.2 Команда Scriptname (название скрипта)
       4.3.3 Команды Declaring variables (команды объявления переменных)
       4.3.4 Команды Begin (начало блока) и End (конец блока)
       4.3.5 Типы выполняемых блоков (BlockTypes).
       4.3.6 Команда "." (точка - UseReference)
       4.3.7 Команда Set (установить)
       4.3.8 Команда Return (возврат)
       4.3.9 Конструкция из команд If, ElseIf, Else, EndIf.
    4.4 Синтаксис
       4.4.1 - Начало и завершение скриптов
       4.4.2 - Общий синтаксис функций.
       4.4.3 - Общий синтаксис: запятые, скобки и пробелы.
       4.4.4 - Комментарии
       4.4.5 - Отступы / использование табуляторов
    4.5 Переменные (Variables)
       4.5.1 Классификация переменных
       4.5.2 Глобальные переменные (Globals)
       4.5.3 Перечень глобальных переменных Обливиона
       4.5.4 Специальные переменные (Special variables)
       4.5.5 Типы переменных
       4.5.6 Целочисленные короткие переменные (Variable types: shortint)
       4.5.7 Целочисленные длинные переменные (Variable types: longint)
       4.5.8 Вещественные переменные с плавающей точкой
       4.5.9 Переменные для хранения копий (Reference variable)
5. Ваш второй скрипт
    5.1 Введение
    5.2 Содержание
    5.3 Информация о написании скриптов в Oblivion
    5.4 Учебник скриптов: до написания кода.
    5.5 Учебник скриптов: первые строки.
    5.6 Учебник скриптов: первый тест.
    5.7 Учебник скриптов: выбор игрока, ошибки и исправления.
    5.8 Учебник скриптов: добавляем ловушку.
    5.9 Как узнать больше.
    5.10 Последние строки.
6. Функции в TES 4
    6.1 Что такое функция? (Function)
    6.2 Типы функций (Function Types)
    6.3 Работа функций с копиями объектов
    6.4 Описание функций в алфавитном порядке
7. Расширитель скриптовых функций OBSE
    7.1 Основные сведения.
    7.2 Изменения в новой версии.
    7.3 Установка OBSE.
    7.4 Типы скриптовых функций OBSE v0009a
    7.5 Официальная документация по командам OBSE v0009а
    7.6 Описание функций OBSE v0009a в алфавитном порядке
8. Консольные функции (Console Functions)
    8.1 Общие сведения
    8.2 Полный перечень консольных функций.
    8.3 Описания консольных функций в алфавитном порядке.
9. Приложения.
    9.1 Приложение 1: Возвращаемые типы величин (OBSEValueTypes)
    9.2 Приложение 2: Слоты ID для экипировки (Slot IDs)
    9.3 Приложение 3: Сканкоды DX
    9.4 Приложение 4: Игровые ID управления (Control IDs)
    9.5 Приложение 5: Виртуальные сканкоды клавиш, определенные в Windows (Virtual-Key Codes)
Награды За огромный вклад в развитие Румора

Оффлайн Garin

  • *
  • Сообщений: 1564
  • Репутация: 5
  • Пол: Мужской
    • ICQ клиент - 244260055
    • Просмотр профиля
    • tiarum.com
Учебник "OSFM v1.0"
« Ответ #2 : 05 Декабрь, 2006, 00:48:46 »
0
1. Предисловие к первому изданию

Основной целью учебника является написание максимально полного и качественного руководства по скриптовому языку программирования для игры TES 4 Oblivion. Учебник предназначен для модмейкеров - людей, создающих свои собственные модификации игры - как для начинающих, так и для опытных знатоков-скриптологов.

Немного истории:
Вы, конечно же, знаете о великом учебнике для игры TES 3 Morrowind - MSfD (Morrowind Scripting for Dummies). Автор учебника - GhanBuriGhan. Последняя авторская версия - MSfD 8.0. По MSfD 8.0 училось писать скрипты множество людей и для многих этот учебник действительно стал настольной книгой.

Начиная с 5-й версии началась работа над переводом MSfD на русский язык. В работе участвовали Boblen (в настоящий момент член команды OSFM team), Falca, Amargo (Nomad), Kuja, Ladimir, Vlad kudriashov, Turin Turambar и многие другие. Пока длились работы над переводом, версия MSfD выросла до седьмой. В конце концов была выпущена русская оф-лайн версия MSfD v7.0 rus. Немного раньше до этого знаменательного события в интернете появилась также русская он-лайн версия MSfD v7.0, автором перевода которой стал Aidan4.
Последнюю, 8-ю версию, перевел Gwathlobal, который, к слову, также является членом нашей команды. В дальнейшем Gwathlobal опубликовал еще одну русскую версию - MSfD 8.1 rus, в которую внес собственные дополнения. Учебник запакован в архив 7z  и имеет небольшой размер - 440кВ.
Скачать его вы можете на сайте TESPlay: http://tesplay.ru/content/articles/articles_m.shtml?view=5

Появилась информация, что сейчас идет работа над новой, 9-й версией MSfD. На сей раз эстафету от GhanBuriGhan принял новый автор - Yacoby. Отслеживать, как у него обстоят дела, вы можете на официальном форуме в теме "Morrowind Scripting for Dummies 9": http://www.elderscrolls.com/forums/index.p...howtopic=553402
Ну, что же, пожелаем ему усидчивости и терпения, поскольку путь к релизу ох как нелегок...

Предпосылки для написания нового учебника - OSFM.
В последнюю игру - TES 4 Oblivion, по сравнению с TES 3 Morrowind, было внесено множество изменений, касающихся практически всех аспектов геймплея. И это, конечно, повлекло за собой неизбежные изменения в принципах создания модификаций к основной игре. Коснулось это и такого очень важного вопроса, как написание скриптов. Скрипты используются непосредственно в игре и пишутся на специальном интерпретируемом языке программирования. Но вот как это делается, каковы особенности языка, функций, команд - увы, на момент релиза игры информации на русском языке было очень мало, не лучше обстоят дела и сейчас, спустя почти год...
Эта ситуация и стала главной предпосылкой к написанию данного учебника.

Реализация проекта OSFM.
Проект получил название OSFM и стартовал в конце мая 2006 года. OSFM - аббревиатура, которая расшифровывается так - "Oblivion Scripting for Modmakers", что в русском переводе можно перевести как "Скрипты Обливиона для модмейкеров". Почему "модмейкеров", а не "чайников" (dummies), спросите вы? Но скажите, где гарантия, что автор MSFD GhanBuriGhan не засел за новый учебник - "OSFD"? :)

Для реализации задуманного была создана команда OSFM team, в которую вошли неравнодушные люди - как обычные пользователи, так и представители различных сайтов, посвященных миру TES. О том, как продвигалась работа, вы можете узнать, посетив сайт "Scripting for Oblivion":
http://theelderscrolls.3dn.ru/
Осенью 2006-го года по различным причинам команда переехала на RUMOR (Russian Morrowind web Ring). Стоит упомянуть, что теперь RUMOR расшифровывается как Russian Morrowind-Oblivion web Ring (Ru-M-O-R):
tiarum.com

Немного о скриптах и проекте.
Для того, чтобы включить скрипты в игру, необходимо использовать специальную программу - Tes 4 Construction Set Oblivion, представляющую собой великолепный полнофункциональный редактор. Именно его использовали разработчики Bethesda Game Studios (Bethesda Softworks) для создания игрового мира.

В основу нашего учебника положена информация, размещенная на The Elder Scrolls Construction Set WIKI (далее для краткости просто WIKI) - специального форума на официальном сайте Bethesda, на котором обычные пользователи всегда могут внести любые изменения в тексты статей, обогащая и дополняя их своим опытом. Так, постепенно, WIKI стал основным источником информации по плагиностроению и работе с конструктором .

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

Мы, разумеется, не могли проигнорировать такой мощный источник информации, как WIKI. Поэтому на начальном этапе мы занялись переводами статей, посвященных скриптам и работе с редактором скриптов. Учитывая, что WIKI создается не профессионалами, его нельзя считать свободным от ошибок, как это ни прискорбно. Помимо ошибок, в WIKI встречается не совсем четкое изложение своих мыслей авторами статей, поэтому и перевод оных может быть неоднозначным. До сих пор в WIKI не стандартизирован такой важный  вопрос, так синтаксис функций. Именно поэтому при написании учебника многие утверждения мы старались по возможности проверять.

Увы, вы должны понимать, что выловить все ошибки, ляпсусы и "очепятки" практически невозможно. Поэтому заранее просим прощения, если таковые обнаружатся, и будем вам очень благодарны, если вы сообщите нам о них.

Свои замечания и предложения по улучшению учебника вы можете оставить  на форуме команды OSFM: http://tiarum.com/forum/index.php?showforum=138.
Мы обязательно учтем их в новых версиях OSFM.

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

Немного о нашей команде.

Команда разработчиков носит название "OSFM Team".
Члены команды:
    1. Garin
    2. Platinum
    3. ZomBoss (Zomb)
    4. Anruin (AD)
    5. ForceKeeper
    6. Willmore
    7. Gwathlobal
    8. LiLu (LizardOfOzz)
    9. Boblen
    10. Eugene
    11. Суфир
    12. TyRun
    13. Gelalhor
Я благодарю всех членов команды за хорошую работу, но хочу также выразить благодарность людям, помогавшим нам в разное время в работе над учебником, а именно: Zig, Vitalka, Когтистый и многие другие.

И в заключение.

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

Все права принадлежат команде OSFM Team.
По вопросам размещения учебника на ваших сайтах обращайтесь к руководителю проекта, то бишь ко мне.
Все возникающие у вас вопросы, замечания, дополнения и предложения вы можете изложить на форуме проекта:
http://tiarum.com/forum/index.php?showforum=138

С уважением, руководитель проекта Aleksandr Garin.
2007 г.
Награды За огромный вклад в развитие Румора

Оффлайн Garin

  • *
  • Сообщений: 1564
  • Репутация: 5
  • Пол: Мужской
    • ICQ клиент - 244260055
    • Просмотр профиля
    • tiarum.com
Учебник "osfm V1.0" Том 1
« Ответ #3 : 05 Декабрь, 2006, 00:50:13 »
0
2. Введение

2.1 Как использовать это руководство.

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

Учебник построен аналогично MSFD – от простого к сложному.
В первом томе после знакомства с основами написания скриптов вам будет предложено написать свой самый первый скрипт, создать свой плагин с ним и включить его в игру. Далее, после более подробного изучения синтаксиса и всех команд, вам сможете написать свой второй скрипт - с ловушкой на шкафу – он более сложный, чем первый, но как учебное пособие гораздо полезнее его.

В первый том мы включили описания всех известных на данный момент функций (всего 359), которые могут использоваться в скриптах Обливиона, описания всех консольных команд и описания всех функций, которые вошли в расширитель скриптов OBSE v0009а. Для вашего удобства описания расположены в алфавитном порядке.
В конце первого тома мы разместили различные приложения и предметный указатель по первому тому со ссылками на страницы с нужной информацией.

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

Скриптовый язык, который использован в игре TES 4 Oblivion, является уникальным, его нельзя использовать нигде, кроме самой игры. Но уникальным его можно назвать и по другим причинам. Скрипты дают нам невиданные возможности по модернизации и изменению игрового мира. Они могут то, чего нельзя сделать никакими другими методами.

В скриптовый язык TES 4 привнесено много нового и это откровенно радует - теперь стали возможны вещи, которые раньше нельзя было реализовать в TES 3.

Сами скрипты представляют собой небольшие текстовые фрагменты с программным кодом, который выполняет в игре определенные функции, изменяя таким образом игровой мир. Скрипты могут “вешаться” на различные объекты, а также выполнять определенные действия в диалогах или отслеживать прогресс игрока в квестах.
Одним из самых больших недостатков скриптового языка является отсутствие возможности определения кода нажатой на клавиатуре клавиши или кнопок мыши. Но и здесь уже появились средства, с помощью которых эта проблема решается легко и просто. Речь идет о расширителе скриптового языка OBSE, который содержит на данный момент около сотни вполне работоспособных и очень полезных функций. Ему мы тоже уделим внимание.

Напомним, что скрипт - это интерпретируемый программный код. Следовательно, он не может выполняться самостоятельно - для его работы необходима другая, скомпилированная программа. В нашем случае это делает “движок” игры, который “зашит” в исполняемый exe-файл - Oblivion.exe.

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

На все, что есть в игре, вы можете тем или иным способом воздействовать с помощью скриптов. Огромное многообразие игрового мира Обливион и богатство его ресурсов – в вашем распоряжении. Игра всегда реагирует на действия игрока. Но с помощью скриптов вы можете изменить реакцию игры на эти действия, например, если игрок намеренно или невзначай осквернил святыню, вы можете вызвать непогоду, превратить день в ночь, вызвать гром и молнию...
Скрипты, как универсальное средство воздействия на геймплей, могут использоваться, например, для создания хитрых ловушек, особо сложных квестов или для воспроизведения нужной анимации. Вы можете заставить любого персонажа игры выполнять совсем несвойственные ему действия, а можете сделать его чрезвычайно “умным”, использовав для этого средства управления искусственным интеллектом. Скрипты помогут вам создать свои собственные уникальные заклинания или зачарованные предметы, которые будут выполнять действия, лежащие за пределами обычных зачарований. В общем, возможности огромны.

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

Как бы там ни было, а скриптовый язык имеет и свои ограничения. В нем нет того богатства и универсальности функций, которые есть в “больших” языках программирования, таких как СИ++, Pascal или Delphi. Функции Обливиона специализированы. На данный момент известно 359 функций (одна из них - This, появилась в WIKI совсем недавно), но в игре задействовано только 353 из них. Тем не менее никакой избыточности нет – функции в основном писались и добавлялись в игру по необходимости.

Если вы захотите сделать нечто экстраординарное, что выходит за рамки возможностей языка, то, скорее всего, это у вас не получится - вы не можете изменить скомпилированный файл Olivion.exe, а исходные коды игры по понятным причинам Bethesda не опубликовала. К таким сложностям относится и создание новых функций.
В Паскале, например, вы можете создавать столько функций и процедур, сколько вам нужно. Можно даже сказать, что программирование в Паскале заключается именно в написании подпрограмм, которые затем в тексте основной программы просто вызываются по необходимости. Увы, написать на скриптовом языке новую функцию, используя только редактор, не удастся. Простого пути здесь нет. Но мы не утверждаем, что это невозможно. Примером служит расширитель скриптов OBSE, который будет рассматриваться в первом томе.
Впрочем, если вам действительно нужна какая-нибудь функция, никто вам не запрещает обратиться непосредственно к разработчикам OBSE с просьбой написать и включить ее в релиз следующей версии. Именно таким образом появилось множество новых функций. Такая страничка находится на официальном WIKI.

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

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

Чтобы писать скриптовые программы, вам нужно хорошо знать все особенности, нюансы, возможности и ограничения скриптового языка. А мы постараемся вам в этом помочь.

2.5 Основные отличия в скриптинге TES 3 и TES 4

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

Первое, что бросается в глаза при взгляде на скрипты Обливиона, это то, что теперь скрипт разделён на исполняемые блоки. В принципе, и в Морровинде делалось то же самое, но в более свободном порядке. Например, если раньше для активации объекта надо было написать:
  if ( OnActivate == 1) 
   …
  endif
причём это можно было ставить где угодно и на каком угодно уровне условий, то теперь для этого надо объявить отдельный блок:
 begin OnActivate 
    … 
  end
В данном случае применяется тип блока OnActivate. Зачем нужен этот блок? Как известно, в Морровинде все скрипты выполнялись в каждом фрейме (кадре) и предшествовали обновлению изображения на экране. Приходилось принимать специальные меры, что ограничить число выполнения тех или иных операций в тексте скрипта, поскольку это усложняло и без того непростые условия обработки информации и, как следствие, понижало fps.
В приведенном примере блок-тип OnActivate будет выполняться только один раз - в первом же фрейме, в котором выполнилось условие активации, в дальнейшем все, что находится в пределах блока «begin OnActivate … end», выполняться не будет.
В первом томе мы более подробно рассмотрим все 30 разновидностей типов блоков.

Другое явное отличие видно уже по окну редактора – это наличие трёх типов скриптов:
  • Object script - объектные (локальные) скрипты, "привязанные" к объектам.
  • Quest script - квестовые скрипты, прикреплены к квестам и выполняются глобально, пока выполняется квест. Эти скрипты доступны из любой локации, где бы игрок ни находился. Глобальных скриптов в том виде, которые известны нам по игре Морровинд, в Обливионе, увы, нет. Но вместо них мы с успехом можем использовать квестовые скрипты. Как это сделать, будет рассмотрено во втором томе учебника в главе «Полезные примеры, решения и трюки».
  • Magic effect script - Магические скрипты. Скрипты, которые связаны с магическими эффектами и магией.
Важным и полезным нововведением является возможность работы с указателями на объекты. Для этого был введен новый тип переменной – ref (reference).

В связи с введением в игру потребностей в еде и сне была разработана новая система искусственного интеллекта – Radiant AI. Как следствие, это повлекло за собой появление пакетов AI, новой анимации, а также скриптовых функций и консольных команд для управления ими. Поскольку теперь стала необходима и более сложная анимация, возможности управления ею стали гораздо шире. В TES 3, например, все анимационные движения для вида от третьего лица были включены в единый длинный файл base_anim.nif, который содержал 6 с небольшим тысяч фреймов. Множество отдельных движений, которые были включены в него, можно было проигрывать в любой последовательности, используя специальные анимационные функции. Внедрить и проиграть новую анимацию можно было, подключив в конструкторе свой собственный анимационный файл (на самом деле это комплект из трех файлов - *.nif, X*.nif и X*.kf.), однако они могли заменить только девять стандартных анимаций бездействия (idle, idle2...idle9).
В Обливионе уже нет такого длинного файла. Анимация разделена и находится в различных файлах, имеющих формат *.kf новой версии. Теперь можно подключить не один, а множество пользовательских файлов с новой анимацией. К сожалению, Bethesda на момент написания учебника так и не опубликовала новый формат файлов KF. Этим, а также отсутствием официального экспортера/импортера для 3dsMax, и объясняется столь долгое отсутствие плагинов с новой анимацией. Но мир не стоит на месте - усилиями энтузиастов наконец-то появились первые проблески - почти расшифрованы новые форматы, появились экспортеры/импортеры и появились первые плагины с новой анимацией. Более подробно анимация будет рассмотрена во втором томе.

Изменения коснулись и формата файлов NIF. Все 3d-модели объектов Обливион, имеющие новый формат NIF - v20.0.0.5, не открываются в старом конструкторе и привычных каждому модмейкеру программах. В связи с этим появляются новые версии программ, “понимающих” данный формат. Одной из динамично развивающихся и очень полезных программ является NIFScope. Но основной программой для создания новых объектов является, безусловно, 3dsMax. Все объекты TES 3 Morrowind были разработаны в 3dsMax v4.2. Работа со старшими версиями этой программы была проблематичной. Развитие 3d-технологий привело к тому, что теперь для моделирования объектов Обливиона можно использовать 3ds Max вплоть до 9-й версии. Необходим только соответствующий плагин для вашей версии программы.

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

Об озвучивании уже много писалось. Большой минус локализованной Акеллой и 1С русской версии игры – это отсутствие русской речи. Будем надеяться, что “народные” проекты озвучивания окажутся удачными. Тогда будет иметь смысл делать и свои “озвученные” плагины и использовать для этого средства управления звуком в диалогах. В игре TES 4 Oblivion есть возможность построения осмысленной беседы целой группы персонажей, чего было сложно добиться в TES 3 Morrowind. Во втором томе мы приведем примеры скриптов, показывающих, каким образом это можно реализовать.

Это только малая часть отличий. В общем, читайте учебник, сравнивайте, анализируйте, творите…
Награды За огромный вклад в развитие Румора

Оффлайн Garin

  • *
  • Сообщений: 1564
  • Репутация: 5
  • Пол: Мужской
    • ICQ клиент - 244260055
    • Просмотр профиля
    • tiarum.com
Учебник "osfm V1.0" Том 1
« Ответ #4 : 05 Декабрь, 2006, 01:06:55 »
0
3. Обучающий курс

3.1 С чего начинать?

Первое, что вы должны сделать, это скачать TES 4 Construction Set. Тот факт, что конструктор оказался вне игры, плохо, разумеется, но не страшно, если у вас есть Интернет. Его можно скачать как на официальном сайте Bethesda, так и на множестве других сайтов, посвящённых серии игр The Elder Scrolls.
Конструктор прекрасно работает и с русской локализованной версией игры, и с локализованными на русский язык плагинами.

Для людей, плохо знающих английский язык, существует русификатор конструктора. Мы решили помочь автору русификатора Serj777 в переводе некоторых английских терминов. Отчасти такое решение было принято для того, чтобы стандартизировать некоторые термины, которые разные переводчики переводят совершенно по-разному.

Разумеется, вам нужна и сама игра. Если вы разрабатываете собственные плагины, без лицензионной версии игры от 1С вам не обойтись. Никаких пиратских и полупиратских версий! Есть важные вопросы совместимости и об этом надо помнить. Разумеется, если ваш плагин разрабатывается для англоязычной аудитории, вам придется использовать лицензионную английскую версию игры.

Одним из проектов, который попал в поле зрения нашей команды, стал редактор скриптов TES Script Master (автор Sufir). Он существовал в очень простой версии и мы решили дополнить его различными улучшениями. Он стал более удобен, имеет цветовую подсветку кода, контекстные подсказки и возможность вставки сразу всей конструкции из команд целиком. В будущем, надеемся, TES Script Master будет иметь развитый HELP с полными описаниями всех команд, функций и синтаксиса. Единственное, что не будет сделано – это встроенные компилятор и расширенная проверка синтаксиса.

3.2 Редактор скриптов (Edit Scripts)

3.2.1. Основные сведения.

Редактор скриптов – это простой текстовый редактор, с помощью которого вы можете создавать и редактировать свои скрипты.



В верхней части окна находится главное меню. Пунктов меню всего три – Script (скрипт), Edit (редактировать) и Help (помощь).

3.2.2. Пункт меню Script.

При активизации кнопкой мыши открывается ниспадающее меню, имеющие следующие подпункты:
  •  New (новый скрипт) - создать новый скрипт.
  •  Open (открыть скрипт) - открыть уже существующий скрипт.
  •  Next script (следующий скрипт) - перейти на следующий (по алфавиту) скрипт из списка Open, при этом текущий не сохраняется.
  •  Previous script (предыдущий скрипт) - открыть предыдущий скрипт, при этом текущий не сохраняется;
  •  Save (сохранить) - скомпилировать и сохранить скрипт. Если при компиляции возникают ошибки, то сохранение не производится. Исправьте найденные ошибки и сохраните снова.
  •  Recompile all (скомпилировать всё) - перекомпилировать все скрипты в игре. Используется для проверки и поиска ошибок при работе с большим количеством скриптов (может занять некоторое время). Старайтесь не пользоваться этой опцией. По имеющимся отзывам, в том числе и на WIKI, делать это крайне не рекомендуется!
  •  Delete (удалить) - удалить открытый скрипт.
  •  Exit – закрыть редактор.
3.2.3. Пункт главного меню Edit.
  •  Undo (отменить, Ctrl+Z) - отменяет ваше последнее действие.
  •  Redo (возвратить, Ctrl+Y) - возвращает изменение в скрипте.
  •  Find text (найти текст) - поиск заданного текста в вашем скрипте.
  •  Find next (найти следующее, F3) – поиск, начиная с текущей позиции;
  •  Go to line (перейти на строку) - переход на строку с указанным номером.
3.2.4. Пункт главного меню Help.

При выборе подпунктов этого меню вызывается запуск Интернет-браузера и производится попытка связаться с сервером www.cs.elderscrolls.com, на котором находится WIKI.

3.2.5. Панель инструментов.

Под главным меню находится панель инструментов с иконками, которые дублируют часть пунктов главного меню, а также поле для выбора типа скрипта - Script type. В нем вы указываете, к чему привязывается ваш скрипт – к обьекту (object), квесту (quest ) или к магическому эффекту (мagic effect).

Иконки по порядку слева направо:
  •  Открытая папка – открыть существующий скрипт.
  •  Дискетка – скомпилировать и сохранить скрипт.
  •  Красная стрелка влево – предыдущий скрипт.
  •  Красная стрелка вправо – следующий скрипт.
  •  Красная дискетка – скомпилировать ВСЕ скрипты. Не поддайтесь соблазну!
  •  Крестик – удалить скрипт.
  •  Стрелка вниз – закрыть.

3.3 Назначение и главная цель вашего скрипта

Приняв решение написать скрипт, вы должны четко представлять себе, какие функции он должен выполнять и нельзя ли обойтись без него. Дело в том, что любой скрипт занимает драгоценные миллисекунды вашего процессорного времени, понижая таким образом fps. Особенно это заметно, когда в сцене находится много персонажей или, например, деревьев. Много скриптов в такой сцене могут резко понизить производительность вашего процессора, сделав из игры “слайд-шоу”. Есть разумный предел, переступать через который нежелательно.

Приняв решение о необходимости данного скрипта и убедившись, что никакими другими более простыми средствами добиться желаемого не удастся, необходимо четко сформулировать задачу с ясными и понятными целями. Когда цель ясна, нужно выбрать оптимальный вариант решения вашей задачи. Основные требования достаточно просты – скрипт должен быть как можно короче и, если нет обязательного выполнения в каждом фрейме, то выбрать оптимальный временной режим выполнения данного скрипта. Иногда задачу можно решить множеством способов. Среди них нужно найти наиболее оптимальный.

3.4 Ваш первый скрипт

Надеемся, вы уже знаете, как запустить редактор TES CS и что там делать, так что перейдём непосредственно к скриптам. В панели инструментов наверху найдите кнопку с карандашом (крайняя справа) – эта кнопка открывает редактор скриптов. Нажали? Значит, вы уже видите этот самый редактор. В нём сейчас пусто и основное его поле, где вам предстоит набирать будущий текст скрипта, имеет серый цвет.

Теперь перейдём к скриптам. Для начала можете посмотреть, как они вообще выглядят. Для этого нажмите на красную стрелку “вправо” и перед вами откроется первый в списке скрипт - AbandonedMineTrap02Script. Судя по названию, он отвечает за работу какой-то ловушки в заброшенной шахте. Всегда старайтесь давать своим скриптам понятные названия!

В этом скрипте есть все основные элементы скрипта:

В самой первой строке пишется название скрипта:
  •  scriptName AbandonedMineTrap02Script – эта строка обязательна, в ней пишется имя скрипта.
  •  Чуть ниже идёт объявление переменных: short triggered – создание короткой целочисленной переменной. В скрипте может не быть вообще переменных, а может быть несколько десятков и разных типов.
  •  Далее идут рабочие блоки:
begin [тип блока]  
    ….  
End
Именно в этих блоках и будет описываться работа скрипта.[/li][/list]

А теперь создадим свой собственный скрипт!
  •  В Object Window (окне объектов конструктора) отыщите отмычки. Вы найдете их в списке Items → Misc Item. Вместо отмычки подойдет любой обычный предмет - яблоко или что-нибудь подобное. Сделайте двойной щелчок на предмете.
  •  Откроется диалоговое окно со свойствами предмета. Там, где написано "Script: NONE", кликните на кнопку с тремя точками, находящуюся справа. Это откроет редактор скриптов.
  •  Выберите Script → New, чтобы создать новый скрипт.
  •  Скопируйте приведенный ниже программный код комбинацией клавиш Ctrl + C и вставьте его в окно редактора с помощью комбинации Ctrl+V:
ScriptName HelloWorld  
    Begin OnAdd        
    Message "Hello World!", 10    
end
    Информация о данном скрипте:

        - Первая строка – это имя скрипта (Scriptname). Убедитесь, что оно уникально. В противном случае вам придётся его изменить, т.к. редактор не позволит скомпилировать скрипт.
        - "Begin OnAdd" означает, что код внутри данного блока будет исполняться всякий раз, когда вы подберете нужный предмет. "OnAdd" – это тип данного блока. Команда “end” закрывает секцию скрипта, которая связана с “OnAdd”. У вас может быть несколько отдельных блоков begin/end, имеющие одинаковые или различные типы блоков (blocktype).
        - Между begin и end находится исполняемый программный код. В нашем случае это всего лишь одна функция – Message, которая выведет на экран сообщение "Hello World!".
        - И последнее – временной контроль за строкой сообщения. В данном случае она имеет параметр «10», который означает, что строка будет отображаться на экране в течение 10 сек.
    •  Сохраните скрипт и закройте Редактор скриптов.
    •  Вернитесь к свойствам предмета, "HelloWorld" должно появиться как опция в ниспадающем списке скриптов. (Возможно, вам нужно будет закрыть окно свойств объекта и снова открыть его, чтобы скрипт "HelloWorld" появился в ниспадающем списке.)
    •  Щелкните ОК, чтобы сохранить изменения, и закройте окно.
    •  На панели инструментов выберите File -> Save; в окне сохранения введите имя файла HelloWorld (это будет ваш первый *.esp файл плагина - HelloWorld.esp !).
    •  Откройте Oblivion_Launcher и щелкните Data Files.
    •  Двойным щелчком мыши подключите свой HelloWorld.esp, щелкните OK и закройте окно.
    •  Теперь все должно работать! Запустите игру, бросьте отмычку (или предмет, который вы использовали) на землю и подберите ее. При этом должно появиться сообщение "Hello World!".
    И с этим первым результатом добро пожаловать в скриптинг!
Награды За огромный вклад в развитие Румора

Оффлайн Garin

  • *
  • Сообщений: 1564
  • Репутация: 5
  • Пол: Мужской
    • ICQ клиент - 244260055
    • Просмотр профиля
    • tiarum.com
Учебник "osfm V1.0" Том 1
« Ответ #5 : 05 Декабрь, 2006, 01:24:15 »
0
4. Основы скриптинга


4.1 Общая информация

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

Основное правило при написании скриптов: каждая операция должна записываться в новой строке.
Вы можете также снабдить ваш код комментариями, используя ";". Все, что стоит после точки с запятой, будет в дальнейшем игнорироваться компилятором и игрой, но на этапе разработки и обсуждения скрипта комментарии облегчат процесс его понимания.

Скриптовые операции делятся на две основные категории, каждая из которых имеет две подкатегории:
  •  Команды: административные и утверждения.
  •  Функции: активные и пассивные.

Команды

Команда – это скриптовая операция, контролирующая все, что происходит в скрипте. Команды регулируют выполнение скрипта, но не влияют на игровой мир непосредственно. Команды делятся на две подкатегории:
  •  Административные команды – это Scriptname, Begin...End и Blocktypes (типы блоков), используемые командой Begin. В каждом скрипте должны быть по крайней мере команда Scriptname, и один Begin...End блок - для назначения скрипта на объекты и определения, когда тот должен заработать.
  •  Утверждения – это Set, If, Return и команды объявления переменных (variable declarations). Утверждения не запускают скрипт, но во всех скриптах, кроме самых простых, используются для управления их работой.
Функции

Функции – это скриптовые операции, которые взаимодействуют с игровым миром. Это самая большая категория скриптовых операций. Каждая функция возвращает значение, которое может быть использовано при проверке условий "if" или которое можно сохранить в переменной, используя команду set.

Функции подразделяются на две подкатегории: пассивные и активные:
  •  Пассивные функции проверяют определённые игровые величины и возвращают их значения. Например, функция GetActorValue возвращает определённое значение характеристики актера, а функция GetDetected - только проверяет и возвращает "1", если цель обнаружена, или "0", если нет.
  •  Активные функции вносят изменения в игровой мир и обычно возвращают логический результат ("1" или "0") - были ли действия успешными или нет. RemoveSpell, к примеру, снимает заклинание с цели и возвращает "1", если действие прошло успешно (т.к. на цели было заклятие). PlaceAtME создает какой-либо объект в локации вызвавшего эту функцию и возвращает ссылку на копию этого объекта.
Ссылки и переменные

Функции оказывают действие на "вызывающий объект" (тот, на котором работает скрипт) по умолчанию, но вы можете вызвать их и на другом объекте, используя ссылку на объект. Когда вы хотите, чтобы скрипт влиял, например, на игрока, используйте ссылку на игрока (“Player”) и точку “.”, чтобы перенаправить вызов функции (function-call) на игрока с вызывающего объекта: player.additem gold_001 100
Для большей гибкости вместо числовых значений вы можете использовать переменные, если они требуются для какой-нибудь функции:
short addgold  
set addgold to 100  
player.additem gold_001 addgold

Для своих целей вы можете использовать как локальные переменные, объявленные в этом же скрипте, так и глобальные.
Из функции нельзя напрямую обратиться к переменной в другом скрипте. Но такой возможностью обладают команды If и Set.
Например, эта строка скрипта работать не будет:
player.additem gold_001 otherobject.addgold
Следует написать так:
short addgold  ; объявление вспомогательной локальной переменной  
set addgold to otherobject.addgold  ; присвоить ей значение внешней локальной переменной  
player.additem gold_001 addgold  ; использование полученных внешних данных



4.2 Типы скриптов

4.2.1 Общие сведения о типах скриптов

Открывая меню свойств объекта, вы, вероятно, заметили, что в нём есть поле для подключения скриптовой программы (скрипта). Скрипт - это, как правило, небольшая программа, которая может быть присвоена объекту игрового мира, что позволяет ему выполнять некие особенные действия.
Скрипты можно условно разделить на две главные категории:
  •  Локальные (Reference scripts) - скрипты на объектах игрового мира.
  •  Нелокальные скрипты (Non-reference scripts).
Локальные скрипты.

Локальные скрипты (Reference scripts) - это скрипты, которые запускаются на объектах. Они разделяются на два типа:
  •  Скрипты, прикрепленные к объектам - объектные скрипты (References object scripts)
  •  Скрипты в поле "result" диалогов (dialogue results)
В таких скриптах некоторые локальные функции (Reference functions) могут использоваться без явного указания ID объекта (ID_NameObject) – в этом случае они будут нацелены на объект, с которым этот скрипт связан (с объектом, на который он “повешен”).
Другими словами, локальные скрипты – это скрипты, в которых функции могут использовать неявные обращения к объекту, к которому они прикреплены. Например, если к NPC прикреплен локальный скрипт, то функция additem в этом скрипте добавит ему 100 золотых:additem gold_001 100
Нелокальные скрипты.

В нелокальных скриптах (квестовые скрипты, результаты выполнения стадии квеста и пр.) имена объектов (ID_NameObject) в функциях должны быть указаны явно. Другими словами, нелокальные скрипты – это скрипты, в которых функции должны явно указывать объект, в отношении которого они вызываются, потому что они не привязаны к какой-либо копии объекта:

  • Квестовые скрипты – скрипт можно сделать квестовым, если указать его тип "Quest" в окне редактирования скриптов.
  •  Скрипты в поле результата стадии квеста.

С другой стороны, все скрипты можно разделить на:
  •  Именованные скрипты (Named Scripts)
  •  Результирующие (Result scripts).

Именованные скрипты.

Именованные скрипты – это полные скрипты, которые могут быть связаны с объектами, квестами или магическими эффектами и которые могут использовать переменные и begin/end блоки.
Именованные скрипты создаются с использованием окна редактирования скриптов. Эти скрипты могут в полной мере использовать все возможности скриптового языка. Командой scriptname им обязательно нужно дать имя.

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

Объектные скрипты.
Скрипты, “повешенные” на объектах - это именованные скрипты, которые могут быть прикреплены к любому объекту. Это всегда локальные скрипты, и они могут использовать любые функции, кроме специализированных команд для магических эффектов.

Квестовые скрипты создаются с типом скрипта Quest, выбранном в окне редактирования скриптов. Никакой другой тип скрипта работать с квестами не будет. Квестовые скрипты - это нелокальные скрипты и потому должны использовать особый синтаксис в вызове функций.

Основные положения:

  •  Квестовые скрипты выполняются только тогда, когда выполняется квест (вы можете определить это в игре, напечатав в консоли sqv QUEST_NAME). Квесты начинаются и заканчиваются с помощью команд StartQuest и StopQuest. Эти команды не зависят от того, завершен квест или нет. Завершение квеста означает, что он перемещается на панель завершенных квестов (Completed Quest tab) в журнале игрока – но скрипт все равно будет исполняться, пока квест не будет переведен в пассивное состояние командой StopQuest.
  •  Квест автоматически начинается, когда в журнал игрока записывается запись от этого квеста. Поэтому команда SetStage QUESTNAME 10 (если запись 10 содержит текст) автоматически начнет квест.
  •  В общем, вы должны останавливать квест, когда он завершен, чтобы скрипт, прикрепленный к квесту, перестал исполняться. Если по какой-то причине квест должен оставаться активным (у вас есть диалог или скрипт, необходимый после окончания квеста), создайте второй квест (например, MS38 и MS38FIN).
  •  Значения квестовых переменных можно запрашивать и изменять, даже когда квест не активен. Когда квест останавливается, его скрипт перестает исполняться, но он все равно существует и его переменные также остаются в целости.

Как изменить частоту выполнения квестового скрипта:
  •  Объявите "магическую переменную" float fQuestDelayTime в вашем квестовом скрипте.
  •  Присвойте переменной fQuestDelayTime число, определяющее требуемое время между циклами выполнения скрипта, в секундах. Чем меньше это значение, тем чаще будет выполняться ваш скрипт. Если число будет очень мало, например, 0.01 сек, то это будет соответствовать частоте исполнения скрипта 100 раз в секунду. Поскольку частота смены кадров (фреймов) на экране (fps) намного меньше, то ваш скрипт будет исполняться в каждом фрейме.
    Если вы установите его в 0, скрипт будет выполняться каждые 5 секунд (время по умолчанию). Используйте эту возможность с осторожностью и в особых случаях – значение fQuestDelayTime должно быть меньше 5-ти.

Скрипты для магических эффектов – это особые скрипты, которые можно использовать для создания заскриптованных магических эффектов. Они создаются в окне редактирования скриптов, но у них должен быть тип Magic Effect, иначе использовать магические эффекты не удастся. Такой скрипт будет выполняться, если игрок находится рядом, и будет останавливаться вместе с игрой при вызове какого-либо меню.

Эти скрипты не используют обычные типы блоков begin/end, поскольку выполняются, пока эффект заклинания активен на цели. Для них существуют три специальных блока и одна особая функция.

Типы блоков для магических эффектов:
  •  ScriptEffectStart
  •  ScriptEffectFinish
  •  ScriptEffectUpdate

Другие типы блоков использовать нельзя (они будут скомпилированы, но код внутри них выполняться не будет).

Специальная функция для магических эффектов:
  •  ScriptEffectElapsedSeconds

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

Результирующие скрипты.

Результирующие скрипты (Result scripts) – фрагменты скриптов, которые связаны с диалогами или стадиями квестов и возвращающие некий результат в поле result диалогового окна.
Скрипты в поле “result” (Result scripts) диалоговых окон конструктора – это скриптовые фрагменты, которые выполняются один раз, когда наступает определенное событие. Существует два типа таких скриптов:
  •  Скрипты в поле result диалога выполняются, когда NPC говорит связанное со скриптом сообщение. Такие скрипты, как и скрипты, прикрепленные к объектам, являются локальными скриптами.
  •  Скрипты в поле result стадии квеста выполняются, когда достигнута определенная стадия квеста, и НУЖНЫЙ ПАРАМЕТР предмета или сам предмет стадии квеста (stage item) соответствует заданным условиям. Эти скрипты относятся к нелокальным скриптам.

Скрипты в поле result имеют следующие ограничения по сравнению с именованными скриптами:
  •  В них нельзя объявлять переменные.
  •  В них нельзя использовать блоки begin/end.
  •  В диалоговых скриптах нельзя использовать неявное обращение к переменным локального скрипта NPC.

В остальном, скрипты в поле result могут использовать все обычные функции и команды.


4.2.2 Как часто обрабатываются скрипты (Script Processing)

Когда и каким образом скрипты обрабатываются, зависит от того, с чем связан скрипт. В общем случае локальные скрипты на объектах выполняются только тогда, когда игрок находится рядом; квестовые же скрипты выполняются постоянно - до тех пор, пока выполняется квест.
Как часто выполняются скрипты:
  •  Квестовые скрипты: когда квест активен, выполняются каждые 5 секунд (по умолчанию). Вы можете изменять частоту выполнения скрипта, изменив переменную float fQuestDelayTime в теле скрипта.
  •  Скрипты на персонажах (существах и NPC): выполняются каждый раз, когда выполняется пакет ИИ (AI) актера. При наивысшем приоритете (загруженная область вокруг игрока) они выполняются в каждом фрейме. Если же игрока рядом нет, то гораздо реже (вплоть до одного раза за 15 минут игрового времени при самом низком приоритете). Но это единственные скрипты (кроме квестовых скриптов), которые выполняются, когда игрока нет рядом.
  •  Скрипты на копиях: выполняются в каждом фрейме, когда ячейка загружена, и совсем не выполняются, когда ячейка не загружена. То есть, они выполняются, только тогда, когда игрок рядом (что означает, что это хороший вариант для использования ресурсоемких скриптов, проверяющих, например, дистанцию).
  •  Скрипты на объектах в контейнерах: выполняются, когда выполняются скрипты на контейнерах – поэтому скрипты вещей у актеров выполняются, когда обрабатывается актер; вещи в других контейнерах обрабатываются в каждом фрейме, когда ячейка загружена.
  •  Скрипты на дверях: особый случай - эти скрипты выполняются, как скрипты на копиях (в каждом фрейме в загруженной ячейке), но они также выполняются один раз, когда персонаж взаимодействует с дверью.
Награды За огромный вклад в развитие Румора

Оффлайн Garin

  • *
  • Сообщений: 1564
  • Репутация: 5
  • Пол: Мужской
    • ICQ клиент - 244260055
    • Просмотр профиля
    • tiarum.com
Учебник "osfm V1.0" Том 1
« Ответ #6 : 05 Декабрь, 2006, 02:00:09 »
0
4.3 Команды (Commands)


4.3.1 Общие сведения о командах (Commands)

Скриптовый язык Обливиона специально создан для игры, но тем не менее структурой он очень напоминает другие языки программирования. Самый простой скрипт имеет три элемента: команда ScriptName (название скрипта), команда begin с указанием типа блока и команда end. Пример:

ScriptName MyScript  
begin OnAdd Player
      ; делать что-то  
End


Команда ScriptName понятна: она задает имя скрипта. Она обязательна и имя должно быть уникальным.
Команда begin определяет действие, которое запускает скрипт. Если условие, указанное в команде begin (тип блока), выполняется, то исполняются все команды, находящиеся в пределах блока между begin и end.

Каждая команда begin обязательно должна иметь соответствующую ей команду end!

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


4.3.2 Команда Scriptname (название скрипта)

Все скрипты (точнее, именованные скрипты) должны начинаться с этой команды, которая задает имя скрипта. Имя должно быть уникальным и состоять из одного слова.
scriptname TestScript
или
scn Testscript


4.3.3 Команды Declaring variables (команды объявления переменных)

Существует 4 типа переменных:
  •  Short  - Короткая целочисленная переменная.
  •  Long   - Длинная целочисленная переменная.
  •  Float   - Вещественная переменная.
  •  Ref    - Переменная типа reference (ссылка на копию объекта).

short     от -32,768 до 32,767  
long     от - 2,147,483,648 до 2,147,483,647  
float     от -3.402823×1038 до -1.175494×10−38, 0 и   от 1.175494×10−38 до 3.402823×1038 (с точностью до 7 знаков)  
ref      32-битный код FormID


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

short myShortVariable  
long myLongVariable    
float myFloatVariable


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

Скрипты также могут использовать переменные типа reference (ссылка на копию объекта):
ref   myRefVariable


4.3.4 Команды Begin (начало блока) и End (конец блока)

Конструкции Begin-End являются блоками, внутри которых и размещен, собственно, весь исполняемый код скрипта. Другими словами, все скриптовые команды, кроме объявления переменных, обязательно должны находиться именно внутри блоков begin-end!

Теперь все блоки Begin-End имеют свое условие для выполнения. Это полезное нововведение в скриптовый язык TES 4 Oblivion, по сравнению с TES 3 Morrowind. Условия ставятся в строке непосредственно после команды Begin и получили название "тип блока" (BlockTypes). Блок-типы имеют различное назначение и представляют собой некое условие. Каждый раз, когда скрипт выполняется в текущем фрейме, все блоки скрипта проверяются на истинность их условий. Если условие какого либо блока не истинно, то этот блок и все скриптовые команды в его пределах выполняться не будут.

Команда End всегда завершает начатый блок, т.е. каждому begin должен обязательно соответствовать свой end.

Количество блоков в скрипте может быть произвольным, но не менее одного!
Блоки следуют один за другим последовательно.
Важное замечание: блоки begin-end не могут быть вложенными!
Все блоки должны обязательно содержать название используемого типа блока!

Пример:begin GameMode  
end




В таблицу, приведенную ниже, сведены все существующие блок-типы. Общее их количество равно 30.


NТип блокаПараметрыОписание
1GameMode нет Исполняется в каждом фрейме, когда игра не находится в меню. Большинство скриптов используют исключительно этот тип блока.
2MenuModeТип меню (не обязательно).Исполняется в каждом фрейме, пока игра находится в меню.
3OnActivateнетИсполняется один раз, когда объект активирован.
4OnActorEquipID объектаИсполняется один раз, когда заскриптованный актер надевает указанный объект.
5OnActorUnequipID объектаИсполняется один раз, когда заскриптованный актер снимает указанный объект.
6OnAddID копии контейнера
(не обязательно)
Исполняется один раз, когда объект добавляется в инвентарь контейнера.
7OnAlarmТип преступления,
Преступник (не обязательно)
Исполняется один раз, когда актер поднимает тревогу по поводу указанного преступления, совершенного преступником (актером).
8OnAlarmVictimТип преступления, Жертва (не обязательно)Исполняется один раз, когда актер поднимает тревогу по поводу указанного преступления, совершенного против жертвы (актером).
9OnDeathID актера (не обязательно) Исполняется один раз, когда умирает от рук указанного актера.
10OnDropID копии контейнера (не обязательно)Исполняется один раз, когда объект сброшен из контейнера.
11OnEquip ID актера (не обязательно)Исполняется один раз, когда объект надевается указанным актером.
12OnHitID актера (не обязательно)Исполняется один раз, когда получают удар от указанного актера
13OnHitWithID объекта (не обязательно)Исполняется один раз, когда актер получает удар указанным оружием
14OnKnockoutнетИсполняется один раз, когда отправлен в нокаут указанными актером
15OnLoadнетИсполняется один раз, когда в игру загружается модель (3D) объекта
16OnMagicEffectHitID эффекта (не обязательно) Исполняется один раз, когда на актера накладывается указанный магический эффект
17OnMurderID актера (не обязательно) Исполняется один раз, когда указанный актер совершает убийство актера (то есть преступление)
18OnPackageChangeID пакетИсполняется один раз, когда актер меняет указанный пакет ИИ
19OnPackageDoneID пакетаИсполняется один раз, когда актер завершает указанный пакет ИИ
20OnPackageStartID пакетаИсполняется один раз, когда актер начинает указанный пакет ИИ
21OnResetнетИсполняется один раз, когда ячейка с заскриптованным объектом сбрасывается (reset)
22OnSellID копии продавца (не обязательно)Исполняется один раз, когда объект продается указанным продавцом
23OnStartCombatID актера-цели (не обязательно)Исполняется один раз, когда актер начинает битву с указанным актером
24OnTriggerID копии сталкивающегося
объекта (не обязательно)
Исполняется один раз, когда объект сталкивается с указанным объектом
25OnTriggerActor ID копии сталкивающегося
объекта (не обязательно)
Исполняется один раз, когда объект сталкивается с указанным актером
26OnTriggerMobID копии сталкивающегося
объекта (не обязательно)
Исполняется один раз, когда объект сталкивается с указанным мобильным объектом (актеры, стрелы, магические снаряды)
27OnUnequipID копии контейнера (не обязательно)Исполняется один раз, когда снимается указанным актером.
28ScriptEffectStartнетОсобый тип блока, используется только в скриптах магических эффектов
29ScriptEffectFinishнетОсобый тип блока, используется только в скриптах магических эффектов
30ScriptEffectUpdateнетОсобый тип блока, используется только в скриптах магических эффектов


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

begin OnAdd 
   ; какой-то скрипт выполняется каждый раз, когда этот объект добавляется кому-то в инвентарь 
end 
begin OnAdd player 
   ; Какой-то скрипт выполняется каждый раз, когда этот объект добавляется в инвентарь игрока. 
   ; Заметьте, что блок OnAdd без параметров ТАКЖЕ будет исполнен. 
end 
begin OnAdd MysteriousChest 
   ; Какой-то скрипт выполняется каждый раз, когда этот объект 
   ; добавляется в инвентарь контейнера MesteriousChest. 
   ; Заметьте, что блок OnAdd без параметров ТАКЖЕ будет исполнен. 
End
Награды За огромный вклад в развитие Румора

Оффлайн Garin

  • *
  • Сообщений: 1564
  • Репутация: 5
  • Пол: Мужской
    • ICQ клиент - 244260055
    • Просмотр профиля
    • tiarum.com
Учебник "osfm V1.0" Том 1
« Ответ #7 : 05 Декабрь, 2006, 02:26:12 »
0
4.3.5 Типы выполняемых блоков (BlockTypes).

Рассмотрим типы выполняемых блоков более подробно.


GameMode

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

 ; Пример скрипта-таймера 
scn myScript 

float timer 
short init 

begin GameMode 
    if init == 0 
        ; установить значение таймера 
         set timer to 25 
         set init to 1 
    else 
         if timer > 0 
             set timer to timer - getSecondsPassed 
         else 
            ; здесь код для того, что должно произойти через 25 секунд 
         endif 
    endif 
end

В игре Обливион блок-тип GameMode используется 964 раза.
Примеры скриптов: AbandonedMineTrap02Script, AloysBincalScript, AltarofAkatosh


MenuMode

Синтаксис:

begin MenuMode MenuType (не обязательно)
Пример:

begin MenuMode 
begin MenuMode 1

Без параметров этот блок будет выполняться, когда игрок НЕ находится режиме игры – то есть, когда отображается ЛЮБОЕ меню.
Если вы включите параметр, то можете указать тип меню, или конкретное меню, во время показа которого должен выполняться блок:

Тип меню:
    1 = "четыре главных" (интерфейс персонажа: хар-ки, магия, инвентарь, журнал) 
    2 = любые другие меню (окна сообщений, контейнеры и т.д.) 
    3 = консоль

Меню:
    1001 = Сообщение
    1002 = Инвентарь
    1003 = Хар-ки
    1004 = Главный HUD (HUDMain)
    1005 = Информационный HUD (HUDInfo)
    1006 = Крест (HUDReticle)
    1007 = Заставка в время загрузки
    1008 = Контейнер
    1009 = Диалог
    1010 = Субтитры (HUDSubtitle)
    1011 = Общий (Generic)
    1012 = Спать/Ждать
    1013 = Пауза
    1014 = Взлом
    1015 = Опции
    1016 = Количество
    1017 = Аудио
    1018 = Видео
    1019 = Видеодисплей (VideoDisplay)
    1020 = Геймплей (Gameplay)
    1021 = Управление (Controls)
    1022 = Магия
    1023 = Карта
    1024 = Магическое всплывающее окно (MagicPopup)
    1025 = Торговля (Negotiate)
    1026 = Книга
    1027 = Уровень
    1028 = Тренировка
    1029 = Знак
    1030 = Класс
    1031 = Атрибуты
    1032 = Умения
    1033 = Специализация
    1034 = Убеждения
    1035 = Починка
    1036 = Раса/Пол
    1037 = Покупка заклинаний
    1038 = Загрузка
    1039 = Сохранение
    1040 = Алхимия
    1041 = Создание заклинаний
    1042 = Зачарование
    1043 = Установка эффектов
    1044 = Главное
    1045 = Воздух
    1046 = Быстрые клавиши
    1047 = Разработчики (Credits)
    1048 = Камень Сигил
    1049 = Перезарядка
    1051 = Редактирование текста

В игре Обливион блок-тип MenuMode используется 34 раза.
Примеры скриптов: BedDiseaseSCRIPT, Blade3Script, DAHermaeusScript



OnActivate

Синтаксис:

begin OnActivate
Этот блок запускается один раз, когда активируется заскриптованный объект.
Активирование объекта устанавливает "бит активирования". Поэтому многократные последовательные вызовы Activate на одном объекте приведут лишь к однократному проходу через блок OnActivate.
Заметьте, что это блокирует нормальное активирование объекта. Чтобы использовать активирование объекта по умолчанию, нужно вызвать на нем Activate. Если вы хотите сделать что-то особенное в зависимости от того, что активировало объект, используйте IsActionRef внутри блока OnActivate.
Помните, что у активатора НЕТ действия по умолчанию, которое выполняется при активации.

В игре Обливион блок-тип OnActivate используется 587 раз.
Примеры скриптов: ActRockGreatForest01SCRIPT, AltarofAkatosh, AltarofArkay


OnActorEquip

Синтаксис:

begin OnActorEquip ObjectID
Пример:

begin OnActorEquip DrinkMead
Этот блок выполняется один раз, когда заскриптованный актер надевает указанный объект (ObjectID).

В игре Обливион блок-тип OnActorEquip используется 1 раз.
Примеры скриптов: Dark14AlvalUvaniScript


OnActorUnequip

Синтаксис:

begin OnActorUnequip ObjectID
Пример:

begin OnActorUnequip DrinkMead
Этот блок выполняется один раз, когда заскриптованный актер снимает указанный объект (ObjectID).

В игре Обливион блок-тип OnActorUnequip не используется.


OnAdd

Синтаксис:

begin OnAdd ContainerRefID (не обязательно)
Пример:

begin OnAdd 
begin OnAdd player

Этот блок выполняется один раз, когда заскриптованный объект добавляется в указанный контейнер (ContainerRefID). Если контейнер не указан, блок будет исполняться, если объект добавляется в любой инвентарь.

В игре Обливион блок-тип OnAdd используется 72 раза.
Примеры скриптов: CGAkaviriLongswordScript, CGBladesEquipmentScript, CGBowScript


OnAlarm

Синтаксис:

begin OnAlarm CrimeType, Criminal (не обязательно)
Пример:

begin OnAlarm 0 
begin OnAlarm 3, player

Этот блок выполняется один раз, когда заскриптованный актер поднимает тревогу по поводу определенного типа преступлений (CrimeType), совершенного преступником-актером (Criminal). Если указан только тип преступлений, блок будет исполняться, когда актер поднимает тревогу по поводу этого типа преступлений (неважно кем совершенного). Если необходимо знать больше информации о преступлении, функция GetCrimeKnown может использоваться внутри блока OnAlarm, чтобы определить, случилась ли определенная комбинация преступник/жертва.

В игре Обливион блок-тип OnAlarm используется 15 раз.
Примеры скриптов: Dark08AlarmScript, Dark08NelsScript, Dark08NevilleScript


OnAlarmVictim

Синтаксис:

begin OnAlarmVictim CrimeType, Victim (не обязательно)
Пример:

begin OnAlarmVictim 0 
begin OnAlarmVictim 3, player

Этот блок выполняется один раз, когда заскриптованный актер поднимает тревогу по поводу определенного типа преступлений (CrimeType), совершенного против жертвы-актера (Victim). Если указан только тип преступлений, блок будет выполняться, когда актер поднимает тревогу по поводу этого типа преступлений (неважно против кого совершенного). Если необходимо знать больше информации о преступлении, функция GetCrimeKnown может использоваться внутри блока OnAlarm, чтобы определить, случилась ли определенная комбинация преступник/жертва.

В игре Обливион блок-тип OnAlarmVictim не используется.


OnDeath

Синтаксис:

begin OnDeath ActorID (не обязательно)
Пример:

begin OnDeath SuperChampion
Этот блок выполняется один раз, когда указанный актер (ActorID) убивает заскриптованного актера. Если параметр не используется, блок выполняется, когда заскриптованный актер умирает.

В игре Обливион блок-тип OnDeath используется 303 раза.
Примеры скриптов: AlawenScript, AlessiaCaroScript, AlixLencoliaScript


OnDrop

Синтаксис:

begin OnDrop ContainerRefID (не обязательно)
Пример:

begin OnDrop 
begin OnDrop player

Этот блок выполняется один раз, когда заскриптованный объект сбрасывается из указанного контейнера (ContainerRefID). Если контейнер не указан, блок будет исполняться, если объект сбрасывается из любого инвентаря.

В игре Обливион блок-тип OnDrop используется 7 раз.
Примеры скриптов: DarkScalesScript, GoblinHeadScript, HrormirsIcestaffScript


OnEquip

Синтаксис:

begin OnEquip ActorID (не обязательно)
Пример:

begin OnEquip 
begin OnEquip player

Этот блок исполняется один раз, когда заскриптованный объект надевается указанным актером (ActorID). Если параметр не используется, блок будет исполняться, когда объект надевается любым актером.

В игре Обливион блок-тип OnEquip используется 27 раз.
Примеры скриптов: AmuletofKingsSCRIPT, ArenaRaimentScript, BoarMeatScript


OnHit

Синтаксис:

begin OnHit ActorID (не обязательно)
Пример:

begin OnHit BaurusRef
Этот блок исполняется один раз, когда заскриптованный актер получает удар от указанного актера (ActorID) оружием или заклинанием. Если параметр не используется, блок исполняется каждый раз, когда актера ударяют.

В игре Обливион блок-тип OnHit используется 55 раз.
Примеры скриптов: ArenaCombatant, ArenaCombatantBlue, ArenaCombatantMulti


OnHitWith

Синтаксис:

begin OnHitWith ObjectID (не обязательно)
Пример:

begin OnHitWith SuperWeapon
Этот блок исполняется один раз, когда заскриптованный актер получает удар указанным оружием (ObjectID). Если параметр не используется, блок будет выполняться, когда заскриптованный актер получает удар любым оружием.

В игре Обливион блок-тип OnHitWith используется 7 раз.
Примеры скриптов: CGRopeBucketScript, Dark05MotierreScript, Dark09AdamusScript


OnKnockout

Синтаксис:

begin OnKnockout
Этот блок исполняется один раз, когда заскриптованный актер отправляется в нокаут.
В игре Обливион блок-тип OnKnockout не используется.


OnLoad

Синтаксис:

begin OnLoad
Этот блок исполняется один раз, когда загружается модель объекта, то есть когда игрок заходит в интерьер, ячейка с объектом загружается в область 5x5 вокруг игрока.

В игре Обливион блок-тип OnLoad используется 95 раз.
Примеры скриптов: ARGateAUTOCLOSE01SCRIPT, ARTallWallCarvingAnim01SCRIPT


OnMagicEffectHit

Синтаксис:

begin OnMagicEffectHit EffectID
Пример:

begin OnMagicEffectHit FIDG
Этот блок исполняется один раз, когда указанный тип магического эффекта (EffectID) ударяет по заскриптованному объекту. Если эффект не указан, блок будет выполняться, когда любой эффект ударяет по объекту.

В игре Обливион блок-тип OnMagicEffectHit используется 7 раз.
Примеры скриптов: JskarScript, MG05RockScript, MG10ColumnScript


OnMurder

Синтаксис:

begin OnMurder ActorID (не обязательно)
Пример:

begin OnMurder SuperChampion
Этот блок выполняется один раз, когда указанный актер (ActorID) совершает убийство (преступление) заскриптованного актера. Если параметр не используется, блок выполняется, когда совершается убийство заскриптованного актера (неважно кем).

В игре Обливион блок-тип OnMurder используется 10 раз.
Примеры скриптов: DarkExiledScript, DarkWrathofSithis2Script, DarkWrathofSithisScript


OnPackageChange

Синтаксис:

begin OnPackageChange PackageID
Пример:

begin OnPackageChange FollowPlayerPackage
Этот блок выполняется один раз, когда заскриптованный актер меняет пакет ИИ с указанного (PackageID) на другой. Заметьте, что "прерывающие" пакеты, такие, как бой или разговор, не запускают этот блок, поскольку они лишь временно заменяют текущий пакет.
Блок запускается, когда актер меняет пакет ИИ на другой. Если указанный пакет завершается, но актер снова начинает его исполнять, OnPackageChange НЕ запустится.

В игре Обливион блок-тип OnPackageChange используется 32 раза.
Примеры скриптов: AlessiaCaroScript, BarthelGernandScript, BaurusScript


OnPackageEnd

Синтаксис:

begin OnPackageEnd PackageID
Пример:

begin OnPackageEnd FollowPlayerPackage
Этот блок является полным синонимом блока OnPackageDone.
Смотрите следующее описание.


OnPackageDone

Синтаксис:

begin OnPackageDone PackageID
Пример:

begin OnPackageDone FollowPlayerPackage
Этот блок исполняется один раз, когда заскриптованный актер завершает указанный пакет ИИ (PackageID). Заметьте, что пакет может быть завершен из-за неудачи (не найден путь, невозможно найти нужное количество объектов, или истекло время), если только у пакета не установлены флаги Must Reach Location или Must Complete.
Заметьте, что некоторые типы пакетов, например прогулка, сон и еда, не могут «завершиться», поскольку у них нет конца, поэтому OnPackageDone не будет запускаться для этих типов пакетов.
Отметьте, что имеется еще один блок - OnPackageEnd. Он является полным синонимом OnPackageDone и полностью с ним взаимозаменяем.

В игре Обливион блок-тип OnPackageDone используется 45 раз.
Примеры скриптов: BaurusScript, BurdSCRIPT, CGEmperorScript


OnPackageStart

Синтаксис:

begin OnPackageStart PackageID
Пример:

begin OnPackageStart FollowPlayerPackage
Этот блок исполняется один раз, когда заскриптованный актер начинает выполнять указанный пакет (PackageID).

В игре Обливион блок-тип OnPackageStart используется 13 раз.
Примеры скриптов: BarthelGernandScript, ClaudeMaricScript, DASheogorathRatScript


OnReset

Этот блок исполняется один раз, когда ячейка с объектом возвращается в исходное состояние (через 3 после последнего посещения игрока). Обычно используется для ловушек и анимированных объектов, чтобы вернуть их в исходное состояние.

В игре Обливион блок-тип OnReset используется 110 раз.
Примеры скриптов: ARCAVEINTRAPSCRIPT01, ARChainPlatform01SCRIPT


OnSell

Синтаксис:

begin OnSell SellerRefID (не обязательно)
Пример:

begin OnSell player
Этот блок исполняется один раз, когда заскриптованный объект продается. Если вы указываете копию продавца (SellerRefID), блок будет исполняется, только если указанный объект продает объект; иначе, он выполняется, когда любой NPC продает объект.

В игре Обливион блок-тип OnCell используется 1 раз.
Примеры скриптов: MS21statuescript


OnStartCombat

Синтаксис:

begin OnStartCombat TargetActorRefID (не обязательно)
Пример:

begin OnStartCombat player
Этот блок выполняется один раз, когда заскриптованный актер начинает бой с указанной целью (TargetActorRefID). Если цель не указана, блок исполняется, когда актер начинает бой.

В игре Обливион блок-тип OnStartCombat используется 13 раз.
Примеры скриптов: BaurusScript, BurdSCRIPT, CGEmperorScript


OnTrigger

Синтаксис:

begin OnTrigger TriggeringRefID (не обязательно)
Пример:

begin OnTrigger player
Этот блок исполняется всякий раз, когда что-то сталкивается с заскриптованным объектом. Если вы указываете это что-то конкретно (TriggeringRefID), блок исполняется, когда указанная копия сталкивается с объектом; иначе блок исполняется, когда с объектом сталкивается любая копия.

В игре Обливион блок-тип OnTrigger используется 94 раза.
Примеры скриптов: CGTriggerZoneCellScript, CGTrigZone01SCRIPT


OnTriggerActor

Синтаксис:

begin OnTriggerActor TriggeringRefID (не обязательно)
Пример:

begin OnTriggerActor player
Этот блок исполняется всякий раз, когда актер сталкивается с заскриптованным объектом. Если вы указываете актера конкретно (TriggeringRefID), блок исполняется, когда указанная копия (актера) сталкивается с объектом; иначе блок исполняется, когда любой актер сталкивается с объектом.

В игре Обливион блок-тип OnTriggerActor используется 11 раз.
Примеры скриптов: CGTrigZoneACTORSCRIPT, FrostFireGasTrap, KillBox01SCRIPT


OnTriggerMob

Синтаксис:

begin OnTriggerMob TriggeringRefID (не обязательно)
Пример:

begin OnTriggerMob player
Этот блок исполняется один раз, когда мобильный объект сталкивается с заскриптованным объектом. Если вы указываете этот объект (TriggeringRefID), блок исполняется, когда указанная копия (мобильного объекта) сталкивается с объектом; иначе блок исполняется, когда любой мобильный объект сталкивается с объектом.
Мобильные объекты включают актеров (NPC и существа), стелы и магические снаряды.

В игре Обливион блок-тип OnTriggerMob не используется.


OnUnequip

Синтаксис:

begin OnUnequip ActorID (не обязательно)
Пример:

begin OnUnequip 
begin OnUnequip player

Этот блок исполняется один раз, когда заскриптованный объект снимается указанным актером (ActorID). Если параметр не используется, блок исполняется, когда объект снимается любым актером.

В игре Обливион блок-тип OnUnequip используется 11 раз.
Примеры скриптов: ArenaRaimentScript, Dark05BladeScript, MGBloodwormHelmScript01


ScriptEffectFinish

Использование:

begin ScriptEffectFinish
Особый блок используется только в скриптах для магических эффектов. Этот блок исполняется после того, как заскриптованный эффект закончился.
Заметьте, что ScriptEffectUpdate будет исполняться до него. Если в ScriptEffectUpdate при последнем есть команда return, эта часть скрипта не будет исполняться.

В игре Обливион блок-тип ScriptEffectFinish используется 32 раза.
Примеры скриптов: AnvilMGPetImpScript, AtronachFlameScript, AtronachFrostHealSCRIPT


ScriptEffectStart

Использование:

begin ScriptEffectStart
Особый блок используется только в скриптах для магических эффектов. Этот блок выполняется сразу после того, как заскриптованный эффект наложен.
Примечание: Любое заклинание со скриптовым эффектом исполняется на актере, на которого оно было наложено. Это означает, что копией по умолчанию является актер, на которого наложено заклинание, а не игрок (хотя игрок тоже может быть этим актером). Это также значит, что если блок выполняется, значит заклинание только что наложили на актера и ScriptEffectStart может считаться блоком OnHitWith <имя заклинания>.
Тот факт, что заклинания со скриптовыми эффектами запускаются на объектах, на которые они были наложены, дает программисту возможность запускать скрипты на любом актере на определенный период времени, и может быть использовано для получения копии актера.
В игре Обливион блок-тип ScriptEffectStart используется 42 раза.
Примеры скриптов: AnvilMGPetImpScript, AtronachFlameScript, AtronachFrostHealSCRIPT


ScriptEffectUpdate

Использование:

begin ScriptEffectUpdate
Особый блок, используется только в скриптах для магических эффектов. Этот блок запускается, как только эффект наложен, и исполняется до тех пор, пока время действия эффекта не закончится.

В игре Обливион блок-тип ScriptEffectUpdate используется 13 раз.
Примеры скриптов: DAHermaeusSoulsSpell, DummyMagicEffectSCRIPT, GhostEffectScript
Награды За огромный вклад в развитие Румора

Оффлайн Garin

  • *
  • Сообщений: 1564
  • Репутация: 5
  • Пол: Мужской
    • ICQ клиент - 244260055
    • Просмотр профиля
    • tiarum.com
Учебник "osfm V1.0" Том 1
« Ответ #8 : 05 Декабрь, 2006, 02:45:55 »
0
4.3.6 Команда "." (точка - UseReference)

Синтаксис:

ObjectID.ObjectFunction [Arguments ...]; IDобъекта.Функция [Аргументы…]
Команда "." устанавливает предыдущий ObjectID (ID объекта) как текущую копию только для следующей функции. ObjectID может быть и копией, и переменной типа reference.

Примечания:

Как бы странно это ни показалось по сравнению с другими командами, но в скомпилированном скрипте это настоящая команда, которая использует код 0x001C.
Выражения (например, QuestID.QuestVariable (IDквеста.КвестоваяПеременная)) не используют эту команду. Внутри игры подобные выражения являются просто сложением (ObjectID)(Variablenumber). Например, строка "MageConvSystem.lecturevar" из скрипта ArcaneUScholarScript в шестнадцатеричном коде будет выглядеть как "72 04 00 73 0F 00" ("MageConvSystem" - четвертая копия, используемая в скрипте, а "lecturevar" объявлена пятнадцатой переменной). Content - Disposition: form-data; name="smiles_on"

4.3.7 Команда Set (установить)

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

Арифметические операторы:

ОператорОписание
+Сложение
Вычитание
*Умножение
/Деление
%Модуль (выполняет целочисленное деление и возвращает остаток)

Примечания:
•   Оператор модуля "%" вычисляется после умножения / деления, но перед сложением / вычитанием:
4 * 3 % 2 = 0
4 * ( 3 % 2 ) = 4
1 + 2 % 3 = 3
(1 + 2 ) % 3 = 0

•   Минус сразу перед числом или переменной считается знаком "отрицания". Если вам необходимо выполнить вычитание, нужно оставить как минимум один пробел до и после минуса. Это единственный случай, когда вам нужен пробел между арифметическими операторами. (Например: "a-b" не будет компилироваться; нужно написать "a - b")
•   Когда при делении вы используете только числа, необходимо указать хотя бы один знак после запятой, чтобы показать, что вы хотите использовать деление с плавающей точкой, без него остаток будет отброшен после окончания деления:

float a 
set a to 9/5 ; установит "a" в 1.000 
set a to 9.0/5; установит "a" в 1.800

•   Если вы хотите сохранить в целочисленной переменной верно округленный результат деления, убедитесь, что в вычислениях используется плавающая точка (и десятичная часть не отбрасывается) и добавьте 0.5:

short a 
set a to 9/5  ; установит "a" в 1 
set a to 9/5 + 0.5  ; установит "a" в 1 
set a to 9.0/5  ; установит "a" в 1 
set a to 9.0/5 + 0.5  ; установит "a" в 2 
set a to 7.0/5 + 0.5  ; установит "a" в 1

short a 
set a to 9 
set a to a/5.0 + 0.5  ; установит "a" в 2

short a 
float b 
set b to 9 
set a to b/5 + 0.5  ; установит "a" в 2

•   Вы можете использовать сравнение в качестве "значения". Переменная тогда станет равной 1 или 0 в зависимости от того, истинно ли сравнение или нет.

set goodluck to player.Getav luck > 60
делает то же самое, что и

if player.Getav luck > 60 
    set goodluck to 1 
else 
    set goodluck to 0 
endif   

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

set luckbonus to 50 * (player.Getav luck > 60)
делает то же самое, что и

if player.Getav luck > 60 
      set luckbonus to 50 
else 
      set luckbonus to 0 
endif   

Другие примеры:

set a to 2 
set b to a*a 
set c to (b - a)*b - a 
set d to ((3* -b+a) - c)/ -2 
message "a=%.0f, b=%.0f, c=%.0f, d=%.0f" a b c d ; ("a=2, b=4, c=6, d=8") 
set stage to getstage quest1 + 10 
set weapondrawn to player.isweaponout

4.3.8 Команда Return (возврат)

Синтаксис:

Return
Return используется для того, чтобы остановить выполнение скрипта в текущем фрейме. Он не просто завершает ТЕКУЩИЙ блок, он завершает весь скрипт до конца фрейма. Скрипт будет запущен снова в следующем фрейме. Это может быть полезно внутри команд if , когда вы можете блокировать команды, следующие после return.

4.3.9 Конструкция из команд If, ElseIf, Else, EndIf.

Команда If (если) позволяет вам исполнять (или не исполнять) группу скриптовых команд в зависимости от того, истинно ли сравнение, которые вы указываете. Команда If в скриптовом языке Обливиона является очень мощной и сравнима с аналогичной командой из “настоящих” языков программирования.

Команда ElseIf (иначе если) используется для увеличения количества проверок условий в одной конструкции If. Если условие не истинно, тогда проверяется условие следующей за ней команды ElseIf. Количество команд ElseIf может быть достаточно большим. Но эта команда не является обязательной.

Команда Else (иначе) используется в конструкции IF в тех случаях, когда ни одна из проверок, объявленных выше, не является истинной. В этом случае будет выполнена группа команд, следующая после нее до команды endif. Команда else, как и elseif, не является обязательной.

Команда Endif обязательна и всегда завершает блок If. То есть, каждому If обязательно соответствует Endif. Обычно все команды конструкции располагают с одинаковым отступом от края страницы для облегчения чтения скрипта.

Синтаксис

Команда if использует следующий синтакис:

if expressionA [сравнение] expressionB 
   ; проверка "выраженияA [сравнение] выражениеB" пройдена 
elseif expressionB [сравнение] expressionC 
   ; проверка "выражениеB [сравнение] выражениеC" пройдена 
else 
   ; ни одна из вышеприведенных проверок не пройдена 
endif  

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

Команда if может содержать один или несколько операторов сравнения. Вот таблица этих операторов:

ОператорОписание
==Равенство (равно)
!=Неравенство (не равно)
>Больше чем
>=Больше или равен
<Меньше чем
<=Меньше или равен

Важно отметить, что в Обливионе нет побитового сравнения.

Объединение сравнений

Сравнения могут быть соединены друг с другом при использовании следующих логических операторов:

ОператорОписаниеПримерОписание примера
&&логическое И (and)if x == 1 && y == 1истина, если и x, и y равны 1.
||логическое ИЛИ (or)if x == 1 || y == 1истина, если ни x, ни y не равны 0.

Заметьте, что " || " рассматривается раньше "&&", также, как " * " рассматривается раньше " + " в обычной алгебре.

Если вы хотите, чтобы “&&” рассматривался первым, необходимо использовать скобки. Например:

if myVar1 == 1 && myVar2 == 1 || myVar2 == 5
Истина, когда MyVar1 = 1 И myVar2 равен 1 ИЛИ 5.

if (myVar1 == 1 && myVar2 == 1) || myVar2 == 5
Истина, когда или myVar2 равен 5 ИЛИ как myVar1, так И myVar2 равны 1.

Сравнения и выражения

Операторы сравнения работают с любыми выражениями, которые можно представить в числах. Предполагая, что "a = 17", "b = 20" и "c = a - b", все следующие выражения работают, как ожидалось. Скобки необходимы только по математическим причинам:

IF c == -3 && b == 20 
IF c == -3 && b == 20 && a == 17 
IF c - 1 == -4 && b == 20 && a == 17 
IF a - 20 == 17 - b 
IF a - 20 == 17 - b && c + 3 == 0 
IF a + 3 == b 
IF a - b == c 
IF a * 4 - b * 4 == c * 4 
IF a * ( 5 + c ) - 14 == b 
IF 2 * (a * (5 + c) - 14) == b - - b

Если переменная или результат функции содержат 1 или 0, или вам интересно, равен ли результат 0, вам не нужно проверять "== 1" или "!=0"

Команды

IF Done 
IF Getisid MyNPC 
IF Getitemcount Lockpick 
IF IsActor && Flag 

делают то же самое, что и

IF Done != 0 
IF Getisid MyNPC != 0 
IF Getitemcount Lockpick != 0 
IF IsActor != 0 && Flag != 0 

Примечания:

•   Не забывайте, что компилятор не распознает команды, написанные в одну строку. Хотя выражение

if condition == 1 set varname to 1 
else set varname to 2

работает в других языках программирования, в скриптах Обливиона эти команды нужно разделить:

if condition == 1 
     set varname to 1 
else 
     set varname to 2 
endif 

(Кроме того, так более читаемо...)

•   После условия или команды "else" остаток строки игнорируется, и никаких сообщений об ошибке не появится, так что (поскольку строка кажется правильной) вы можете потратить много времени, пытаясь обнаружить источник проблемы.
Награды За огромный вклад в развитие Румора

Оффлайн Garin

  • *
  • Сообщений: 1564
  • Репутация: 5
  • Пол: Мужской
    • ICQ клиент - 244260055
    • Просмотр профиля
    • tiarum.com
Учебник "osfm V1.0" Том 1
« Ответ #9 : 05 Декабрь, 2006, 02:50:47 »
0
4.4 Переменные (Variables)


4.4.1 Классификация переменных

Ссылки и переменные

Функции оказывают действие на “вызывающий объект” (тот, на котором работает скрипт) по умолчанию, но вы можете вызвать их и на другом объекте, используя ссылку на объект. Когда вы хотите, чтобы скрипт влиял, например, на игрока, используйте ссылку на игрока (“Player”) и “.”, чтобы перенаправить вызов функции (function-call) на игрока с вызывающего объекта:

player.additem gold_001 100
Для большей гибкости вместо числовых значений вы можете использовать переменные, если они требуются для какой-нибудь функции:

short addgold 
set addgold to 100 
player.additem gold_001 addgold

Вы можете использовать локальные переменные, объявленные в этом же скрипте, или же использовать для своих целей глобальные переменные.
Из функции нельзя напрямую обратиться к переменной в другом скрипте. Но такой возможностью обладают команды If и Set.
Например, эта строка скрипта работать не будет:

player.additem gold_001 otherobject.addgold
Следует написать так:

short addgold; объявление вспомогательной локальной переменной 
set addgold to otherobject.addgold; присвоить ей значение внешней локальной переменной 
player.additem gold_001 addgold; использование полученных внешних данные

Переменные можно классифицировать по назначению и по типам.

Переменные по назначению бывают:
  • Глобальные
  • Специальные
  • Локальные
Переменные по типам:
  • Short    - Короткая целочисленная.
  • Long    - Длинная целочисленная.
  • Float    - Вещественная переменная.
  • Ref    - Переменная типа reference (ссылка на копию объекта).
4.4.2 - Глобальные переменные (Globals)

Глобальные переменные может использовать любой скрипт или условие и они не привязаны ни к какому определенному объекту или квесту.
Вы можете создавать свои собственные глобальные переменные.
Глобальные переменные объявляются в главном меню Gameplay −► Globals.

Описание свойств диалогового окна Globals:
  • EditorID: Имя переменной. Зарезервированные символы ( «_», «+», «−», и т.д.) и пробелы использовать нельзя.
  • Variable Type: Тип переменной Short (короткий целочисленный) и Long (длинный целочисленный) по сути одно и то же. Оба типа являются целочисленными. Float – это вещественная переменная. Внутри игры все переменные хранятся в виде 32-битных переменных с плавающей точкой. Техническая реализация такого формата переменных приводит к неточностям с очень большими и очень малыми значениями. (например, все числа от 2000000000 до 2000000064 хранятся как 2000000000).
  • Value: Значение переменной по умолчанию. Переменная будет иметь такое же значение, как и сразу после установки плагина. После этого значение переменной будет храниться в файле сохраненной игры.
4.4.3 - Перечень глобальных переменных Обливиона

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

Глобальные переменные, обрабатываемые Oblivion.exe:

GameDayВозвращает внутриигровой день.
GameDaysPassedВозвращает количество дней, прошедших с начала игры.
GameHourВозвращается внутриигровой час
GameMonthВозвращает внутри игровой месяц
GameYear Возвращает внутриигровой год
TimescaleОтношение игровой минуты к минуте реального времени (по умолч. – 30)


Глобальные переменные, обрабатываемые в скриптах и диалогах:
    CrimeForceJail
    EmfridBittneld
    Fame
    FameAkatosh
    FameArkay
    FameDibella
    FameJulianos
    FameKynareth
    FameMara
    FameStendarr
    FameTiberSeptim
    HasGrace
    HighwaymanGotMoney
    KvatchDestroyed
    MQ05RavenPlace
    MQEndDayWeek
    MS05InProgress
    MS22DealGold
    MS22RewardGold
    MS38LastContact
    OblivionCrisis
    PCVampire:
         Сохраняет стадию вампиризма игрока. Возможные значения:
                  0: Не вампир (по умолчанию)
                  1-4: Стадии вампиризма.
                  -1: Игрок вылечился от вампиризма.
         Используется в скриптах игры:
                  - VampireScript
                  - MS40PotionEffect
    RentAnvilCountsArms
    RentAnvilFlowingBowl
    RentBorderWatchInn
    RentBravilLonelySuitor
    RentBravilSilverHome
    RentBrinaCross
    RentBrumaJerallView
    RentBrumaOlavs
    RentCheydinhalBridgeInn
    RentCheydinhalNewlandsLodge
    RentChorrolGreyMare
    RentChorrolOakandCr osier
    RentDrunkenDragon
    RentFaregyl
    RentGottshawInn
    RentHackdirtMoslinsInn
    RentICAllSaintsInn
    RentICBloatedFloat
    RentIC KingandQueen
    RentICLuthorBroad
    RentICMerchantsInn
    RentICTiberSeptimHotel
    RentIllOmen
    RentImperialBridge
    RentLeyawiinFiveCl aws
    RentLeyawiinThreeSisters
    RentNewlandsLodge
    RentRoxeyInn
    RentSkingradTwoSistersLodge
    RentSkingradWestWeladInn
    RentWawne tInn
    Sleep
    TGPayoffCrimeGold
    TGPriceAttack
    TGPricePerKill
    TGPriceSteal
    UmbacannoCount
Награды За огромный вклад в развитие Румора

Оффлайн Garin

  • *
  • Сообщений: 1564
  • Репутация: 5
  • Пол: Мужской
    • ICQ клиент - 244260055
    • Просмотр профиля
    • tiarum.com
Учебник "osfm V1.0" Том 1
« Ответ #10 : 05 Декабрь, 2006, 02:56:43 »
0

4.4.4 - Специальные переменные (Special variables)

Специальные переменные могут относиться как к глобальным, так и к локальным.
Некоторые глобальные переменные заданы с самого начала и их значения обновляет сама игра.
В таблице приведены такие виды глобальных переменных:

ТипНаименованиеОписание
floatGameYearТекущий год
floatGameMonthТекущий месяц
floatGameDayТекущий день
floatGameHourТекущий час (0-24 часов)
floatTimeScaleСколько минут игры проходит за одну минуту реального времени
floatGameDaysPassedКол-во дней, прошедших с начала игры


Значение GameMonthНазвание месяцаОписание
0Утренней ЗвездыКол-во дней как в январе (31)
1ВосходаКол-во дней как в феврале (28)
2ПервоцветаКол-во дней как в марте (31)
3ДождяКол-во дней как в апреле (30)
4СеваКол-во дней как в мае (31)
5Середины ГодаКол-во дней как в июне (30)
6СолнцеворотаКол-во дней как в июле (31)
7УрожаяКол-во дней как в августе (31)
8ОгняКол-во дней как в сентябре (30)
9МорозаКол-во дней как в октябре (31)
10ЗакатаКол-во дней как в ноябре (30)
11Вечерней ЗвездыКол-во дней как в декабре (31)

Есть также локальные переменные с особыми функциями:

Тип скриптаТип перемИмяОписание
КвестfloatQuestDelayTimeОпределяет, как долго (в реальных секундах) игра будет ждать между двумя исполнениями квестового скрипта. По умолчанию, когда fQuestDelayTime установлена в 0, это значение составляет 5 сек. Если задать очень малое значение, например, 0.01, то квестовый скрипт будет исполняться в каждом фрейме.
Объект (ловушка)floatfTrapDamageКоличество повреждений, которые наносятся каждый раз, когда ловушка воздействует на актера.
Объект (ловушка)floatfTrapPushBackКоличество ударной силы, которая применяется к актеру. Должна быть в диапазоне от 0 до 1000.
Объект (ловушка)floatTrapMinVelocityМинимальная скорость, с которой ловушка должна двигаться относительно игрока, чтобы нанести повреждения. Значение в BSUnits (128 = 6 футов).
Объект (ловушка)floatbTrapContinuous0 = Наносить повреждения только при первом контакте с ловушкой.
1 = Постоянно наносить повреждения, пока контакт с ловушкой сохраняется.


4.4.5 Типы переменных

Есть несколько типов переменных. Хотя вы можете объявить переменную, как short или long, результат будет одинаковым, если вы не выходите из диапазона.

short  - Короткая целочисленная
  Диапазон: от -32768 до 32767
  Пример: short varNameShort
    
long - Длинная целочисленная
  Диапазон: от -2 147 483 648 до 2 147 483 647  
  Пример: long varNameLong   

float - Вещественная переменная
  Диапазон: от -3.402823×1038 до -1.175494×10−38,
  0 и от 1.175494×10−38 до 3.402823×1038 
  (точность до 7 знаков)  
  Пример:  float varNameFloat   

ref - Ссылка на копию объекта
  Диапазон: 32-битный код  FormID   
  Пример: ref varNameRef   


4.4.6 Целочисленные короткие переменные (Variable types: shortint)


Короткие целочисленные переменные (short) – это целочисленный формат переменных, использующий 16 бит. Самый старший бит – это знак, поэтому диапазон значений переменной от -215 (-32768) до (215)-1 (32767).


4.4.7 Целочисленные длинные переменные (Variable types: longint)

Длинные целочисленные переменные (long) – это целочисленный формат переменных, использующий 32 бита.
Самый старший бит – это знак, поэтому диапазон значений переменной от -231 (-2147483648) до (231)-1 (2147483647).
Когда вы используете long-переменную в скрипте, нет никаких ограничений, но если это глобальная переменная, она хранится как float и могут возникнуть проблемы с точностью при крайних значениях.


4.4.8   Вещественные переменные
(Variable types: floating point)



Информация из WIKI:

Вещественные переменные (float) - это формат чисел, в котором можно хранить и очень большие, и очень малые значения. Диапазон составляет от 1.18E-38 до 3.40E38.
Однако этот формат не всегда является лучшим выбором, потому что техническая реализация этого формата приводит к некоторым неточностям (например, все числа от 2 000 000 000 до 2 000 000 064 хранятся как 2 000 000 000).

Почему это происходит?
В реальной жизни вещественные числа имеют основание 10. Компьютер использует основание 2, что делает все несколько сложнее, но, по сути, остается прежним, поэтому для объяснений мы будем использовать основание 10.
В школе нас учили как записывать большие числа, используя экспоненту, чтобы экономить место и улучшать читаемость: "1 000 000 000" - то же самое, что и " 109 ", а "1 234 000 000" – это " 1,234 * 109 " или " 1,234E9 ". Также и с малыми числами: " 0,000001234 " - это "1,234E-6"
Когда длина первого числа (мантиссы) ограничена, очень большие и очень малые числа обрезаются. Обливион использует около 7 знаков для мантиссы:
1.0000000E9 = 1 000 000 000
1.0000001E9 = 1 000 000 100
Таким образом, нельзя отображать числа между 1 000 000 000 и 1 000 000 100 потому, что они требуют 9 знаков, а сохраняется только первые семь.

Прим. Garin:
    На самом деле приведенные примеры не совсем точны. Смотреть надо двоичный код в районе 7-ми десятичных разрядов - это число должно быть кратно двоичному коду. Нужно дополнительно поэкспериментировать, чтобы определить точно это число. Ориентировочно 24 двоичных разряда.
    Например, числу 10 000 000 соответствует двоичный 24-хразрядный код 1001 1000 1000 1011 0100 0000.
    Двоичный 24-хразрядный код 1000 0000 0000 0000 0000 0000 соответствует десятичному 8388608 или 8.388608Е6. Максимальное число для 24 разрядов – это 16 777 215. Вот тут и надо ловить. Все, что больше, в младших разрядах мантиссы обрезается.
    То же самое было в TES3. Там длинные 32-разрядные двоичные числа в глобальных переменных "обрезались" до 24-х разрядов, а вот в локальных почему-то работали.
    Давайте рассуждать логически. Допустим, вещественное число занимает 4 байта или 32 двоичных разряда. Из них 3 байта отведены на мантиссу, а 1 байт - на степень. 3 байта мантиссы - это 24 двоичных разряда. 1 байт на степень - это 255, но в игре - только (- 38...+38).
    Не стоит забывать также, что старший разряд отдан для знака.


4.4.9 Переменные для хранения копий (Reference variable)

Как и другие переменные, переменные для хранения копий (ref) должны быть объявлены до их использования:

ref refVarName
Их можно использовать во всех функциях, которые работают с копиями объекта. Неинициализированные ref переменные указывают на сам объект, в скрипте которого они были объявлены; в остальных случаях они ссылаются на указанный объект.
Ref-переменная, объект которой не находится в памяти (например, статический объект, когда игрок вышел из ячейки, где он находится) считается неинициализированным.
Вы можете присвоить значение ref-переменной, используя команду set. Обычно для этого вы будете использовать функцию, возвращающую formID. Например:

 set myRef to GetContainer
Можно задавать значения переменных, объявленных на другом объекте:

 set BobRef.myRef to GetSelf
Проверка того, что переменная не инициализирована:

 if myReferenceVariable == 0   
Чтобы проверить, инициализирована ли переменная:

 if myReferenceVariable != 0
Чтобы проверить, указывает ли переменная на другую копию (например, на игрока):

 if myReferenceVariable == player
или другую копию:

 if myReferenceVariable != player
Пример:

 scn TheMastersSword     ; кто оденет, получит +50 к навыку "Мечи" 

ref UserRef 

begin OnEquip 
    set UserRef to GetContainer 
    UserRef.Modactorvalue blade 50 
end 

begin OnUnEquip 
    set UserRef to GetContainer 
    UserRef.Modactorvalue blade -50 
end

Помните, что ссылки на непостоянные предметы недоступны, когда объект не находится в памяти (например, в другой ячейке). То же самое относится к предметам, находящимся в контейнере. Попытка доступа к недоступным переменным может не иметь никакого эффекта, а может привести к вылету. В CS есть механизмы, не позволяющие прямо запрашивать доступ к подобным объектам, но вы можете обойти их с помощью ref-переменных.
Делайте это на свой страх и риск...
Награды За огромный вклад в развитие Румора

Оффлайн Garin

  • *
  • Сообщений: 1564
  • Репутация: 5
  • Пол: Мужской
    • ICQ клиент - 244260055
    • Просмотр профиля
    • tiarum.com
Учебник "osfm V1.0" Том 1
« Ответ #11 : 05 Декабрь, 2006, 03:04:32 »
0
5. Ваш второй скрипт
http://cs.elderscrolls.com/constwiki/index...y_Second_Script

Автор: Grundulum

Мы включили это руководство из WIKI полностью. Оно содержит уже известные вам основы скриптинга, но мы сочли, что это даже хорошо, поскольку «повторение - мать учения».

5.1 Введение

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

Данный учебник в основном был адаптирован из "Руководства GhanBuriGhan’a по скриптам Morrowind для чайников" (GhanBuriGhan's excellent Morrowind Scripting for Dummies); так что авторские права принадлежат GhanBuriGhan за проделанную им фантастическую работу над оригиналом.

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

5.2 Содержание

5.3. Информация о написании скриптов в Oblivion 
•   Что такое скрипт? 
•   Что могут скрипты? 
•   Чего не могут скрипты 
5.4. Учебник скриптов: до написания кода 
•   Начинаем! 
•   Скриптовое окно 
•   Что мы хотим? 
•   Написание скрипта 
5.5. Учебник скриптов: первые строки 
Называем скрипт 
•   Функции "Begin" и "End" 
•   Выдача текстового сообщения и получение ответа от игрока 
•   Как выполняются объектные скрипты 
5.6. Учебник скриптов: первый тест 
•   Сохранение и подготовка модификации 
•   Выполнение скрипта в игре 
5.7. Учебник скриптов: выбор игрока, ошибки и исправления 
•   Выбор игроком варианта ответа 
•   Первые ошибки и исправления 
5.8. Учебник скриптов: добавляем ловушку 
5.9. Как узнать больше 
5.10. Последние строки



5.3 Информация о написании скриптов в 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 ограничен в своих возможностях – в нем большое количество функций, которые вы можете использовать, но иногда возможные варианты использования будут не все, которых бы вам хотелись. В большинстве случаев опытные скриптологи смогут найти специфику для очевидных ограничений, но не стоит ожидать чуда. Многие вещи запрограммированы и скрипты на них влияния не оказывают, а если и оказывают, то лишь косвенно.

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

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

Начинаем!

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

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

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

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

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

Что мы хотим?

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

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

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

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

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


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

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

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

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" будет неверно и текстовое сообщение больше выдаваться не будет.


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

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

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

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

ПРИМЕЧАНИЕ: ОБРАТИТЕ ВНИМАНИЕ НА ТО, ЧТО МЫ ТОЛЬКО ЧТО СДЕЛАЛИ. РЕДАКТИРОВАНИЕ ОБЪЕКТА БЕЗ ПРИСВОЕНИЯ ЕМУ НОВОГО ID - ОПАСНОЕ ЗАНЯТИЕ. НИКОГДА ТАК НЕ ДЕЛАЙТЕ, ЕСЛИ ВЫ НЕ УВЕРЕНЫ В ТОМ, ЧТО ВЫ ДЕЛАЕТЕ!

Скрипт в игре

• Теперь используйте "Файлы данных", чтобы активировать мод, запустить игру и загрузить сохранение.
• Когда игра загрузится, активируйте консоль (обычно это кнопка ~ (тильда), слева от 1 на основной клавиатуре) и в консоли напечатайте:

player.coc "AleswellInn" и нажмите Enter.


http://cs.elderscrolls.com/constwiki/image...t2_testing1.JPG
Тестовая локация, шкаф в Алесвельской таверне

• Вы появитесь в Алесвельской таверне, где вас сразу поприветствует группа невидимых людей. Это не имеет отношения к моду, просто данная ячейка использовалась автором для тестирования (она находится сверху в списке интерьеров, поэтому ее очень легко находить). Щелкайте, пока не сможете двигаться, и подойдите к шкафу слева от вас.

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


http://cs.elderscrolls.com/constwiki/image...t2_testing2.JPG
Созданное нами окно сообщений

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

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


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

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

Теперь нужно, что бы скрипт вычислял, какой вариант ответа выбирает игрок и соответственно реагировал на правильный и неправильные ответы. Функция для проверки выбранного ответа "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 0 
       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 0 
     EndIf 
ElseIf ( controlvar == 2 ) 
     Activate 
EndIf  

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

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

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

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

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


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

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

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

Else 
     MessageBox "Неправильный ответ." 
     Cast Mg05FingerSpell15 Player 
     Set controlvar to 0 
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 0 
         EndIf 
     ElseIf ( controlvar == 2 ) 
         Activate 
         Set controlvar to 3 
     EndIf 
End

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


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

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

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


5.10 Последние строки.

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

Наконец, объявляю огромную благодарность GhanBuriGhan за фантастическое "Руководство GhanBuriGhan’a по скриптам Morrowind для чайников" (GhanBuriGhan's excellent Morrowind Scripting for Dummies), в котором содержится прототип этого учебника. Я не смог связаться с ним, чтобы получить разрешение на его использование; если у него есть какие-либо вопросы насчет данного руководства, он вправе убрать или отредактировать его.
Награды За огромный вклад в развитие Румора

Оффлайн Garin

  • *
  • Сообщений: 1564
  • Репутация: 5
  • Пол: Мужской
    • ICQ клиент - 244260055
    • Просмотр профиля
    • tiarum.com
Учебник "osfm V1.0" Том 1
« Ответ #12 : 05 Декабрь, 2006, 03:06:48 »
0
6. Функции в TES 4



6.1 Что такое функция? (Function)

Функции – это скриптовые операции, которые, в отличие от команд, напрямую взаимодействуют с игровым миром. Из всех скриптовых операций самое большое количество приходится именно на функции, которых на данный момент насчитывается 359 (в игре TES 4 Oblivion используется 353). Внушительное количество полезных функций – 96 - насчитывается в расширителе скриптов OBSE v0009.

Программисты, привыкшие к таким языкам программирования, как Pascal и Delphi, не найдут в скриптовом языке Обливион привычных процедур. Есть только функции.

Все без исключения функции возвращают какое-либо значение. Возвращаемые значения могут быть использованы при проверке условий "if" или же их можно сохранить в переменных, используя команду “set”.

Функции подразделяются на две подкатегории: пассивные и активные.
  • Пассивные функции проверяют определенные значения в игре и возвращают их численное значение. К примеру, GetActorValue возвращает определенное числовое значение, а GetDetected возвращает “1”, если цель обнаружена, или “0”, если нет и т.п.
  • Активные функции, в отличие от пассивных, вносят изменения в игровой мир и, как правило, возвращают логический результат (“1” или “0”) - были ли действия успешными или нет. RemoveSpell, к примеру, снимает заклинание с цели и возвращает “1”, если действие прошло успешно (т.к. на цели было заклятие). PlaceAtME создает какой-либо объект в локации вызвавшего эту функцию и возвращает ссылку на копию этого объекта.



6.2 Типы функций (Function Types)

Чтобы как-то систематизировать функции, в WIKI они были разделены на 22 категории:
  •  AI Functions – Функции, связанные с искусственным интеллектом (Radiant AI)
  •  Actor Functions – Функции, работающие с актерами.
  •  Actor State Functions – Функции, связанные с состоянием актера.
  •  Statistics Functions – Статистические функции, связанные с характеристиками актеров.
  •  Actor Value Functions – Функции, модифицирующие характеристики актеров. Относятся также к статистическим функциям.
  •  Animation Functions – Анимационные функции
  •  Combat Functions – Функции боя
  •  Condition Functions – Функции условий. Могут использоваться в качестве условий в любом месте редактора, где есть условия (стадии квеста, диалоги, пакеты, менеджер анимации и т.п.).
  •  Crime Functions – Функции преступлений
  •  Dialogue Functions – Функции диалогов
  •  Faction Functions – Функции фракций
  •  Magic Functions – Магические функции
  •  Miscellaneous Functions – Прочие функции
  •  Movement Functions – Функции движения
  •  Object Functions – Объектные функции
  •  Player Functions – Функции, обращающиеся только к игроку
  •  Quest Functions – Квестовые функции
  •  Reference Variable Functions – Функции, возвращающие указатели для установки ref- переменных
  •  Time Functions – Функции времени.
  •  Weather Functions – Функции погоды.
  •  Console Functions – Консольные функции. По другому – консольные команды, а иногда – чит-коды или читы.
  •  OBSE Function Types – Функции расширителя скриптового языка OBSE.

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



6.3 Работа функций с копиями объектов (Reference functions)

Объектные функции  

Большинство скриптовых функций являются объектными функциями, поскольку запускаются с копии объекта (Object reference). Локальные скрипты (скрипты на объектах и скрипты в поле result диалога) могут использовать неявный синтаксис обращения к копии.
Например:

GetDisposition player
GetDisposition – это объектная функция – отношение кого мы запрашиваем? Поскольку в этом случае мы не указываем копию объекта, подразумевается, что мы пишем:

thisReference.GetDisposition player; thisReference – копия, к которой прикреплен скрипт
Всегда можно использовать явный синтаксис, точно указывая копию, на которой вызывается функция. Нелокальные скрипты должны использовать явный синтаксис, поскольку они не запускаются с какой-либо копии. Например:

JauffreRef.GetDisposition player
Здесь мы запрашиваем отношение Джоффри(Jauffre) к игроку. Этот синтаксис может использоваться в любом скрипте, потому что мы явно указали копию объекта.
ПРИМЕЧАНИЕ: вы также можете запускать объектные функции с переменных типа ref, как если бы эти переменные сами были объектами.
Награды За огромный вклад в развитие Румора

Оффлайн Garin

  • *
  • Сообщений: 1564
  • Репутация: 5
  • Пол: Мужской
    • ICQ клиент - 244260055
    • Просмотр профиля
    • tiarum.com
Учебник "osfm V1.0" Том 1
« Ответ #13 : 05 Декабрь, 2006, 03:27:47 »
0
Описание функций TES 4 Oblivion
в алфавитном порядке:



A


Activate
http://cs.elderscrolls.com/constwiki/index.php/Activate

Синтаксис:
Activate ActivatorID (optional), NormalActivationFlag (optional) Примеры:
Activate player
Activate
Activate player, 1

Функция Activate указывает объекту выполнить его действие по-умолчанию.
Если ActivatorID опущен, то команда Activate будет использовать «текущий активатор» вызывающего объекта. Это очень полезно внутри блока OnActivate, когда вам нужно, чтобы активация проходила в обычном режиме, за исключением определенных условий.

Это означает, что вызов

Activateбудет эквивалентен
ref actingref
set actingref to GetActionRef
Activate actingref

Если используется ActivatorID, вызывающий объект исполнит действие, привязанное к ActivatorID.

Тип объектаАктивация
NPCДиалог
КонтейнерОткрыть
ДверьОткрыть
Оружие, броня, и т.д.Поднять
Книга/СвитокЧитать

Если флаг NormalActivationFlag опущен, вызывающий объект исполняет нужное действие, пропуская любые блоки OnActivate, которые могут быть на нем. Обычно так и используется команда Activate, т.к. чаще всего она вызывается как раз внутри блока OnActivate.

Если NormalActivationFlag установлен в 1, вызывающий объект будет активирован обычным способом, включая блок OnActivate. В основном этот флаг аннулирует активацию по умолчанию как представлено выше. Используйте данную возможность осторожно — если вы вызовете Activate на сам объект изнутри блока OnActivate, вы тем самым запустите бесконечный цикл.

При осторожном использовании функция Activate может оказаться очень полезной для принудительного вызова и использования как псевдо-функция вызова между заскриптованным объектом и заклинаниями. Такое использование не предполагалось и требует тщательного планирования.

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

Activate player
Пример 2:
Чтобы не переключило блок OnActivate, оно также вызовет Activate, как будто скрипта и нет.

begin OnActivate  
   if MyCrazyCondition == 1  
      Activate
   else  
     ; делаем что-то еще  
   endif  
end

Пример 3:
Этот скрипт запускает бесконечный цикл — как только заскриптованный объект активирован, блок OnActivate будет выполняться вечно.
 
float infinity  
begin OnActivate  
    ; НИКОГДА так не делайте!!  
     set infinity to infinity + .1  
     message "Infinity = %.1f", infinity  
     activate player 1  
end

Пример 4:
Вот правильный способ использования NormalActivationFlag:

begin OnActivate  
    ; активируем другой объект, когда этот активирован игроком  
      if IsActionRef player == 1  
           MyGate.Activate player 1  
      endif  
end

Относится к типу: Object Functions


AddAchievement
http://cs.elderscrolls.com/constwiki/index.../AddAchievement

Синтаксис:
AddAchievement AchievementNumber
Пример:
AddAchievement 12
Используется только в XBox!
Добавляет указанное достижение в профиль игрока. Т.к. достижения прописаны в движке, эта функция не используется в модостроении.


AddFlames
http://cs.elderscrolls.com/constwiki/index.php/AddFlames

Синтаксис:
[ObjectID.]AddFlamesДобавляет объект пламени FlameNode к вызываемому объекту.

.  
Пламя выключено ...................... Пламя включено

См. также: FlameNode, CanHaveFlames, HasFlames, RemoveFlames
Относится к типу: Object Functions


AddItem
http://cs.elderscrolls.com/constwiki/index.php/AddItem

Синтаксис:
[ActorID|ContainerID.]AddItem ObjectID, Count
Пример:
AddItem MyObject, 1 Ref MyItem
Short count
set MyItem to ArenaAkaviriLongSword
set count to 1
player.additem MyItem Count

Добавляет число Count предметов ObjectID в инвентарь вызывающего контейнера.

Примечания:
  • В качестве ObjectID могут быть использованы переменные типа ref, а для Count - переменные типа short.
  • Данная функция не включит блок OnAdd потому, что предмет создается внутри инвентаря, а не добавляется в него. Для создания объектов из консоли, если вам нужно включить блок OnAdd, используйте функцию PlaceAtMe и поднимите предмет с земли.

Консольное использование:
Используя AddItem с консолью, вы должны использовать FormID желаемого предмета, а не его EditorID.
Поэтому для того, чтобы добавить себе отмычку, вместо команды
player.additem lockpick 1 вы должны набрать в консоли
player.additem 00000A 1
Kedrigh (wiki) добавил:
    "FormID находится в CS и имеет вид: yyxxxxxx.
    yy используется для ссылки на плагин, а xxxxxx - чтобы сослаться на элемент внутри плагина (и он не изменяется). Таким образом, если вы загружаете мастер-файл Oblivion в CS и, немного поработав, создали новый объект, то
    FormID этого объекта будет выглядеть как 01xxxxxx.
    Часть FormID - yy - изменяется в зависимости от загруженных модов, которые вы отметили при загрузке."

Прим. Garin:
    yy зависит от порядкового номера загруженного плагина, которые при загрузке сортируются по дате.
См. также: RemoveItem, GetItemCount
Oтносится к типу: Object Functions | Actor Functions


AddScriptPackage
http://cs.elderscrolls.com/constwiki/index...ddScriptPackage

Синтаксис:
[ActorID.]AddScriptPackage PackageIDПример:
AddScriptPackage MQ07BeggarToTavernОписание:
Функция AddScriptPackage добавляет скриптовый пакет для вызывающего актера. Когда эта функция вызвана, этот пакет станет преобладающим над всеми другими пакетами.
Примечания:
  • Актер может иметь только один скриптовый пакет. При вызове этой функции дважды, второй пакет заменит первый.
  • Отметим, что в случае, когда добавленный пакет не принуждает актера к чему-то ("должен завершить" (must complete) и/или "должен достичь расположения" (must reach location)), он будет снят, когда актер в следующий раз переоценит этот пакет.

Справка:
Список скриптов Обливиона, которые используют AddScriptPackage (WIKI):
  • AmuseiScript
  • ArmandChristopheScript
  • BanditSentryFemaleScript
  • BanditSentryMaleScript
  • bernadettepenelesscript
  • CPRollingRock01SCRIPT
  • DASanguineSpell
  • DavideSurilieScript
  • HieronymusLexScript
  • KurtTestMagicEffect2
  • MartinScript
  • MethredhelScript
  • MQ09Script
  • MQ14StatueScript
  • MQ15AnaxesDoorSCRIPT
  • MS45DarMaScript
  • OrrinScript
  • TG03ChapelUndercroftGuardScript
  • TG11BlindMonkBossScript
  • ToutiusSextiusScript
  • TrigZoneP layerDoonce01DABoethiaSCRIPT01
  • TrigZonePlayerDoonce01DABoethiaSCRIPT02
  • TrigZonePlayerDoonce01DABoethiaSCRIPT03
  • TrigZonePlayerDoonce01DABo ethiaSCRIPT04
  • TrigZonePlayerDoonce01DABoethiaSCRIPT05
  • TrigZonePlayerDoonce01DABoethiaSCRIPT06
  • TrigZonePlayerDoonce01DABoethiaSCRIPT07
  • TrigZonePlayerDoonce01DABoethiaSCRIPT08
  • TrigZonePlayerDoonce01DABoethiaSCRIPT09
См. также: RemoveScriptPackage
Oтносится к типaм: AI Functions | Actor Functions


AddSpell
http://cs.elderscrolls.com/constwiki/index.php/AddSpell

Синтаксис:
[ActorID.]AddSpell SpellID  
Пример:
AddSpell AbWeaknessNormalWeapons Добавляет заклинание вызывающему актеру. Заклинаниями также считаются болезни, дополнительные способности, благословения (powers). Когда добавляется способность или болезнь, отображается соответствующий магический эффект. Когда добавляется заклинание или благословение, показывается скастованное заклинание\благословение. Есть и другие важные отличия, смотрите Spell, чтобы узнать подробности.
Примечания:
  • Addspell работает только с типами заклинаний, указанными в секции заклинаний редактора. Её нельзя использовать для заклинаний, добавленных с помощью скриптов. Для динамического добавления заклинания, основываясь на его уровне, используйте следующий скрипт в качестве руководства:
if ( Player.GetLevel >= 25 )
      player.addspell InnerFire25
elseif ( player.Getlevel >= 20 )
      player.addspell InnerFire20
elseif ( player.Getlevel >= 15 )
      player.addspell InnerFire15
elseif ( player.Getlevel >= 10 )
      player.addspell InnerFire10
elseif ( player.Getlevel >= 5 )
      player.addspell InnerFire05
else
      player.addspell InnerFire01
endif
  • Будьте осторожны при использовании данной функции на неуникальных актерах. Добавление способности или заклинания на актёра изменит базовый объект, и все актёры, созданные из данного базового объекта также подвергнуться изменению.
  • Как и большинство функций, эта имеет отличия при использовании в консоли - вместо SpellID надо указывать FormID.
  • Обратите внимание, что большинство заклинаний не работают как способности, включая "Перо", "Бремя" и "Дезинтеграцию", так же как и любые заклинания, заставляющие цель реагировать на заклинателя, например "Поднять мёртвого", "Очаровать" или "Деморализовать".
См. также: RemoveSpell
List of existing scripts that use AddSpell
Oтносится к типу: Magic Functions | Actor Functions  


AddTopic
http://cs.elderscrolls.com/constwiki/index.php/AddTopic

Синтаксис:
AddTopic TopicID Пример:
AddTopic HiddenCaveИспользуйте эту функцию, чтобы добавить тему в список известных тем игрока.
Только темы из этого списка появляются в перечне тем NPC во время диалога. Темы также можно добавить, используя список AddTopic в окне редактора диалогов.
См. также: List of functions that use AddTopic (wiki)
Oтносится к типу: Dialogue Functions  


AdvancePCLevel
http://cs.elderscrolls.com/constwiki/index.../AdvancePCLevel

Синтаксис:
AdvancePCLevel  
advLevel
   
Ручное повышение уровня игрока, вызывающее меню «повышение уровня».
Oтносится к типу: Player Functions  


AdvancePCSkill
http://cs.elderscrolls.com/constwiki/index.../AdvancePCSkill

Синтаксис:
AdvancePCSkill Skill Amount  
advSkill Skill Amount
   
Пример:
AdvancePCSkill Blade 2    
Функция AdvancePCSkill повышает навык игрока (Skill) на величину Amount, как если бы игрок получил его при многократном использовании в игре или у тренера.
Эта функция стала объектом спора в обсуждении ModPCSkill. Пожалуйста, прочтите эту страницу перед использованием данной функции.
Прим. zOmb (ZomBoss):
    Тестовое дополнение:
    AdvancePCSkill добавляет игроку очко скилла. Причём, если скилл в главных, то повышается и шкала повышения уровня.
    Вызов функции с отрицательным аргументом приводит к зависанию игры.[/li]
Oтносится к типу: Player Functions  


Autosave
http://cs.elderscrolls.com/constwiki/index.php/Autosave

Синтаксис:
AutosaveВызов этой функции приводит к немедленному автосохранению. Запись производится в тот же слот памяти, что и обычное автосохранение.


Награды За огромный вклад в развитие Румора

Оффлайн Garin

  • *
  • Сообщений: 1564
  • Репутация: 5
  • Пол: Мужской
    • ICQ клиент - 244260055
    • Просмотр профиля
    • tiarum.com
Учебник "osfm V1.0" Том 1
« Ответ #14 : 05 Декабрь, 2006, 03:46:40 »
0
=============
C
=============

CanHaveFlames
http://cs.elderscrolls.com/constwiki/index.php/CanHaveFlames

Синтаксис:
[objectID.]CanHaveFlamesВозвращает 1, если объект может использовать пламя (светильник, например)

Cм. также: FlameNode, HasFlames, AddFlames, RemoveFlames
Относится к типу: Object Functions | Condition Functions


CanPayCrimeGold
http://cs.elderscrolls.com/constwiki/index...CanPayCrimeGold

Синтаксис:
[ActorID.]CanPayCrimeGold Возвращает 1, если актер имеет достаточное количество золота в инвентаре, чтобы оплатить штраф за преступление, и 0, если нет.

См. также: GetCrimeGold, ModCrimeGold, SetCrimeGold
Относится к типу: Crime Functions | Condition Functions


Cast
http://cs.elderscrolls.com/constwiki/index.php/Cast

Синтаксис:
[ActorID|ActivatorID.]Cast SpellID [TargetRefID]
Пример:
Cast ShrineAkatoshSpeedMagicka Player
При вызове функции Cast вызывающий объект кастует заклинание SpellID на цель TargetRefID (и только заклинания).

Oтносится к типу: Magic Functions | Actor Functions  


CloseCurrentOblivionGate
http://cs.elderscrolls.com/constwiki/index...entOblivionGate

Синтаксис:
CloseCurrentOblivionGate iNoResetFlag (optional)Когда вызывается функция CloseCurrentOblivionGate, то мир Обливиона, в котором находится игрок, сбрасывается. Он возвращается туда, откуда он вошел в Обливион и поворачивается лицом к воротам. Затем ворота сворачиваются и помечаются как уничтоженные (не используемые более). Другие актеры помещаются за ворота и связанный мир сбрасывается.
Другие актеры (не принадлежащие к данной локации) также помещаются за ворота и связанный мир сбрасывается.
Если опциональный флаг iNoResetFlag = 1, то мир Обливиона после закрытия врат не сбрасывается.

См. также: CloseOblivionGate
Относится к типу: Miscellaneous Functions  


CloseOblivionGate
http://cs.elderscrolls.com/constwiki/index...oseOblivionGate

Синтаксис:
CloseOblivionGate iNoResetFlag (optional)Референсная функция. Если вызывающий объект – врата Обливиона, они закрываются (более подробно - см. CloseCurrentOblivionGate).

См. также: CloseCurrentOblivionGate
Относится к типу: Miscellaneous Functions


CompleteQuest
http://cs.elderscrolls.com/constwiki/index.php/CompleteQuest

Синтаксис:
CompleteQuest QuestID Пример:
CompleteQuest SQ09Помечает квест как законченный. Единственный реальный эффект состоит в том, что квест будет отображаться в разделе «Завершенные» списка квестов.

См. также: StartQuest, StopQuest
Относится к типу: Quest Functions


CreateFullActorCopy
http://cs.elderscrolls.com/constwiki/index...teFullActorCopy

Синтаксис:
[ActorID.]CreateFullActorCopy

Пример 1:

Функция CreateFullActorCopy создает копию указанного актера (ActorID, в данном случае игрока) и его базы:
player.CreateFullActorCopy  
Пример 2:

Функция создает копию вызывающего актера и возвращает ID нового объекта, поэтому может использоваться для того, чтобы задать ref-переменную, как это сделано в этом примере:
set newRef to CreateFullActorCopy  
Копия представляет собой полный дубликат оригинального актера (на котором "висит" данный скрипт), включая инвентарь, но со следующими оговорками:
  • Объекты инвентаря дублируются также, как и в случае вызова функции DuplicateAllItems
  • У копии нет пакетов ИИ или фракций.
См. также: DeleteFullActorCopy
Oтносится к типу: Miscellaneous Functions | Actor Functions
Награды За огромный вклад в развитие Румора

Оффлайн Garin

  • *
  • Сообщений: 1564
  • Репутация: 5
  • Пол: Мужской
    • ICQ клиент - 244260055
    • Просмотр профиля
    • tiarum.com
Учебник "osfm V1.0" Том 1
« Ответ #15 : 11 Декабрь, 2006, 12:45:58 »
0

D


DeleteFullActorCopy
http://cs.elderscrolls.com/constwiki/index...teFullActorCopy

Синтаксис: [refID.]DeleteFullActorCopyПример: newRef.DeleteFullActorCopyФункция DeleteFullActorCopy удаляет созданную копию актера (refID) полностью и его базовый объект.
Примечание: Работает как функция return — строки скрипта, следующие после вызова, выполняться не будут.
См. также: CreateFullActorCopy
Относится к типу: Miscellaneous Functions  


Disable
http://cs.elderscrolls.com/constwiki/index.php/Disable

Синтаксис: [ObjectID|ActorID.]Disable
Функция Disable отключает вызывающий объект. Отключенные объекты не загружаются в мир, отключенные актеры не обрабатывают свой ИИ, но скрипты на отключенных объектах ВЫПОЛНЯЮТСЯ.
Функция Disable не удаляет объекты из игры, она просто прекращает их отрисовку. Не полагайтесь на Disable, чтобы увеличить производительность путём удаления объектов.
См. также: Enable, GetDisabled
Относится к типу: Miscellaneous Functions


DisableLinkedPathPoints
http://cs.elderscrolls.com/constwiki/index...inkedPathPoints

Синтаксис: [ObjectID.]DisableLinkedPathPointsФункция DisableLinkedPathPoints отключает все путевые узлы, привязанные к вызывающему объекту ObjectID. Это нужно, чтобы изменить нахождение пути на геометрии, изменяющейся во время игры, например, на разводных мостах ( drawbridges), движущихся решётках (portcullises), разваливающихся опорах (crumbling bridges) и т.п.
 Чтобы привязать узел пути к объекту, выделите его в редакторе и нажмите "R".
См. также: EnableLinkedPathPoints, Category: Path Grids
Относится к типу: Miscellaneous Functions


DisablePlayerControls
http://cs.elderscrolls.com/constwiki/index...ePlayerControls

Синтаксис: DisablePlayerControls    
При вызове функции DisablePlayerControls игрок не может двигаться, ждать, активировать предметы или получать доступ к журналу.
Примечание: при этом игрок всё ещё может осматриваться вокруг.
См. также: EnablePlayerControls
Oтносится к типу: Player Functions


Dispel
http://cs.elderscrolls.com/constwiki/index.php/Dispel

Синтаксис: [ActorID].Dispel MagicIDПримеры: Dispel ShrineAkatoshSpeedMagickaNPCRef.Dispel ShrineAkatoshSpeedMagickaФункция Dispel удаляет указанное заклинание/магию (MagicID), наложенные на актера ActorID.
Примечание: Эта функция должна работать и работает как команда Return, если вы пытаетесь удалить заклинание в его текущем скрипте. Например, в следующем скрипте сообщение показано не будет:
 scn EXSpellScript
Begin ScriptEffectFinish
      player.dispel EXSpell
      messagebox "Не будет виден!"
End
См. также: DispelAllSpells
Oтносится к типу: Magic Functions | Actor Functions  


DispelAllSpells
http://cs.elderscrolls.com/constwiki/index...DispelAllSpells

Синтаксис: [ActorID.]DispelAllSpells
Функция DispelAllSpells удаляет все текущие заклинания/магию, наложенные на актера (ActorID).
См. также: Dispel
Oтносится к типу: Magic Functions | Actor Functions


Drop
http://cs.elderscrolls.com/constwiki/index.php/Drop

Синтаксис: [ActorID.]Drop ObjectID Count Пример: Drop Torch02 2При вызове функции Drop вызывающий актер ActorID выбрасывает указанный предмет(ы) (ObjectID) в мир к своим ногам в указанном количестве (Count).
Oтносится к типу: Object Functions | Actor Functions


DropMe
http://cs.elderscrolls.com/constwiki/index.php/DropMe

Синтаксис: [ObjectID.]DropMe При вызове функции DropMe из контейнера (инвентаря) выбрасывается вызывающий предмет ObjectID. Если его в контейнере нет, функция не имеет эффекта.
Примечания:
  • Эта функция работает как функция Return - строки скрипта, следующие за ней, выполнены НЕ будут  (т.к. объект уничтожает cfv себя в процессе удаления из инвентаря).
  • В отличие от RemoveMe, функция не сохраняет уровни изношенности, заряда или скриптовые переменные предмета.

См. также: RemoveMe
Oтносится к типу: Object Functions


DuplicateAllItems
http://cs.elderscrolls.com/constwiki/index...plicateAllItems

Синтаксис: [ActorID|ContainerID.]DuplicateAllItems TargetContainerID
Пример: DuplicateAllItems BlackBrugoRef Функция DuplicateAllItems дублирует все предметы, находящиеся в вызывающем контейнере (ActorID|ContainerID), в целевом контейнере TargetContainerID. Заскриптованные объекты дублируются как новые, незаскриптованные (но в остальном идентичные) - как версии (копии) самих себя. Квестовые предметы также дублируются, так что используйте эту функцию осторожно. Многие квесты полагают, что квестовые предметы уникальны — создание их второй копии может привести к нежелательным последствиям.
См. также: CreateFullActorCopy
Oтносится к типу: Category: Items | Actor Functions  


DuplicateNPCStats
http://cs.elderscrolls.com/constwiki/index...plicateNPCStats

Синтаксис: [ActorID.]DuplicateNPCStats NPCToCopyFromIDПример: myClone.DuplicateNPCStats playerФункция DuplicateNPCStats дублирует все характеристики, которые имеются у  указанного персонажа (NPCToCopyFromID), на вызывающего NPC (ActorID), включая следующее:
  • Класс (class)
  • Уровень (level)
  • Навыки и атрибуты (Skills and attributes)

См. также: CreateFullActorCopy
Oтносится к типу: Miscellaneous Functions

Награды За огромный вклад в развитие Румора

Оффлайн Garin

  • *
  • Сообщений: 1564
  • Репутация: 5
  • Пол: Мужской
    • ICQ клиент - 244260055
    • Просмотр профиля
    • tiarum.com
Учебник "osfm V1.0" Том 1
« Ответ #16 : 11 Декабрь, 2006, 12:47:01 »
0
E



Enable
http://cs.elderscrolls.com/constwiki/index.php/Enable

Синтаксис: [ObjectID.]EnableФункция Enable включает вызывающий объект ObjectID, заблокированный ранее функцией Disable.
Все объекты включены в игре по умолчанию, а это означает, что они рендерятся в игре и, если они актеры, то отрабатываются их пакеты AI.
См. также: Disable, GetDisabled
Относится к типу: Miscellaneous Functions  


EnableFastTravel
http://cs.elderscrolls.com/constwiki/index...nableFastTravel

Синтаксис: EnableFastTravel flagФункция EnableFastTravel включает или отключает быстрое путешествие.
Если флаг (flag) установлен в "1", тогда разрешено, если в "0" = заблокировано до тех пор, пока снова не будет включено этой функцией.
Относится к типу: Miscellaneous Functions  


EnableLinkedPathPoints
http://cs.elderscrolls.com/constwiki/index...inkedPathPoints

Синтаксис: [ActorID.]EnableLinkedPathPointsФункция EnableLinkedPathPoints включает все путевые узлы (пафгриды), связанные с объектом вызова ActorID.
Чтобы привязать точку пути к объекту, выберите в конструкторе точку пути и нажмите клавишу "R".
См. также: DisableLinkedPathPoints,  Category: Path Grids
Относится к типу: Miscellaneous Functions  


EnablePlayerControls
http://cs.elderscrolls.com/constwiki/index...ePlayerControls

Синтаксис: EnablePlayerControls
Функция EnablePlayerControls включает управление игрока, отключенное ранее функцией DisablePlayerControls
См. также: DisablePlayerControls
Oтносится к типу: Player Functions  


EquipItem
http://cs.elderscrolls.com/constwiki/index.php/EquipItem

Синтаксис: [ActorID.]EquipItem ObjectID NoUnequipFlagПример: EquipItem FavoriteCuirass
player.EquipItem CursedHelm 1

Вызов функции EquipItem заставляет актера ActorID одеть объект ObjectID. Если флаг NoUnequipFlag = 1, актер (включая и персонажа игрока), не сможет снять объект.
См. также: UnequipItem
Oтносится к типу: Object Functions | Actor Functions  


EssentialDeathReload
http://cs.elderscrolls.com/constwiki/index...tialDeathReload

Синтаксис: EssentialDeathReload "Death message"Пример: EssentialDeathReload "Вы проиграли. Жоффре убит. Надежды больше нет."
Функция EssentialDeathReload заставляет игру перезагрузиться (также, как и после смерти персонажа игрока). Сначала появляется сообщение, затем меню перезагрузки.
Oтносится к типу: Miscellaneous Functions  


EvaluatePackage
EvaluatePackage

Синтаксис: [ActorID.]EvaluatePackage PackageID
evp PackageID
Используйте функцию EvaluatePackage на указанном актере (ActorID), чтобы вынудить его переоценить пакеты и выбрать указанный PackageID, который должен выполняться немедленно. Это может быть необходимо в тех случаях, когда в скрипте изменились какие-либо условия. Например, если вы хотите, чтобы актер активировал рычаг, когда какой-нибудь флаг в скрипте установится в состояние "True" - "истина". Для того, чтобы актер активировал его сразу же после этого события,  вам нужно вызвать EvaluatePackage и заставить актера немедленно переоценить пакеты, чтобы не ждать в течение целого часа.
Эта функция должна использоваться осмотрительно, поскольку это может занять длительное время в случае, если актер имеет длинный список пакетов и условий.
Oтносится к типу - AI Functions | Actor Functions  


Награды За огромный вклад в развитие Румора

Оффлайн Garin

  • *
  • Сообщений: 1564
  • Репутация: 5
  • Пол: Мужской
    • ICQ клиент - 244260055
    • Просмотр профиля
    • tiarum.com
Учебник "OSFM v1.0" Том 1
« Ответ #17 : 11 Декабрь, 2006, 12:47:29 »
0
F



ForceActorValue
http://cs.elderscrolls.com/constwiki/index...ForceActorValue

Синтаксис: [ActorID.]ForceActorValue StatName value
[ActorID.]ForceAV StatName value

Параметры:    ActorID - ID персонажа, необязательный.
    StatName - название изменяемой характеристики
    Value - значение, которое будет присвоено
Пример: ForceActorValue Strength 50  
Функция ForceActorValue изменяет для указанного актера (ActorID) его текущую характеристику (StatName) до определенного значения (value) (не путайте с SetActorValue, которая изменяет БАЗОВОЕ значение характеристики). Измененная характеристика будет отображаться в игре красным цветом (damaged - повреждение) или зеленым (restored - восстановление), чтобы информировать игрока, что это временная модификация. Неизмененные параметры будет отображаться синим цветом.
Основы:
Когда вы (или игра) используете GetActorValue, вы получаете сумму базового значения актера плюс значения трех модификаторов - игрового, магического и скриптового:
    1. Game Modifier используется для "постоянного" эффекта, типа Damage и Restore.
    2. Magic Modifier используется для "временного", развеваемого магического эффекта, такого как Drain и Fortify.
    3. Script Modifier используется для "временного" неразвеиваемого скриптового эффекта, такого как благословения и проклятия.[/li]
Функции ModActorValue и ForceActorValue изменяют только скриптовый модификатор. Изменения, сделанные этими функциями, не восстанавливаются автоматически внутриигровыми средствами, подобно естественному восстановлению здоровья или магии. Для этого вам нужно "уничтожить" их в скрипте.
В скриптах эти функции ведут себя так, как описано выше, но в консоли они ведут себя несколько иначе - в связи с тем, что они использовались Bethesda для целевого тестирования объектов.

См. описание для функции ModActorValue:
ModActorValue health, ( value - GetActorValue health )
Как и в случае с ModActorValue, при вызове ForceActorValue из скрипта изменения будут временными.
См. также: Stats List, GetActorValue, GetBaseActorValue, SetActorValue, ModActorValue
Oтносится к типу: Actor Value Functions | Statistics Functions | Actor Functions


ForceCloseOblivionGate
http://cs.elderscrolls.com/constwiki/index...oseOblivionGate

Синтаксис: ForceCloseOblivionGateФункция ForceCloseOblivionGate мгновенно закрывает врата Обливиона — работает также, как и функция CloseOblivionGate, но анимация закрытия врат не проигрывается.
См. также: CloseOblivionGate, CloseCurrentOblivionGate
Oтносится к типу: Miscellaneous Functions  


ForceFlee
http://cs.elderscrolls.com/constwiki/index.php/ForceFlee

Синтаксис: [ActorID.]ForceFlee
[ActorID.]ForceFlee CellID
[ActorID.]ForceFlee CellID, ObjectRefID
Примеры: ForceFlee ChorrolTheGreyMare
ForceFlee ChorrolTheGreyMare, BongondRef
Вызов функции ForceFlee заставляет вызывающего актера (ActorID) убегать, независимо от того, сражается в данный момент актер или нет.
  • Если функция вызывается без параметров, актер будет выбирать сам, куда убегать и когда остановиться, т.е. так, как поступают обычные актеры.
  • Если функция вызывается с CellID, актер будет убегать, пока не достигнет указанной ячейки.
  • Если функция вызывается с ObjectRefID, актер будет убегать, пока не достигнет указанной цели (ObjectRefID) (в данном случае ячейка CellID будет игнорироваться, но для нормальной компиляции скрипта ее требуется обязательно указать).
  • Есть полезное побочное действие этой функции, заключающееся в том, что если вызвать ее без параметров на разговаривающем в данный момент актере, то он мгновенно прекратит разговор и оба актера немедленно возвратятся к своим текущим пакетам.

Oтносится к типу : AI Functions | Actor Functions  


ForceTakeCover
http://cs.elderscrolls.com/constwiki/index.../ForceTakeCover

Синтаксис: [ActorID.]ForceTakeCover TargetID DurationПримеры: ForceTakeCover player 30
Функция ForceTakeCover вынуждает вызывающего актера (ActorID) отделиться от цели TargetID на указанное в секундах время (Duration).
Oтносится к типу: AI Functions | Actor Functions  


ForceWeather
http://cs.elderscrolls.com/constwiki/index.php/ForceWeather

Описание: Функция ускоренной смены погоды
Тип: nil
Синтаксис: ForceWeather WeatherID WeatherOverrideFlag (optional)Параметры:   WeatherID - ID объекта погоды
   WeatherOverrideFlag - необязательный, указывает, зафиксировать погоду или нет
Примеры: ForceWeather Clear
ForceWeather OblivionStorm 1
fw SigilWhiteOut
Функция ForceWeather позволяет установить указанную погоду (WeatherID) немедленно после вызова. Если необязательный флаг WeatherOverrideFlag указан и установлен в "1", то погода изменяться не будет, пока не будет вызвана функция ReleaseWeatherOverride, в противном случае погода вернется к своему нормальному виду согласно текущей системы погоды в данной местности.
   Тип погоды можно изменять с помощью двух функций - ForceWeather и SetWeather. Отличаются они только тем, что в первом случае переход произойдёт мгновенно, а во втором - плавно, в соответствии с настройками объекта погоды.
ID погоды (Console IDs):  

Tamriel  
    CamoranWeather 000370CE
    Clear 00038EEE
    Cloudy 00038EFE
    DefaultWeather 0000015E
    Fog 00038EEF
    Overcast 00038EEC
    Rain 00038EF2
    Snow 00038EED
    Thunderstorm 00038EF1
    OblivionStormTamriel 000836D5
    OblivionStormTamrielMQ16 0006BC8B
    [/list]

    Oblivion  
      OblivionDefault 00032E15
      OblivionElectrical 00067198
      OblivionMountainFog 000671A1
      OblivionSigil 000C0999
      OblivionStormOblivion 00067199
      SigilWhiteOut 000C42DE  
      [/list]
      Other
        MS14Sky 0018BCCF[/list]

        См. также: ReleaseWeatherOverride, SetWeather
        Oтносится к типу: Weather Functions
        Награды За огромный вклад в развитие Румора

        Оффлайн Garin

        • *
        • Сообщений: 1564
        • Репутация: 5
        • Пол: Мужской
          • ICQ клиент - 244260055
          • Просмотр профиля
          • tiarum.com
        Учебник "osfm V1.0" Том 1
        « Ответ #18 : 17 Декабрь, 2006, 13:04:32 »
        0
        G


        GetActionRef
        http://cs.elderscrolls.com/constwiki/index.php/GetActionRef

        Синтаксис:
        set refVar to GetActionRef
        Функция GetActionRef возвращает ref-переменную объекта, который в данный момент взаимодействует с заскриптованным объектом. Доступно только тогда, когда объект активируется или включается. Функция возвращает значение только в одном фрейме сразу после взаимодействия с объектом. Это означает, что она в основном будет полезна внутри блоков OnActivate или OnTrigger.
        В некоторых случаях, если заскриптованный объект взаимодействует одновременно с несколькими объектами (например, в зоне действия объекта находится несколько переключателей), функция возвратит только самый последний из объектов взаимодействия.

        См. также: IsActionRef
        Oтносится к типу: Reference Variable Functions  


        GetActorValue
        http://cs.elderscrolls.com/constwiki/index.php/GetActorValue

        Краткое описание: Возвращает текущее значение характеристики.
        Синтаксис:
           [ActorID.]GetActorValue StatName  
            [ActorID.]GetAV StatName
        Параметры:
           ActorID - ID персонажа, необязательный
            StatName - название характеристики
        Пример:
        GetActorValue StrengthФункция GetActorValue возвращает текущее модифицированное значение характеристики (StatName) для указанного актера ActorID. GetActorValue может использоваться с любыми характеристиками, доступными персонажу игрока или актеру (NPC или существо).

        См. также: Stats List, GetBaseActorValue, ModActorValue, SetActorValue, ForceActorValue
        Oтносится к типу: Actor Functions | Actor Value Functions | Statistics Functions | Condition Functions  


        GetAlarmed
        http://cs.elderscrolls.com/constwiki/index.php/GetAlarmed

        Синтаксис:
        [ActorID.]GetAlarmedФункция GetAlarmed возвращает истину (1), если актер (ActorID) поднял тревогу.

        Oтносится к типу: Crime Functions | Condition Functions | Actor Functions


        GetAmountSoldStolen
        http://cs.elderscrolls.com/constwiki/index...mountSoldStolen

        Синтаксис: GetAmountSoldStolenФункция GetAmountSoldStolen возвращает полную сумму украденных товаров, которые игрок продал. Отметьте, что это количество золота, которое получил игрок по факту, а не базовая стоимость предметов.

        См. также: ModAmountSoldStolen
        Oтносится к типу: Player Functions | Condition Functions  


        GetAngle
        http://cs.elderscrolls.com/constwiki/index.php/GetAngle

        Синтаксис:
        [ActorID.]GetAngle axisПример:
        GetAngle ZФункция GetAngle возвращает текущий угол поворота объекта (ActorID) по выбранной оси (axis) (X, Y, или Z) в формате float относительно мировых координат.
        Особые замечания (если функция вызвана на персонаже игрока):
        • Угол Z возвращается со значением от 0 до 360 град в зависимости от текущего положения головы персонажа.
        • Угол X возвращается (теоретически) в диапазоне от -90 до +90 градусов. В действительности игровой диапазон составляет -89....+89. Если игрок смотрит вверх, то предельное возвращаемое значение угла будет составлять -89 градусов, если же он смотрит вниз, на ноги, то предельное значение будет составлять +89.
        Oтносится к типу: Movement Functions | Condition Functions


        GetArmorRating
        http://cs.elderscrolls.com/constwiki/index.../GetArmorRating

        Краткое описание: Функция возвращает общий рейтинг брони.
        Синтаксис:
        [ActorID.]GetArmorRatingПараметры:
        ActorID - ID персонажа, необязательный.Функция GetArmorRating возвращает полный суммарный рейтинг всех доспехов, одетых в данный момент на указанного актера (ActorID).

        Oтносится к типу: Statistics Functions | Condition Functions | Actor Functions


        GetArmorRatingUpperBody
        http://cs.elderscrolls.com/constwiki/index...RatingUpperBody

        Синтаксис:
        [ActorID.]GetArmorRatingUpperBody
        Функция GetArmorRatingUpperBody не дает рейтинг брони (доспехов), но возвращает, какой тип (класс) брони носит актер в слоте верхней части тела.
        Параметры: ActorID - ID персонажа, броню которого нужно проверить. Необязательный.
        Возможные возвращаемые значения класса брони:

        0нет брони
        1легкая броня
        2тяжелая броня

        См. также: GetArmorRating, GetObjectValue(OBSE)
        Oтносится к типу: Statistics Functions | Condition Functions | Actor Functions


        GetAttacked
        http://cs.elderscrolls.com/constwiki/index.php/GetAttacked

        Синтаксис:
        [ActorID.]GetAttackedФункция GetAttacked возвращает 1, если вызывающий актер (ActorID) был атакован. Это значение сбрасывается, когда актер выходит из боя.
        Примечание:
        • Не ясно, чем она отличается от IsInCombat.
        • Не ясно, работает ли эта функция вообще...

        См. также: IsInCombat
        Oтносится к типу: Combat Functions | Condition Functions | Actor Functions


        GetBarterGold
        http://cs.elderscrolls.com/constwiki/index.php/GetBarterGold

        Синтаксис: GetBarterGold Тип: целое, неотрицательное
        Функция GetBarterGold возвращает доступное для обмена количество денег (золота) у NPC. Фактически, это максимальная цена, за которую NPC может что-либо купить.
        См. также: ModBarterGold
        Oтносится к типу: Statistics Functions | Condition Functions


        GetBaseActorValue
        http://cs.elderscrolls.com/constwiki/index...tBaseActorValue

        Синтаксис:
         [ActorID.]GetBaseActorValue StatName
          [ActorID.]GetBaseAV StatName
         
        Пример:
         GetBaseActorValue Health Параметры:
           ActorID - ID персонажа, необязательный
           StatName - название характеристики
        Описание: Функция GetBaseActorValue возвращает базовое значение указанной характеристики StatName у указанного актера ActorID. Чтобы узнать текущее (модифицированное) значение, используйте функцию GetActorValue.
        См. также: Stats List, GetActorValue
        Oтносится к типу: Actor Functions | Actor Value Functions | Statistics Functions | Condition Functions


        GetButtonPressed
        http://cs.elderscrolls.com/constwiki/index...etButtonPressed

        Синтаксис:
        GetButtonPressedПример:
        set buttonVar to GetButtonPressedПри первом вызове функции GetButtonPressed, после того, как в игре была нажата кнопка в диалоговом окошке, созданном функцией MessageBox, GetButtonPressed возвратит номер нажатой кнопки ("0" означает первую кнопку, "1" - вторую, и т.д.). Во всех остальных случаях (если кнопка в предыдущих фреймах не нажималась либо значение нажатой кнопки уже было считано и сохранено в переменной) будет возвращаться  "-1".
        Отметьте, что функция реагирует на MessageBox, созданный в этом же скрипте.
        Пример скрипта:
        Begin OnActivate
            if IsActionRef player == 1
                messagebox "У вас 3 варианта:", "Вариант 1", "Вариант 2", "Вариант 3"
            endif
        end

        begin gamemode
            set button to getbuttonpressed
            if button > -1
                if button == 0
                    ; Вариант 1
                elseif button == 1
                    ; Вариант 2
                elseif button == 2
                    ; Вариант 3
                endif
            endif
        end
        См. также: MessageBox
        Oтносится к типу: Miscellaneous Functions


        GetClassDefaultMatch
        http://cs.elderscrolls.com/constwiki/index...assDefaultMatch

        Синтаксис:
        GetClassDefaultMatch    
        Функция GetClassDefaultMatch возвращает 0, 1 или 2 в зависимости от того, насколько текущий класс персонажа игрока соответствует "классу по-умолчанию":
         
        2соответствует полностью
        1совпадает специализация (Сражение, Магия или Скрытность)
        0нет совпадений

        Например, если класс игрока по-умолчанию — Скаут (Scout), а текущий класс — Варвар (Barbarian), то эта функция вернет 1. Если класс игрока по-умолчанию — Целитель (Healer), а текущий класс — Варвар (Barbarian), то эта функция возвратит 0 (полностью различные специализации).

        См. также: GetIsClassDefault, SetInCharGen
        Oтносится к типу: Player Functions | Condition Functions


        GetClothingValue
        http://cs.elderscrolls.com/constwiki/index...etClothingValue

        Синтаксис:
        [ActorID.]GetClothingValueФункция GetClothingValue возвращает «стоимость одеяния» одетой в данный момент на вызывающем актере (ActorID) одежды и брони, в интервале от 0 до 100. Ценность каждого предмета масштабируется в зависимости от процента покрытия данного слота (поэтому дорогая роба будет иметь больший вес, чем дорогие ботинки). Эту функцию лучше всего использовать для диалогов, чтобы NPC реагировали на то, как богато или бедно одет кто-либо.
        Следующие игровые настройки используются, чтобы определить ценность одежды, и возвращаются функцией GetClothingValue.
        Драгоценности, броня и одежда регулируются независимо:
        • fClothingArmorBase
          Это базовое значение стоимости для ношения брони любого типа.
          Значение по умолчанию: 0.000
        • fClothingArmorScale
          Это множитель для денежной стоимости носимой брони.
          Значение по умолчанию: 0.2500
        • fClothingBase
          Это базовая стоимость для ношения повседневных одежд любого типа.
          Значение по умолчанию: 0.000
        • fClothingClassScale
          Это множитель для денежной стоимости всей носимой одежды.
          Значение по умолчанию: 3.000
        • fClothingJewelryBase Это базовая стоимость для ношения драгоценности любого типа.
          Значение по умолчанию: 5.000
        • fClothingJewelryScale Это множитель для денежной стоимости любой носимой драгоценности.
          Значение по умолчанию: 0.1000
        Относится к типу: Actor State Functions | Condition Functions


        GetCombatTarget
        http://cs.elderscrolls.com/constwiki/index...GetCombatTarget

        Синтаксис:
        [ActorID.]GetCombatTargetПример:
        set refVar to GetCombatTargetФункция GetCombatTarget возвращает текущую боевую цель вызывающего актера ActorID.
        Но если вызывать эту функцию с явным указанием персонажа игрока -Player.GetCombatTarget, функция всегда будет возвращать 0, так как игра не может определить, какую цель выбрал игрок.

        Oтносится к типу: Reference Variable Functions | Actor Functions


        GetContainer
        http://cs.elderscrolls.com/constwiki/index.php/GetContainer

        Синтаксис:
        set refVar to GetContainerФункция GetContainer возвращает ref-переменную (ссылку) на вызывающий объектный контейнер (если таковой имеется).

        Oтносится к типу: Reference Variable Functions


        GetCrime
        http://cs.elderscrolls.com/constwiki/index.php/GetCrime

        Синтаксис:
        [ActorID.]GetCrime CriminalActorID [CrimeType]
        Пример:
        GetCrime player, 3  
        Функция GetCrime возвращает 1, если актер CriminalActorID совершил определенный тип преступления [CrimeType] против вызывающего актера ActorID И вызывающий актер знает об этом. Если тип преступления [crime type] опущен, то истина возвращается, если вызывающий знает о любом преступлении, совершенном актером CriminalActorID против него.
        Типы преступлений [crime type]:

        0Кража
        1Карманная кража
        2Нарушение территории
        3Атака
        4Убийство

        См. также: Crime Types
        Oтносится к типу: Crime Functions | Condition Functions | Actor Functions


        GetCrimeGold
        http://cs.elderscrolls.com/constwiki/index.php/GetCrimeGold

        Синтаксис:
        [ActorID.]GetCrimeGold Функция GetCrimeGold возвращает текущее значение "криминального" золота у актера ActorID. «Криминальное Золото» ("Crime Gold") — это текущий штраф, который актер заработал на преступлениях.

        См. также: ModCrimeGold, SetCrimeGold
        Oтносится к типу: Crime Functions | Condition Functions


        GetCrimeKnown
        http://cs.elderscrolls.com/constwiki/index.php/GetCrimeKnown

        Синтаксис:
        [ActorID.]GetCrimeKnown CrimeType, Criminal, Victim  
        Пример:
        GetCrimeKnown 4, EvilJoe, PoorBob
        Функция GetCrimeKnown возвращает 1, если вызывающий актер (ActorID) знает об указанном преступлении (CrimeType).

        См. также: Crime Types
        Oтносится к типу: Crime Functions | Actor Functions


        GetCurrentAIPackage http://cs.elderscrolls.com/constwiki/index...urrentAIPackage

        Синтаксис:
        [ActorID.]GetCurrentAIPackageФункция GetCurrentAIPackage возвращает следующие значения для типов пакетов AI, имеющихся у вызывающего актера ActorID:
          0 = EXPLORE
          1 = FOLLOW
          2 = ESCORT
          3 = EAT
          4 = SLEEP
          5 = COMBAT
          6 = DIALOGUE
          7 = ACTIVATE
          8 = ALARM
          9 = SPECTATOR
          10 = FLEE
          11 = TRESPASS
          12 = GREET
          13 = WANDER
          14 = TRAVEL
          15 = ACCOMPANY
          16 = USEITEMAT
          17 = AMBUSH
          18 = FLEE_NON_COMBAT
          19 = CAST_MAGIC
          20 = COMBAT_LOW
          21 = GET_UP
          22 = MOUNT_HORSE
          23 = DISMOUNT_HORSE
          24 = DO_NOTHING
          25 = CAST_TARGET_SPELL
          26 = CAST_TOUCH_SPELL
          27 = VAMPIRE_FEED
          28 = SURFACE
          29 = SEARCH_FOR_ATTACKER
          30 = CLEAR_MOUNT_POSITION
          31 = SUMMON_CREATURE_DEFEND
          32 = MOVEMENT_BLOCKED
        См. также: GetCurrentAIProcedure
        Oтносится к типу: AI Functions | Condition Functions | Actor Functions


        Награды За огромный вклад в развитие Румора

        Оффлайн Garin

        • *
        • Сообщений: 1564
        • Репутация: 5
        • Пол: Мужской
          • ICQ клиент - 244260055
          • Просмотр профиля
          • tiarum.com
        Учебник "osfm V1.0" Том 1
        « Ответ #19 : 17 Декабрь, 2006, 13:05:29 »
        0
        G 2


        GetCurrentAIProcedure
        http://cs.elderscrolls.com/constwiki/index...rentAIProcedure

        Синтаксис: [ActorID.]GetCurrentAIProcedureФункция GetCurrentAIPackage возвращает следующие значения для типов AI-процедур, имеющихся у вызывающего актера ActorID:
          0 = TRAVEL
          1  = ACTIVATE
          2  = AQUIRE
          3  = WAIT
          4  = DIALOGUE
          5  = GREET
          6  = GREET_DEAD
          7  = WANDER
          8  = SLEEP
          9  = OBSERVE_COMBAT
          10 = EAT
          11 = FOLLOW
          12 = ESCORT
          13 = COMBAT
          14 = ALARM
          15 = PURSUE
          16 = FLEE
          17 = DONE
          18 = YIELD
          19 = TRAVEL_TARGET
          20 = CREATE_FOLLOW
          21 = GET_UP
          22 = MOUNT_HORSE
          23 = DISMOUNT_HORSE
          24 = DO_NOTHING
          25 = CAST_SPELL
          26 = AIM
          27 = ACCOMPANY
          28 = USE_ITEM_AT
          29 = VAMPIRE_FEED
          30 = WAIT_AMBUSH
          31 = SURFACE
          32 = WAIT_FOR_SPELL
          33 = CHOOSE_CAST
          34 = FLEE_NON_COMBAT
          35 = REMOVE_WORN_ITEMS
          36 = SEARCH
          37 = CLEAR_MOUNT_POSITION
          38 = SUMMON_DEFEND
          39 = MOVEMENT_BLOCKED_WAIT
        Отметим, что процедура и текущий пакет - суть не одно и то же. Отдельный пакет может содержать различные возможные процедуры - в зависимости от того, что делает в настоящий момент актер. Например, в пакете "Travel" актер будет выполнять процедуру путешествия - "Travel" (когда актер перемещается к цели назначения), а затем, прибыв в место назначения, он будет выполнять процедуру ожидания - "Wait".
        Процедура может также и не быть связанной с лежащим в ее основе пакетом - какое-нибудь незапланированное событие может заставить актера начать новую процедуру без изменения пакета.
        Смотрите также: GetCurrentAIPackage
        Oтносится к типу: AI Functions | Condition Functions | Actor Functions


        GetCurrentTime
        http://cs.elderscrolls.com/constwiki/index.../GetCurrentTime

        Синтаксис: GetCurrentTimeТип возвращаемого значения: float (вещественное)
        Параметры: нет
        Описание: Функция GetCurrentTime возвращает текущее значение игрового времени в десятичном формате с плавающей запятой.
        Примеры: GetCurrentTime
          1) Текущее игровое время = 4:30 ам (4:30), возвращаемое значение - 4.5
          2) Текущее игровое время = 7:45 рм (19:45), возвращаемое значение - 19.75
        Oтносится к типу: Time Functions


        GetCurrentWeatherPercent
        http://cs.elderscrolls.com/constwiki/index...tWeatherPercent

        Синтаксис: GetCurrentWeatherPercent Функция GetCurrentWeatherPercent возвращает информацию о том, на какой стадии находится процесс смены типа погоды в текущей локации.
        Любое значение в интервале от 0 до 1 говорит о том, что погода меняется.
        Тип: вещественное, в диапазоне от 0 до 1
        Oтносится к типу: Weather Functions | Condition Functions


        GetDayOfWeek
        http://cs.elderscrolls.com/constwiki/index.php/GetDayOfWeek

        Синтаксис: GetDayOfWeekОписание: Функция GetDayOfWeek возвращает текущее значение дня недели.
        Тип возвращаемого значения: short (целочисленное короткое)
        Параметры: нет
        Возвращаемые значения:

        Возвр.знач.Игров. день неделиДень недели
        0Sundasвоскресенье
        1Morndasпонедельник
        2Tirdasвторник
        3Middasсреда
        4Turdasчетверг
        5Fredasпятница
        6Loredasсуббота

        Oтносится к типу: Time Functions


        GetDead
        http://cs.elderscrolls.com/constwiki/index.php/GetDead

        Синтаксис: [ActorID.]GetDead
        Пример: BossGoblin.GetDead  Функция GetDead возвращает истину, если вызывающий объект ActorID мертв.
        См. также: GetDeadCount
        Oтносится к типу: Actor State Functions | Condition Functions | Actor Functions


        GetDeadCount
        http://cs.elderscrolls.com/constwiki/index.php/GetDeadCount

        Синтаксис: GetDeadCount ActorBaseType Пример: GetDeadCount Goblin Функция GetDeadCount возвращает общее количество убитых существ/NPC указанного типа (ActorBaseType). Заметьте, что параметр ActorBaseType — это базовый тип актеров, например, гоблины или спригганы, поэтому вы не сможете использовать эту функцию, чтобы проверить, был ли убит конкретный объект, указав его ActorID.
        См. также: GetDead
        Oтносится к типу: Actor State Functions | Condition Functions


        GetDestroyed
        http://cs.elderscrolls.com/constwiki/index.php/GetDestroyed

        Синтаксис: [ActorID.]GetDestroyed Функция GetDestroyed возвращает 1, когда вызывающий актер (ActorID) помечен на уничтожение, и 0 — во всех других случаях.
        Oтносится к типу: Miscellaneous Functions | Condition Functions


        GetDetected
        http://cs.elderscrolls.com/constwiki/index.php/GetDetected

        Синтаксис: [ActorID.]GetDetected TargetID    
        Пример: GetDetected player    
        Функция GetDetected возвращает 1, если вызывающий актер (ActorID) в данный момент заметил указанную цель - TargetID.
        См. также: IsActorDetected, GetDetectionLevel, Category:Detection
        Oтносится к типу: Actor State Functions | Condition Functions | Actor Functions


        GetDetectionLevel
        http://cs.elderscrolls.com/constwiki/index...tDetectionLevel

        Синтаксис: [ActorID.]GetDetectionLevel TargetActor    
        Пример: ScaryGuard.GetDetectionLevel player    
        Функция GetDetectionLevel используется для проверки текущего уровня обнаружения вызывающим актером (ActorID) указанной цели (TargetActor).
        Возможны следующие уровни обнаружения:

        0Потерян (Lost)
        1Не виден (Unseen)
        2Замечен (Noticed)
        3Виден (Seen)

        См. также: GetDetected, IsActorDetected, Category:Detection
        Oтносится к типу: Crime Functions | Condition Functions | Actor Functions


        GetDisabled
        http://cs.elderscrolls.com/constwiki/index.php/GetDisabled

        Синтаксис: [ActorID.]GetDisabledФункция GetDisabled возвращает 1, если вызывающий актер (ActorID) отключен.
        См. также: Enable, Disable
        Oтносится к типу: Object Functions | Condition Functions


        GetDisease
        http://cs.elderscrolls.com/constwiki/index.php/GetDisease

        Синтаксис: [ActorID.]GetDiseaseФункция GetDisease возвращает 1, если вызывающий актер (ActorID) заражен.
        Oтносится к типу: Actor State Functions | Condition Functions | Actor Functions


        GetDisposition
        http://cs.elderscrolls.com/constwiki/index.../GetDisposition

        Синтаксис: [ActorID.]GetDisposition TargetActor    
        Пример: GetDisposition BaurusПараметры:
           ActorID - ID вызывающего персонажа, необязательный
           TargetActor - указанный ID целевого актера    
        Функция GetDisposition возвращает текущее отношение вызывающего актера (ActorID) к указанному целевому актеру (TargetActor). Учитываются все модификаторы, в данный момент влияющие на отношение.
        Oтносится к типу: Statistics Functions | Condition Functions | Actor Functions


        GetDistance
        http://cs.elderscrolls.com/constwiki/index.php/GetDistance

        Синтаксис: [ObjectID1.]GetDistance ObjectID2Функция GetDistance возвращает расстояние в игровых единицах длины от вызывающего объекта (ObjectID1) до указанного явно объекта "ObjectID2".
        Игровые единицы игры Обливион соответствуют таковым для Morrowind.
        К примеру, длина внешней ячейки равна 4096 единицам (units).
        Подробнее о единицах длины см. здесь: Oblivion Units
        Примеры:GetDistance TestMarkerRef Set distance to Getdistance PlayerRef Actor
        Begin OnActivate
            set Actor to GetActionRef
            if Getdistance Actor > 70
                 messagebox "Подойдите поближе, мой друг!"
            endif
        end
        Oтносится к типу: Movement Functions | Condition Functions


        GetDoorDefaultOpen
        http://cs.elderscrolls.com/constwiki/index...DoorDefaultOpen

        Синтаксис: [DoorID.]GetDoorDefaultOpen Функция GetDoorDefaultOpen возвращает 1, если дверь (DoorID) открыта по-умолчанию, и 0 — если по-умолчанию закрыта.
        Состояние по-умолчанию — это состояние двери, в которое она вернется после того, как ячейка выгрузится из памяти и игрок вновь войдет в нее, вне зависимости от того, в каком состоянии она осталась перед этим. Состояние по-умолчанию может быть задано через редактор в окне редактирования свойств объекта, или через скрипт командой SetDoorDefaultOpen.
        Oтносится к типу: Miscellaneous Functions | Condition Functions


        GetEquipped
        http://cs.elderscrolls.com/constwiki/index.php/GetEquipped

        Синтаксис: [ActorID.]GetEquipped ObjectID
        Функция GetEquipped возвращает 1, если вызывающий актер (ActorID) одет в одежду ObjectID.
        Тип возвращаемой переменной - long (целочисленная длинная)
        См. также: OnEquip, OnActorEquip
        Oтносится к типу: Object Functions | Condition Functions | Actor Functions


        GetFactionRank
        http://cs.elderscrolls.com/constwiki/index.../GetFactionRank

        Синтаксис: [ActorID.]GetFactionRank FactionID
        Пример: GetFactionRank FightersGuild
        Функция GetFactionRank возвращает ранг вызывающего актера (ActorID) во фракции FactionID. Если актер не числится в указанной фракции, функция возвратит "-1".
        См. также: GetFactionRankDifference, GetInFaction, ModFactionRank, SetFactionRank
        Oтносится к типу: Faction Functions | Condition Functions | Actor Functions


        GetFactionRankDifference
        http://cs.elderscrolls.com/constwiki/index...nRankDifference

        Синтаксис: [ActorID.]GetFactionRankDifference FactionID TargetActor     
        Пример: GetFactionRankDifference FightersGuild JoeFightersGuildRef  
        Функция GetFactionRankDifference возвращает разницу в рангах между вызывающим актером (ActorID) и указанным целевым актером (TargetActor) в указанной фракции FactionID.
        Oтносится к типу: Faction Functions | Condition Functions | Actor Functions


        GetFactionReaction
        http://cs.elderscrolls.com/constwiki/index...FactionReaction

        Синтаксис: GetFactionReaction FactionID1 FactionID2Пример: GetFactionReaction FightersGuild BlackwoodCompanyФункция GetFactionReaction возвращает реакцию одной фракции (FactionID1) по отношению ко второй (FactionID2).
        Oтносится к типу: Faction Functions | Condition Functions


        GetFatiguePercentage
        http://cs.elderscrolls.com/constwiki/index...tiguePercentage

        Синтаксис: [ActorID.]GetFatiguePercentageФункция GetFatiguePercentage возвращает текущую усталость вызывающего актера (ActorID), как долю от базового показателя в диапазоне (0.0 ... 1.0).
        Тип: Вещественное, в диапазоне от 0 до 1
        Параметры: ActorID - ID персонажа, необязательный
        Oтносится к типу: Statistics Functions | Condition Functions | Actor Functions


        GetForceRun
        http://cs.elderscrolls.com/constwiki/index.php/GetForceRun

        Синтаксис: [ActorID.]GetForceRunФункция GetForceRun возвращает 1, если актер (ActorID) в данный момент  находится в состоянии бега.
        См. также: SetForceRun
        Oтносится к типу: Actor State Functions | Condition Functions | Actor Functions


        GetForceSneak
        http://cs.elderscrolls.com/constwiki/index.php/GetForceSneak

        Синтаксис: [ActorID.]GetForceSneakФункция GetForceSneak возвращает 1, если вызывающий актер (ActorID) находится в состоянии скрытности.
        См. также: SetForceSneak
        Oтносится к типу: Actor State Functions | Condition Functions | Actor Functions


        GetFriendHit
        http://cs.elderscrolls.com/constwiki/index.php/GetFriendHit

        Синтаксис: [ActorID.]GetFriendHit TargetActor     
        Пример: FriendlyGuard.GetFriendHit player    
        Функция GetFriendHit возвращает число «дружеских» ударов, нанесенных вызывающему актеру (ActorID) указанным актером TargetActor.
        Oтносится к типу: Combat Functions | Condition Functions | Actor Functions


        GetFurnitureMarkerID
        http://cs.elderscrolls.com/constwiki/index...rnitureMarkerID

        Синтаксис: GetFurnitureMarkerIDФункция GetFurnitureMarkerID возвращает 0 для сломанных вещей, 1...10 - для кроватей и 11...20 для стульев. Это узлы маркеров (FurnitureMarker), встроенные в объекты мебели, которую актер может использовать. Эта функция используется менеджером анимации (idle manager), чтобы выбрать нужную анимацию для начала или конца использования мебели. Например, когда актер садится на стул, функция возвратит его тип, чтобы он проиграл анимация корректно.
        Oтносится к типу: Object Functions | Condition Functions


        GetGameSetting
        http://cs.elderscrolls.com/constwiki/index.../GetGameSetting

        Синтаксис: GetGameSetting GameSettingName
        getGS GameSettingName
        Примеры: GetGameSetting fBribeBase Функция GetGameSetting возвращает значение указанной игровой настройки GameSettingName.
        См. также: Con_SetGameSetting (OBSE)
        Oтносится к типу: Miscellaneous Functions


        GetGlobalValue
        http://cs.elderscrolls.com/constwiki/index.../GetGlobalValue

        Синтаксис: GetGlobalValue GlobalVariableName Пример: GetGlobalValue GameDaysPassedФункция GetGlobalValue возвращает значение указанной глобальной переменной GlobalVariableName.
        Примечание: Доступна только как функция условия в диалоге. В обычных скриптах можно просто использовать имя глобальной переменной:
        set myVar to GameDaysPassed
        См. также: GetQuestVariable, GetScriptVariable
        Oтносится к типу: Miscellaneous Functions | Condition Functions


        GetGold
        http://cs.elderscrolls.com/constwiki/index.php/GetGold

        Синтаксис: [ActorID.]GetGoldПараметры:
           ActorID - ID персонажа, необязательный.
        Функция GetGold возвращает общее количество золота у указанного актера (ActorID).
        Oтносится к типу: Statistics Functions | Condition Functions | Actor Functions


        GetHeadingAngle
        http://cs.elderscrolls.com/constwiki/index...GetHeadingAngle

        Синтаксис: [ActorID.]GetHeadingAngle ObjectRefIDПример: GetHeadingAngle StrangeStatueФункция GetHeadingAngle возвращает угол поворота между вызывающим объектом (ActorID) и указанным явно объектом ObjectRefID в пределах от -180 до 180.
        Например, игрок смотрит на север. Объект StrangeStatue находится к западу от игрока. Вызов следующей команды вернет "-90" градусов:
        player.GetHeadingAngle StrangeStatue Если добавить это значение к текущему повороту игрока, он повернется лицом к статуе:
        set angle to player.getangle z + player.GetHeadingAngle StrangeStatue
          player.setangle z angle
        Oтносится к типу: Movement Functions | Condition Functions


        GetIdleDoneOnce
        http://cs.elderscrolls.com/constwiki/index...GetIdleDoneOnce

        Синтаксис: GetIdleDoneOnceФункция GetIdleDoneOnce используется в менеджере анимации (idle manager), чтобы пометить определенное анимационное движение (idle) для одиночного проигрывания в конкретной ситуации.
        Например, если вы вставите анимацию приветствия (salute idle) в  приветственный диалог, происходящий между двумя NPC, и выставите в диалоге GetIdleDoneOnce == 1, то в игре NPC выполнят ее всего один раз, а затем будут пропускать ее до конца диалога.
        Oтносится к типу: Miscellaneous Functions | Condition Functions


        GetIgnoreFriendlyHits
        http://cs.elderscrolls.com/constwiki/index...oreFriendlyHits

        Синтаксис: [ActorID.]GetIgnoreFriendlyHits    
        Функция GetIgnoreFriendlyHits возвращает 1, если вызывающий актер (ActorID) в данный момент игнорирует «дружеские» удары.
        См. также: SetIgnoreFriendlyHits
        Oтносится к типу: Combat Functions | Condition Functions | Actor Functions


        Награды За огромный вклад в развитие Румора

        Теги:
         

        Учебник "OSFM v1.2"

        Автор GarinРаздел Скриптинг под TES IV

        Ответов: 15
        Просмотров: 5564
        Последний ответ 04 Апрель, 2012, 21:34:30
        от salad0rec
        Учебник по созданию квестов "Quest Tutorial"

        Автор GarinРаздел Туториалы по TES 4 Oblivion

        Ответов: 0
        Просмотров: 5542
        Последний ответ 13 Январь, 2007, 23:12:49
        от Garin
        Запись в команду "OSFM Team"

        Автор GarinРаздел Скриптинг под TES IV

        Ответов: 3
        Просмотров: 6124
        Последний ответ 13 Декабрь, 2007, 00:42:25
        от Garin
        Работа над заказным плагином Dan"а

        Автор DanРаздел Плагины для TES 3: Morrowind

        Ответов: 31
        Просмотров: 17764
        Последний ответ 30 Октябрь, 2005, 11:27:41
        от N 34
        О проекте "Систематизация Lore".

        Автор FinveРаздел Вселенная TES

        Ответов: 1
        Просмотров: 2569
        Последний ответ 10 Март, 2011, 06:54:20
        от Tiara
        Плагин "старый Замок"

        Автор ~Max960~Раздел Плагины для TES 3: Morrowind

        Ответов: 4
        Просмотров: 5156
        Последний ответ 20 Январь, 2006, 09:10:01
        от ~Max960~
        Туториал "Лошадь на продажу" (Horse For Sale Tutorial)

        Автор GarinРаздел Туториалы по TES 4 Oblivion

        Ответов: 0
        Просмотров: 1730
        Последний ответ 09 Декабрь, 2006, 01:19:04
        от Garin
        Removing "placeatme Objects"

        Автор GarinРаздел Туториалы по TES 4 Oblivion

        Ответов: 0
        Просмотров: 1178
        Последний ответ 09 Декабрь, 2006, 02:04:02
        от Garin
        "без Ключа Не Пройдешь!"

        Автор GL.SamРаздел Архив готовых скриптовых решений

        Ответов: 0
        Просмотров: 2075
        Последний ответ 08 Январь, 2007, 04:05:14
        от GL.Sam
        Руководство для начинающих "a Beginner's Guide"

        Автор GarinРаздел Туториалы по TES 4 Oblivion

        Ответов: 1
        Просмотров: 5387
        Последний ответ 14 Январь, 2007, 01:30:40
        от Garin

        Поиск

         
        Top
        SimplePortal 2.3.5 © 2008-2012, SimplePortal