Существует особенности скриптов TES, которые нужно объяснить до того, как мы пойдем разбирать их дальше.
Начало и завершение скриптов
Begin Script_ID
End
End Script_ID
Каждый скрипт должен иметь команду Begin и End!
Имя «Script_ID» - это имя скрипта, по которому он будет отличаться от других.
Хотя чаще пишется как ИмяСкрипт т.к. MyFirstScript, а не ScriptMyFirst.
Скрипт может начинаться и с комментариев, но первой строчкой кода должен быть «Begin xxxxx»В большинстве случаев не важно как вы завершаете скритп End или End “Script_ID”. Вообще, лично я всегда использовал End. (Прим. Gwathlobal)..
Как и с другими объектами, рекомендуется давать скрипам уникальное имя.
Я лично использую GBG_Scriptname.
Так все мои скрипты легко находятся в одном блоке в списке скриптов и вряд ли будут конфликты с модами, использующими такое же имя.
Использовать подчеркивание (т.е. _Scriptname) не рекомендуетсяПозволю себе не согласиться. Лично я использовал и все работало как часы. (Прим. Gwathlobal)..Лучше сделать так; MyNikName_number_MyNameScript
Т.е. в качестве префикса использовать либо (свой НикНейм)(Название Плагина, что правовернее)
Далее номер скрипта, либо алфавитное значение.
И затем Имя скрипта.
- выделит скрипты проекта в группу, что будет удобно для поиска и выбора.
- отсортирует скрипты по группам и порядку. Так можно создавать группу скриптов для какого-то действия.
- уникальное имя скрипта описывающие, что он делает.
G7_A1_TestTestTestScript
И будет это звучать примерно, как:
Гритнес7 составил сей скрипт в своем плагине Первым для целей теста и еще раз теста и просто тестовых целей.
Впрочем, для небольших плагинов с одни двумя скриптами, не так чтоб нужно так заморачиватья.
If you want your scripts to appear at the top of the list of scripts, put a 1 in front, for example, 1YAC_ScriptName (мсфд9)
Общий синтаксис функций:
Функции не различаются по регистру, но все равно рекомендуется писать со строчными и прописными для облегчения чтения (напр. GetSpellEffects вместо getspelleffects).
"Object_ID"->Function, [параметры]
Это формат для всех функций, взаимодействующих или относящихся к определенному объекту в игре.
«Стрелка» указывает, на какой объект вызовется функция.
“Object_ID” – это уникальный идентификатор (не имя!)т.е. это ID объекта в редакторе, а не название оного. , который присваивается каждому объекту в редакторе (первая колонка).
Если не указать объект, то функция будет вызвана на объект по умолчанию, т.е. которому присвоен скрипт.
Т.е. если скрипт локальный и повешен на некий объект через опцию Script в его настройках.
Если же скрипт глобальный и не повешен на объект, будет выдана ошибка некоего рода.
Некоторые функции можно вызывать с другим объектом в качестве параметра:
"Object_ID1"->Function, "Object_ID2"
Примечание: Функции с «стрелкой» будут компилироваться, если только объект уже был помещен в игровой мир в редакторе (то есть имеет хотя бы одну копию).
В некоторых функциях использование «стрелки» бессмысленно и даже может привести к ошибкам, напр.
В функция которые по умолчанию вызываются для игрока (напр. GetDetected, GetPCRank и т.д.)
Использование «стрелки» для неуникальных объектов приведет к вызову функции только для первого объекта!
Так что использование в глобальном скрипте:
"cliff racer"->SetHealth, 0
не приведет к желаемому эффекту, а только убьет одну из этих надоедливых тварей.
Однако прикрепление скрипта на монстра с командой:
SetHealth, 0
сделает чудеса, потому что каждая копия скального наездника будет иметь скрипт и применять функцию на себя.
Ряд функций относится только к игроку или вообще не относятся к объектам, а потому не используются со стрелкой. Напр:
If ( GetPCRank == 0 )
If ( CellChanged == 0 )
FadeOut, 2
Общий синтаксис: запятые, скобки и пробелы.
К скриптам TES не предъявляется слишком высоких требований по синтаксису.
Запятые могут быть пропущены, а пробелы в большинстве случаев игнорируются.
Тем не менее, я бы посоветовал следовать следующим принципам:
-
Используйте запятые между параметрамиНикогда не использовал, проблем замечено не было. (Прим. Gwathlobal)Здесь скорее вопрос удобства чтения а не работы механизма скриптов в целом.
Т.е. запятые позволяют лучше читать скрипт, а не влияют на его работу в целом.
-
Если вы используете
ID, содержащий пробелы, то нужно заключить его в кавычки: "Object ID". А еще лучше писать вместо пробелов знак подчеркивания: Object_ID.То же самое, если используете ID, начинающийся с подчеркивания. Нужно использовать кавычки. (Прим. Gwathlobal)
-
Всегда оставляйте пробелы между операторами, скобками и переменными: if ( variable == 1 ),
-
а не: if (variable==1), Object_ID1 -> Function, Object_Id2, а не Object_ID1->Function,Object_ID
-
Хотя часто это не имеет значения, иногда это создает странные и непредсказуемые ошибкиНасчет пробелов перед и после стрелки – не знаю. Один раз использовал и это породило ошибку при компиляции. Убрал – все заработало. В другой раз – без пробелов не работало. Так что когда как. С остальным согласен. (Прим. Gwathlobal).
-
(От 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"
вызывает ошибки Ну, естественно. В первом случае, объект с подчеркиванием заключен в кавычки, а во втором – нет. Вот редактор и ругается. Чтобы все работало, нужно закавычить и объект перед «стрелкой». То же самое и с переменными. (Прим. Gwathlobal).
По крайней мере, одно из руководств по моддерству рекомендовало использовать подчеркивание в начале ID объектов, потому что так они собираются в начале списков объектов и их легко найти. Я и многие люди последовали этом совету. Подчеркивание в переменных также ведет к непредсказуемым результатам: иногда они работают, иногда нет.
Так что я НЕ использую подчеркивание ни для чего в CS.
Комментарии
Комментарии обозначаются точкой с запятой (;). Они могут быть добавлены на новой строке или в конце строки с кодом
; вход в крадущийся режим
Fargoth->ForceSneak
Fargoth->AiTravel -11468.595,-71511.531,173.728 ;идет к дереву
Отступы / использование табуляторов
Ради вашего же блага, используйте отступы (табуляторы) в конструкциях if-elseif – это дает возможность гораздо легче их воспринимать, и вы вряд ли забудете поставить
endif в конце. В разделе Советы и Трюки вы найдете ссылку на внешний редактор скриптов EMACS, который будет автоматически оставлять отступы.
If ( variable1 )
If ( variable2 )
[делать что-то]
endif
endif
лучше, чем:
If ( variable1 )
If ( variable2 )
[делать что-то]
endif
endif