Это используется в поле result диалогового окна в TES CS, чтобы дать игроку выбор или просто «продолжить» длинную речь[34]. После того, как игрок сделает выбор, та же тема (topic) будет проверена снова, и вы можете задать нужную реакцию, используя функцию / choice / = / choice_enum в условиях для говорящего окна диалога в TES CS. Не применима в скриптах, насколько я знаю.
Информация от Riiak: В отличие от messageBox, эта функция может использовать стек. Под этим я подразумеваю, что вы можете использовать 2 вызова choice в одном поле result для 10 choice-ов максимум или 3 вызова Choice для 15 choice-ов максимум и т.д. Я не знаю лимита стека, но уверен, что он есть. (Думаю, он ограничен 5 choice за вызов).
Добавление записей в журнал и тест записей журнала
[no fix] Journal, "Journal_ID", Index_enum
Journal, MG_BCShroomsCombat, 10
Эта функция добавляет запись в ваш игровой журнал, запись должна быть заранее определена в редакторе диалогов. Индекс показывает, какая запись из журнальной темы будет добавлена. Остерегайтесь использовать простые названия для журнальных тем, добавляйте 2 буквы в начале, как это сделано у Bethsoft (смотрите скрипт ниже) иначе запись журнала будет показана, как обычная тема для диалога, если эта тема будет упомянута в диалоге!
(Информация с форумов / Melian)
[no fix] SetJournalIndex"Journal_ID" index_enum
SetJournalIndex "MG_BCShroomsCombat" 99
Setjournalindex установит индекс в нужное значение, не важно есть для этого значения запись в журнале или нет (полезно для простых флагов для которых не нужны записи в журнале).
Примечание: После перезагрузки, индекс установится в наибольшее значение из тех записей, которые уже были добавлены в журнал. Так что это может быть использовано для определения загрузился ли игрок:
"Dummy" это любая журнальная запись, у которой нет записи с индексом 100.
Самое хорошее, что это легко использовать в диалоге: послать игрока на тяжелое задание, и установить индекс в поле result. Если по возвращении игрока индекс изменился, значит, игрок провалил задание (информация от JOG).
[no fix] ClearInfoActor
Эта функция используется в поле result диалогового окна используя ее можно предотвратить появление темы в журнале игрока (в секции "Темы"). Полезно, чтобы предотвратить засорение секции Темы бесполезной информацией.
Эта функция возвращает индекс наибольшей (последней?) записи в журнале для конкретной темы. Это очень удобно для отслеживания развития квеста, и для задания реакции скрипта на то, какая часть задания уже выполнена.
Пример: Это короткий скрипт, демонстрирующий использование обеих функций в игре.
Begin attack_slave
short nolore
If ( GetDeadCount "Vorar Helas" > 0 )
return
endif
if ( GetJournalIndex"MV_SlaveMule" < 102 ); если игрок не достиг определенной точки
If ( GetDistance, "Rabinna" < 512 )
Rabinna->AiWander 0 0 0 0 0 0 0
StartCombat, "Rabinna"
Journal "MV_SlaveMule", 102 ; добавить запись
endif
endif
End
Специальные диалоговые функции
В числе функций, доступных для определения условий диалога в редакторе диалогов, есть некоторые, не имеющие прямого эквивалента в функциях для скриптов. Используя диалог (напр.: ForceGreeting, голосовой диалог или стратегически расположенного квестового NPC) и поле Редактора диалогов result, вы можете использовать эти функции для скриптовых целей, например, устанавливая глобальную переменную в поле result. Вот примеры этих функций:
PC Sex (dialog)
0, если игрок мужчина и 1, если женщина.
Примечание: Это единственный способ определить пол игрока вы можете использовать это, чтобы установить глобальную переменную, содержащую пол игрока самый легкий способ через Voice, то есть поместить приветствие hello для всех NPC вверху листа, которое устанавливает переменную в 1 - если игрок мужчина, и 2 если женщина. В теме также должно быть условие, что эта переменная равна нулю, то есть, не установлена.
Talked to PC (dialog)
1, если говорящий уже разговаривал с игроком и 0, если нет. Вы можете использовать эту функцию, чтобы кто-то сказал что-то, когда игрок говорит с ним в первый раз, или для наших скриптовых целей, чтобы пометить актера, как известного игроку.
Похоже, что Talked to PC сбрасывается в 0, если игрок провел 72 часа вне ячейки с NPC. Это ограничение также применяется к другим диалоговым функциям, например ForceGreeting: NPC доступен из другой ячейки только 72 часа. Этот можно обойти вызывая PositionCell на NPC каждый день (даже не перемещая его никуда). (Информация с форумов / Cortex, Srikandi). Этот фокус, похоже, требует, что ячейка, куда они перемещаются, должна быть не той же самой ячейкой, где игрок впервые встретил их. (Информация с форумов / Cortex)
Это предполагает, что или ячейка не должна быть ячейкой, куда их поместили в редакторе, или ячейкой, где игрок еще не бывал. Я использую интерьер для этого, и у меня все работает.
Так что после того, как вы их встретили, они посылаются в эту ячейку каждый день, хотя они и так уже там.
Rank Requirement (dialog)
Эта функция для проверки вашего соответствия для следующего ранга во фракции говорящего.
Функция возвращает 0, если у вас не достает репутации во фракции (Faction Reputation) и вы не удовлетворяете требованиям по навыкам.
Функция возвращает 1, если у вас не достает репутации во фракции (Faction Reputation), но вы удовлетворяете требованиям по навыкам.
Функция возвращает 2, если у вас достает репутации во фракции (Faction Reputation), но вы не удовлетворяете требованиям по навыкам.
Функция возвращает 3, если вы готовы к повышению.
PC Clothing Modifier (dialog)
Это полная стоимость всей одежды и брони, надетой на игрока. Стоимость вашего снаряжения меняет отношение к вам людей в игре.
Friend Hit (dialogue)
Используется в диалоге для того, чтобы определить реакцию члена вашей группы на вашу же атаку на них.
Возвращаемые значения:
0 = атаки не было
1 = атакован игроком в первый раз
2 = атакован игроком во второй раз
3 = атакован игроком в третий раз
4 = атакован игроком в четвертый раз и npc/животное не дерется с игроком.
Hello
Get/Mod/SetHello
Это изменяет ВСЕ копии актера. Информация из хелпа: Hello определяет дистанцию, при которой актер остановится, повернется к игроку и скажет привет. Это значение (по умолчанию 30) умножается на iGreetDistanceMultiplier (по умолчанию 7). Также при hello 30, расстояние будет равно 10 футам (210 ед).
Полезные диалоговые переменные
Ряд переменных Bethesda использует для блокирования определенных диалогов. Они должны быть просто объявлены, без установки значений.
Они проверяются использую условие Not Local как описано в хелпе:
Nolore
Блокирует большинство общих диалогов
NoIdle
Блокирует голоса Idle, используется для вампиров
NoFlee
Блокирует голоса flee, используется для вампиров
NoHello
Блокирует голоса Hello, используется для вампиров
Условие истинно, если игрок не имеет переменной. В отличие от большинства условий "Not", этой не важно, во что вы установили переменную. И в диалоге она (переменная) должна сравниваться с 0, и сама быть равной 0. Это может быть странно. Вот таблица, которая показывает как это работает:
Not Local
Переменная существует
Значение
Подходит?
(в диалоге)
(да/нет)
(в скрипте)
(говорящий это скажет)
= 0
Нет
Не доступно
Да
= 0
Да
Нет
= 0
Да
Да
= 1
Нет
Не доступно
Да
= -3
Да
-3
Нет
Изменяем и проверяем Навыки, Атрибуты и другие характеристики
Get, Set, and Mod Stats общие замечания
GetStat (returns float)
SetStat, var_float
ModStat, var_float
Set floatvar to ( Player -> GetHealth )
Player -> SetWillpower, 20
Player -> ModHealth, floatvar
Это целое семейство функций, которые позволяют изменять параметры игрока и актера, установки ИИ и многое другое. Просто замените Stat любым игровым параметром, атрибутом, установкой ИИ, сопротивлением болезни, репутацией, и т.д. (список смотри в Приложении). Положительные значения прибавляются к текущему параметру, отрицательные значения вычитаются.
Функция GetStat возвращает значение типа float, содержащее текущее значение параметра (Stat) (Не максимальное или базовое естественное значение параметра для игрока, а его текущее значение, используемое в игре, например, оно может быть усилено магией или уменьшено проклятием).
Функция SetStat устанавливает заданное базовое и текущее значение параметра.
Функция ModStat добавляет (положительные значения добавляются к текущему значению параметра, отрицательные значения вычитаются) заданное значение сразу к базовому и текущемузначению параметра (Stat). Функция ModStat не может устанавливать атрибут больше его лимита (100), тогда как SetStat может.
Примечание: Это может быть неверно для таких необычных характеристик как сопротивления, которые могут быть отрицательными или превосходить 100.
Существует так много вещей, которые можно сделать, используя эти функции, что не очень полезно приводить пример. Посмотрите скрипт Marksman Toggle в разделе Советов и Трюков в качестве хорошего примера. Скрипт, приведенный в «Воскрешение мертвого актера» ниже также использует ModHealth, как и многие другие.
Эти команды имеют тысячи способов применения. Они могут использоваться в проклятиях, специальных предметах, благословениях, для сбора информации о силе и слабости игрока, для изменения установок ИИ (делаем NPC агрессивным, после того как игрок его оскорбил, NPC не разговаривает с вами ночью и т.д.) Также можно изменять навыки владения оружием и броней, чтобы NPC переключался между разными их видами.
В 8-ой редакции многие эти функции были отсортированы в соответствующие разделы (то есть по магии, бою и т.д.)
Определение и изменение характеристик игрока и актеров:
Определение и изменение атрибутов:
Get/Mod/SetStrength
Get/Mod/SetIntelligence
Get/Mod/SetWillpower
Get/Mod/SetAgility
Get/Mod/SetSpeed
Get/Mod/SetEndurance
Get/Mod/SetPersonality
Get/Mod/SetLuck
Определение и изменение Здоровья, Магии и Усталости:
Get/Mod/SetHealth
Get/Mod/SetMagicka
Get/Mod/SetFatigue
Эти три функции возвращают, изменяют или устанавливают жизненные функции для игрока. Для NPC и игрока функции Get выдадут текущее здоровье/магию/усталость. GetHealth также работает с оружием/броней, но возвращает максимальное здоровье. Неизвестна ни одна функция, которая бы возвращала текущее здоровье предмета (информация с форумов / Mana User).
Специальное использование ModStat:
ModCurrentHealth, var_float
ModCurrentMagicka, var_float
ModCurrentFatigue, var_float
Тогда как ModHealth изменяет и максимальное и текущее значение здоровья актера на одинаковое значение (таким образом, это повлияет даже на полностью здорового актера), ModCurrentHealth изменяет только текущее здоровье и не может устанавливать здоровье выше его текущего максимума для актера (так что, применив ModCurrentHealth, 10000 к актеру с максимальным Здоровьем в 70 и текущим Здоровьем 35 установим Здоровье в 70, а применив ModHealth, 10000 установим Здоровье в 10035).
GetHealthGetRatio (returns float)
Эта функция возвращает текущее Здоровье актера в процентах, как значение типа float в пределах от 0 до 1, например 1 означает 100% Здоровья, 0.9 означает 90% Здоровья и 0 означает, ну, мертв, я думаю. Это замена ошибочно указанной в Справке функции GetHealthRatio.
Если вы хотите узнать максимум Здоровья актера (помните, GetHealth возвращает текущее значение здоровья), вы можете использовать следующее:
Float MaxHealth
Float CurrentHealth
Set CurrentHealth to "Actor ID"->GetHealth
Set MaxHealth to (CurrentHealth / "Actor ID" -> GetHealthGetRatio)
Определяем и изменяем скиллы:
Изменения навыков оружия и брони можно использовать для того, чтобы изменить, что какое оружие NPC используют по умолчанию. Это не работает с броней, так как для этого NPC используют значения, установленные в редакторе. Если у вас есть Трибунал или Бладмун, то на NPC можно вызвать Equip, чтобы заставить его надеть определенный предмет (Информация с форумов / Vorwoda_the_Black). Для примера смотри раздел Советы и Трюки. Диапазон допустимых значений для навыков не лежит в пределе от 0 до 100, как того можно ожидать. На самом деле текущее значение навыка хранится как float, так что здесь можно задать большие числа, но есть некоторые ограничения: вы не м