- 19 Страниц
- 1
- 2
- 3
- →
- Последняя »
Уголок скриптолога Скрипты для TES4 CS: что, где, почем
#1
Отправлено 23 Декабрь 2006 - 18:22
Соответственно здесь я буду выкладывать свои наработки. Начну я с азов.
1. Инструментарий. В первую очередь - это сам CS. Кроме того, есть программа TES Script Master, но она не доработана (причем нет некоторых элементарных возможностей - например, нет возможности скопировать скрипт или его кусок в буфер, если бы кто из моих студентов такое позволил, плохо бы ему было). Но на безрыбье и рак рыба. Можно использовать и постой блокнот (хотя я пользуюсь программой Notepad++, ней есть возможность включить подсветку кода).
2. Скрипты - что этот такое и как с ними бороться.
В редакторе CS TES4 для того, чтобы работали квесты и диалоги (которые ВСЕ являются частью квестов), необходимо использовать различные скриптовые функции. Причем используются они двумя способами. Первый - в теле самого квеста. Это могут быть условия, при которых доступен тот или иной диалог, стадия квеста, пакет AI и т.п. Кроме того, результатом какого-то диалога или стадии квеста могут быть какие-то скриптовые функции.
Второй - скрипт, привязанный к квесту или объекту. Он создается в специальном редакторе и сохраняется в моде. Далее он привязывается к квесту или объекту. Далее я попробую проиллюстрировать все на примере создания мода.
Начну я с первого способа.
#2
Отправлено 23 Декабрь 2006 - 20:20
Для этого в CS выбирается пункт меню Character|Quest. Появляется окно квестов.
Что есть на этом окне. Слева - панель идентификаторов квестов. Чтобы не запутаться, рекомендуется давать значащие имена. В них лучше включать категории (например, MG01 - 1-й квест гильдии магов). Когда создается свой собственный квест, то чтобы его не искать, можно начат его как aaa... Я буду приводить примеры из мода, над которым работаю. Для него требовалось создать квест "Сокровища Змеиной Тропы". Соответственно, в окне нажимаем правой кнопкой мыши в любое место панели идентификаторов и в появившемся окне выбираем New. Далее задаем идентификатор (в нашем случае - aaaInn7ways01).
Теперь рассмотрим другие части окна. Вверху располагаются закладки - можно, выбирая их, получаем доступ к различным настройкам квеста. Начнем с закладки Quest Data.
Quest Name - отображаемое название квеста. Оно будет появляться во время игры в журнале игрока. В нашем случае - Сокровища Змеиной Тропы. Внизу находится поле Priority - приоритет квеста. Он определяет, насколько данный квест важен. Рекомендуется следующие приоритеты:
Priority Type
1 Tutorials
5 Generic Activities quests
10 Non-quest Dialogue
20 House & Horse quests
40 Training & Vampire quests
50 Miscellaneous quests
60 Guild quests
85 Main story quest
90 Crime & Character Gen quests
Поле Script - в нем выбирается из списка скрипт, привязанный к данному квесту. Про скрипты поговорим позже.
Теперь 3 флажка.
Start Game Enabled - если флажок установлен, то квест стартует вместе с новой игрой (или сразу при подключении мода). Если не установлен, то его нужно запускать.
Allow Repeated Conversation Topics - доступны все темы для разговора
Allow Repeated Stages - разрешать повторения в журнале.
Quest Conditions - условия, при которых становится доступным данный квест. О том, как настраивать условия, поговорим позже.
Кроме того, можно подгрузить изображение, которое будет привязано к данному квесту. Оно должно быть в формате dds. Все изображения должны быть помещены в папку data игры. Путь указывается после нажатия на кнопку.
Следующая закладка - Quest Stages.
В ней устанавливаются все стадии текущего квеста. Стадии нумеруются от 0 до 255. Они располагаются в левой панели. Для создания новой стадии нужно щелкнуть ПКМ и выбрать New. Далее вводится номер. Далее в Quest Stage Items нужно щелкнуть ПКМ и выбрать New. Если необходимо, чтобы в журнале для этой стадии появлялась запись, то она вводится в Log Entry (если оставить ее пустой, то в журнале ничего не будет). Если в результате должен быть выполнен какой-нибудь скрипт, он помещается в Result Script (для того, чтобы он был сохранен, нужно нажать на кнопку Compile Result). В Conditions устанавливаются условия, при выполнении которых будет установлена данная стадия. Ну и для последней стадии должен быть установлен флажок Complete Quest.
Следующая закладка - Quest Targets.
На данной закладке содержатся маркеры целей, которые появляются на карте во время выполнения стадий квеста. Дя создания маркера в верхнем окне нужно щелкнуть ПКМ и выбрать New. Далее нужно выбрать ячейку (Cell), в которой находится цель стадии квеста. И саму цель - Ref (npc, предмет или маркер). Во время игры к этой цели будет привязан зеленый или красный маркер на карте. Кроме того, нужно в Conditions прописать условия появления маркера (обычно используют функцию GetStage).
Следующая закладка - Topics.
Здесь прописываются темы и тексты диалогов. Во многом именно здесь проходит основная работа по созданию квеста. Для начала нужно выбрать тему - нужно в панели идентификаторов тем нужно щелкнуть ПКМ и выбрать Add Topics.
В появившемся окне выбирается существующая тема или создается новая (нужно щелкнуть ПКМ и выбрать New) и далее нужно нажать Ok.
Далее создается заголовок темы. Для каждой темы создаются конкретные диалоги. Подробно об этом я говорить здесь не буду, это достаточно объемная тема. Но для каждого диалога настраиваются условия, добавляются результирующие скрипты.
Для того, чтобы данная тема была доступна, ее нужно добавить. Можно сделать это двумя способами. Либо выбрать ее в Add Topic другого диалога, либо в результирующий скрипт темы или стадии квеста добавить строку AddTopic <имя темы>.
Пока все. Дальше я рассмотрю собственно скрипты.
#3
Отправлено 08 Август 2007 - 03:50
Сообщение отредактировал Simon-86: 09 Август 2007 - 06:38
#4
Отправлено 09 Август 2007 - 00:12
Simon-86 (8.8.2007, 3:50) писал:
Это элементарно.
1. В меню квестов (кнопка Q) создай свой квест с уникальным ID. Потом набросай пару стадий с их описаниями для дневника (Log Entry). Последняя стадия должна быть с пометкой Complete Quest. И в результирующем скрипте (Resul Script) команда StopQuest <ID квеста>. В итоге при дстижении этой стадии квест будет считаться пройденным (завершенным), и его скрипты не будут работать (т.е. напрягать комп).
2. Приоритет квеста - это приоритет при выборе топиков у перса. Чем выше приоритет квеста, тем скорее непись выберет для общения его топики. Кстати, топики квеста начинают "срабатывать",если квест уже начат, но не закончен.
3. Начать квест можно командой StartQuest <ID квеста>, а лучше setstage <ID квеста> <# стадии квеста>. Стадия может быть и без записи в дневнике.
Этой же командой продвигайся по всему квесту, меняя стадии. Эту и другие команды можно вызывать везде - и в скриптах, и в конце топиков, и как результирующую команду в скрипте стадии квеста.
4. Если нужно, чтобы квест начинался сразу после загрузки мода, то ставь галочку Start Game Enable.
5. Если в квесте предусмотрены переговоры с повторением топиков, то отметь галочкой Allow Repeated Conversation Topic. (аналогчино и с повторяющимися стадиями)
6. Цели квеста прописываются в соотвествующей закладке - Quest targets.
Там делай новую, выбирай цель и пиши условие, когда эта цель появится на компасе. Типа, getStage <ID квеста> <# стадии квеста> == 30. Т.е. эта цель будет на 30 стадии.
#5
Отправлено 21 Август 2007 - 18:47
#6
Отправлено 22 Сентябрь 2007 - 23:55
http://сайт-который-...а.ru/cs/tes4cs/
Если это уже есть на этом сайте пост можно удалить.
Тут есть полезные программы для тех кто хочет делать квесты:
http://сайт-который-...cles/util.shtml
#7
Отправлено 27 Ноябрь 2007 - 14:13
здесь наиболее читабельная версия. Где-то там же в формате .rtf
#8
Отправлено 25 Январь 2008 - 17:54
Сообщение отредактировал LEVIATHAN: 25 Январь 2008 - 17:58
#9
Отправлено 25 Январь 2008 - 18:41
LEVIATHAN (25.1.2008, 16:54) писал:
Заставить скриптом выполнить подобную анимацию невозможно (по крайней мере, я не знаю). Делается же подобное так:
1. Надо найти файл анимации *.kf, которую Вы хотите, чтобы НПЦ исполнял
2. Поместить этого нпц в игровой мир (если он еще не там)
3. Убедиться, что у него есть время для "тусовки", т.е. рано или поздно в его пакетах поведения наступит пакет Wander (или, если пакетов нет вообще, добавить таковой).
4. Добавить idle-анимацию (тут описывать не буду, как делать, есть на Wiki), указав в её условиях, например,
GetIsID == этот персонаж
Можно еще указать GetCurrentAIProcedure != 4 - чтобы персонаж не дергался во время разговора. Если он (она) ничего особо кроме танцев делать не будет, то таких условий достаточно. Если будет - ставь свою анимацию как можно ниже в дереве, чтобы она не перекрывала другие (сидение, падение, прочие).
Если персонаж что-то делает, а после этого надо перейти сразу на анимацию бездействия (которую мы тут и заносили), вызови для него процедуру PickIdle - он (она) сразу перейдет на нужную анимацию, а не будет ждать несколько секунд. Это будет единственное место, где анимации можно помочь скриптом.
#10
Отправлено 26 Январь 2008 - 17:15
Цитата
1. Надо найти файл анимации *.kf, которую Вы хотите, чтобы НПЦ исполнял
2. Поместить этого нпц в игровой мир (если он еще не там)
3. Убедиться, что у него есть время для "тусовки", т.е. рано или поздно в его пакетах поведения наступит пакет Wander (или, если пакетов нет вообще, добавить таковой).
4. Добавить idle-анимацию (тут описывать не буду, как делать, есть на Wiki), указав в её условиях, например,
GetIsID == этот персонаж
Можно еще указать GetCurrentAIProcedure != 4 - чтобы персонаж не дергался во время разговора. Если он (она) ничего особо кроме танцев делать не будет, то таких условий достаточно. Если будет - ставь свою анимацию как можно ниже в дереве, чтобы она не перекрывала другие (сидение, падение, прочие).
Если персонаж что-то делает, а после этого надо перейти сразу на анимацию бездействия (которую мы тут и заносили), вызови для него процедуру PickIdle - он (она) сразу перейдет на нужную анимацию, а не будет ждать несколько секунд. Это будет единственное место, где анимации можно помочь скриптом.
Спасибо помогло, теперь танцует как миленькая.
Для своего мода решил составить скрипт музыкальной шкатулки, но так как я в скриптах никак,то он соответственно не работает. Что то сделал не так.
scn MusicBoxScript
short button
begin onactivate
MessageBox ”Какую песню желаете?”, ”n1”, ”n2”, ”n3”
Set button to getbuttonpressed
If button == 0
MessageBox ”Good”
Streammusic ”Data\Music\Special\a.mp3”
Endif
If button == 1
MessageBox ”Good”
Streammusic ”Data\Music\Special\b.mp3”
Endif
If button == 2
MessageBox ”Good”
Streammusic ”Data\Music\Special\c.mp3”
Endif
End
У кого нибудь есть какие соображения?
Сообщение отредактировал LEVIATHAN: 26 Январь 2008 - 17:17
#11
Отправлено 26 Январь 2008 - 18:58
Т.е. надо сделать ещё блок OnActivate, где это и прописать...
#12
Отправлено 27 Январь 2008 - 20:49
Цитата
scn MusicBoxScript
short button
begin onactivate
MessageBox ”Какую песню желаете?”, ”n1”, ”n2”, ”n3”
Set button to getbuttonpressed
If button == 0
MessageBox ”Good”
Streammusic ”Data\Music\Special\a.mp3”
Endif
If button == 1
MessageBox ”Good”
Streammusic ”Data\Music\Special\b.mp3”
Endif
If button == 2
MessageBox ”Good”
Streammusic ”Data\Music\Special\c.mp3”
Endif
End
У кого нибудь есть какие соображения?
Цитата
Т.е. надо сделать ещё блок OnActivate, где это и прописать...
Не могу догнать :) . Ребят может отредактируем скрипт до играбельного состояния? :laugh:
#13
Отправлено 27 Январь 2008 - 22:26
Цитата
Упс! Натупил и не заметил. Я имел в виду сделать ещё блок GameMode, где и будет находиться getbuttonpressed.
скрипт, вроде бы, должен выглядеть как-то так:
scn MusicBoxScript short button short p begin onactivate if p==0 MessageBox ”Какую песню желаете?”, ”n1”, ”n2”, ”n3” Set p to 1 endif end begin gameMode if p==1 set button to getbuttonpressed set p to 2 endif if p==2 If button == 0 MessageBox ”Good” Streammusic ”Data\Music\Special\a.mp3” set p to 3 Endif If button == 1 MessageBox ”Good” Streammusic ”Data\Music\Special\b.mp3” set p to 3 Endif If button == 2 MessageBox ”Good” Streammusic ”Data\Music\Special\c.mp3” set p to 3 Endif endif End
Писал спонтанно, так что, если не сработает, пиши.
Если сам отладишь, все равно отпишись, чтоб я хоть знал, где я мыслю не так..
#14
Отправлено 28 Январь 2008 - 01:22
Цитата
Если сам отладишь, все равно отпишись, чтоб я хоть знал, где я мыслю не так..
Тэкс... В ходе тестирования выяснилось, что скрипт срабатывает только один раз, и музыка все равно не играет :laugh: . Сообщение "Хорошо" не появляется :) .
Скрипт в моде выглядит так;
scn MusicBoxScript
short button
short p
begin onactivate
if p==0
MessageBox ”Какую песню желаете?”, ”Эмоция”, ”Блюз”, ”От заката до рассвета”, “Майорка”, “Остров сокровищ”, “Урманга”
Set p to 1
endif
end
begin gameMode
if p==1
set button to getbuttonpressed
set p to 2
endif
if p==2
If button == 0
MessageBox ”Хорошо”
Streammusic ”Data\Music\Special\a.mp3”
set p to 3
Endif
If button == 1
MessageBox ”Ладно”
Streammusic ”Data\Music\Special\b.mp3”
set p to 3
Endif
If button == 2
MessageBox ”Уговорил”
Streammusic ”Data\Music\Special\c.mp3”
set p to 3
Endif
If button == 3
MessageBox ”Договорились”
Streammusic ”Data\Music\Special\d.mp3”
set p to 3
Endif
If button == 4
MessageBox ”Слушаюсь”
Streammusic ”Data\Music\Special\i.mp3”
set p to 3
Endif
If button == 5
MessageBox ”Так точно!”
Streammusic ”Data\Music\Special\f.mp3”
set p to 3
Endif
endif
End
Интересно почему MessageBox "Хорошо" не появляется?
#15
Отправлено 28 Январь 2008 - 06:14
попробуй добавить блок:
if button == -1
set button to getbuttonpressed
set p to 2
endif
в то место, где идут схожие по условию блоки...
#16
Отправлено 28 Январь 2008 - 20:22
scn MusicBoxScript
short button
short p
begin onactivate
if p==0
MessageBox ”Какую песню желаете?”, ”Эмоция”, ”Блюз”, ”От заката до рассвета”, “Майорка”, “Остров сокровищ”, “Урманга”
Set p to 1
endif
end
begin gameMode
if button == -1
set button to getbuttonpressed
set p to 2
endif
if p==1
set button to getbuttonpressed
set p to 2
endif
if p==2
If button == 0
MessageBox ”Хорошо”
Streammusic ”Data\Music\Special\a.mp3”
set p to 3
Endif
If button == 1
MessageBox ”Ладно”
Streammusic ”Data\Music\Special\b.mp3”
set p to 3
Endif
If button == 2
MessageBox ”Уговорил”
Streammusic ”Data\Music\Special\c.mp3”
set p to 3
Endif
If button == 3
MessageBox ”Договорились”
Streammusic ”Data\Music\Special\d.mp3”
set p to 3
Endif
If button == 4
MessageBox ”Слушаюсь”
Streammusic ”Data\Music\Special\i.mp3”
set p to 3
Endif
If button == 5
MessageBox ”Так точно!”
Streammusic ”Data\Music\Special\f.mp3”
set p to 3
Endif
endif
End
В игре скрипт ведет себя следующим образом:
При активации срабатывает любая музыка выбранная по условию скрипта :) , в процессе игры активатор больше не реагирует :laugh: , ( скрипт одноразовый, p == 0, а как это исправить? :e: )
В процессе игры выбранной композиции, быстрая загрузка срабатывает через раз, первый раз играет та же композицию, второй вылет в О.С. :)
В общем скрипт работает как надо, только его второй раз уже не используешь, и в процессе воспроизведения одной композиции, другая музыка незапустится ( p == 0 ?).
Но все равно равно что то же получилось :laugh: !!!
#17
Отправлено 28 Январь 2008 - 22:18
С загрузками у меня и так проблемы, без всяких скриптовых тестов, в повседневной "жизни". Через раз вылетает..
Чтобы можно было запустить музыку ещё раз - просто исправь все фрагменты:
Цитата
Цитата
Можно, кстати, сделать интереснее (может даже проще). Начинать проигрывать в любом случае "пустую" музыку, т.е. файл .mp3 без звуков. И при выборе песни включать источник звука или делать playsound3d. Так при приближении к твоей "Музыкальной коробке" музыка будет громче. Опять же, не проверял..
#18
Отправлено 28 Январь 2008 - 22:31
С загрузками у меня и так проблемы, без всяких скриптовых тестов, в повседневной "жизни". Через раз вылетает..
Чтобы можно было запустить музыку ещё раз - просто исправь все фрагменты: на . Просто сначала не стал делать возможность повтора, т.к. у меня у самого была проблема с подобным скриптом не так давно..
Можно, кстати, сделать интереснее (может даже проще). Начинать проигрывать в любом случае "пустую" музыку, т.е. файл .mp3 без звуков. И при выборе песни включать источник звука или делать playsound3d. Так при приближении к твоей "Музыкальной коробке" музыка будет громче. Опять же, не проверял..
StreamMusic функция глюкавая, даже на Вики это признают. А уж сами разработчики наверно про неё ответили бы: "Отвяжись, я её начал делать, а потом меня заставили копыта для лошадей рисовать".
Так что вылеты в ОС тут неизбежны по определению, и, если в каком-то случае их нет, значит, именно в этот раз что-то и сглючило. :)
Действительно, наверное лучше её вообще не использовать, а просто класть источник звука (Sound), если место стационарное, и включать его, когда надо. К тому же его можно спозиционировать в пространстве, и это только добавить достоверности, в отличие от StreamMusic, которая бубухает в колонках с одинаковой громкостью, независимо от перемещений игрока (вернее, ГГ).
#19
Отправлено 29 Январь 2008 - 00:15
Цитата
Мдя, спасибо сам бы не додумался :) . Скрипт работает как надо, пока одна мелодия не доиграет другая не запустится.
Я тут решил еще раз с анимацией поработать по типу танцовщицы. На этот раз жонглер Тейдил (wood elf) из Блисса. Ну в общем сделал как положено, распаковал архив островов, вставил НеПиСя в локацию, но вот загвоздка вышла. Анимация идет без шариков. Проверял 2 kf файла ( se_specialidle_juggling2, и sejuggling ) все равно без шариков. Просто как то не естественно смотрится жонглировать без шариков :laugh:
#20
Отправлено 29 Январь 2008 - 00:31
LEVIATHAN (28.1.2008, 23:15) писал:
Я тут решил еще раз с анимацией поработать по типу танцовщицы. На этот раз жонглер Тейдил (wood elf) из Блисса. Ну в общем сделал как положено, распаковал архив островов, вставил НеПиСя в локацию, но вот загвоздка вышла. Анимация идет без шариков. Проверял 2 kf файла ( se_specialidle_juggling2, и sejuggling ) все равно без шариков. Просто как то не естественно смотрится жонглировать без шариков :laugh:
Шарики надо добавить в AnimObjects (кажется, так называется эта группа в КС) и привязать их к твоей анимации. Так что ищи ещё и эти самые шарики, надо будет сделать их дубль и привязать дубль уже к твоей анимации.
Поделиться темой:
- 19 Страниц
- 1
- 2
- 3
- →
- Последняя »