Суббота, 05.10.2024, 13:30

Приветствую Вас Странник | RSS
The Elder Scrolls:Morrowind
ГлавнаяРегистрацияВход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Общие Сведения: Скрипты, Команды и Синтаксис
Sm1LeRДата: Суббота, 10.11.2007, 21:24 | Сообщение # 1
Болтун
Группа: Администраторы
Сообщений: 41
Репутация: 2
Статус: Offline
Типы скриптов
Локальные скрипты
Локальный скрипт – это любой скрипт, привязанный к объекту или персонажу в игре (назначенный в выпадающем поле “Script” окна объекта в TESCS). Локальные скрипты активны только тогда, когда загружена ячейка – в помещении та, в которой находится игрок, а на улице – та, в которой находится игрок плюс все, непосредственно к ней прилегающие. Если объект оказывается за указанными пределами (в неактивной ячейке), то его скрипт «выключается», но перед этим, при выходе игрока из ячейки, все локальные переменные скрипта сохраняются.
Глобальные скрипты
Глобальный скрипт – это любой скрипт, не привязанный ни к какому объекту. По умолчанию глобальные скрипты не выполняются до тех пор, пока вы их не вызвали (см. ниже). Нужно отметить, что для глобального скрипта не существует объекта «по умолчанию», поэтому его объект всегда должен быть непосредственно указан. В то время, как следующая конструкция отлично работает в локальном скрипте, будучи привязанной к конкретному NPC:

AITravel 1150, 8899, 1110

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

“NPC_ID” -> AITravel 1150, 8899, 1110
;NPC_ID – это уникальный идентификатор для каждого объекта в TESCS

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

StartScript, "Script ID"

С установленными аддонами Tribunal и Bloodmoon у вас также появится возможность запускать скрипты автоматически с загрузкой игры. В TESCS выберите в меню Gameplay->Edit starting Scripts — там вы можете добавить любой скрипт в список автостарта.

Вот функция для остановки глобального скрипта:

StopScript, "Script ID"

Есть возможность использовать функцию, чтобы запускать глобальные скрипты, привязанные к объекту или Актеру. Это так называемые "целевые скрипты".

"Object_ID" -> StartScript "Script_ ID"

Эти скрипты объединяют в себе локальные (в том, что все вызываемые функции по умолчанию применяются к объекту или Актеру, указанному в качестве цели скрипта) и глобальные скрипты (в том, что они исполняются всегда и могут быть остановлены при помощи команды StopScript).



....будь умнЕЕ!!...

Сообщение отредактировал Sm1LeR - Суббота, 10.11.2007, 21:24
 
Sm1LeRДата: Суббота, 10.11.2007, 21:24 | Сообщение # 2
Болтун
Группа: Администраторы
Сообщений: 41
Репутация: 2
Статус: Offline
Синтаксис
В скриптовом языке TES существует несколько особенностей, которые мы должны разобрать до того, как углубимся в детали.
Начало и конец скрипта

Begin Script_ID
End
End Script_ID

В каждом скрипте должны присутствовать команды “Begin” и “End”. Данное скрипту имя также является его уникальным ID, по которому вы будете ссылаться на данный скрипт (как из других скриптов, так и в окнах TESCS). Скрипт, конечно, может начинаться с комментариев, но первая строка исполняемого кода – это в любом случае “Begin xxxxxxxxx”.
Общий синтаксис для функций:
"Object_ID" -> Function, [parameters]

Эта «стрелка», или «фикса», обозначает объект, с которым будет работать вызываемая функция. “Object_ID” – это уникальный идентификатор, присваиваемый каждому объекту в редакторе TESCS (обычно это первое поле в окне любого объекта). Вам нужен именно этот ID, а не имя объекта! Если вы попробуете вызвать функцию без указания ID целевого объекта, функция будет работать с объектом «по умолчанию». Объект «по умолчанию» - тот, к которому привязан данный скрипт. Правда, это не значит, что не может быть другого объекта, вызываемого в качестве параметра:
"Object_ID1" -> Function, "Object_ID2"
Функции нечувствительны к регистру, но использование заглавных букв, предложенное Bethesda Software (например, GetSpellEffects вместо getspelleffects), делает скрипты более читабельными, - рекомендуется придерживаться данного стиля.
Общий синтаксис: запятые, скобки и пробелы
Скрипты TES не очень-то щепетильны в плане синтаксиса. Регистр букв обычно не имеет значения, запятые иногда можно пропускать, пробелы по большей части игнорируются. Однако я бы все же рекомендовал придерживаться здесь определенных принципов:
Ставьте запятые между перечисляемыми параметрами
Если какой-то ID содержит пробелы, следует указывать его в кавычках: “Object ID”, а лучше вообще заменять пробелы подчеркиванием: Object_ID
Заведите полезную привычку всегда оставлять пробелы после скобок и команд, если не хотите неприятных сюрпризов:
например “if ( variable == 1 )”, а не “if(variable==1)”;
или ”Object_ID1 -> Function, Object_ID2”, а не “Object_ID1->Function,Object_ID2”.
В большинстве случаев это не имеет значения, зато создает мешанину, от которой рябит в глазах – в результате появляются ошибки, отследить которые в крупных скриптах практически невозможно.
(От Dinkum Thinkum:) Начальные символы подчеркивания в ID объектов и переменных дают неверные результаты в редакторе скриптов: где-то они работают хорошо, а в других местах редактор ругается на них (обычно выдает сообщения об ошибках, которых не на самом деле…). Например:
PlaceItemCell, "_dt_Racial_ClothierNord", "Vivec, Agrippina Herennia: Clothier", -348, 48, -221, 0
отлично работает, а
_dt_Racial_ClothierNord -> PositionCell, -348, 48, -221, 0, "Vivec, Agrippina Herennia: Clothier"
выдает ошибки.
По крайней мере одно из стандартных руководств по моддингу советует давать объектам ID с начальным символом подчеркивания, чтобы их было легче найти. Я последовал этому совету, как и много других людей (просматривая чужие моды). Начальные символы подчеркивания для переменных также нежелательны в скриптах: где-то они работают, где-то нет. Так что теперь моя политика НЕ использовать начальный символ подчеркивания нигде в КС.
Табуляция
Для вашего же блага, пользуйтесь табуляцией, работая с управляющими конструкциями типа “If - ElseIf” – это позволяет легче отслеживать ход скрипта, и вы не забудете поставить в нужном месте “EndIf”.

If ( variable1 )
If ( variable2 )
[do something]
endif
endif

лучше, чем

If ( variable1 )
If ( variable2 )
[do something]
endif
endif


....будь умнЕЕ!!...
 
Sm1LeRДата: Суббота, 10.11.2007, 21:26 | Сообщение # 3
Болтун
Группа: Администраторы
Сообщений: 41
Репутация: 2
Статус: Offline
Переменные
Объявление переменных
В скриптовом языке TES предусмотрено три типа переменных: short, long и float. Согласно документации, они покрывают следующие области исчисления:

Short -32,768 to 32,767 (целые числа со знаком)
Long -2,147,483,648 to 2,147,483,647 ( длинные целые числа со знаком)
Float 3.4E +/- 38 (числа с плавающей десятичной точкой, точность 7 разрядов)

По видимому границы для типа Long, указанные здесь, верны лишь отчасти, в TES-CS вы можете присвоить максимальное значение в 2147483520 (Форум.инф. / Argent).
Теоретически должны существовать и строковые переменные, но мне об этом ничего пока не известно. К сожалению, не существует также особого типа данных для хранения ID объектов, и это в определенной степени ограничивает мощность скриптов TES как языка.
Переменные можно подразделить на локальные (область действия ограничена одним скриптом) и глобальные (область действия – любой и каждый скрипт).
Локальные переменные
Локальные переменные нужно объявлять в скрипте так:

Float floatvarname
Short shortvarname
Long longvarname

Локальные переменные имеют область видимости в пределах конкретного экземпляра родного скрипта, и в этих пределах они сохраняют уникальность. Поэтому локальные переменные в нескольких объектах, которым назначен один и тот же скрипт, никак не перекрываются, и не взаимодействуют друг с другом. Имена, которые вы назначаете своим переменным, в большей степени остаются на вашей совести, не считая того, что имя переменной должно начинаться с буквы. Однако не стоит назначать переменным имена, идентичные функциям языка (это приведет к ошибке во время выполнения), равно как и использовать зарезервированные символы (+, -, /, *, =, “ и др.). Например, “variable-1” не сработает в качестве имени переменной. Символы подчеркивания, как в “my_variable” – наоборот, вполне законны. Точка тоже имеет зарезервированное значение (см. ниже, раздел Ссылка на переменные в других локальных скриптах).

Глобальные переменные
Чтобы объявить глобальную переменную, нужно в TESCS в меню “Gameplay” выбрать пункт “Globals”. Воспользуйтесь ПКМ, чтобы вызвать выпадающее меню, и выберите “New”. Назовите переменную, укажите ее тип и начальное значение (по умолчанию — ноль). Глобальные переменные могут быть незаменимы в работе с большими квестами, когда нужно отслеживать ход событий, развернутых в большом пространстве и на протяжении значительного времени. Кроме того, глобальные переменные – это простейший путь для обмена информацией между разными скриптами.
Примечание: если вы объявляете локальную переменную с таким же именем, как у глобальной переменной, то глобальная переменная становится невидимой для этого скрипта. В таком случае НЕ объявляйте глобальную переменную!
Ссылка на переменные в других локальных скриптах
Если уникальному объекту назначен локальный скрипт, вы можете менять его переменные вне этого скрипта вот так:

Set MyObject.variable to 100

или так

Set MyObject.variable to local_variable

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

Обратите внимание, обратный синтаксис не сработает:

Set local_variable to MyObject.variable ;не работает!

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

if ( anotherobject.x > 0 )

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

set Global_script_name.variable to 1

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

Примечание: Для некоторых функций, когда существуют и Get-, и Set-методы, есть способ обойти это ограничение с помощью функции “While” (см. ниже).
Математические операции
Вы можете пользоваться стандартными арифметическими операндами в командах типа “Set” (и возможно, где-то еще, но я не пробовал), чтобы выполнять в скриптах расчеты:

Сложение: +
Вычитание: -
Умножение: *
Деление: /

Синтаксис должен быть следующим:

Set result_var to (var_a + var_b)

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

set ln to ( ln + ( k10 * math_ln10 ) + ( k2 * math_ln2 ) )

Предупреждение: похоже, что с очень длинными операциями сложения (например, сложение более 20 переменных в одной строке кода) есть какая-то проблема. Если при загрузке игра «падает», попробуйте разбить одно длинное вычисление на несколько коротких, в разных строках. <У меня был ОЧЕНЬ плохой опыт использования более чем одного оператора в линии, но может это только у меня.>

В скриптах Морроувинда не так много математических функций. Есть функция “Random”, и еще добавленная в Трибунале “GetSquareRoot” (см. ниже). Если вам нужны более сложные функции, предлагаю вам скачать “Math Mod”, который создал Solaris в виде коллекции скриптов, позволяющих выполнять довольно сложные вычисления. Вот небольшая вырезка из readme-файла, просто, чтобы дать вам представление, о чем речь:

"Этот мод добавляет возможность использовать различные матем.функции в скриптах Морроувинда.
Эти скрипты добавляют следующее:"


Name Check/Done Inputs Outputs Accuracy
MathScripts N/A N/A N/A N/A
MathConstants N/A N/A N/A N/A
SquareRoot 1 math_sqrt math_result, math_imag 7
SineScript 2 math_angle math_sin, math_cos, math_tan 7
ArcsineScript 3 math_arc math_sin, math_cos 6-7
NaturalLog 4 math_log math_result, math_imag 4-5
LogScript 5 math_log, math_base math_result, math_imag 3-4
intPower 6 math_value, math_power math_result 7
intRoot 7 math_value, math_root math_result, math_imag 6-7
Modulus 8 math_value, math_mod math_result 6-7
Antiln 9 math_log math_result 4-5
Antilog 10 math_log, math_base math_result 2-3
AbsoluteValue 11* math_abs math_abs 7
PowerScript 12 math_value, math_power math_result, math_imag 2-3


....будь умнЕЕ!!...
 
Sm1LeRДата: Суббота, 10.11.2007, 21:27 | Сообщение # 4
Болтун
Группа: Администраторы
Сообщений: 41
Репутация: 2
Статус: Offline
Проверка условий
Использование конструкции “If… ElseIf”
Немалая часть скриптов в TES использует управляющие конструкции типа “If… ElseIf” в различных вариациях. Очень важно добиться их полного понимания, равно как и понимания условий, которые в них могут использоваться для определения состояния игры и, соответственно, запуска тех или иных событий. Традиционно условие считается «верным», когда проверяющая его функция возвращает значение «1» (или просто «not 0» (не равно нулю) во многих языках программирования. (напр. -1 "истина" в Скриптах TES) и "ложь", когда значение 0. Есть определенные функции, которые возвращают значение «верно» только при определенных условиях. Например, обратите внимание на функцию “GetAIPackageDone”, приведенную ниже. Она возвращает значение «верно» (= 1) в течение одного фрейма, когда “AIPackage” закончила свою работу.
Так, выражения:

If ( GetAIPackageDone )

endif

и

if ( GetAIPackageDone == 1 )

endif

равнозначны. Второй вариант проверяет условие и возвращает «верно» при найденном соответствии. Можете еще проверить, как работают такие способы проверки условий:


«Равно» ==
«Не равно» !=
«Больше чем» >
«Меньше чем» <
«Больше или равно» >=
«Меньше или равно» <=

Также вы можете пользоваться командами “Else” и “ElseIf”. “ElseIf” проверяет отдельное условие, а то, что после “Else”, выполняется только в случае, когда ни одно из предыдущих условий не оказалось соответствующим действительности («верным»).

If ( foo_var == 1 )
[делаем что-то]
elseif ( foo_var == 2 )
[делаем что-то еще]
else
[делаем что-то совершенно иное]
endif

Из моего опыта, надежнее использовать “ElseIf” вместо нескольких отдельных “If”, если вы проверяете различные состояния одной переменной.
Существует максимально возможное количество конструкций “If - ElseIf”, которые могут вместе работать в одном скрипте. Я не уверен, но по-моему это число где-то в районе 256.
Конструкция “While”
While ( condition )
; планируемые действия
EndWhile

Команда “While” отличается от команды “If” тем, что выполняется в течение одного фрейма до тех пор, пока поставленное условие не будет достигнуто. Это лучше пояснить на примере:

Short desiredAmnt

SetStrength 0
while( GetStrength < desiredAmnt ) ; неконкретное значение, которого нужно достичь
modStrength 1
endwhile

Данный скрипт доведет значение атрибута Силы до значения, указанного в переменной desiredAmnt по прошествии одного фрейма. А вот следующий скрипт потребует неопределенного количества фреймов, чтобы сделать то же самое, потому что конструкция “If” выполняется один раз за фрейм:

if(getStrength < desiredAmnt) ; неконкретное значение, которого нужно достичь
modStrength 1
endif

С другой стороны, первый пример мог бы в принципе вызвать «зависание» (если значение, которого нужно достичь, окажется слишком велико), а второй пример – нет.
Заметьте, что это может послужить решением проблемы в случае с функциями, не принимающими неконкретные значения (переменные) в качестве аргументов.
Моделирование Булевых (логических) операций в скриптах TES
К сожалению, в скриптах TES отсутствуют операторы логических отношений (Булевские AND, OR, NOT, XOR, …), поэтому вам придется при нужде смоделировать их собственноручно, используя конструкции управления типа “If – ElseIf”.

Вместо AND:
if ( variable1 AND variable2 ); такого не существует
[делаем что-то]
endif

вам придется использовать:
If ( variable1 )
If ( variable2 )
[делаем что-то]
endif
endif

Вместо OR:
if ( variable1 OR variable2 )
[делаем что-то]
endif

вы можете употребить:

If ( variable1 )
[делаем что-то]
elseif ( variable2 )
[делаем что-то]
endif


....будь умнЕЕ!!...
 
  • Страница 1 из 1
  • 1
Поиск:


Copyright MyCorp © 2024Конструктор сайтов - uCoz